SSブログ
English Version

中華製マトリックスLEDキットでLチカ(その2) [PIC]

 「中華製マトリックスLEDキットでLチカ」の記事で書いた中華製32x16の2色のドットマトリックスLEDキットを二つ連結してみました。

 LEDユニットには下の写真の左下にあるようにカスケード接続するための次段ユニットへの出力コネクタが実装されています。
 これを利用すればLEDユニットを容易に多段接続することが可能です。

32x16のDot Matrix LEDユニット


 物理的に連結するためにLEDユニットの基板にある4つのホールを利用した接続パーツを3Dプリンタで作成しました。
 上下のホールの基板の淵からの位置が微妙に異なるので別々に作成しています。

LEDユニット連結パーツ


 制御する上では1ラインに対して32ドット分のデータを送信していた部分を64ドット分に変更すればいいのですが、1ユニットの時には先頭のドットが表示面の左端に表示されていたので下の写真のように連結用のケーブルは長くなってしまいます(どうしてこのような設計にしたのか疑問)。
 ソフト的に処理することで左右のユニットを逆にして短いケーブルで接続することも可能ですがケーブルの長さだけの問題なので下の写真のように接続することにしました。

 尚、回路図や制御方法に関しては冒頭で書いた記事を参照してください。

LEDユニットの連結(back面)


 表示面が下の写真になります。これくらいのサイズであれば電光掲示板としても使えそうですね。

LEDユニットの連結(front面)


 YouTubeにサンプル動画をアップしたので貼っておきます。
 カメラ動画では、橙色と赤の区別が付きにくく、表示タイミングと録画時のフレームタイミングの関係で少しカクカクしたように見えたり、最後の部分では横方向にドットが広がって見えますが肉眼では綺麗に見えています。


https://youtu.be/p2LM8fFhKdA


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

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

中華製マトリックス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) 
共通テーマ:趣味・カルチャー

PICkit3でコネクトエラー [PIC]

 久々にPICkit3で PIC24FJ64GA004 に書き込みを行おうとしたら

The target circuit may require more power than the debug tool can provide. An external power supply might be necessary. Connection Failed.

のエラーが出て接続できず・・・・
電源はPICkit3から供給していますが接続されているのはPIC単体のみに近い状態なので電流不足は考えにくい状況なのですが・・

 このエラーは以前も何度か出ていましたが PICkit3 からの供給電圧を 3.15Vに下げることで問題回避できていました。
 今回は電圧を下げても状況が変わらず、予備のPICkit3に変えたり、 PICを PIC24FJ64GA002 に変更しても変化なし・・orz

 しばらく悩んだけど MPLAB IPE を立ち上げてからPICkit3をパソコンに接続したらPICにコネクトできました ^^
 尚、IPEのバージョンは3.35です。

 なんなんでしょうねぇ~

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

I2Cロガーの製作 [PIC]

 I2Cで接続される複数のセンサのデータを連続的に保存したいことからI2Cロガーを作ってみました。
 パソコンにUSBケーブルで接続し、スクリプトで制御可能な市販されているI2Cインターフェースボックスがありますが、サンプリング周期を一定にして連続してデータを取得するのが困難であることから、このI2Cインターフェースボックスの中身をPIC24FJ64を使った簡単なボードに入れ替えます。

 PIC24FJ上ではpicleコンパイラも動作するのでスクリプト感覚でデータ取得処理を記述できます。
 ファイルへの保存はTeraTermのマクロで実現する予定です。
 回路図は下図のとおりでUSBシリアル変換は安易に市販の変換基板(FT232RL)を使い必要最小限の信号をコネクタに出しています。

回路図


 この程度の回路であれば片面基板で対応可能でCNCルーターでPCB基板を作成しました。ガラエポの両面基板と比べれば難易度はかなり低いですが、後述のように手抜きしてジャンパー接続することに ^^;

 今回もいつものように DesignSparkPCB でパターンを作成しました。

DesignSparkPCBでパターン作成


 次にDesingSparkPCBで出力したガーバーデータを FlatCAM に読ませて、CNC用のNCファイルを作成します。

FlatCAMでのNCファイル作成


 PCB作成の最後の工程として作成したNCファイルを使ってCNCルーターで生基板を切削し、ホームメイドのプリント基板を作ります。

CNCルーターでの生基板の切削


 CNCで切削後の導通チェックではOKでしたが、ソルダーレジスト塗布後、グランドとショート状態のパターンがあったのでパターンカットし、ジャンパーで接続しました^^;
 今回はベーク版の片面基板ということで手抜きしてCNCでの切削後のヤスリ掛け工程を省略してしまったため、レジスト塗布時に切削した溝に残っていた銅層の切りくずでショートしてしまったようです(今後気を付けねば)。
 まぁ、これくらいの回路であれば、PCB製造業者に依頼して何週間か待つよりは、CNCでサクッと作れるので便利です。^^
(汎用基板で作った方が早いけどそれは言わない約束ということで・・・w)

★2019/11/17 追記
 ソルダーレジスト塗布方法を記載した記事へのリンク追加

PCB半田面


 部品面は下の写真のとおりです。後述するようにケースがアルミ製なのでケースとの接触防止のためにUSBコネクタの上にマスキングテープを張っています。
 また、OneBitLoaderはコンソール接続用のシリアル通信に対応させた2線式のものを入れています。

PCB部品面


 冒頭で書いたようにケースはI2Cインターフェースボックスのものを流用することにして、コネクタ部とUSB&LED部のキャップを3Dプリンタで作成しました。

コネクタ側のキャップ


USB&LED側のキャップ


 ケースに収めた外観が下の写真です。

ケースに収納した写真


 おまけとして、I2Cでアドレス出力しACK応答の有無で接続されているI2Cセンサのアドレスをスキャンした結果を付けておきます。
 接続しているのは「I2C通信実験 照度センサー」の記事で書いた照度センサです。

I2Cスキャン実行例
:\\ +B000-B670 # Life Game in picle language +B800-BEA5 # I2C check +C000-CAD1 # I2C test Light Sensor(BH1750) :\<$b800 1701 :run 00 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 10 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20 : -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- 30 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70 : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- :


[TOP] [ 前へ ] 連載記事 [ 次へ ]
nice!(0)  コメント(0) 
共通テーマ:趣味・カルチャー

PIC24FJ64GAでGAME言語(その9) [PIC]

 PIC24FJでちょっとした実験などを行う時は、最近ではGAME言語ではなく、picle言語(セルフコンパイラ)を使っていますが、久々にGAME言語ネタです。

 昔の本とかを少し整理していたところ、GAME言語をハンド逆アセンブルしていた時のメモが出てきました・・懐かしぃ

 C9のニーモニック欄がそのまま「C9」になっているところがある・・頭の中ではRETもC9も等価で区別が無かったのでしょうw

 最後の方は条件ジャンプ等、ちょっと紛らわしい部分だけニーモニックを書いていて頭の中ではニーモニックと等価な命令にはニーモニックすら書いてない・・w
 あれ、8640H部分、ちょっと間違えてますねぇw でもマシン語部分から脳内ではニーモニック化できているので問題ないでしょうw

 因みにKEIOのデータシート用紙を使っていますが、この頃はある理由によりこの紙の入手性が良かったためで、私はKEIOの関係者ではございません。

GAME言語ハンドディスアセンブル


★2019/08/15 追記
3チップ構成Pic24CPMマイコン(その7)GAMEコンパイラ」の記事でCP/M-80版のGAMEインタプリタ&コンパイラについて記載しました。


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

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