ShigezoneフルカラーLEDパネルを使う(令和2)


※2022/03/24 実ボードで動作が確認できました。

はじめに

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」へ変更してあります。

matled_6464_reiwa2.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      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++;
}

-以上-