はじめに
2024年8月ごろから秋月電子で大量に販売されだした 秋月のドット抜け御免マトリクスLEDモージュール を10月に購入し、工作して電光掲示板など作り始めました。
ちなみにこのマトリクスLEDモージュールは、ネットを検索すると15年ぐらい前の利用作品が見つかるので少なくとも2010年ごろから売られている製品のようです。
X(旧Twitter)でこのマトリクスLEDモージュールを使った製作ブツの動画や画像をあげたところ使い方が分からないという書き込みを見つけたので確認用プログラムを作ってみようと考えました。
確認用プログラムの実行環境は工作初心者の人も持っていそうな Arduino UNO とその開発環境である Arduino IDE にしました。
なお、Arduino UNOを含め、以下の3つのボードを今回の確認プログラムの対象としました。
-
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モジュール7個使いのRSSニュース表示機
https://youtu.be/bg-C_dvsK2I -
マトリクスLEDモジュール12個使いの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 | D3 | 縦データ入力 |
3 | SIN 2 | D4 | 横データ入力 (LED1) |
4 | SIN 3 | D5 | 横データ入力 (LED2) |
5 | CLOCK | D6 | クロック入力 |
6 | LATCH | D7 | ラッチ入力 |
7 | STROBE | GND | 点灯制御 |
8 | IC_PWR | 5V | IC用電源 |
9 | GND | GND | GND |
10 | GND | GND | GND |
STROBE は GND 固定で点灯制御は行っていません。
工夫が必要になるのが Arduino UNOから 5V をマトリクスLEDモージュールの2つのピンへの接続だと思います。
Arduino UNO のシールド用のコネクタに 5V は1本しか出ていないためです。
Maker UNO の場合には下図赤丸部分のコネクタにも 5V が出ているのでこのピンを2本目として用いました。
Arduino UNO の回路図を見るとArduino UNO の同じ辺りのコネクタに 5V が出ているのでこのピンが利用できそうです。
また D2ピンへ GNDへつながるボタンスイッチを設けることで、ボタンを押すごとにマトリクスLEDへ表示されるデータを変更できます。
Maker UNOの場合にはボード上に BUTTON として用意されているので追加は不要です。
参考
今後も Arduino UNO環境での動作確認を行う可能性、および、Arduino UNO用シールドのコネクタを有するマイコンボードが各種あり、
これらのボードでも動作確認ができるようArduino UNO用シールド向けのユニバーサル基板を使ってマトリクスLEDをシールドとして接続できるよ工作しました。
使用するピンなどは前述の結線と同じですが、IC用電源はマイコンボード(マイコン)により 3.3V になることがあるので、スライドスイッチで 5V と 3.3V を切り替えるようにしてあります。
使用したユニバーサル基板の長さが短かったのでマトリクスLEDモジュールの入力側上下両方の1列ずつ使って上下から信号線にアクセスしています。
配線面の画像は自粛です。
ソフトウェア
動作確認用のソフトウェアは以下のgithubへアップしてあるのでダウンロードして使ってください。
いつくかのファイルがありますが、 UNO_junk_test.ino ファイルだけでビルドして動かすことができます。
UNO_junk_testディレクトリを作成し、その中に inoファイルを置いてArduino IDEでビルドして使ってください。
Arduino IDEのボード用の設定などはここでは省略させてもらいます。
ソフトウェアの実行
Arduino UNOとマトリクスLEDモジュールを結線し、前述のプログラムのビルドが終わったらプログラムをボードに書き込みます。
Arduino IDEの操作で「書き込み」ボタンを押してた場合、既にプログラムの書き込みまでが行われている思います。
プログラムの書き込みが完了するとすぐにプログラムが実行されます。
結線やビルド、書き込みが正常に終了していれば、以下のような16x16ドットの赤い■がマトリクスLEDの右から左で移動しながら表示され、これが繰り返されます。
ドット抜けがある場合、そのドットが消灯したままとなりドット抜けの確認ができます。
また、D2ピンを使ったボタンスイッチを付けた場合、このボタンを押すことで表示される画像が以下のように変化します。
ソフトウェアの概要
戦術した UNO_junk_test.ino ファイルのポイントとなる部分を説明します。
なお説明中の行番号はソースプログラムの修正などにより前後する場合があります。
-
5~17行目
各種マクロ定義、処理で使用する定数などの定義をしています。 -
20行目~ adr_tbl[][]
マトリクスLEDモジュールの SIN1 へ出力するデータ。
SIN2、SIN3へ出力するデータをマトリクスLEDのどの行に割り当てるかを指定するのに使用します。 -
41行目~ disp_pattern0[][]
マトリクスLEDへ表示する16x16ドットのデータで、起動後最初に表示される全点灯のパターンです。
1要素が1ドットを表し、「 1 」で点灯、「 0 」で消灯を意味します。 -
61行目~ disp_pattern1[][]
ボタンスイッチを押した際2番目に表示される左先が尖ったパターンです。 -
81行目~ disp_pattern2[][]
ボタンスイッチを押した際3番目に表示される「赤」のパターンです。
disp_pattern0、disp_pattern1、disp_pattern2の内容を変更することで任にのパターンを表示させることができます。
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の1行目の SIN2、SIN3へ「 0 」を出力します。
1ドット分のデータを出力後 CLOCK を 0 -> 1 -> 0 と変化させることでマトリクスLEDモジュールへデータを取得させます。
1行16ドットを出力し終えたら LATCH を 1 -> 0 -> 1 と変化させることでマトリクスLEDへデータを表示(この関数の場合には消灯)します。
このマトリクスLEDモジュールはダイレクトドライブ方式で1度に表示できるのは1行分のみになります。
このため、表示のクリアは任意の1行に対して行えば、他の行は表示されていないためマトリクスLED全体の表示がクリアされたことになります。
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 が16行分の繰り返し、ループ wd が1行16ドット分の繰り返しです。
for( hi=0 ; hi<DEF_LED_HIGHT ; hi++ ) {
for( wd=0 ; wd<DEF_LED_WIDTH ; wd++ ) {
SIN2へ出力するための判定処理です。
表示位置の計算結果から 0以上 DEF_LED_WIDTH (16)未満でSIN2へ所定の位置のパターンデータを出力します。
この範囲外の場合、「 0 」を出力します。
/* 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とは異なる出力結果となります。
/* 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行目
ボタンスイッチの押下の有無をチェックし、押された場合にはパターンを変更する処理です。
また、押されたボタンが離されるまで多重に押されたと判定しないための処理も行っています。
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の輝度や点滅のチラツキ具合が変化します。
digitalWrite( LATPIN, 0 );
usec_delay( 1 );
digitalWrite( LATPIN, 1 );
usec_delay( DEF_BRIGHT_TIME );
- 238~240行目
ボタンスイッチが離されたかをチェックする処理です。
簡易ですがチャタリングを防止するため押されたタイミングと同一のloop()関数処理では離れたかのチェックはしないようにしています。
if( btn_flag != 0 && btn_stat == HIGH ) {
btn_flag = 0;
}
- 242~247行目
表示パターンを左へスライドさせるための変数の更新処理です。
if( --disp_slide <= 0 ) {
if( --disp_pos <= 0 ) {
disp_pos = DEF_INIT_POS;
}
disp_slide = DEF_SLIDE;
}
- 249行目
ループから抜ける際にいったんマトリクスLEDの(行の)表示をクリアします。
loop()関数を抜ける前に表示をクリアしないと、loop()関数外の処理時間が不明なため最後に表示した行(このプログラムの場合、最下位の行)の表示される時間が他の行より長くなり、結果として1行だけ明るく光ることになります。
これを避けるためにloop()関数の最後でマトリクスLEDへの表示をクリアしてから関数を抜けます。
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用のプログラムをそのまま利用できます。
また、NUCLEO-64にはボード上にプッシュスイッチがあり、PC13ポートに割り当てられているのでボタンスイッチのピン番号はこのポートへ変更します。
STM32F4xxシリーズの各ポートの電圧は 3.3V なので、IC用電源ピンには 3.3V への変更が必要です。
LED側ピン番号 | LED側ピン名 | NUCLEO-64側 | 意味 |
---|---|---|---|
1 | LED_PWR | 5V | LED用電源 |
2 | SIN 1 | D3 (PB3) | 縦データ入力 |
3 | SIN 2 | D4 (PB5) | 横データ入力 (LED1) |
4 | SIN 3 | D5 (PB4) | 横データ入力 (LED2) |
5 | CLOCK | D6 (PB10) | クロック入力 |
6 | LATCH | D7 (PA8) | ラッチ入力 |
7 | STROBE | GND | 点灯制御 |
8 | IC_PWR | 3.3V | IC用電源 |
9 | GND | GND | GND |
10 | GND | GND | GND |
ボタンスイッチ:PC13
ソフトウェア
動作確認用のソフトウェアは以下のgithubへアップしてあるのでダウンロードして使ってください。
使用方法やプログラムの構成は Arduino UNO用と同じです。
以下に差異部分を説明します。
- 12行目
ボタンスイッチはNUCLEO-64のボード上にあるボタンを使うためポート番号の指定を変更しました。
#define BTNPIN PC13
- 16行目
STM32F4xxの方がArduino UNOより処理速度が速いのでLEDの点灯時間を定義しているマクロ DEF_BRIGHT_TIME の値を大きくしました。
#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用シールドソケットはなく、7個のGroveコネクタがありここからGPIOと3.3V、GNDをマトリクスLEDモジュールと接続できます。
5V はGroveコネクタからは取り出せませんがサーボモータ用のコネクタに 5Vが出力されているので、ジャンパーケーブルを使ってこのピンとマトリクスLEDモジュールを接続します。
また、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 |
ソフトウェア
動作確認用のソフトウェアは以下のgithubへアップしてあるのでダウンロードして使ってください。
使用方法やプログラムの構成は Arduino UNO用と同じです。
以下に差異部分を説明します。
- 5~11行目
ポート番号を変更しました。
#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 の値を大きくしました。
#define DEF_BRIGHT_TIME 300
Arduino UNO用のプログラムとの違いは以上です。
最後に
表示パターンをスライドさせているため位置決め処理が少し分かりにくかったかもしれませんが、それ以外はGPIOのみのアクセスでかなりシンプルに書いてあるつもりです。
購入後、未使用のドット抜け御免マトリクスLEDがありましたら、ドット抜けの有無の確認を兼ねて動作確認されてはいかがでしょうか。
あと、「はじめに」で少しPRしましたが ドット抜け御免マトリクスLEDモジュールを使った製作ブツをいくつか作り、その動画をYoutubeへアップしてあります。
ぜひ、のぞいていってください。
これらの説明記事は今後少しずつQiitaへ載せていきたいと考えています。
-
マトリクスLEDモジュール7個使いのRSSニュース表示機
https://youtu.be/bg-C_dvsK2I -
マトリクスLEDモジュール12個使いのRSSニュース表示機
https://youtu.be/gC3v0oRvM4Y -
秋月電子のドット抜けありますよマトリクスLEDを使った二字熟語問題表示機
https://youtu.be/GCvzoc3YioQ -
ESP32+秋月電子のドット抜けありますよマトリクスLEDのニュース表示 Ver1
https://youtu.be/zxJrbvou328 -
ESP32+秋月電子のドット抜けありますよマトリクスLEDのニュース表示 Ver2
https://youtu.be/RbTdOlkaAG8
以上