秋月電子のドット抜け御免マトリクスLEDの動作確認

## はじめに
２０２４年８月ごろから秋月電子で大量に販売されだした **秋月のドット抜け御免マトリクスLEDモージュール** を１０月に購入し、工作して電光掲示板など作り始めました。
![20241004_Aki_MatLED_s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/c3703df6-aafc-431c-bf82-3d61464c7306.jpeg)

ちなみにこの**マトリクスLEDモージュール**は、ネットを検索すると１５年ぐらい前の利用作品が見つかるので少なくとも２０１０年ごろから売られている製品のようです。

![OLD_sample1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/ef5c8042-4400-4b55-932e-a82f1524fdc5.jpeg)

X（旧Twitter）でこの**マトリクスLEDモージュール**を使った製作ブツの動画や画像をあげたところ使い方が分からないという書き込みを見つけたので確認用プログラムを作ってみようと考えました。
確認用プログラムの実行環境は電子工作初心者の人も持っていそうな **Arduino UNO** とその開発環境である **Arduino IDE** にしました。
なお、Arduino UNOを含め、以下の３つのボードを今回の確認プログラムの対象としました。


- Arduino UNO

- STM32F4xx-Nucleo
  「**4xx**」の部分は搭載CPUを表す数字が記されます。
  F400系の**NUCLEO-64**であればどのボードでも動作すると思います。

- MAKER PI RP2040
  Cytron社製のRP2040搭載ボード
 （**RP2040** は ラズパイPicoに使われているCPU）
  https://akizukidenshi.com/catalog/g/g116939/

<<< ちょっとPR >>>
ドット抜け御免マトリクスLEDモジュールを使った製作ブツの紹介です。

- マトリクスLEDモジュール７個使いのRSSニュース表示機
 https://youtu.be/bg-C_dvsK2I

- マトリクスLEDモジュール１２個使いのRSSニュース表示機
 https://youtu.be/gC3v0oRvM4Y

- 秋月電子のドット抜けありますよマトリクスLEDを使った二字熟語問題表示機
 https://youtu.be/GCvzoc3YioQ


## Arduino UNOでの動作確認
Arduino UNOを使ってのマトリクスLEDモジュールを確認するためのハードウェア、ソフトウェアの説明を記します。

### ハードウェア
**Arduino UNO** と書きましたが、実際の試行環境は Arduino UNOコンパチボード しかもっていないので、**Maker UNO**というコンパチボードで確認を行っています。
回路構成やUSBコネクタの違いはありますが使用しているCPUはArduino UNOと同じですし使えるピンも同じなので問題ないと思います。

 Maker UNO - Arduino UNO Compatible
  https://akizukidenshi.com/catalog/g/g116285/

Arduino UNOとマトリクスLEDモージュールの結線は以下のようにします。

| LED側ピン番号 | LED側ピン名 | UNO側 | 意味 |
|:-----:|:------|:------|:------|
| 1 | LED_PWR | 5V | LED用電源 |
| 2 | SIN 1 | 3 (D3) | 縦データ入力 |
| 3 | SIN 2 | 4 (D4) | 横データ入力 (LED1) |
| 4 | SIN 3 | 5 (D5) | 横データ入力 (LED2) |
| 5 | CLOCK | 6 (D6) | クロック入力 |
| 6 | LATCH | 7 (D7) | ラッチ入力 |
| 7 | STROBE | GND| 点灯制御 |
| 8 | IC_PWR | 5V | IC用電源 |
| 9 | GND | GND| GND |
| 10 | GND | GND| GND |

**STROBE** は **GND** 固定で点灯制御は行っていません。

工夫が必要になるのが Arduino UNOから **5V** をマトリクスLEDモージュールの２つのピンへの接続だと思います。Arduino UNO のシールド用のコネクタに 5V は１本しか出ていないためです。
**Maker UNO** の場合には下図赤丸部分のコネクタにも **5V** が出ているのでこのピンを２本目として用いました。
Arduino UNO の回路図を見るとArduino UNO の同じ辺りのコネクタに **5V** が出ているのでこのピンが利用できそうです。
![UNO-Pin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/ccb569fd-cd44-406a-b3c1-5a655a2311a5.jpeg)

また **D2**ピンに GNDへつながるボタンスイッチを設けることで、ボタンを押すごとにマトリクスLEDへ表示されるデータを変更できます。
**Maker UNO**の場合にはボード上に **BUTTON** として用意されているので追加は不要です。

