SSブログ
English Version

中華製マトリックスLEDキットでLチカ [PIC]

 ebayで16x32 Dot Matrix DIY Kit Red Green Dual-Color Control LED Display Moduleの名称で売られていた32x16の2色のドットマトリックスLEDキットを購入してみました。
 8x8の2色LED単体で2百円程度はするのではないかと思いますがそれが8個も入ったキットが9百円弱なのでお買い得感がありますね^^

 LED基板の部品構成はシリパラ変換(ラッチ付き)の74HC595 x 8個と縦16ラインのセレクト用に74HC138 x 2個以外はドライバ用のトランジスタとパスコン及び電源用電解コンのみです。

 ネット上では下記のようなボケた回路図しか見当たりませんでしたが、上記の部品構成から回路は容易に想像できますね。

マトリックスLEDキットの回路


 組立後にPICと接続した状態が下の写真です。PICはいつものようにpicleコンパイラを使って制御しています。
 また、OneBitLoaderをUARTでの2線式に対応させて入れています。

PICに接続した状態


 マトリックスLED基板自体の背面は下の写真のような感じです。LEDを半田付け後に点灯しないピクセルが発生すると嫌なのと、基板の取付穴を後で利用できるように(写真では判りませんが)LEDを直付けせずに別途ebayで購入した丸ピンソケットを使って接続しています。

マトリックスLED基板の背面


 制御方法は上記の部品構成から次のようになります。(74シリーズIC規格表で595を確認すると良くわかります)
 赤及び緑それぞれで1ライン分(32bit)のデータをラッチでき、A-Dで指定したラインに表示されます。
 最初のラインの先頭のシリアルビットがLED基板の左上のピクセルに対応します。

Sig Namememo
A - D138 でデコードされるライン情報
G Green serial input
R Red serial input
CK G/R clock(positive edge)
SRB 595 paralel data latch(positive edge)
OE/ 595 pararel data output(low active)


 PICとの接続は次のようにしました。

Sig NamePIC pinPin No.
A RA0 2
B RA1 3
C RA2 9
D RA310
CKRA412
G RB0 4
R RB1 5
SRBRB2 6
OE/ RB3 7


 ほとんどPIC単体の回路ですが、PICとマトリックスLEDの接続回路は以下のとおりです。
 シリアル通信の速度は38400bpsです。

マトリックスLED基板とPICの接続回路図


 マトリックスLED側のシリアル入力はRedとGreenの2bit入力なため、SPIは使えないのでソフトでシリアライズしています。
 今回は1ライン表示処理を約1ms間隔で呼び出し、1画面表示を16ms(62.5fps)で処理しています。

 ロジアナで確認した1周期分(16ライン分)の信号が下記になります。

1周期分の制御信号


 1ライン分の範囲に拡大したものが下図です。

1ライン分の制御信号


 更に1bit送信部分を拡大したものが下図です。

1bit送信分の制御信号


 マトリックスLED制御用に作成したpicleライブラリのソースが下記です。
 1ライン表示用の処理とfontデータをVRAMへ展開する処理を作成しました。フォントについてはフリーなものを少し探しましたが変換処理が必要そうだったので数も少ないことからフォントデータを自分で作成しました。
 フォントデータをメモリ上の固定アドレスに書き込んでいますが、PICの開発環境であるMPLABX環境でメモリの一部だけに書きこむにはリンカスクリプトの変更が必要そうだったのでCP/MのM80/L80環境でHEXファイルを作成し、OneBitLoaderで書き込みました。

 また、VRAMはスクロール処理用に右端と下側に8bit分をLEDパネルサイズ外の範囲まで持っています。
 フォント展開処理(SetFont)ではバイト境界を意識せず、VRAM上の任意の位置にfontデータを展開できるようにしています(但し、範囲チェックはしていない)

