2017-10-10 18:35 | カテゴリ:PIC応用回路
プラモのフライングサブの電飾改造もなんとか完成し、ほっと一息ついています。
次は何を、と考えていたら、机の隅に先日にスクロール表示テストまで終わったマトリクスLEDが目につきました。
テストが終わっただけで、何か完成品に仕上げたわけでもなく、どうしようかと。

(MTX01)
MTX01.jpg

この8x8ドットのLEDが4個並んでセットされたLEDモジュールが四個。
制御は行単位のドットデータ(横)を128ビット分(16バイト)を送信して、LOAD信号を与えると指定された行のLEDバッファに読み込まれて、そこのLEDが点滅します。

(MTX02)
MTX02.jpg

前回は、ASCII文字をスクロール表示されるところまでテストしました。

(MTX03)
MTX03.jpg


続きは、、、、


そもそも、何を製作しようかという目標がなかなか定まりません。
16個のマトリクスLEDを横に並べても、どうにも使い勝手が悪そうです。
そこで、8x8のドットマトリクスLEDを4x4にまとめ、32ドットx32ドットのディスプレイにしてみました。

(MTX04)
MTX04.jpg


これで見かけ上は、32x32ドットのマトリクスLEDとなりました。
裏側は、4個のモジュールを結線しているだけです。

信号は、+5V、GND、シリアルデータ入力(反対側は出力)、通信用クロック、ラッチ信号の5本です。

(MTX05)
MTX05.jpg

この疑似32x32ドットLEDを使いこなそうとするには、いくつかの制御関数が必要になります。
まずは、基本的な制御方法を決めなければなりません。

アイデアとしては、

1)メモリ上にLEDのドットに対応した配列関数を定義して、LEDのドットのON/OFFをそこに書き込み、
2)メモリ上の配列への書き込みや読み出しは、LEDのマトリクスの座標(X,Y)で指定する。
3)その配列をまとめてLEDにシリアル送信して、LEDに表示させる。


と、考えます。

1)ですが、以下の様な配列を定義します。

unsigned char Data_Buff[4][4][8] = 0; // 全ドットデータ用バッファ

配列変数は、4個のLED、それを4個集めたブロック、一つのLED内の8ドットを一行として、8行分。

2)の処理。上記1)定義の配列で、ドットのONを実施します。


//-------------------------------------------------
// 指定x,yのドットをONにする(既にOnの際はそのまま)
//-------------------------------------------------

void Dot_On(int x, int y) {
unsigned char Dot_Data, tp = 1;
int L, N, M, K;

if ((x < 0) | (x > 31) | (y < 0) | (y > 31)) return; // Over scale
N = x / 8;
L = y / 8;
M = y % 8;
//K = 7 - (x % 8);
K = x % 8;
Dot_Data = Data_Buff[L][N][M];
tp = tp << K;
Data_Buff[L][N][M] = Dot_Data | tp;
}


3)で、Data_Buff[L][N][M]をLEDへ転送する。


//-----------------------------------------
// Data_Buffの配列全データをLEDに送出する
//-----------------------------------------

void Data_Buff_Out(void) {
int l, m, n;
for (m = 0; m <= 7; m++) {
Load_data = 0;
for (l = 0; l <= 3; l++) {
for (n = 3; n >= 0; n--) {

SPI_Exchange8bit((unsigned char) (m + 1));//表示するLED内のドットの行を指示
SPI_Exchange8bit(revers_bit8(Data_Buff[l][n][m]));//表示データ

}
}
Load_data = 1;
Load_data = 0;
}
}

と、上記の処理で、任意の点(x、y)のドットを転送できます。

この方法で、実際は問題ないのですが、欠点は、一つのドットを点灯しただけでも、それをLEDに反映させるために、Data_Buff配列内のデータをすべてLEDへ転送しなければならない仕様だということです。

手持ちの時計で計測したら、1024個のLEDドットを1ドット毎に配列に書き込み、全配列をLEDへ転送して表示アップデートするために、約4秒かかりました。

改良案としては、点灯座標(x,y)から、LEDの行(8行中の目的の一行)を計算し、その行データ(4バイト)のみを送信すれば、時間は1/8に節約できそうです。

プログラムを少し変更して、ドットを表示させたy座標の一連のデータのみを出力する様にしました。
その結果、予想通りに処理速度が8倍ほどになりました。

ご参考までに動画を撮りましたので、ご笑覧ください。






関連記事

管理者のみに表示する