はじめに
Qiitaの記事「マトリクスLEDパネルの動作確認」( https://qiita.com/Yukiya_Ishioka/items/c455f7bfbcb240bb2ba7 )でESP32を使い、秋葉原の Shigezone で購入した64×64のマトリクスLEDパネルを使って「令和」画像を表示するプログラムを紹介しました。
また、Shigezoneから「フルカラーLEDパネル用ESP32制御ボードキット」という商品が発売されたのを見つけ、このボードに対応した「令和」表示プログラムも紹介しました。
いずれも2枚の64x64のマトリクスLEDパネルを使って「令和」を表現しているため、1枚だけだと「和」しか表示されていませんでした。
このため、64x64のマトリクスLEDパネル 1枚でも「令和」を表示できるようデータを変更したプログラムを作ってみました。
・フルカラーLEDパネル用ESP32制御ボードキット(基板+部品)
https://www.shigezone.com/product/hub75eboard/
・秋葉原ラジオデパートShigezone(シゲゾーン)
https://www.shigezone.com/
・Qiitaの記事「マトリクスLEDパネルの動作確認」
https://qiita.com/Yukiya_Ishioka/items/c455f7bfbcb240bb2ba7
・ShigezoneフルカラーLEDパネルを使う(令和)
https://qiita.com/Yukiya_Ishioka/items/9984a42072edc950b4a4
・ShigezoneフルカラーLEDパネルでRSS表示
https://qiita.com/Yukiya_Ishioka/items/33d27c350a3b4c677261
表示画像
「令和」の画像が64x64ドット内で可能な限り大きくなるよう、45度傾けた画像を作って表示データとしました。
ソースコード
以下に表示プログラムのソースコードを貼ります。
以前のプログラムではカラーコードとして青を「2」、緑を「4」としていましたが、現在のマトリクスLEDパネルに合っていないため、青を「4」、緑を「2」へ変更してあります。
表示に使うパネルも1枚に対応するため、表示幅DEF_DISP_WIDTHを「64」へ変更してあります。
/*
* Copyright(C) by Yukiya Ishioka
*/
#include <stdio.h>
#include <string.h>
/* ESP32 */
#define R1PIN 25
#define G1PIN 26
#define B1PIN 27
#define R2PIN 21
#define G2PIN 22
#define B2PIN 23
#define APIN 12
#define BPIN 16
#define CPIN 17
#define DPIN 18
#define EPIN 4
#define CLKPIN 15
#define LATPIN 32
#define OEPIN 33
#define DEF_DISP_WIDTH 64
#define DEF_SEL_LINE 32
int led_color;
const unsigned char mask_pattern[8] = {
0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
};
const unsigned char reiwa_20220323_3_bin[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x9f, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x0f, 0x8f, 0xf1, 0xff,
0xff, 0xff, 0xff, 0xf8, 0x07, 0x8f, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xfc,
0x03, 0x87, 0x83, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x03, 0x87, 0x87, 0xff,
0xff, 0xff, 0xff, 0xff, 0x03, 0x87, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff,
0x83, 0x8e, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0x8c, 0x3f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xc1, 0x08, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc1, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xe0, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xf0, 0x00, 0xf8, 0xff,
0xff, 0xff, 0xff, 0xf3, 0xf0, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xf3,
0xf8, 0x3f, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xf9, 0xf8, 0x3e, 0x00, 0x7f,
0xff, 0xff, 0xff, 0xf8, 0x60, 0x30, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xf8,
0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x0c, 0x0f,
0xff, 0xff, 0xff, 0xf8, 0x1e, 0x18, 0x1e, 0x07, 0xff, 0xff, 0xff, 0xf8,
0x1f, 0x7f, 0xff, 0x03, 0xff, 0xff, 0xff, 0xf8, 0x0f, 0xfc, 0x7f, 0x01,
0xff, 0xff, 0xff, 0xfc, 0x0f, 0xfc, 0x3f, 0x01, 0xff, 0xff, 0xff, 0xfc,
0x0f, 0xfe, 0x3e, 0x01, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xff, 0x3e, 0x03,
0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0x98, 0x07, 0xff, 0xbf, 0xff, 0xff,
0xff, 0xff, 0x80, 0x0f, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f,
0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0x9f, 0xff, 0xe1,
0xff, 0xff, 0xe0, 0x3f, 0xff, 0x9f, 0xff, 0xc1, 0xff, 0xff, 0xc0, 0x1f,
0xff, 0x9f, 0xff, 0xc3, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0x1f, 0xff, 0xc3,
0xff, 0xff, 0xfe, 0x7f, 0xff, 0x1e, 0x1f, 0x87, 0xff, 0xff, 0xff, 0xff,
0xff, 0x18, 0x0f, 0x0b, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0c, 0x0e, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0x1e, 0x0c, 0x00, 0xff, 0xff, 0xff, 0xff,
0xff, 0x1f, 0x00, 0x61, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x80, 0x41,
0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0x87, 0xc1, 0xff, 0xff, 0xff, 0xff,
0xfe, 0x1f, 0xc7, 0x83, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xc3, 0x03,
0xff, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xe3, 0x07, 0xff, 0xff, 0xff, 0xff,
0xfe, 0x31, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0xf0, 0x0f,
0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x70, 0x1f, 0xff, 0xff, 0xff, 0xff,
0xfc, 0x20, 0x30, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x70, 0x30, 0x1f,
0xff, 0xff, 0xff, 0xff, 0xf8, 0x7c, 0x7c, 0x3f, 0xff, 0xff, 0xff, 0xff,
0xf8, 0x7f, 0xfe, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xe0, 0x00,
0x1f, 0xff, 0xff, 0xff, 0xf0, 0xfe, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff,
0xf0, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00,
0x03, 0xff, 0xff, 0xff, 0x80, 0x00, 0x0f, 0xe0, 0x01, 0xff, 0xff, 0xff,
0xc0, 0xff, 0xff, 0xfc, 0x01, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff,
0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
void led_addr_wr( int a, int b, int c, int d, int e )
{
digitalWrite( OEPIN, HIGH );
usleep(3);
digitalWrite( APIN, a );
digitalWrite( BPIN, b );
digitalWrite( CPIN, c );
digitalWrite( DPIN, d );
digitalWrite( EPIN, e );
usleep(3);
digitalWrite( LATPIN, HIGH );
digitalWrite( LATPIN, LOW );
digitalWrite( OEPIN, LOW );
}
void matled_line_clear( void )
{
int col;
for( col=0 ; col<DEF_DISP_WIDTH ; col++ ) {
digitalWrite( R1PIN, LOW );
digitalWrite( G1PIN, LOW );
digitalWrite( B1PIN, LOW );
digitalWrite( R2PIN, LOW );
digitalWrite( G2PIN, LOW );
digitalWrite( B2PIN, LOW );
digitalWrite( CLKPIN, HIGH );
digitalWrite( CLKPIN, LOW );
}
led_addr_wr( 0, 0, 0, 0, 0 );
}
void setup( void )
{
/* init serial */
Serial.begin(115200);
Serial.println( "call setup()" );
pinMode( R1PIN, OUTPUT );
pinMode( G1PIN, OUTPUT );
pinMode( B1PIN, OUTPUT );
pinMode( R2PIN, OUTPUT );
pinMode( G2PIN, OUTPUT );
pinMode( B2PIN, OUTPUT );
pinMode( APIN, OUTPUT );
pinMode( BPIN, OUTPUT );
pinMode( CPIN, OUTPUT );
pinMode( DPIN, OUTPUT );
pinMode( EPIN, OUTPUT );
pinMode( CLKPIN, OUTPUT );
pinMode( LATPIN, OUTPUT );
pinMode( OEPIN, OUTPUT );
digitalWrite( CLKPIN, LOW );
digitalWrite( LATPIN, LOW );
digitalWrite( OEPIN, LOW );
/* dummy address set */
led_addr_wr( LOW, LOW, LOW, LOW, LOW );
/* clear MATLED */
matled_line_clear();
led_color = 4;
}
void loop( void )
{
int a, b, c, d, e;
int dr, dg, db;
int row, col;
int i, j;
unsigned char *buff1;
dr = 0;
dg = 0;
db = 0;
if( led_color & 0x1 ) dr = 1;
if( led_color & 0x2 ) dg = 1;
if( led_color & 0x4 ) db = 1;
Serial.printf( "color DR=%d DG=%d DB=%d\n", dr, dg, db );
buff1 = (unsigned char *)reiwa_20220323_3_bin ;
j = 0;
while( 1 ) {
for( i=0 ; i<DEF_SEL_LINE ; i++ ) {
row = (DEF_DISP_WIDTH / 8) * (DEF_SEL_LINE -1 - i);
for( col=0 ; col<DEF_DISP_WIDTH ; col++ ) {
/* R1 G1 B1 */
//if( (j % 3) == 0 && (buff1[ (DEF_DISP_WIDTH / 8) * DEF_SEL_LINE + row + (col >> 3) ] & mask_pattern[ col & 0x07 ]) != 0 ) {
if( (buff1[ (DEF_DISP_WIDTH / 8) * DEF_SEL_LINE + row + (col >> 3) ] & mask_pattern[ col & 0x07 ]) != 0 ) {
digitalWrite( R1PIN, dr );
digitalWrite( G1PIN, dg );
digitalWrite( B1PIN, db );
} else {
digitalWrite( R1PIN, LOW );
digitalWrite( G1PIN, LOW );
digitalWrite( B1PIN, LOW );
}
/* R2 G2 B2 */
//if( (j % 3) == 0 && (buff1[ row + (col >> 3) ] & mask_pattern[ col & 0x07 ]) != 00 ) {
if( (buff1[ row + (col >> 3) ] & mask_pattern[ col & 0x07 ]) != 0 ) {
digitalWrite( R2PIN, dr );
digitalWrite( G2PIN, dg );
digitalWrite( B2PIN, db );
} else {
digitalWrite( R2PIN, LOW );
digitalWrite( G2PIN, LOW );
digitalWrite( B2PIN, LOW );
}
digitalWrite( CLKPIN, HIGH );
digitalWrite( CLKPIN, LOW );
}
/* set access row position */
a = b = c = d = e = 0;
if( i & 0x01 ) a = 1;
if( i & 0x02 ) b = 1;
if( i & 0x04 ) c = 1;
if( i & 0x08 ) d = 1;
if( i & 0x10 ) e = 1;
led_addr_wr( a, b, c, d, e );
}
j++;
}
/* clear MATLED */
matled_line_clear();
led_color++;
}
-以上-