少し前に秋月電子のジャンク品で、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つ並んでいるものですが、もっと並べることもできるようです。

完全に動かなかったのは少し残念ですが、勉強用に買ったので目的は果たしました。