●修正(2021.03.02) T0Hが足りてたのに足りないと書いていた。
●公開(2021.03.02) 参照先サイト様とのコメントのやり取りが終わったので公開。
巷で噂(?)ラズパイPICO。
MicroPythonを入れて目玉機能「PIO」を食す。
WS2818B用のサンプルがあるので、まずはそこから事象を捉え、
PIOアセンブラの意味を探る……………探れるかな?(汗)
光具合は多数の動画等アップされているので、私もやった!(ぉぃ
稚拙な作品を見て皆で笑え。(●´ω`●)
芋ハンダばんざーいヽ(´ー`)ノ
蛇の目基板にSMDって本当老人には辛いよ。(´;ω;`)
ものは秋葉原・秋月電子通商さんで購入。
マイコン内蔵RGBLED WS2812B-B (2個入): LED(発光ダイオード)
https://akizukidenshi.com/catalog/g/gI-16029/
さて、ソフトはサンプルのLEDの個数を10個に変えた以外はオリジナルのままです。
この時の波形を以前記事にした中華ロジアナで観察してみて挙動を伺おうと言う作戦。
事象からコーディングの意味を知ろうと言う、BottomUp作戦だ!
※常人の様にTopDown(ドキュメントを読み構造を知り結果を予測)出来るだけの知性が無い…うん、無い。
設定は20Mサンプル保存できる様にして、16MHzでスキャンさせてます。
信号は1本だけ、立ち上がりエッジ検出にし、mathライブラリにWS2818があったので付加しました。
まずざっと計測した感じ。
髭が生えてる…いやこれじゃ判らんな。(;^ω^)
少しよってみる。
髭と髭の間を測ると約50m秒経過している。
ソースにもアレイ構造のデータを吐き出す毎に50m秒のスリープがある。
更によって、スリープの直前のデータ。
1つの髭の中身はこんな感じに細かい髭が沢山。
一番下、紫のアイ・パターンが10個並んでいる。一つ一つがWS2818に対応して10個分あるのがわかる。
更により、紫のアイ・パターン一つを拡大。
緑の部分は生のパルスデータを0/1の解釈を与えて表示されている。24Bits構造なのがわかる。
このLEDはマイコン内蔵でマイコンはこの24ビットのデータをRGB8ビットずつに解釈して各々を光らせている。
内蔵のマイコン自体はこのシリアルなデータを3ByteなPWMデータと解釈しているのだろう。
各々光の三原色の輝度を変える事で一千六百万色もの色を表現する。現代は凄いねぇ。
更によってみると各ビットの状態が観察できる。
ここからはWS2818Bの通信規格のお話になる。
24Bitの01を送るのに「オンオフの長さ」で表現している。
※マンチェスタじゃなしNZR/ZRとかでもなし…なんという符号方式なのだろう?誰か教えて下さい。
仕様書によると…
※WS2818BのページあってWS2818B-Bのページにないのが仕様書。(笑)
※中身だけ言えば同じものだしね、仕方ないね。
※ マイコン内蔵RGBLED WS2812B (2個入): LED(発光ダイオード)
※ https://akizukidenshi.com/catalog/g/gI-07915/
改めて、仕様書によると、
0を表すには T0H 220〜 380ns T0L 580〜1000ns
1を表すには T1H 580〜1000ns T1L 580〜1000ns
0の時だけH期間が短いのね。
その様子を観察すると、
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だ、そしてサンプリング点の数を数えると
0は4つと16で出来ていて、1は14と6で出来ている。
16MHzで観察したので2倍になっている、つまり0は2+8、1は7+3で出来ている。
前出の楽しくやろう。氏の説明だと、PIOを使って
引用>>「1」を出力する場合、0001111111
引用>>「0」を出力する場合、0001100000
を作っていると言う。うむ、見事完全に一致。
しかしこれ…仕様からずいぶんかけ離れていません?
0(T0H 220〜 380ns T0L 580〜1000ns)の場合、125usが2で250us、8は1000us…0はおk!
1(T1H 580〜1000ns T1L 580〜1000ns)の場合、125usが7で875us、3は375us…T1Lが足らない。(笑)
私としては楽しくやろう。氏のコメント欄にも書きましたが
「1」の場合、0000111111 → 6+4
「0」の場合、0001110000 → 3+7
が良いかな?って思うのですけどね、そこまでシビアじゃないようで。
兎に角動いた!何より何より。