IchigoJamで32x16ドットマトリクスLEDを制御する

はじめに、そして結論

大阪日本橋のデジットで売られている32x16ドットマトリクスLEDをIchigoJamから制御するお話。IchigoJamのBASICからでは速度的につらかった。本気でやるときは機械語でよろしくすべし。

準備

32x16ドットマトリクスLEDはデジットに買いに行ってもいいし、上記の共立エレショップから通販してもいい。このマトリクスLEDモジュールは簡易資料/PDFにあるように10ピンのコネクタが背面にある。このコネクタにつなぐケーブルもついでに購入しておくと便利。ケーブルは適当なところで切断して、各線をピンヘッダに半田付けしておくとブレッドボードに接続しやすくなる。

IchigoJamからはマトリクスLEDモジュールのSIN_1, SIN_2, SIN_3, CLOCK, LATCH, ENABLEの計6本の信号をOUT1〜6端子で制御することにする。 マトリクスLEDモジュールの電源はVCC(ロジック部電源)とVLED(LED駆動電圧)の二つが必要でともに5Vとなっている。IchigoJamのVCCは3.3Vだと思うので別のところから5Vを供給することにする。

制御方法

このマトリクスLEDモジュールは、SIN_1〜3にそれぞれデータを出力してCLOCKを立ち上げること16回。その後一旦ENABLEを非アクティブにして、LATCHでデータ更新、再度ENABLEをアクティブにする。これでSIN_1で指定した行の1ライン分(32ドット)が出力されるようになっている。16ラインあるのでこれを16回繰り返すと32x16となる。

プログラム

10 rem initialization
20 out 6,1
100 rem data 'Ichigo Jam'
110 let [0], #0000, #6300, #9480, #9480, #7480, #1300, #6000, #0000
120 let [8], #0000, #0000, #8000, #4000, #4000, #4000, #0000, #0000
130 let [16], #e040, #4642, #4970, #484a, #484a, #e64a, #0000, #0000
140 let [24], #1c00, #0800, #08c6, #0925, #0925, #30d5, #0000, #0000
200 rem main
210 for i=0 to 15
220 c=1<<i
230 d=[i]
240 e=[i+16]
250 for j=0 to 15
260 out 1,c&#8000
270 out 2,d&#8000
280 out 3,e&#8000
290 c=c<<1
300 d=d<<1
310 e=e<<1
320 out 4,0
330 out 4,1
340 next
350 out 6,1
360 out 5,1
370 out 5,0
380 out 6,0
390 next
400 goto 210

20行目で一旦ENABLEを非アクティブにしておく。 110〜120行目が画面左半分の16x16の表示データ。配列の[0]が最上行、[15]が最下行。 130〜140行目が画面右半分の16x16の表示データ。配列の[16]が最上行、[31]が最下行。

ちなみにこんなデータはスプレッドシート的なものでこんな感じに作ってみた。緑が左側半分の16x16、黄色が右半分の16x16。 f:id:rohi:20150831141348p:plain

210行目から390行目までのFORループで16行分のループ。変数iが何行目かを示している。 220行目の変数cはSIN_1に出力するデータ。今回のループで出力する位置がHになるように1をi回左シフトしている。 230行目の変数dはSIN_2に出力するデータ。配列から画面左半分の1行分である16ビット値を取り出している。 240行目の変数eはSIN_3に出力するデータ。配列から画面右半分の1行分である16ビット値を取り出している。 250行目から340行目までのFORループも16回のループだが、こちらはラッチの1回分である16ビット分の送出のためのループ。変数c, d, eは左方向に1ビットずつシフトして最上位ビットが0以外なら対応するSIN_*にHを出力し、0ならLを出力する。 320〜330行目でCLOCKをL→HすることでSIN_1〜3のデータを取り込ませる。 350行目で一旦ENABLEを非アクティブにして360〜370行目でLATCHさせ、380行目でENABLEをアクティブにする。これで1行分の表示が更新される。 390行目のnextは変数iのループのためのnext。 400行目でこの処理の先頭に戻して無限ループとしている。

結果

とても遅くて1画面更新するのに約4秒かかっている。それを16行分に分割した時間ずつ、各1行が点灯し他の行が消灯しているという状況。

ちなみに比べてもしょうがないけどSTM32F4-Discoveryで作ったCプログラムでは、1ms周期で割り込みを起こさせてそこで1行分の更新をするようにしている。1画面に16msかかる感じなのでちらつきは感じない。 IchigoJamでの動作はちらつきとかそういうレベルではないので、BASICからの制御はちょっと使えない感じ。 複数行に同じ表示をする場合はSIN_1で複数ビットをHにすればよいので、例えば全面点灯/全面消灯みたいなものなら、1画面の点灯に上記プログラムの1行分の処理でまかなえる。なので、最短の点滅周期だと4秒÷16×2くらいでいけると予想する。