ボタンスイッチ：2 (D2)
![btn_pin.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/a7d3d164-015d-4adf-81ad-084e3d238474.jpeg)

### 参考１
マトリクスLEDモジュールの点灯確認する際、まだピンヘッダなどのはんだ付けはしたくないということがあると思います。
このマトリクスLEDモジュールの基板はスルーホールになっているのでピンヘッダにテンションをかけるだけで通電させることができます。接触不良になりやすいく注意が必要ですが点灯チェックのみであれば有用と思います。
![UNO_Jump1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/a724f769-290b-4f2e-844c-e49f141ab78e.jpeg)
![UNO_Jump2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/a840970c-cfc7-457b-9a3c-6a2d4cb18015.jpeg)
![UNO_Jump3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/afbb9bbd-9c57-4400-bf2f-cb2525c498e7.jpeg)

### 参考２
今後も Arduino UNO環境での動作確認を行う可能性、および、Arduino UNO用シールドのコネクタを有するマイコンボードが各種あり、これらのボードでも動作確認ができるようArduino UNO用シールド向けのユニバーサル基板を使ってマトリクスLEDをシールドとして接続できるよう工作しました。
使用するピンなどは前述の結線と同じですが、IC用電源はマイコンボード（マイコン）により **3.3V** になることがあるので、スライドスイッチで **5V** と **3.3V** を切り替えるようにしてあります。
使用したユニバーサル基板の長さが短かったのでマトリクスLEDモジュールの入力側上下両方の１列ずつ使って上下から信号線にアクセスしています。
配線面の画像は自粛です。

![led_shield.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/f0d9dfd1-84a7-456c-86db-eeea404877f0.jpeg)

![led_shield_side.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/8e15ada9-c5fd-4732-b674-110cfd3cd12c.jpeg)

### ソフトウェア
動作確認用のソフトウェアは以下のgithubへアップしてあるのでダウンロードして使ってください。

https://github.com/Y-Ishioka/UNO_junk_test

いつくかのファイルがありますが、 **UNO_junk_test.ino** ファイルだけでビルドして動かすことができます。
**UNO_junk_test**ディレクトリを作成し、その中に inoファイルを置いてArduino IDEでビルドして使ってください。
Arduino IDEのボード用の設定などはこの記事では省略します。

### ソフトウェアの実行
Arduino UNOとマトリクスLEDモジュールを結線し、前述のプログラムのビルドが終わったらプログラムをボードに書き込みます。
Arduino IDEの操作で「書き込み」ボタンを押していた場合、既にプログラムの書き込みまでが行われていると思います。

プログラムの書き込みが完了するとすぐにプログラムが実行されます。
結線やビルド、書き込みが正常に終了していれば、以下のような１６ｘ１６ドットの赤い■がマトリクスLEDの右から左で移動しながら表示され、これが繰り返されます。
ドット抜けがある場合、そのドットが消灯したままとなりドット抜けの確認ができます。
![disp_pat1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/72d30642-3b26-4e91-a1fa-d23b5105af95.jpeg)

ドット抜けありの例
![disp_ng.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/14d95e5f-5998-482b-8ce3-4f0fb54eceac.jpeg)

また、D2ピンを使ったボタンスイッチを付けた場合、このボタンを押すことで表示される画像が以下のように変化します。

![disp_pat2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/b669a4de-ec0e-4b58-9dd5-e993bd50694b.jpeg)
　↓
![disp_pat3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/8b7d92f3-1f1f-428e-8212-486b6b4c37a9.jpeg)
　↓
![disp_pat1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/02bfff53-9b31-4dd0-b869-32ba5cc7a118.jpeg)
　：

### ソフトウェアの概要
前述した **UNO_junk_test.ino** ファイルのポイントとなる部分を説明します。
なお説明中の行番号はソースプログラムの修正などにより前後する場合があります。

- 5～17行目
各種マクロ定義、処理で使用する定数などの定義をしています。

- 20行目～　adr_tbl[][] 
マトリクスLEDモジュールの **SIN1** へ出力するデータ。
SIN2、SIN3へ出力するデータをマトリクスLEDのどの行に割り当てるかを指定するのに使用します。

- 41行目～　disp_pattern0[][]
マトリクスLEDへ表示する１６ｘ１６ドットのデータで、起動後最初に表示される全点灯のパターンです。
１要素が１ドットを表し、「 1 」で点灯、「 0 」で消灯を意味します。

- 61行目～　disp_pattern1[][]
ボタンスイッチを押した際２番目に表示される左先が尖ったパターンです。

