M5ATOM Matrixにmicro:bit互換の文字表示

M5Stack

 M5Stack ATOM Matrixでカンタンに文字表示ができないか? という挑戦。ライブラリのインストールとかせずにさくっといけないかな? ということで、思いついたのが、micro:bitの文字表示の仕組みを流用できないかというもの。できたのがこれ。

M5Stack ATOM Matrix ASCII characters

 前の記事とは違って、1画面には1文字ずつ。それでもASCIIコードがひととおり表示できるので、楽に使えるんじゃないかなあ、と。

 コードはまだまとめ中。C/C++の基本がわからないので苦戦中です。スクロールさせたほうがいいのかなあ? という考えもあり。

 とりあえず最低限のコードは以下のとおり。

#include "M5Atom.h"

/*
 * ASCII FONT DATA
 */
const uint8_t FONTDATA[475] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x8, 0x8, 0x0, 0x8, 0xa, 0x4a, 0x40, 0x0, 0x0, 0xa, 0x5f, 0xea, 0x5f, 0xea, 0xe, 0xd9, 0x2e, 0xd3, 0x6e, 0x19, 0x32, 0x44, 0x89, 0x33, 0xc, 0x92, 0x4c, 0x92, 0x4d, 0x8, 0x8, 0x0, 0x0, 0x0, 0x4, 0x88, 0x8, 0x8, 0x4, 0x8, 0x4, 0x84, 0x84, 0x88, 0x0, 0xa, 0x44, 0x8a, 0x40, 0x0, 0x4, 0x8e, 0xc4, 0x80, 0x0, 0x0, 0x0, 0x4, 0x88, 0x0, 0x0, 0xe, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x1, 0x22, 0x44, 0x88, 0x10, 0xc, 0x92, 0x52, 0x52, 0x4c, 0x4, 0x8c, 0x84, 0x84, 0x8e, 0x1c, 0x82, 0x4c, 0x90, 0x1e, 0x1e, 0xc2, 0x44, 0x92, 0x4c, 0x6, 0xca, 0x52, 0x5f, 0xe2, 0x1f, 0xf0, 0x1e, 0xc1, 0x3e, 0x2, 0x44, 0x8e, 0xd1, 0x2e, 0x1f, 0xe2, 0x44, 0x88, 0x10, 0xe, 0xd1, 0x2e, 0xd1, 0x2e, 0xe, 0xd1, 0x2e, 0xc4, 0x88, 0x0, 0x8, 0x0, 0x8, 0x0, 0x0, 0x4, 0x80, 0x4, 0x88, 0x2, 0x44, 0x88, 0x4, 0x82, 0x0, 0xe, 0xc0, 0xe, 0xc0, 0x8, 0x4, 0x82, 0x44, 0x88, 0xe, 0xd1, 0x26, 0xc0, 0x4, 0xe, 0xd1, 0x35, 0xb3, 0x6c, 0xc, 0x92, 0x5e, 0xd2, 0x52, 0x1c, 0x92, 0x5c, 0x92, 0x5c, 0xe, 0xd0, 0x10, 0x10, 0xe, 0x1c, 0x92, 0x52, 0x52, 0x5c, 0x1e, 0xd0, 0x1c, 0x90, 0x1e, 0x1e, 0xd0, 0x1c, 0x90, 0x10, 0xe, 0xd0, 0x13, 0x71, 0x2e, 0x12, 0x52, 0x5e, 0xd2, 0x52, 0x1c, 0x88, 0x8, 0x8, 0x1c, 0x1f, 0xe2, 0x42, 0x52, 0x4c, 0x12, 0x54, 0x98, 0x14, 0x92, 0x10, 0x10, 0x10, 0x10, 0x1e, 0x11, 0x3b, 0x75, 0xb1, 0x31, 0x11, 0x39, 0x35, 0xb3, 0x71, 0xc, 0x92, 0x52, 0x52, 0x4c, 0x1c, 0x92, 0x5c, 0x90, 0x10, 0xc, 0x92, 0x52, 0x4c, 0x86, 0x1c, 0x92, 0x5c, 0x92, 0x51, 0xe, 0xd0, 0xc, 0x82, 0x5c, 0x1f, 0xe4, 0x84, 0x84, 0x84, 0x12, 0x52, 0x52, 0x52, 0x4c, 0x11, 0x31, 0x31, 0x2a, 0x44, 0x11, 0x31, 0x35, 0xbb, 0x71, 0x12, 0x52, 0x4c, 0x92, 0x52, 0x11, 0x2a, 0x44, 0x84, 0x84, 0x1e, 0xc4, 0x88, 0x10, 0x1e, 0xe, 0xc8, 0x8, 0x8, 0xe, 0x10, 0x8, 0x4, 0x82, 0x41, 0xe, 0xc2, 0x42, 0x42, 0x4e, 0x4, 0x8a, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x8, 0x4, 0x80, 0x0, 0x0, 0x0, 0xe, 0xd2, 0x52, 0x4f, 0x10, 0x10, 0x1c, 0x92, 0x5c, 0x0, 0xe, 0xd0, 0x10, 0xe, 0x2, 0x42, 0x4e, 0xd2, 0x4e, 0xc, 0x92, 0x5c, 0x90, 0xe, 0x6, 0xc8, 0x1c, 0x88, 0x8, 0xe, 0xd2, 0x4e, 0xc2, 0x4c, 0x10, 0x10, 0x1c, 0x92, 0x52, 0x8, 0x0, 0x8, 0x8, 0x8, 0x2, 0x40, 0x2, 0x42, 0x4c, 0x10, 0x14, 0x98, 0x14, 0x92, 0x8, 0x8, 0x8, 0x8, 0x6, 0x0, 0x1b, 0x75, 0xb1, 0x31, 0x0, 0x1c, 0x92, 0x52, 0x52, 0x0, 0xc, 0x92, 0x52, 0x4c, 0x0, 0x1c, 0x92, 0x5c, 0x90, 0x0, 0xe, 0xd2, 0x4e, 0xc2, 0x0, 0xe, 0xd0, 0x10, 0x10, 0x0, 0x6, 0xc8, 0x4, 0x98, 0x8, 0x8, 0xe, 0xc8, 0x7, 0x0, 0x12, 0x52, 0x52, 0x4f, 0x0, 0x11, 0x31, 0x2a, 0x44, 0x0, 0x11, 0x31, 0x35, 0xbb, 0x0, 0x12, 0x4c, 0x8c, 0x92, 0x0, 0x11, 0x2a, 0x44, 0x98, 0x0, 0x1e, 0xc4, 0x88, 0x1e, 0x6, 0xc4, 0x8c, 0x84, 0x86, 0x8, 0x8, 0x8, 0x8, 0x8, 0x18, 0x8, 0xc, 0x88, 0x18, 0x0, 0x0, 0xc, 0x83, 0x60};

