akibaLEDピカリ館のLEDマトリクスパネルが2,380円で割とでかいのですが、
これをRaspberry Piを使って光らす。(前回のArduinoでやったやつはこちら。)
使ったRaspberry Piは、Raspberry Pi B+、プログラミング環境はnode.jsです。ほら、node.jsにしておけば、サーバにしたりWebSocketで通信したりしやすいでしょ……
注意ですが電源はしっかりアンペアの大きい5Vスイッチング電源を用意して、電源からRaspberry Piの5Vとパネルの5Vに分岐させるように。一応Raspberry PiをUSBにつないだときの5V端子からパネルにつないでもパネル1枚くらいなら光るけれども、パネル3枚全点灯でテストしたら、5V・4.6A位になったので、マジにやるなら30W級の5Vスイッチング電源を用意しましょう。
あと、信号線がRaspberry Piから出る分は3.3V、LEDマトリクスパネルの仕様は5Vなので、途中に74HC4050を入れて電圧を合わせてあげましょう(レベルシフタ)。ちょうど3.3Vの信号線が6本なのでよい。74HC4050は鈴商とかマルツにあります。一方向のレベルシフタでいいのなら、74HC4050が便利ですね。
このパネル、コネクタのAとBのラインが74HC138(デコーダ)の入力につながり、出力側でソースドライバのFETを駆動するのに利用されています。また、DATAラインとCLKとLATCHが74HC595(シフトレジスタ)につながっていて、シンクドライバとして利用されています。DATA(仕様書では/DATAと書いてある)と負論理になっているのは、74HC595の端子が0Vになった時に、ソースドライバ側との電位差により吸い込みが発生し、LEDが点灯するからなのでした。
プログラムは、node.jsで作りましたので、事前にraspi-configでSPIが使えるkernelドライバを有効にしておくこと、node.jsをインストールすること、npmでpi-spiとonoffをインストールすること、更にrootでの実行が必要となります。
node.jsのインストールは、OSのものはv0.6なので古すぎで、最低でもv0.10が欲しいところです。node.jsのサイトでは、v0.10がパッケージされて置いてあり、nodebrewとかnodeenvとかでインストールできるわけですが、せっかくなのでnode-armから入手できるv0.12を入れます。
pi@raspberrypi ~ $ curl -LO http://node-arm.herokuapp.com/node_latest_armhf.deb pi@raspberrypi ~ $ sudo dpkg -i node_latest_armhf.deb (データベースを読み込んでいます ... 100% (データベースを読み込んでいます ... 現在 77859 個のファイルとディレクトリがインストールされています。) (node_latest_armhf.deb から) node を展開しています... node (0.12.6-1) を設定しています ... man-db のトリガを処理しています ... pi@raspberrypi ~ $ node -v v0.12.6 pi@raspberrypi ~ $
ライブラリのインストールはこんな感じ。
pi@raspberrypi ~ $ mkdir test pi@raspberrypi ~/test $ cd $_ pi@raspberrypi ~/test $ npm install onoff pi-spi \ > pi-spi@1.0.0 install /home/pi/node_modules/pi-spi > node-gyp rebuild make: Entering directory '/home/pi/node_modules/pi-spi/build' CXX(target) Release/obj.target/spi_binding/spi_binding.o SOLINK_MODULE(target) Release/obj.target/spi_binding.node COPY Release/spi_binding.node make: Leaving directory '/home/pi/node_modules/pi-spi/build' > epoll@0.1.13 install /home/pi/node_modules/onoff/node_modules/epoll > node-gyp rebuild make: Entering directory '/home/pi/node_modules/onoff/node_modules/epoll/build' CXX(target) Release/obj.target/epoll/src/epoll.o SOLINK_MODULE(target) Release/obj.target/epoll.node COPY Release/epoll.node make: Leaving directory '/home/pi/node_modules/onoff/node_modules/epoll/build' pi-spi@1.0.0 ../node_modules/pi-spi └── nan@1.9.0 onoff@1.0.2 ../node_modules/onoff └── epoll@0.1.13 (bindings@1.2.1, nan@1.8.4) pi@raspberrypi ~/test $
プログラムはこちら。
んで、node.jsなんですが、非同期処理・シングルスレッドがウリのnode.jsで同期処理やるためにコールバックで自分自身を再帰呼び出しするように作ってみましたが、Raspberry PiのOS自身の処理とかネットワークIO処理とかに巻き込まれループが一定の間隔で動くわけがなく、4ライン毎のダイナミック点灯の間隔が一定にならないのでした。