- 81行目～　disp_pattern2[][]
ボタンスイッチを押した際３番目に表示される「赤」のパターンです。
disp_pattern0、disp_pattern1、disp_pattern2の内容を変更することで任にのパターンを表示させることができます。

``` c++
unsigned char  disp_pattern2[ DEF_LED_HIGHT ][ DEF_LED_WIDTH ] = {
 /* 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 */
  { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
  { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
  { 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0 },
  { 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0 },
  { 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0 },
  { 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1 },
  { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
  { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 },
  { 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 },
};
```

- 127行目～　dev_led_clr_out()
マトリクスLEDの表示をクリアする処理。
処理としてはマトリクスLEDの１行目の SIN2、SIN3へ「 0 」を出力します。
１ドット分のデータを出力後 **CLOCK** を 0 -> 1 -> 0 と変化させることでマトリクスLEDモジュールへデータを取得させます。
１行１６ドットを出力し終えたら **LATCH** を 1 -> 0 -> 1 と変化させることでマトリクスLEDへデータを表示（この関数の場合には消灯）します。
このマトリクスLEDモジュールはダイレクトドライブ方式で１度に表示できるのは１行分のみになります。
このため、表示のクリアは任意の１行に対して行えば、他の行は表示されていないためマトリクスLED全体の表示がクリアされたことになります。

``` c++
void  dev_led_clr_out( void )
{
    int  wd;

    for( wd=0 ; wd<DEF_LED_WIDTH ; wd++ ) {
        digitalWrite( SIN1PIN, adr_tbl[0][wd] );

        digitalWrite( SIN2PIN, 0 );
        digitalWrite( SIN3PIN, 0 );

        usec_delay( 1 );
        digitalWrite( CLKPIN, 1 );
        usec_delay( 1 );
        digitalWrite( CLKPIN, 0 );
    }

    digitalWrite( LATPIN, 0 );
    usec_delay( 1 );
    digitalWrite( LATPIN, 1 );
}
```

- 149行目～　setup()
Arduinoの初期化用関数で、使用する各ピンの入出力の設定と初期値の出力、マトリクスLEDのクリアを行います。

- 173行目～　loop()
Arduinoのメインループ用関数で、この中で表示パターンの移動、ボタンスイッチの入力チェックとパターンの切り換えを行います。

- 180～192行目
どの表示パターンを使うかを決め、そのパターンのポインタを設定します。

- 194～240行目
表示パターンの表示位置を表す変数 disp_pos から決まる位置へデータをSIN2、SIN3へ出力します。

ループ hi が１６行分の繰り返し、ループ wd が１行１６ドット分の繰り返しです。

``` c++
  for( hi=0 ; hi<DEF_LED_HIGHT ; hi++ ) {
    for( wd=0 ; wd<DEF_LED_WIDTH ; wd++ ) {
```

SIN2へ出力するための判定処理です。
表示位置の計算結果から 0以上 DEF_LED_WIDTH (16)未満でSIN2へ所定の位置のパターンデータを出力します。
この範囲外の場合、「 0 」を出力します。

``` c++
      /* for SIN2 */
      pos = pat_pos2 - wd;
      if( pos >= 0 && pos < DEF_LED_WIDTH ) {
        digitalWrite( SIN2PIN, (uint8_t)(*pattern_pnt)[hi][pos] );
      } else {
        digitalWrite( SIN2PIN, 0 );
      }
```

SIN3へ出力するための判定処理です。
表示位置の計算結果から 0以上 DEF_LED_WIDTH (16)未満でSIN3へ所定の位置のパターンデータを出力します。
この範囲外の場合、「 0 」を出力します。
SIN2と同じような判定処理になっていますが、位置計算の初期値が異なるためSIN2とは異なる出力結果となります。

``` c++
      /* for SIN3 */
      pos = pat_pos3 - wd;
      if( pos >= 0 && pos < DEF_LED_WIDTH ) {
        digitalWrite( SIN3PIN, (uint8_t)(*pattern_pnt)[hi][pos] );
      } else {
        digitalWrite( SIN3PIN, 0 );
      }
```

- 224～230行目
ボタンスイッチの押下の有無をチェックし、押された場合にはパターンを変更する処理です。
また、押されたボタンが離されるまで多重に押されたと判定しないための処理も行っています。

``` c++
    btn_stat = digitalRead( BTNPIN );
    if( btn_stat == LOW && btn_flag == 0 ) {
      if( ++pat_num >= DEF_MAX_PAT ) {
        pat_num = 0;
      }
      btn_flag = 1;
    }
```

