EEPROM AT24C1024Bへの美咲フォントデータの格納
美咲フォントを使った日本語を表示を行うために現在いろいろとやってます。
意外と面倒です。
何気に苦労してやっとEEPROM AT24C1024Bにフォントデータを格納して、
指定したフォントデータの取り出しまで出きるようになりました。
テストプログラム(メインのみ)
void setup() {
int code;
wchar_t u16str[50];
char str[] = "こんにちは、埼玉県♪";
byte fontdata[8];
char buf[32];
unsigned long addr;
int i;
i2c_init();
Serial.begin(9600); // 9600bpsでポートを開く
// UTF-8からUTF16に変換
int len = Utf8ToUtf16(u16str, 50 ,str,strlen(str));
Serial.print("len=");Serial.println(len,DEC);
// フォントデータの取得
int rc;
for (int j=0; j < len; j++) {
code = findcode(u16str[j]);
addr = (unsigned long)code * 8;
rc = (int)Sequential_read(addr, fontdata, (byte)8);
// データ表示
sprintf(buf," u+%04x:c+%04d: ",u16str[j],code);
Serial.print(buf);
for (int i=0; i< 8; i++) {
sprintf(buf,"%02x ",fontdata[i]);
Serial.print(buf);
}
Serial.println("");
print_font(fontdata);
}
}
実行結果
フォントデータの格納形式
1)美咲フォントデータ本体(7120文字 x 8バイト: 56kバイト)
生データはJISコード順ですが、arduinoでは文字コードとしてUTF-8を
使っているため、UTF-16順にデータを並び替えて格納しました。
収録フォント(括弧内は美咲フォントの収録フォント数)
U+0020-007F 半角 ASCII文字 (95文字)
U+0080-00FF 全角 ラテン補助 (11文字)
U+0390-03FF 全角 ギリシア文字及びコプト文字(48文字)
U+0400-04FF 全角 キリール文字(キリル文字)(66文字)
U+2000-206F 全角 一般句読点 (15文字)
U+2100-214F 全角 文字様記号 (3文字)
U+2150-218F 全角 数字に準じるもの (10文字)
U+2190-21FF 全角 矢印 (6文字)
U+2200-22FF 全角 数学記号 (45文字)
U+2300-23FF 全角 その他の技術用記号 (1文字)
U+2460-24FF 全角 囲み英数字 (20文字)
U+2500-257F 全角 罫線素片 (32文字)
U+25A0-25FF 全角 幾何学模様 (12文字)
U+2600-26FF 全角 その他の記号 (7文字)
U+3000-303F 全角 CJKの記号及び句読点 (24文字)
U+3040-309F 全角 平仮名 (174文字)
U+30A0-30FF 全角 片仮名 (90文字)
U+3200-32FF 全角 囲みCJK文字・月 (8文字)
U+3300-33FF 全角 CJK互換用文字 (28文字)
U+4E00-9FFF 全角 CJK統合漢字 (6356文字)
U+FF00-FFEF 全角 半角・全角形 (91文字)
UTF-16の広いコード空間に大して美咲フォントはスカスカなので、
存在するフォントデータのみを詰めて格納しています。
このデータは容量的に Arduino UNOの内部メモリに格納は無理なので
EEPROM AT24C1024Bに格納します。
2)UTF-16コードテーブル (2バイト x 7120文字分 15kバイト)
美咲フォントが対応している文字のUTF-8コード(2バイト)を格納順に
並べたテーブルです。このテーブルを2分検索してフォントデータの
格納位置を調べます。
このテーブルは検索速度を考慮してArduino UNOのフラッシュメモリ上
に配置しています。
当初、美咲フォントをJIS形式で格納してテーブルを用いてデータ参照を
考えていたのですが、これをやると、
UTF-16コード => 格納アドレス
のデーブルが必要で (2バイト+2バイト) x 7120文字 = 29kバイト必要で
Arduino UNOのフラッシュメモリ上に乗らないので止めました。
UTF-8からUTF16に変換は自力では無理そうなので、
やんちのプログラミングメモ(http://yanchde.gozaru.jp/) さんが公開している
関数を利用させていただきました。
Utf8ToUtf16 http://yanchde.gozaru.jp/utf8_to_utf16/utf8_to_utf16_2.html
これでやっと、8x8ドットマトリクスLEDの表示の準備ができました。
フォントデータの格納のために、変換用ツール、PCからの書き込みツールなど
いろいろと作る必要がありました。
« ArduinoでI2C接続EEPROM AT24C1024Bを利用するテスト | トップページ | Arduinoで美咲フォントを使った8x8ドットマトリクスLED »
「arduino」カテゴリの記事
- Freenove Mecanum ホイール カー キットを購入しました(2025.05.28)
- Arduino IDE+Arduino STM32環境で指定と異なるgccが使われてしまう(2025.01.23)
- Zorin OSでArduino Uno互換機(CH340)が認識しない(2025.01.19)
- Arduino IDE 2.3.4でArduino STM32を利用する(2025.01.12)
- Arduino用 SKK日本語変換ライブラリの開発 その1(2024.12.28)
「AVR」カテゴリの記事
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
- Arduino用SJIS漢字フォントライブラリ SDカード版を作成しました(2018.10.30)
- ATtiny13AでI2C接続キャラクタLCDを利用する(4)(2018.04.16)
- ATtiny13Aで赤外線リモコン受信センサーを使う(2)(2018.04.15)
- ATtiny13AでHC-SR04を使った距離計測(2018.04.14)
« ArduinoでI2C接続EEPROM AT24C1024Bを利用するテスト | トップページ | Arduinoで美咲フォントを使った8x8ドットマトリクスLED »

コメント