少し前に秋月電子のジャンク品で、32x16ドットLEDマトリクス表示装置パーツセットというものを買いました。
32x16もあれば色々と表現できそうなので、ちょっと触ってみました。
参考にさせていただいた記事はこちら。
結論から言うと、ジャンク品ということもあり、上側半分の表示がうまく出来ませんでした。
こんな感じ。
とても勉強になったので、何をやったのかを残しておこうと思います。
配線などは付属のデータシートの通りです。
実際の接続の様子はこんな感じ。
今回はArduinoではなくEPS32を使用しました。
これに文字を映し出そうとすると、どうすればよいのか考えました。
16x16で1文字として、2文字出そうと思います。
フォントのデータを読み込ませるとか高度なことはせず、手書きの文字をデータにして映し出す方法を取りました。
まずExcelで下書きをします。
0,1でざっくりと描いていきます(1がLEDを付けたいところ)。
私の推し「真野あゆみ」さんから拝借して、「まの」の2文字にしました。
この表示器は、1列ごとに表示させていく方式のようなので、1列ずつ表示を16bitの数字に直します(0x0000の形式)。
これら16行分をunsigned intで配列に取り込みます。
1文字につき1つの配列にしました。
プログラムはこのようにしました。
Arduino IDEで書いて、ESP32に書き込みました。
// 3つの16ビットデータをシリアル出力し、ラッチとクロックでLED制御するプログラム
// 初期データ(16ビット分)
unsigned int sin1 = 0x0001; // 縦方向(1ビットだけON)
unsigned int sin2[]={0x0000,0x0100,0x1FF0,0x0100,0x0100,0x1FF0,0x0100,0x0100,0x0100,0x3d00,0x4300,0x41C0,0x2130,0x1E08,0x0000,0x0000}; // 横方向1(配列)ま
unsigned int sin3[]={0x0000,0x0000,0x0000,0x0000,0x07C0,0x0930,0x1108,0x2108,0x2104,0x2104,0x2104,0x2104,0x2208,0x1C10,0x0000,0x0000}; // 横方向2(配列)の
// Arduinoのデジタルピンの割り当て ESP32
const int PIN_STROBE = 2; // ストローブ信号(データ書き込みの開始合図)
const int PIN_SIN1 = 3; // データ出力1(sin1)
const int PIN_SIN2 = 4; // データ出力2(sin2)
const int PIN_SIN3 = 5; // データ出力3(sin3)
const int PIN_LATCH = 16; // ラッチ信号(出力の確定) 6
const int PIN_CLOCK = 17; // クロック信号(ビットシフトの同期) 7
void setup() {
// シリアル通信初期化(デバッグ用)
Serial.begin(9600);
Serial.println("setup OK");
// 各ピンを出力モードに設定
pinMode(PIN_STROBE, OUTPUT);
pinMode(PIN_SIN1, OUTPUT);
pinMode(PIN_SIN2, OUTPUT);
pinMode(PIN_SIN3, OUTPUT);
pinMode(PIN_LATCH, OUTPUT);
pinMode(PIN_CLOCK, OUTPUT);
}
// 指定されたピンに、1ビット(最下位ビット)の値を出力する関数
void bitchecker(unsigned int sin0, int portnum) {
sin0 &= 0x0001; // 最下位ビットだけ抽出
if (sin0 == 1) {
digitalWrite(portnum, HIGH);
} else {
digitalWrite(portnum, LOW);
}
}
void loop() {
for(int j =0; j<16; ++j){
// 一時変数にコピー(ループ中に元のデータをシフトするため)
unsigned int tmp_sin1 = sin1;
unsigned int tmp_sin2 = sin2[j];
unsigned int tmp_sin3 = sin3[j];
// ラッチとストローブを一旦HIGHにして転送準備
digitalWrite(PIN_LATCH, HIGH);
digitalWrite(PIN_STROBE, HIGH);
// 16ビット分、1ビットずつ出力
for (int i = 0; i < 16; ++i) {
digitalWrite(PIN_CLOCK, LOW); // クロックをLOWにして準備
bitchecker(tmp_sin1, PIN_SIN1); // sin1の1ビットを出力
bitchecker(tmp_sin2, PIN_SIN2); // sin2の1ビットを出力
bitchecker(tmp_sin3, PIN_SIN3); // sin3の1ビットを出力
delayMicroseconds(50); // 少し待機
digitalWrite(PIN_CLOCK, HIGH); // クロックをHIGHにしてシフト動作
tmp_sin1 >>= 1; // 次のビットへシフト
tmp_sin2 >>= 1;
tmp_sin3 >>= 1;
delayMicroseconds(50); // 安定化のための待機
}
// ラッチをLOWにして、出力を確定
digitalWrite(PIN_LATCH, LOW);
// ストローブをLOWに戻す(データ確定)
digitalWrite(PIN_STROBE, LOW);
delayMicroseconds(50);
// 表示をゆっくり変えるためのディレイ
delay(100);
// sin1の表示ビットを左へ1ビットシフト(縦方向にLEDを動かす)
sin1 <<= 1;
}
// 全ビットが0になったら最初の状態に戻す(ループ)
sin1 = 0x0001;
}
これは16x16のドットが2つ並んでいるものですが、もっと並べることもできるようです。
完全に動かなかったのは少し残念ですが、勉強用に買ったので目的は果たしました。