- 232～235行目
SIN1で指定した行へ表示を行うための **LATCH** を 1 -> 0 -> 1 へ変化させる処理です。
LATCHの処理後、LEDを点灯させるための時間待ちを行います。
この時間の設定によりLEDの輝度や点滅のチラツキ具合が変化します。

``` c++
    digitalWrite( LATPIN, 0 );
    usec_delay( 1 );
    digitalWrite( LATPIN, 1 );
    usec_delay( DEF_BRIGHT_TIME );
```

- 238～240行目
ボタンスイッチが離されたかをチェックする処理です。
簡易ですがチャタリングを防止するため押されたタイミングと同一のloop()関数処理では離れたかのチェックはしないようにしています。

``` c++
  if( btn_flag != 0 && btn_stat == HIGH ) {
    btn_flag = 0;
  }
```


- 242～247行目
表示パターンを左へスライドさせるための変数の更新処理です。

``` c++
  if( --disp_slide <= 0 ) {
    if( --disp_pos <= 0 ) {
      disp_pos = DEF_INIT_POS;
    }
    disp_slide = DEF_SLIDE;
  }
```

- 249行目
ループから抜ける際にいったんマトリクスLEDの（行の）表示をクリアします。
loop()関数を抜ける前に表示をクリアしないと、loop()関数外の処理時間が不明なため最後に表示した行（このプログラムの場合、最下位の行）の表示される時間が他の行より長くなり、結果として１行だけ明るく光ることになります。
これを避けるためにloop()関数の最後でマトリクスLEDへの表示をクリアしてから関数を抜けます。

``` c++
  dev_led_clr_out();
}
```

ソフトウェアの概要は以上となります。


## STM32F4xx-Nucleoでの動作確認
STM32F4xx-Nucleo-64を使ってのマトリクスLEDモジュールを確認するためのハードウェア、ソフトウェアの説明を記します。

### ハードウェア
STM32F4xx-Nucleo-64のうち手元にあった STM32F411-Nucleoを使って動作確認を行いました。
NUCLEO-64シリーズにはボード上にArduino UNO用シールドソケットがあり、Arduino IDEでソフトを作成する場合にはD3～D7ピンはArduino UNOと同一の番号表記でシールドソケットの同じ位置を指定できるので、Arduino UNO用のプログラムをそのまま利用できます。
![f411-nucleo1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/259fc540-4794-4bbe-a503-dc3478190c68.jpeg)

また、NUCLEO-64にはボード上にプッシュスイッチがあり、PC13ポートに割り当てられているのでボタンスイッチのピン番号はこのポートへ変更します。
STM32F4xxシリーズの各ポートの電圧は **3.3V** なので、IC用電源ピンには **3.3V** への変更が必要です。

| LED側ピン番号 | LED側ピン名 | NUCLEO-64側 | 意味 |
|:-----:|:------|:------|:------|
| 1 | LED_PWR | 5V | LED用電源 |
| 2 | SIN 1 | 3 (PB3) | 縦データ入力 |
| 3 | SIN 2 | 4 (PB5) | 横データ入力 (LED1) |
| 4 | SIN 3 | 5 (PB4) | 横データ入力 (LED2) |
| 5 | CLOCK | 6 (PB10) | クロック入力 |
| 6 | LATCH | 7 (PA8) | ラッチ入力 |
| 7 | STROBE | GND| 点灯制御 |
| 8 | IC_PWR | **3.3V** | IC用電源 |
| 9 | GND | GND| GND |
| 10 | GND | GND| GND |

ボタンスイッチ：**PC13**

### ソフトウェア
動作確認用のソフトウェアは以下のgithubへアップしてあるのでダウンロードして使ってください。

https://github.com/Y-Ishioka/STM_junk_test

使用方法やプログラムの構成は Arduino UNO用と同じです。
以下に差異部分を説明します。

- 12行目
ボタンスイッチはNUCLEO-64のボード上にあるボタンを使うためポート番号の指定を変更しました。

``` c++
#define BTNPIN          PC13
```

- 16行目
STM32F4xxの方がArduino UNOより処理速度が速いのでLEDの点灯時間を定義しているマクロ **DEF_BRIGHT_TIME** の値を大きくしました。

``` c++
#define DEF_BRIGHT_TIME 10000
```

Arduino UNO用のプログラムとの違いは以上です。


