IchigoJamでMAX7219 8x8ドットLEDマトリックスを制御する
IchigoJamでMAX7219を使った8x8ドットLEDマトリックスの制御をやってみました。
(IchigoJamはファームウェアバージョン 1.2.1を利用しています)
1個バージョンです。
MAX7219 dot matrix module microcontroller module DIY KIT

やってはみたものの、遅くて実用的でないです。
I2C接続のHT16K33を使った方が断然いいですね。
HT16K33みたいなスクロール表示なんかはちょっと無理そうです。
動いている様子
遅いですねぇ。データラッチが行単位なのも遅い処理系には一層見苦しい表示に
なりますね。
接続
IchigoJam LEDドットマトリックスモジュール
VCC <= VCC
GND <= GND
OUT1 <= CLK
OUT2 <= CS
OUT3 <= DIN
プログラム
1 'MAX7219(OUT1: CLOCK, OUT2: ~CS, OUT3: DAT)
10 M="ネコニコンバンワ!":L=LEN(M)
20 LET [0],#B,7,#A,0,#C,1,9,0,#F,0
30 FOR I=0 TO 8 STEP 2:R=[I]:V=[I+1]:GOSUB @WRITE:NEXT
40 FOR I=0 TO L-1
50 A=PEEK(M+I)*8
60 FOR J=0 TO 7:R=J+1:V=PEEK(A+J):GOSUB @WRITE:NEXT
70 NEXT
80 END
90 @WRITE:OUT2,0
100 FOR W=0TO7:OUT1,0:OUT3,R>>(7-W)&1:OUT1,1:NEXT
110 FOR W=0TO7:OUT1,0:OUT3,V>>(7-W)&1:OUT1,1:NEXT
120 OUT2,1:OUT2,0
130 RETURN
プログラムの簡単な説明
・MX7219では、16ビット単位でコマンドを送信して制御を行います。
16ビットの上位8ビットがレジスタ番号(または表示用メモリアドレス)、
下位が付随するデータとなります。
その送信を90行~130行のサブルーチン @WRITE で行っています。
・10行は表示用文字列とその長さです。
デモ動画で表示しているIchigoJamの特殊文字は削除して掲載しています。
・20行はレジスタ番号とその設定値を配列を使って定義しています。
レジスタと値の意味は下記の通りです。
#B, 7 :スキャン制御レジスタ 表示制御を行う行数を0~7で指定する(ここでは7を指定)
#A, 0 :輝度レジスタ 0~7で輝度を指定する(ここでは最低輝度0を指定)
#C, 1 :シャットダウンレジスタ 1:稼働 0:シャットダウンを指定(ここでは1:稼働を指定)
9 , 0 :デコードモードレジスタ 0:デコード不要 1~:デコードする(ここでは0を指定)
#F, 0 :ディスプレイテストレジスタ 0:テストしない 1:全点点灯(ここでは0を指定)
・30行は20行の配列値を使ってレジスタ設定を5件分行っています。
・40行~80行がキャラクタ表示を行っています。
文字列Mの内容を先頭から順番に表示しています。
文字コードに該当するフォントデータの先頭格納アドレスを50行で計算して変数Aに
格納しています。
60行では、各文字のフォントデータ8バイトを順次取り出して、MAX7219に送信しています。
考察・問題点等
さて、遅い原因ですが、サブルーチン@WRITEの処理内容に起因します。
1ビット送信にOUT命令を3回実行する必要があります。
8x8ドットの表示用データを送るのにOUT命令は384回も実行する必要があります。
またロジックアナライザでビットレート(転送速度)を測定してみると約130bpsくらいでした。
8x8ドット表示に128ビット送信するので最低でも1秒かかることになります。
一方、HT16K33を使った場合、8x8ドット(64ドット)送信はI2CW命令1回で出来ます。
この差が大きいですね。
IchigoJamはArduinoのShiftOut()命令的な通信プロトコルを要するデバイスの利用は
遅いです。インタープリターとしてはShiftOut()類似の専用命令が欲しいところです。
ShiftOut()に置き換えれば、8倍は早くなると思います。
それと、本モジュールを使うとIchigoJamの画面に揺れ・乱れが生じました。
繋げただけでは発生はせず、プログラムを実行してシャットダウンレジスタを1:稼働に
セットすると発生します。
モジュール側のダイナミック駆動が影響しているっぽいです。
対策として、そのへんに転がっていた100μFのコンデンサをVCC・GND間に入れると
揺れ・乱れは無くなりました(本当はモジュールのVCC・GNDに入れるべきです)。
MAX7219のデータシートを見るとリップルノイズ対策にVCC・GND間に10μFと0.1μFの
入れるよう記載されています。
モジュールには、0.1μFのセラミックコンデンサしか乗ってないみたいです。
10μFの電解コンデンサを入れた方が良いようです。
« 4連8x8ドットLEDマトリックスを試してみる 続編 | トップページ | 秋月電子 「球根始めました」 ・・・ はぁ? »
「IchigoJam」カテゴリの記事
- Ichigojam Rが届きました(2021.02.05)
- β版 IchigoJam Rを予約注文しました(2021.01.23)
- IchigoJamのファームウェア 1.4.1が正式に公開されました(2019.12.10)
- 「ichigoツール」をGithubにて公開しました(2019.11.09)
- ichigojamのファームウェアを1.4b13にアップデートしました(2019.11.06)
コメント
« 4連8x8ドットLEDマトリックスを試してみる 続編 | トップページ | 秋月電子 「球根始めました」 ・・・ はぁ? »
確かに表示の切り替えが遅いですが、なかなか味のある表現となっていますね
投稿: 後田 | 2016年7月12日 (火) 21時31分
後田さん
確かに味はありますが、やはり圧倒的に遅です。
I2Cは100kbpsなのでHT16K33を使った表示は500~700倍早いです(たぶん)。
投稿: たま吉さん(管理者) | 2016年7月12日 (火) 23時26分