ShigezoneフルカラーLEDパネルを使う（令和）

※2022/03/24　実ボードで動作が確認できました。
![reiwa_20220324_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/4f98a50b-352f-30fa-b0db-22bbfbc80dc4.jpeg)

# はじめに
Qiitaの記事「マトリクスＬＥＤパネルの動作確認」（ https://qiita.com/Yukiya_Ishioka/items/c455f7bfbcb240bb2ba7 ）でESP32を使い、秋葉原の **Shigezone** で購入した６４×６４のマトリクスＬＥＤパネルを使って「令和」画像を表示するプログラムを紹介しました。
**Shigezone**から「フルカラーLEDパネル用ESP32制御ボードキット」という商品が発売されたのを見つけたのですが、先のQiitaの記事で使った回路とは違うため、記事内のプログラムそのものでは動作しないことが分かりました。
このため、「フルカラーLEDパネル用ESP32制御ボードキット」でそのまま使えるプログラムを公開しようと考えました。

なお、この記事の執筆時点では「フルカラーLEDパネル用ESP32制御ボードキット」を入手していないため、商品に添付されている説明書に記されているページにある回路図からピン設定を変更しています。

・フルカラーLEDパネル用ESP32制御ボードキット(基板＋部品)
　https://www.shigezone.com/product/hub75eboard/

・秋葉原ラジオデパートShigezone(シゲゾーン)
　https://www.shigezone.com/

・Qiitaの記事「マトリクスＬＥＤパネルの動作確認」
　https://qiita.com/Yukiya_Ishioka/items/c455f7bfbcb240bb2ba7

・Qiitaの記事「ShigezoneフルカラーLEDパネルを使う（令和２）」
　https://qiita.com/Yukiya_Ishioka/items/b26cd1eae5f5c37470d5

・ShigezoneフルカラーLEDパネルでRSS表示
　https://qiita.com/Yukiya_Ishioka/items/33d27c350a3b4c677261

# マイコンとマトリクスＬＥＤパネルの接続

回路図からESP32DevKitとマトリクスＬＥＤパネルとの接続は以下の設定になります。

```  
#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
```  

# Arduino IDEの設定
ボード種別やOTAの有無により挙動が変わる可能性があるので、実行確認時のArduino IDEの設定内容を公開しておきます。
![ESP32_Arduino_Set2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370759/4673a2a7-2ea1-a49f-0c83-ba13775ea6bb.jpeg)

# ESP32制御ボードキット対応プログラム

「令和」を題材に、**あの画像** を元にビットマップデータを作り、プログラム内に組込み、表示するプログラムを紹介します。

