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ὀ 270 out 2,dὀ 280 out 3,eὀ 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。
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くらいでいけると予想する。