読者です 読者をやめる 読者になる 読者になる

M.C.P.C. (Mamesibori Creation Plus Communication)

印刷屋から五反田のWeb屋に転職したCLのブログです。

ピカリ館の単色LEDマトリクスパネルをRaspberry Piで光らす

akibaLEDピカリ館のLEDマトリクスパネルが2,380円で割とでかいのですが、

www.akiba-led.jp

これをRaspberry Piを使って光らす。(前回のArduinoでやったやつはこちら。)

使ったRaspberry Piは、Raspberry Pi B+、プログラミング環境はnode.jsです。ほら、node.jsにしておけば、サーバにしたりWebSocketで通信したりしやすいでしょ……

f:id:C_L:20150820014128p:plain

注意ですが電源はしっかりアンペアの大きい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 $ 

プログラムはこちら。

gist.github.com

www.youtube.com

んで、node.jsなんですが、非同期処理・シングルスレッドがウリのnode.jsで同期処理やるためにコールバックで自分自身を再帰呼び出しするように作ってみましたが、Raspberry PiのOS自身の処理とかネットワークIO処理とかに巻き込まれループが一定の間隔で動くわけがなく、4ライン毎のダイナミック点灯の間隔が一定にならないのでした。

広告を非表示にする