```matled_6464_reiwa.ino

/*
 *  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      128
#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  char_dat_yoko[ 1024 ] = {
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,
  0xff,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xfc,0xff,0xff,0xff,0xff,
  0xff,0x81,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xf9,0xff,0xff,0xff,0xff,0xff,0x80,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,
  0xff,0xff,0xff,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xe3,0xff,0xff,0xff,0xff,0xff,0x00,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,
  0xff,0xff,0xff,0xff,0xff,0x00,0xfe,0x7f,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0x87,0xff,0xff,0xff,0xfd,
  0xfe,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0x0f,0xff,0xff,0xff,0xfb,0xfe,0x03,0xf8,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x1f,0xff,0xff,
  0xff,0xf3,0xfe,0x07,0xf0,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xf8,0x3f,0xff,0xff,0xff,0xe3,0xfc,0x07,
  0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x3f,
  0xff,0xff,0xff,0xc3,0xfc,0x0f,0xc1,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xc0,0x7f,0xff,0xff,0xff,0xc7,
  0xf8,0x0f,0x81,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0x80,0xff,0xff,0xff,0xff,0x87,0xf8,0x1e,0x03,0xff,
  0xff,0xff,0xff,0xff,0xff,0xfe,0x01,0xdf,0xff,0xff,
  0xff,0x07,0xf8,0x18,0x07,0xff,0xff,0xff,0xff,0xff,
  0xff,0xfc,0x03,0xc3,0xff,0xff,0xff,0x03,0xf0,0x00,
  0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x0f,0xc1,
  0xff,0xff,0xfe,0x03,0xf0,0x00,0x1f,0xff,0xff,0xff,
  0xff,0xff,0xff,0xe0,0x1f,0xe0,0xff,0xff,0xf8,0x03,
  0xf0,0x00,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0x80,
  0x3f,0xe0,0x7f,0xff,0xf8,0x00,0x60,0x00,0xff,0xc3,
  0x7f,0xff,0xff,0xff,0xfe,0x00,0xff,0xe0,0x7f,0xff,
  0xf8,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,0xff,
  0xf8,0x01,0xff,0xe0,0x7f,0xff,0xf8,0x06,0x00,0x00,
  0x00,0x00,0x3f,0xff,0xff,0xf3,0xe0,0x00,0xff,0xc0,
  0xff,0xff,0xf8,0x06,0x00,0x00,0x00,0x00,0x7f,0xff,
  0xff,0xf0,0x00,0x18,0x3f,0xc0,0xff,0xcf,0xfc,0x0f,
  0x00,0x40,0x04,0xff,0xff,0xff,0xff,0xf8,0x00,0x3c,
  0x1f,0x81,0xff,0xc7,0xfc,0x0f,0x81,0xe0,0x7f,0xff,
  0xff,0xff,0xff,0xf0,0x00,0xfc,0x0f,0x80,0x3f,0x81,
  0xfe,0x1f,0x81,0xe0,0x7f,0xff,0xff,0xff,0xff,0xf0,
  0x01,0xfc,0x0f,0x80,0x00,0x00,0xff,0x1f,0x81,0xf0,
  0x7f,0xff,0xff,0xff,0xff,0xf8,0x03,0xfc,0x0f,0x04,
  0x00,0x00,0xff,0xff,0x80,0xf8,0xff,0xff,0xff,0xff,
  0xff,0xfc,0x03,0xfc,0x0f,0x06,0x00,0x03,0xff,0xff,
  0xc0,0x1f,0xff,0xff,0xff,0xff,0xff,0xfe,0x01,0xfc,
  0x0f,0x0f,0x39,0xff,0xff,0xff,0xf0,0x0f,0xff,0xff,
  0xff,0xff,0xff,0xff,0xf0,0x7e,0x0e,0x0f,0xf8,0x3f,
  0xff,0xff,0xfc,0x03,0xff,0xff,0xff,0xff,0xff,0xff,
  0xf8,0x3f,0x1c,0x1f,0xe0,0x1f,0xff,0xff,0xfe,0x00,
  0x3f,0xff,0xff,0xff,0xff,0xff,0xfc,0x0f,0xfc,0x1e,
  0x00,0x1f,0xff,0xff,0xfe,0x00,0x03,0xff,0xff,0xff,
  0xff,0xff,0xfe,0x07,0xf8,0x00,0x00,0x1f,0xff,0xff,
  0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x01,
  0xf8,0x00,0x00,0x3f,0xff,0xff,0xf9,0x00,0x00,0xff,
  0xff,0xff,0xff,0xff,0xff,0x80,0xf8,0x00,0x00,0xff,
  0xff,0xff,0xf9,0x80,0x01,0xff,0xff,0xff,0xff,0xff,
  0xff,0xc0,0x38,0x00,0x03,0xff,0xff,0xff,0xf8,0xf0,
  0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x0c,0x00,
  0x1f,0xff,0xff,0xff,0xf8,0x7f,0x87,0xff,0xff,0xff,
  0xff,0xff,0xff,0xf0,0x06,0x01,0xff,0xff,0xff,0xff,
  0xf8,0xff,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,
  0x00,0x0f,0xff,0xff,0xff,0xff,0xf1,0xff,0x03,0xff,
  0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0x1f,0xff,0xff,
  0xff,0xff,0xf1,0xff,0x03,0xff,0xff,0xff,0xff,0xff,
  0xff,0xfe,0x00,0x3f,0xff,0xff,0xff,0xff,0xf1,0xff,
  0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x1f,
  0xff,0xff,0xff,0xff,0xf1,0xff,0x03,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xc0,0x0f,0xff,0xff,0xff,0xff,
  0xf3,0xff,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xe0,0x07,0xff,0xff,0xff,0xff,0xe3,0xfe,0x07,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x03,0xff,0xff,
  0xff,0xff,0xe0,0x00,0x07,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xf0,0x01,0xff,0xff,0xff,0xff,0xc0,0x00,
  0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0x01,
  0xff,0xff,0xff,0xff,0x80,0x00,0x07,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xfc,0x00,0xff,0xff,0xff,0xff,
  0x80,0x00,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xfc,0x00,0xff,0xff,0xff,0xff,0x80,0x00,0x07,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xfc,0x00,0xff,0xff,
  0xff,0xff,0xc0,0x00,0x07,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xfe,0x00,0xff,0xff,0xff,0xff,0xe0,0x00,
  0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x00,
  0xff,0xff,0xff,0xff,0xe0,0x1f,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0x00,0x7f,0xff,0xff,0xff,
  0xf0,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0x00,0x7f,0xff,0xff,0xff,0xf8,0x7f,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc0,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xe0,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,
  0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  0xff,0xff,0xff,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 = 1;
}


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 ) db = 1;
  if( led_color & 0x4 ) dg = 1;
  Serial.printf( "color DR=%d  DG=%d  DB=%d\n", dr, dg, db );

  buff1 = (unsigned char *)char_dat_yoko ;

  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++;
}
```  

# さいごに
表示につかったデータは64x64パネルを２枚使って「**令和**」を表示するプログラムになっているため、パネル１枚を使った場合には２文字目の「**和**」が表示されます。
「**令**」を表示する場合にはソースファイルの**231行目付近**の以下の行の「**col<DEF_DISP_WIDTH**」を「**col<DEF_DISP_WIDTH/2**」へ変更することで表示を変えられます。

```  
      for( col=0 ; col<DEF_DISP_WIDTH ; col++ ) {
```  
　　　↓

```  
      for( col=0 ; col<DEF_DISP_WIDTH/2 ; col++ ) {
```  

データやプログラムを変更して色々な画像など表示にトライしてみてください。

－以上－