M5Stack ATOM Matrixでカンタンに文字表示ができないか? という挑戦。ライブラリのインストールとかせずにさくっといけないかな? ということで、思いついたのが、micro:bitの文字表示の仕組みを流用できないかというもの。できたのがこれ。
前の記事とは違って、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);
}
もう少しなんとかしたやつは次のエントリー。
その後、GitHubにも整理したものをアップしました。 M5AtomMatrix_DispChar
コメント
こちらのフォントデータなどを自作のプログラムで利用させていただいてもよろしいでしょうか?
とくに問題ないです。作品を公開された時は教えていただけるとうれしいです。また公開ページに当サイトのリンクをはっていただけるとなおうれしいです。よろしくお願いします。
追記。フォントはmicro:bit用のMakecodeを参考にしています。ライセンスも元のコードに従います。というわけでMIT Licenseです。以下を御覧ください。
https://github.com/microsoft/pxt-microbit