このところ、DS18B20、OST4ML5B32Aと1本の信号線で通信するペリフェラルを動かしてきました。そこにNeoPixel、デバイス的にはWS2812が入ってないのはマズいだろ~。ということで今回はシリアル制御LEDの代表選手、NeoPixelことWS2812Bを動かしてその通信波形を眺めてみたいと思います。
※「部品屋根性」投稿順Indexはこちら
WS2812
過去回でやった2つのシリアル通信デバイスは、ちょっと電気的に挑戦的なことをやってました。1-wire「バス」のDS18B20温度センサは、信号線から電源供給するという荒業でたった2本の物理配線にデバイス(それも複数個可能)をぶら下げるという技を使ってました。一方、シリアル制御フルカラーLEDのOST4ML5B32Aでは、VDD/2という中間電位を駆使する荒業で0と1を表現しとりました。
今回動かしてみるWS2812、NeoPixelデバイスはそれらに比べるとずっと普通なデジタルインタフェースです。パルスの長さで0と1を表現してます。当然、末端のデバイス側に「時間」を認識するための「インテリジェンス」が必要だと。
WS2812の製品ページが以下に。中国は深圳近郊の会社みたいです。
http://www.world-semi.com/ws2812-family/
なお、電子工作業界に広く流布したNeoPixelというお名前は、電子工作業界のリーダー?米Adafruit社が作ったWS2812ベースの各種LED製品に冠した商標かと。知らんけど。
今回、動作確認実験をやるにあたり、Adafruit社に敬意をはらい、Adafuit社がArduino用に公開(LGPLv3)されている以下のライブラリを使わせていただきました。あざーす。
なお、Arduino用のNeoPixelライブラリは上記だけでなく、とても多くの種類があります。Adafruit社製でも、DMAを使っているやつとか、Matrix用とか複数存在するみたいデス。その中で上記は一番「プリミティブ」に見えたものであります。まあ今回、最近手にいれたばかりのArduino UNO R4でライブラリが動くのかどうかも確かめようという色気があるので、DMAとかマイコン固有部分に引っかかりそうな奴は避けたと。
なお、今回使用のWS2812Bというデバイスは表面実装品で、手先が不器用で老眼のこの年寄には扱いかねるので、秋月電子通商殿のAE-WS2812BというDIP化基板を使わせていただいとります。
実験にはDIP化基板を3個以下のように数珠繋ぎにしたものを使用しました。
まずArduino UNO R4で試みる
Arduino IDEのライブラリマネージャから、以下のAdafuit社ライブラリを選択し、インストールしておきます。
上記のライブラリはAVRマイコンベースのArduinoだけでなく、Armベースのボードでも動作するような記載だったので選択してみました。ただし、今のところArduino UNO R4対応はうたわれていませんでした。
やってみるしかない(見る前に飛べ)
年寄のやることではないよ。
さて、ライブラリをインストールした後は、スケッチ例の中にAdafruit NeoPixelという項があらわれ、サンプルスケッチが使えるようになってます。その中でもいかにもシンプルそうな以下のスケッチ例を開きました。
Adafruit NeoPixel > simple
スケッチ例上、明らかに修正必要であったのは以下の1行だけでした。接続しているNeoPixelの個数の指定。今回は3個しか接続しないので、下記の16を3に書き換える必要があり。
書き換えた後、ターゲット機をArduino UNO R4にむけてビルド。成功。書き込み。成功。ノーエラーです。しかしNeoPixel、光ってくれませぬ。
Arduinoの標準APIレベルでは互換性OKなUNO R4も、各種のサードベンダ・ライブラリがそのまま動くわけではないのでいたしかたないっす。まあ、UNO R4対応は後日考えることにしてターゲット機を切り替えました。クリック一発。
Arduino UNO R3に変更
こういうとき、Arduino IDEは素晴らしいです。さきほどのソースコードを開いたまま、UNO R4からUNO R3に切り替え、再ビルドしてこんどはUNO R3に書き込み。ノーエラー。そして元気よくWS2812Bが光ってます。こんな感じ。
そのときの時間波形が以下に。ちょっと信号暴れている感じだけれども、よくみると長短パルス幅が見えとりますがな。
UNO R4の件は引っかかるが、LEDは光った。