M5Stack Puzzle Unit使ってみる? - 3-

 さて、自由に日本語を表示するためには、いちいちグリフを作っていられない。

 美咲フォントのデータをArduinoで使えるようにライブラリ化している方がいるので、それを使わせてもらう。

 GitHub - Tamakichi/Arduino-misakiUTF16: Arduino用 美咲フォントライブラリ 教育漢字・内部フラッシュメモリ乗せ版

https://github.com/Tamakichi/Arduino-misakiUTF16

 使えるのは、教育漢字1,006字+ひらがな・カタカナ・記号・半角等の1,710字だそうだ。メモリ消費は約16kバイト。最近のESP32とかでは問題ないね。

 残念ながら、ArduinoIDEのライブラリには登録されていない。手動でzipを取り込む。

 ダウンロードはこちらからzipをもらう。

 Release Arduino用 美咲フォントライブラリ 教育漢字・内部フラッシュメモリ乗せ版 1.03 · Tamakichi/Arduino-misakiUTF16 · GitHub

https://github.com/Tamakichi/Arduino-misakiUTF16/releases/tag/1.03

 Arduino IDEを開いて、[スケッチ] -> [ライブラリをインクルード] -> [.ZIP形式のライブラリをインストール...]でzipを選択してインストールする。

 「指定されたフォルダ/zipファイルには有効なライブラリがありません」とエラーになった。展開してみると、そのまま使えないリポジトリのアーカイブになっている。つらい。

 misakiUTF16フォルダだけをzipアーカイブして、Arduino IDEで指定したら読み込めた。

 % ls ~/Documents/Arduino/libraries/misakiUTF16

 examples misakiUTF16.cpp misakiUTF16FontData.inc

 keywords.txt misakiUTF16.h

 スケッチをビルドするとエラーになった。

 どうやら、misakiUTF16.h は <avr/pgmspace.h> を参照しているようだ。AVR系マイコン用のヘッダなのでESP32では使えない。

 AIを駆使して、pgmspaceの対応コード潰しているけど、なんかキリがない感じでエラーになるわ...

 Xでボヤいていたら、アドバイスもらった。

 朝日薫/multix.jp on X: "@kinneko pgmspaceは別段難しいことはやってないので、手でラッパー書いた方が早いんじゃないかな。単にコードアドレス空間のバイト群を、レジスタや、データアドレス空間に転写したりするだけなので。" / X

https://x.com/askn37/status/1949014405624320332

 なるほど。

 AIに書いてもらう。

#ifndef PGMSPACE_H

#define _PGMSPACE_H_
// PROGMEM は無効化(無視される)
#define PROGMEM
// pgm_read_byte などを単なるポインタ読み込みで置き換え
#define pgm_read_byte(addr) (*(const uint8_t *)(addr))
#define pgm_read_word(addr) (*(const uint16_t *)(addr))
#define pgm_read_dword(addr) (*(const uint32_t *)(addr))
#define pgm_read_float(addr) (*(const float *)(addr))
// memcpy_P は通常の memcpy と同義
#define memcpy_P(dest, src, num) memcpy((dest), (src), (num))
// strcpy_P も同様に置き換え
#define strcpy_P(dest, src) strcpy((dest), (src))
// PSTR マクロ:単なる文字列として返す(フラッシュ展開なし)
#define PSTR(s) (s)

#endif // PGMSPACE_H

 プロジェクトのディレクトリにavr/pgmspace.hとして置いてビルドすると通った。

#include <Adafruit_NeoPixel.h>
#include <misakiUTF16.h>  // 美咲フォントライブラリ
#define PIN 26
#define WIDTH 8
#define HEIGHT 8
#define NUM_LEDS (WIDTH * HEIGHT)

 Adafruit_NeoPixel matrix(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

 const char* msg = "すしくいてー!"; // UTF‑8文字列

 int scrollPos = 0;

 unsigned long lastTime = 0;

 const int scrollSpeed = 150; // ms

 void setup() {

matrix.begin();
matrix.setBrightness(30);
matrix.clear();
matrix.show();
}

 void loop() {

 if (millis() - lastTime < scrollSpeed) return;

lastTime = millis();

 scrollPos++;

matrix.clear();
// UTF‑8文字列を順にビットマップ取得し、スクロール表示
char buf[8];
char *ptr = (char*)msg;
int charIndex = 0;
while (*ptr) {
ptr = getFontData((uint8_t*)buf, ptr, true);
if (!ptr) break;
// 各文字は buf[0]〜buf[7] に8行分のビットデータが格納される
int xOffset = charIndex * 8 - scrollPos + WIDTH;
if (xOffset <= WIDTH && xOffset > -8) {
for (int y = 0; y < HEIGHT; y++) {
for (int bit = 0; bit < 8; bit++) {
if (buf[y] & (0x80 >> bit)) {
int x = xOffset + bit;
if (x >= 0 && x < WIDTH) {
matrix.setPixelColor(y * WIDTH + x, matrix.Color(255, 255, 0));
}
}
}
}
}

 charIndex++;

}
matrix.show();

 if (scrollPos > charIndex * 8 + WIDTH) scrollPos = 0;

}

 ひらがなで動かしてみる。

 Unit Puzzleで日本語表示(フォント版) - YouTube

https://www.youtube.com/watch?v=2KKGvz2j2mA

 漢字にしてみる。

 さすがに、8x8だと、漢字は読めないのな...

 Unit Puzzleで日本語表示(漢字) - YouTube

https://www.youtube.com/watch?v=9cZMINKaSuM

 100円投げ銭  https://kinneko.booth.pm/items/1963720


オリジナル投稿:
M5Stack Puzzle Unit使ってみる? - 3-|kinneko|pixivFANBOX
https://kinneko.fanbox.cc/posts/10283070