## MAKER PI RP2040での動作確認
MAKER PI RP2040を使ってのマトリクスLEDモジュールを確認するためのハードウェア、ソフトウェアの説明を記します。
なおMAKER PI RP2040 にはGroveコネクタと接続ケーブルが付属していてマトリクスLEDモジュールと接続しやすいことから MAKER PI RP2040を使いましたが、ラズパイPicoやラズパイPico2でも問題なく動作確認できると思います。ただしラズパイPico2はRP2040より高速なCPUが使われているのでLEDの点灯時間の調整が必要かもしれません。

### ハードウェア
MAKER PI RP2040にはArduino UNO用シールドソケットはなく、７個のGroveコネクタがありここからGPIOと3.3V、GNDをマトリクスLEDモジュールと接続できます。
**5V** はGroveコネクタからは取り出せませんがサーボモータ用のコネクタに 5Vが出力されているので、ジャンパーケーブルを使ってこのピンとマトリクスLEDモジュールを接続します。
![maker_pi_rp2040.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/ac13bc79-9d41-42c1-b898-5950898a9c76.jpeg)

また、MAKER PI RP2040にはボード上にプッシュスイッチがあり、GP20ポートに割り当てられているのでボタンスイッチのピン番号はこのポートへ変更します。
MAKER PI RP2040もSTM32F4xxシリーズと同様に各ポートの電圧は **3.3V** なので、IC用電源ピンには **3.3V** への変更が必要です。

| LED側ピン番号 | LED側ピン名 | MAKER PI RP2040側 | 意味 |
|:-----:|:------|:------|:------|
| 1 | LED_PWR | 5V | LED用電源 |
| 2 | SIN 1 | 0 (GP0) | 縦データ入力 |
| 3 | SIN 2 | 1 (GP1) | 横データ入力 (LED1) |
| 4 | SIN 3 | 2 (GP2) | 横データ入力 (LED2) |
| 5 | CLOCK | 3 (GP3) | クロック入力 |
| 6 | LATCH | 4 (GP4) | ラッチ入力 |
| 7 | STROBE | GND| 点灯制御 |
| 8 | IC_PWR | **3.3V** | IC用電源 |
| 9 | GND | GND| GND |
| 10 | GND | GND| GND |

ボタンスイッチ：**20 (GP20)**
![maker_pi_rp2040_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/32e207de-a95a-494a-9689-d9d4631b3b0a.jpeg)

### ソフトウェア
動作確認用のソフトウェアは以下のgithubへアップしてあるのでダウンロードして使ってください。

https://github.com/Y-Ishioka/MakerPi_junk_test

使用方法やプログラムの構成は Arduino UNO用と同じです。
以下に差異部分を説明します。

- 5～11行目
ポート番号を変更しました。

``` c++
#define SIN1PIN         0
#define SIN2PIN         1
#define SIN3PIN         2
#define CLKPIN          3
#define LATPIN          4

#define BTNPIN          20
```

- 15行目
MAKER PI RP2040の方がArduino UNOより処理速度が速いのでLEDの点灯時間を定義しているマクロ **DEF_BRIGHT_TIME** の値を大きくしました。

``` c++
#define DEF_BRIGHT_TIME 300
```

Arduino UNO用のプログラムとの違いは以上です。


## 最後に
表示パターンをスライドさせているため位置決め処理が少し分かりにくかったかもしれませんが、それ以外はGPIOのみのアクセスでかなりシンプルに書いてあるつもりです。
購入後、未使用のドット抜け御免マトリクスLEDがありましたら、ドット抜けの有無の確認を兼ねて動作確認されてはいかがでしょうか。

あと、「はじめに」で少しＰＲしましたが ドット抜け御免マトリクスLEDモジュールを使った製作ブツをいくつか作り、その動画をYoutubeへアップしてあります。
ぜひ、のぞいていってください。
これらの説明記事は今後少しずつQiitaへ載せていきたいと考えています。

- マトリクスLEDモジュール７個使いのRSSニュース表示機
 https://youtu.be/bg-C_dvsK2I

- マトリクスLEDモジュール１２個使いのRSSニュース表示機
 https://youtu.be/gC3v0oRvM4Y

- 秋月電子のドット抜けありますよマトリクスLEDを使った二字熟語問題表示機
 https://youtu.be/GCvzoc3YioQ

- ESP32+秋月電子のドット抜けありますよマトリクスLEDのニュース表示 Ver1
 https://youtu.be/zxJrbvou328

- ESP32+秋月電子のドット抜けありますよマトリクスLEDのニュース表示 Ver2
 https://youtu.be/RbTdOlkaAG8

以上