フォト
2017年11月
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    
無料ブログはココログ

« 4連8x8ドットLEDマトリックスを試してみる 続編 | トップページ | 秋月電子 「球根始めました」 ・・・ はぁ? »

2016年7月12日 (火)

IchigoJamでMAX7219 8x8ドットLEDマトリックスを制御する

IchigoJamMAX7219を使った8x8ドットLEDマトリックスの制御をやってみました。
(IchigoJamはファームウェアバージョン 1.2.1を利用しています)

02

利用したのは、下記の製品です。ちょっと前に入手した「4連8x8ドットLEDマトリックス」
1個バージョンです。

MAX7219 dot matrix module microcontroller module DIY KIT
01

やってはみたものの、遅くて実用的でないです。
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:稼働に
セットすると発生します。
モジュール側のダイナミック駆動が影響しているっぽいです。

03

対策として、そのへんに転がっていた100μFのコンデンサをVCC・GND間に入れると
揺れ・乱れは無くなりました(本当はモジュールのVCC・GNDに入れるべきです)。

05

04

MAX7219のデータシートを見るとリップルノイズ対策にVCC・GND間に10μFと0.1μFの
入れるよう記載されています。
モジュールには、0.1μFのセラミックコンデンサしか乗ってないみたいです。
10μFの電解コンデンサを入れた方が良いようです。

« 4連8x8ドットLEDマトリックスを試してみる 続編 | トップページ | 秋月電子 「球根始めました」 ・・・ はぁ? »

IchigoJam」カテゴリの記事

コメント

確かに表示の切り替えが遅いですが、なかなか味のある表現となっていますね

後田さん

確かに味はありますが、やはり圧倒的に遅です。
I2Cは100kbpsなのでHT16K33を使った表示は500~700倍早いです(たぶん)。

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/63904366

この記事へのトラックバック一覧です: IchigoJamでMAX7219 8x8ドットLEDマトリックスを制御する:

« 4連8x8ドットLEDマトリックスを試してみる 続編 | トップページ | 秋月電子 「球根始めました」 ・・・ はぁ? »