マトリックスLED制御ライブラリ(picle言語)
#LibMatrix v0.02 2020/02/14 skyriver # 8x8 x 8, 2colors Dot Matrix driver # Signal connection # LED PIC # A-D : RA0 2 # RA1 3 # RA2 9 # RA3 10 # # CK : RA4 12 # # Red : RB0 4 # Grn : RB1 5 # SRB : RB2 6 # OE : RB3 7 var LATA,LATB,ArIdx,_Bit; var _Rpat,_Gpat,_Font; func Alloc( size ) { return=Array_(ArIdx); ArIdx=ArIdx+size; } # # clear VRAM # proc Vcls() { var i; for (i=0;i<5*24;i=i+1) { _Rpat[i]=0; _Gpat[i]=0; } } proc Init() { var ad1pcfg,pr1,i,pat; ad1pcfg = $032c; ad1pcfg[0]=$ffff; # set digital mode pr1=$102; pr1[0]=$003d; # 270:10ms -> 3D:1ms LATA=$02c4; LATB=$02cc; LATA[-1]=$ffef; # ck:low LATB[-1]=$fffb; # srb:low LATA[-2]=$0000; LATB[-2]=$f300; # RB8,9:serial Rx,Tx _Bit=Alloc(4); _Rpat=Alloc(5*12); _Gpat=Alloc(5*12); _Font=$f800; pat=1; for (i=7;i>=0;i=i-1) { _Bit[i]=pat; pat=pat+pat; } Vcls(); } # display # ln<- line No. # x <- start x(0..7) # Y <- 0..15+1 # <- _Rpat,_Bpat proc Disp(ln,x,y) { var bcnt,_rpnt,_gpnt,rpat,gpat,lata,latb,tmp,xbit; xbit=x; tmp=(ln+y)*5; _rpnt=_Rpat+tmp; _gpnt=_Gpat+tmp; lata=LATA[0]; rpat=_rpnt[0]; gpat=_gpnt[0]; for (bcnt=4*8;bcnt;bcnt=bcnt-1) { if (xbit>7) { xbit=0; _rpnt=_rpnt+1; _gpnt=_gpnt+1; rpat=_rpnt[0]; gpat=_gpnt[0]; } latb=3; if (rpat&_Bit[xbit]) { latb=2; } if (gpat&_Bit[xbit]) { latb=latb&$fd; } LATB[0]=latb; LATA[0]=lata | $10; # ck positive edge LATA[0]=lata; xbit=xbit+1; } LATB[0]=$0c; # OE inactive and SRB edge(positive) LATA[0]=ln; LATB[0]=0; # RB3 OE active } # set vram with ascii code # _plane <- _Rpat or _Gpat # badr <- VRAM bit adrs from plane # line <- line No. # code <- ASCII codfe proc SetFont(_plane,badr,line,code) { var i,_fadr,fdat,_vadr,_vast,fbit,vbit,vbst; _fadr=_Font+(code-' ')*7; _vast=_plane+5*line+badr/8; _vadr=_vast; vbst=Modulo_; vbit=Modulo_; fbit=0; fdat=_fadr[0]; for (i=7*6;i;i=i-1) { if (fbit>5) { fbit=0; _fadr=_fadr+1; fdat=_fadr[0]; _vast=_vast+5; _vadr=_vast; vbit=vbst; } if (vbit>7) { vbit=0; _vadr=_vadr+1; } if (fdat&_Bit[fbit]) { _vadr[0]=_vadr[0]|_Bit[vbit]; } else { _vadr[0]=_vadr[0]&~_Bit[vbit]; } fbit=fbit+1; vbit=vbit+1; } }
★2020/02/14 変更 最新版にアップデート

 今回は久々にYouTubeに動画をアップしたので貼っておきます。
 カメラで撮影する場合、周りが暗いと赤色と橙色の差が判り辛くなったので結構明るいところで撮影しています。このため動画ではLEDがうす暗いように見えますが、実際には十分な明るさです。

 もっと明るくしたい場合には5V電源をLEDボード側に給電し、PICは5Vからレギュレータで降圧した3.3Vで動かすという手もあります。
 この場合、PIC側の3.3VとLEDボード側の5Vが短絡しないように注意してください。
 LEDボード側のICはHCシリーズなので問題ないはずですし、PIC側は出力だけなので5Vトレラントなピンを使う必要もありません。




 最後に今回作成したデモプログラムを自動起動状態に設定したPIC24FJ64GA002のヘキサファイルは以下からダウンロード可能です。
 商用利用以外であれば自由に使用可です。(自分のための覚書という意味もあるw)
 自動起動になっていますがエスケープキーでプログラムを中断できます。

PIC24FJ64GA002_LedMatrix_20200212.zip
★2020/02/12 最新版にアップデート


[TOP] [ 前へ ] 連載記事 [ 次へ ]

nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー