2017-04-26 10:48 | カテゴリ:PIC応用回路
先日来、動作実験を続けていますこのドットマトリクスLEDですが、新たに3個のモジュールを再注文し、それが到着しましたので、4個LEDx4モジュールの、合計16LEDのシリアル接続にトライしました。
また、それに合わせて、ASCII文字のスクロール表示ソフトを改良し、表示に便利な関数を作成しましたので、併せてご紹介したいと思います。

(MTXLED001)
MTXLED001.jpg


続きは、、、

これらのLEDは、夫々5本の信号線で接続します。
+5V、GND、CLOCK、CSは共通ですが、DataOutは次のLEDのDataInに接続します。

(MTXLED002)
MTXLED002.jpg


私は、5cm程のリード線で接続しましたが、ここにコネクターを利用して、4個のLEDをシリアルに接続するのもよいと思いますが、夫々の利用目的に応じてつなげます。
今回のソフトは、シリアル接続ですので、4個のLEDモジュールを2個シリアル接続の上、二段重ねにして表示させる事には対応していません。
あくまで、8ドットx128ドットのスクリーンの動作となります。

今回のPICは、16F1716を使用しました。
理由は、RAMが1KWあるからです。
LEDに表示させるデータを記憶するデータの配列要素が大きいので、昔からのPIC(16D876Aなど)では無理だったので。
プログラムメモリーは、8KWで十分です。(ASCIIフォントも入りました)

PICとLEDモジュールとの接続は、以下の通りです。

(PICの端子) (LEDモジュール信号)

V(5V) ---->VCC ---->次のLEDのVCC
VSS(GND)---->GND ---->次のLEDのGND
RC3(CLK)---->CLOCK ---->次のLEDのCLOCK
RC4(SDO)---->DataIn
RA0(出力) ---->CS ---->次のLEDのCS
 DataOut---->次のLEDのDataIn

RC0(出力)---->別途動作確認用に小さなLEDを300-500Ωくらいの抵抗を通してGNDにつなげてください。
PICが動作開始した際に、1秒ほど点滅します。



LEDモジュールの接続順ですが、左から


(PIC)->(LED1)->LED2)->LED3)->LED4)

とします。
これは、文字の上下と流れる方向で、このように初期設定しました。
最初にプログラムをLEDモジュール1個用から4個用に修正してテストしたら、何やらドット表示が1つおきに表示されてしまいました。

(MTXLED003)
MTXLED003.jpg




そこを修正し、4個を接続して初テストしました。


(ScrlErr)



おーっ!
ちゃんとスクロールしてる、、、と思ったら、何か変です。
文字スクロールの方向は、右から左であっているのですが、表示するモジュールの順が左から右になっています。

これは、データを送り出す順番とLEDモジュールの並び順があっていないからです。
早速修正しました。


(ScrlOK)



そして、肝心のPICのプログラムはこちらです。

(GoogleDrive)
XC8のプロジェクト
https://drive.google.com/file/d/0B4yxpgEEEsTVM1ZnU2FYSlhaZ00/view?usp=sharing

GoogleDriveに入れました。
ZIPしています。
MPLABXのXC8で製作しています。
解凍してプロジェクトをMPLABXに読み込み、PICKit3(なんちゃってバージョンですが)を接続して、書き込みます。


このままで、デモ表示がはじまります。
最初に、動作確認用のLEDが1秒ほど点滅した後、全LEDモジュールが一瞬点灯し、その後、デモ表示文字列が右端のLEDから順次左へと表示・スクロールされていきます。

このプログラムの使用方法ですが、MPLABXのXC8で、MCC(コードコンフィギュレータ)の使用を前提として、自動作成されたSPIモジュールの制御関数が面倒なことを代行してくれます。
ご自分のプログラムに組み込む際には、この自動作成された関数やヘッダーファイルもちゃんとコピーして組み入れた上で、main()の中の関数もコピーしてください。


(MTXLED004)



あとは、私が作成した

//-------------
// 関数定義
//-------------
void Font_Rot(unsigned char); // フォントデータを右90度回転してbuff_data[]にセット
void LED_clear(void); // LED Space clear
void LED_scrl(void); // LED左方向1ドットスクロール
void LED_disp(void); // mtx_data[]をLEDに転送して表示する
void LED_init(void); // LED MAX7219の初期化(8ドットラインスキャン設定)
void LED_msg(const char *p); //disp_msg[] に文字列をセットして呼び出す
void Buff_clear(void);

の関数のうち、

最初にこれで初期化し

void LED_init(void); // LED MAX7219の初期化(8ドットラインスキャン設定)

この関数を呼び出して、希望する文字(ASCII)を指定するだけです。

void LED_msg(const char *p); //disp_msg[] に文字列をセットして呼び出す


(使用例)

LED_clear();

LED_msg("Ver022");
// 半角カナ文字は、文字化けが生じる事がある
LED_msg("アイウエオ カキクケコ サシスセソ");
LED_msg("This driver software supports numver of serial connected 8x8 dot matrix LED.");
LED_msg("Please visit VividHobby web site.");

文字配列に入れた文字を表示させたいときは、配列名を与えればOKです。


このプログラムは、単にメッセージをスクロール表示するだけですので、問題は、何を表示させるかです。
ゆくゆくは、RaspberryPiにつなげて(プログラムの変更が必要ですが)、WEBから天気やニュースなどを拾って、電光掲示板よろしく、リビングのアクセサリーにできればと思いますが、RaspberryPiもまだ操作を習得していない上に、WEBからデータを取り込む方法もわからないので、当分はお蔵入りです。(笑)






管理者のみに表示する