ESP8266からWS2812Bを光らす
マイコンに表示機器が一切ないとデバッグ用にシリアルラインでもつながないと状態が全くわかりません。そこでフルカラーLEDでもつければ、遠くからでも様子がわかるなーと思って、電子工作界隈では有名なWS2812Bをつけてみようと思ったわけです。
こいつの特徴は、マイコンが内蔵されており、わずか1本のデータ線でRGBすべての制御ができ、かつデイジーチェインが可能で数十個数珠繋ぎになったLEDテープを一挙に制御可能ということ。使えれば工作の幅が広がりそうです。
VDDが3.5~5.3VでかつHysteresis voltageが0.35Vだから、ちょっと3.3Vオンリーで動作させるのは厳しい…ESP8266は5Vトレラントではないから信号線の3.3V→5Vレベルシフト回路が必要です。
世間の作例だと、3.3Vのまま動かしていたり3.7VのLiPOバッテリーを電源に使ったりしてレベル変換もせず動かしているものが多いのですが、点滅が不安定とかデイジーチェインの1個めだけ光らないとか、不具合も多いよう。
普通に正攻法でBSS138 MOSFETを使ってレベル変換回路かけばいいんちゃうか?と思って、以下のような回路を作って基板を起こしました。
まー普通に動くでしょ?こんなの・・・と思ってたら見事に動かず。かなり苦労しました。
ライブラリは世間一般に使われているAdafruit NeoPixelでは動かなくて、Makuna NeoPixelBusのBitbangモードでだけ動き、しかも特定の組み合わせの色が白になってしまう。
不安定すぎんだろ!!
データシートを見る限り、1ビットのH信号を出すために、850nsのHを出した後450nsのLを出力、誤差は150ns以内ということですから、いくらARMコアが速くてもソフトだけでこのタイミングを生成するのは相当荷が重いでしょう。Bitbangモードは、使えるIOピンを選ばない利点がありますが、この微小なタイミング生成をソフトでやるので、ESP8266が忙しくなりすぎてWiFi通信が不安定になったり勝手にリセットがかかったりするそうです。やはりSPIやUARTのようなハード的なバッファを持ったモードで動作させたくなりますね。
うーん。いわゆるハッキング、マッシュアップのレベルでは「簡単にできた」と表現されるWS2812Bですが、実物はかなりの難物との印象です(少なくとも私のような素人には)
結局どうしたの?
結論だけ聞くと簡単そうに聞こえるでしょうが、「BSS138のプルアップ抵抗を100kΩ→1kΩにしただけ」で動きました(≧▽≦;)
参考になった記事はTesting level shifters for running Adafruit NeoPixel strips from a 3.3 Volt Teensyでした。どうもBSS138をはさむことで信号が鈍るようなんです。
私みたいにソフト・サーバ屋から電子回路に入ってきた人間には想像もつかないことですが、本来コンデンサではないはずの部品や回路配線自体に寄生容量というものが存在するそうです。これがコンデンサとして働いてしまう。この寄生容量(C)とプルアップ抵抗(R)で、RC遅延回路が形成されてしまう。すると信号の立ち上がりに遅れが生じて、方形が山形状の波形に鈍ってしまうと。
Bitbangモードだけで動いた、その理由は具体的にはわからないのですが、オシロで確認した限りでは生成された波形にかなり違いがありました。ちなみに出している信号はR=128, G=0, B=0です。Rの上位1ビットだけがHということですね。
int PixelPin = 5; NeoPixelBus<NeoGrbFeature, NeoEsp8266BitBang800KbpsMethod> strip(PixelCount, PixelPin);
int PixelPin = 2; NeoPixelBus<NeoGrbFeature, NeoEsp8266Uart800KbpsMethod> strip(PixelCount, PixelPin);
この違い、わかります?全体の長さも違いますが、Bitbangモードの方がH信号の山部分が平坦かつ長いんですね。つまりBitbangの方が正確なんですよ。UARTバッファモードは、元々シリアル通信の生成に使うハードウェア機能を流用して作られたものですから、本来の信号のためのクロックをだましだまし使うということになります。そりゃそうだ、WS2812B専用の回路を持つマイコンなんて存在しないから。
これが影響しているんじゃないかなー・・・・と個人的には思っているのですが、宮仕え先のオシロは仕事の都合で返してしまったので、結局調べられていません。
オシロほしいですね・・・・・まともなものは10万くらいしますから到底買えませんけども・・・お金ほしいですね・・・お金ください!!!(血涙