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

美咲フォントのデータを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



