Raspberry PI PICOによるWS2818B(-B)サンプルの実行

●修正(2021.03.02)　T0Hが足りてたのに足りないと書いていた。
●公開(2021.03.02)　参照先サイト様とのコメントのやり取りが終わったので公開。

巷で噂(？)ラズパイPICO。
MicroPythonを入れて目玉機能「PIO」を食す。

WS2818B用のサンプルがあるので、まずはそこから事象を捉え、
PIOアセンブラの意味を探る……………探れるかな？(汗)

光具合は多数の動画等アップされているので、私もやった！(ぉぃ
稚拙な作品を見て皆で笑え。(●´ω｀●)

https://www.nicovideo.jp/watch/sm38351715?ref=pc_mypage_history_video

芋ハンダばんざーいヽ(´ー｀)ノ
蛇の目基板にSMDって本当老人には辛いよ。(´；ω；｀)

ものは秋葉原・秋月電子通商さんで購入。
　マイコン内蔵ＲＧＢＬＥＤ　ＷＳ２８１２Ｂ－Ｂ　（２個入）: LED(発光ダイオード)
　https://akizukidenshi.com/catalog/g/gI-16029/

さて、ソフトはサンプルのLEDの個数を10個に変えた以外はオリジナルのままです。
この時の波形を以前記事にした中華ロジアナで観察してみて挙動を伺おうと言う作戦。
事象からコーディングの意味を知ろうと言う、BottomUp作戦だ！
※常人の様にTopDown(ドキュメントを読み構造を知り結果を予測)出来るだけの知性が無い…うん、無い。

設定は20Mサンプル保存できる様にして、16MHzでスキャンさせてます。
信号は１本だけ、立ち上がりエッジ検出にし、mathライブラリにWS2818があったので付加しました。

まずざっと計測した感じ。
![Screenshot at 2021-03-01 20-16-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185494/5b39cdd9-8f87-227b-cf27-618d9f1436c1.png)
髭が生えてる…いやこれじゃ判らんな。（；＾ω＾）

少しよってみる。
![Screenshot at 2021-03-01 20-18-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185494/0a8a4541-27eb-af3d-1cd1-9322375aaa92.png)
髭と髭の間を測ると約50m秒経過している。
ソースにもアレイ構造のデータを吐き出す毎に50m秒のスリープがある。

更によって、スリープの直前のデータ。
![Screenshot at 2021-03-01 20-19-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185494/d6e6666a-d8b8-1df3-13c0-717095457e37.png)
１つの髭の中身はこんな感じに細かい髭が沢山。
一番下、紫のアイ・パターンが10個並んでいる。一つ一つがWS2818に対応して10個分あるのがわかる。

更により、紫のアイ・パターン一つを拡大。
![Screenshot at 2021-03-01 20-19-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185494/e99f0c9e-52cc-e328-beb9-0bacfec303a1.png)
緑の部分は生のパルスデータを０／１の解釈を与えて表示されている。24Bits構造なのがわかる。
このLEDはマイコン内蔵でマイコンはこの24ビットのデータをRGB8ビットずつに解釈して各々を光らせている。
内蔵のマイコン自体はこのシリアルなデータを3ByteなPWMデータと解釈しているのだろう。
各々光の三原色の輝度を変える事で一千六百万色もの色を表現する。現代は凄いねぇ。

更によってみると各ビットの状態が観察できる。
![Screenshot at 2021-03-01 20-19-56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185494/47f5e5be-b935-4277-feec-26a787403463.png)
ここからはWS2818Bの通信規格のお話になる。
24Bitの０１を送るのに「オンオフの長さ」で表現している。
※マンチェスタじゃなしNZR/ZRとかでもなし…なんという符号方式なのだろう？誰か教えて下さい。

仕様書によると…
※WS2818BのページあってWS2818B-Bのページにないのが仕様書。(笑)
※中身だけ言えば同じものだしね、仕方ないね。
※　マイコン内蔵ＲＧＢＬＥＤ　ＷＳ２８１２Ｂ　（２個入）: LED(発光ダイオード)
※　https://akizukidenshi.com/catalog/g/gI-07915/

改めて、仕様書によると、
　０を表すには　T0H 220〜 380ns　T0L 580〜1000ns
　１を表すには　T1H 580〜1000ns　T1L 580〜1000ns
０の時だけH期間が短いのね。

その様子を観察すると、
![Screenshot at 2021-03-01 21-50-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185494/40ad840c-e1db-1274-200f-9aafbd3ff249.png)
1Bitのデータが20個のサンプリング点で観測されている。
それもそのはず、ソース中にもSMを8MHzで動作させているのが記述されていて、今回16MHzで観察している。
この辺のからくりは

PicoのNeoPixel（WS2812）のサンプルを動かしてみた – 楽しくやろう。
https://blog.boochow.com/article/rpi-pico-ws2812.html

氏のページで学んだ。非常に解りやすくPICOのいろいろが紹介されている。PICOに興味有る人は一読あれ。

話を戻そう、8MHz(1.25usサイクル)を10Bitなのだから1Bitは125nsだ、そしてサンプリング点の数を数えると
０は４つと１６で出来ていて、１は１４と６で出来ている。
16MHzで観察したので２倍になっている、つまり０は２＋８、１は７＋３で出来ている。

前出の楽しくやろう。氏の説明だと、PIOを使って
引用>>「１」を出力する場合、0001111111
引用>>「０」を出力する場合、0001100000
を作っていると言う。うむ、見事完全に一致。
しかしこれ…仕様からずいぶんかけ離れていません？

０(T0H 220〜 380ns　T0L 580〜1000ns)の場合、125usが２で250us、８は1000us…０はおｋ！
１(T1H 580〜1000ns　T1L 580〜1000ns)の場合、125usが７で875us、３は375us…T1Lが足らない。(笑)

私としては楽しくやろう。氏のコメント欄にも書きましたが
「１」の場合、0000111111　→　６＋４
「０」の場合、0001110000　→　３＋７
が良いかな？って思うのですけどね、そこまでシビアじゃないようで。

兎に角動いた！何より何より。