/*
 * 文字列を表示
 */
void dispCharS(const char mes[], uint8_t R, uint8_t G, uint8_t B ,uint8_t Rb=0, uint8_t Gb=0, uint8_t Bb=0){

  uint8_t DisBuffString[2 + 5 * 5 * 3];
  DisBuffString[0] = 0x05;
  DisBuffString[1] = 0x05;

  for (int j = 0; j < strlen(mes)-1 ; j++){ 
    char str = mes[j];
  
    if(str < 32 || str > 127){
      Serial.println("dispChar Error...");
    }
    
    int start = ((int)str -32) * 5;
    for (int row = 0 ; row < 5 ; row++){
      for (int i = 0; i < 5; i++){ 
        if(( FONTDATA[ start + row ] & (1 << abs(i-4))) != 0){
          DisBuffString[2 + ((row) * 5 + i) * 3 + 0] = R;
          DisBuffString[2 + ((row) * 5 + i) * 3 + 1] = G;
          DisBuffString[2 + ((row) * 5 + i) * 3 + 2] = B;
        }
        else {
          DisBuffString[2 + ((row) * 5 + i) * 3 + 0] = Rb;
          DisBuffString[2 + ((row) * 5 + i) * 3 + 1] = Gb;
          DisBuffString[2 + ((row) * 5 + i) * 3 + 2] = Bb;
        }
      }
    }
    M5.dis.displaybuff(DisBuffString);

    if(strlen(mes) > 1){

      delay(400);

      for (int i = 0; i < 25; i++){ 
        DisBuffString[2 + i * 3 + 0] = Rb;
        DisBuffString[2 + i * 3 + 1] = Gb;
        DisBuffString[2 + i * 3 + 2] = Bb;
      }
      M5.dis.displaybuff(DisBuffString);
      delay(50);
    }
  }
}  // 文字列を表示 終わり

/*
 * 1文字を表示する(コードを数値で指定することも可能)
 */
void dispChar(char str, uint8_t R, uint8_t G, uint8_t B ,uint8_t Rb=0, uint8_t Gb=0, uint8_t Bb=0){
  if(str < 32 || str > 127){
    Serial.println("dispChar Error...");
    return;
  }
  
  uint8_t DisBuffString[2 + 5 * 5 * 3];
  DisBuffString[0] = 0x05;
  DisBuffString[1] = 0x05;
  int start = ((int)str -32) * 5;
  
  for (int row = 0 ; row < 5 ; row++){
    for (int i = 0; i < 5; i++){ 
      if(( FONTDATA[ start + row ] & (1 << abs(i-4))) != 0){
        DisBuffString[2 + ((row) * 5 + i) * 3 + 0] = R;
        DisBuffString[2 + ((row) * 5 + i) * 3 + 1] = G;
        DisBuffString[2 + ((row) * 5 + i) * 3 + 2] = B;
      }
      else {
        DisBuffString[2 + ((row) * 5 + i) * 3 + 0] = Rb;
        DisBuffString[2 + ((row) * 5 + i) * 3 + 1] = Gb;
        DisBuffString[2 + ((row) * 5 + i) * 3 + 2] = Bb;
      }
    }
  }
  M5.dis.displaybuff(DisBuffString);
}

void setup()
{
  M5.begin(true, false, true);
}

void loop() {

  // 1文字ずつ表示 指定をプログラム側で
  char mes[] = "Good Morning! ";
  for (int i = 0; i < sizeof(mes)-1 ; i++){
    dispChar(mes[i],  0xff, 0x8c, 0x0, 0,0,0);  // Orange
    delay(400);  
    dispChar(32,  0xff, 0x8c, 0x0, 0,0,0);  // 32: SPACE
    delay(40);  
  }

  // 文字コードで一覧表示    
  for (int i = 32; i < 128 ; i++){
    dispChar(i,  0x0, 0xff, 0x0, 0,0,0);  // Green
    delay(400);  
  }

  // 文字列を指定して表示
  dispCharS("Hello World:) ",  0xff, 0xff, 0x0, 0,0,0);  // Yellow
  delay(400);  
}

 もう少しなんとかしたやつは次のエントリー。

コメント