arduinoで利用可能な漢字フォントROMの製作(2)
「arduinoで利用可能な漢字フォントROMの製作」の続きです。
SPI接続のフラッシュメモリ W25Q64BV に漢字を含む14種類のフォントデータを載せて
arduinoで汎用的に利用できる 漢字フォントROMを作成しました。
その作成手順とテストをまとめました。
まずは14種類のフォントファイルから、漢字フォントROM用データの作成です。
ツールを作成しました。需要は無いと思われますが公開します。
作成するデータは、14種類のフォント(全角、半角)を格納したバイナリファイルです。
arduinoが採用している文字コード系 UTF-8に親和性のあるUTF-16のインデックスを
付加したデータとなります。
作成はすべてWinddows 8.1上で行いますが、perl(ActivePerl)が必要です。
手順
1)ツールをここ(fonts.zip)からダウンロードして下さい。
解凍すると、\fontsフォルダ下に次のファイルが入っています。

2)この中にフォントデータは含まれていません。次のサイトから入手して、
上記フォルダbdf内にファイルを配置して下さい。
フォルダbdfには全部で14個のファイルを配置します。
3)バイナリフォントデータの作成
コマンドプロンプトを開き、\fonts のディレクトリに移動します。
makeall.bat を実行します。
これにより、バイナリフォントデータを作成します。
ほかに、幾つかのファイルを生成しますが、利用するファイルは次の2つです。
.\utf_fontbin\u_font.bin … 全種半角全角結合フォント
その他の生成されたファイルについては、添付のREADME.txtに説明を記述しています。
これで、フォントデータの作成は終了です。
一部のフォントでUTF16コード変換でエラーが発生しますが、無視して結構です。
< 2016/04/18 追記、2016/04/19 修正
バイナリファイル版を用意しました。
下記からダウンロードして解凍してご利用下さい。
ココログの制約から2つに分割しています。
ダウンロード exfontbin.z01 (800.0K)
ダウンロード exfontbin.zip (510.4K)
解凍はwinrarを使い、上記2つのファイルを同じフォルダに入れて exfontbin.zipの方を
解凍ツールで解凍すれば、解凍出来ます。
ライブラリではフォルダ内のu_font.bin、u_table.h を利用します。
ライセンスに関しては、添付のREADME.txtを参照して下さい。
フォントに関してはフォント製作者に著作権があります。各フォントのライセンスに関する
記載内容を確認の上、個人・非商用利用に限り配布可能と判断いたしました。
本配布について問題があるようでしたらご指摘下さい。
>
手持ちの CH341A Programmer を使って書込みます。
前回は「Serprog/Arduino flasher」で行いましたが、これを使うと非常に楽ちんです。
国内だとaitendoさんで購入出来ます: フラッシュ/SPIプログラマ [PRG341A]

Aliexpressやebayなんかだと、400円くらいから購入出来きます。

操作は、利用するフラッシュメモリの種類を設定して、書き込むデータとして
作成した u_font.bin を指定して読み込みます。
あとは、[auto]ボタンを押して、 書込みを開始します。
数分で書込みが完了します。
CH341A programmer については、「CH341A programmerを試してみました」にも
使い方等を書いています。
3. arduinoでの漢字ROMの利用
作成した漢字ROMを使うには、次の物が必要です。
・arduinoで 漢字ROM (W25Q64BV) を利用する回路を作成する。
・漢字ROM を利用するスケッチ (プログラム)を作成する。
対象は、arduino Unoで利用する場合とします。
W25Q64BVは、3.3V駆動のため、CD4050でレベル調整しています。
回路図

実際の結線接続イメージ
3.3Vで駆動できるArduinoでは直接、接続して利用します。

2)スケッチ(プログラム)の作成
ライブラリを作成しました。ダウンロードして各自のarduino IDEに
ライブラリとして登録して下さい(スケッチ保存場所ディレクトリのlibrariesに
exfontsと、W25Q64を入れる)。
ダウンロード: libraries.zip
解凍すると、2つのフォルダ
・exfonts : 漢字利用ライブラリ :
が得られます。
一点、修正作業があります。
オリジナルのフォントデータの修正等により、内容が異なる場合があります。
3)サンプルプログラムの実行
arduino IEDを起動して、
メニュー [ファイル] - [スケッチの例] - [exfonts] - [exfonts_sample]
#include <SPI.h> #include <W25Q64.h> #include <exfonts.h> exfonts ft; // フォント管理オブジェクト // ビットパターン表示 // d: 8ビットパターンデータ // void bitdisp(uint8_t d) { for (byte i=0; i<8;i++) { if (d & 0x80>>i) Serial.print("#"); else Serial.print("."); } } // フォントデータの表示 // c(in) : フォントコード(UTF16コード) // void fontdisp(uint16_t c) { byte buf[MAXFONTLEN]; ft.getFontData(buf,c); // フォントデータの取得 byte bn= ft.getRowLength(); // 1行当たりのバイト数取得 Serial.print(ft.getWidth(),DEC); Serial.print("x"); Serial.print(ft.getHeight(),DEC); Serial.print(" "); Serial.println((unsigned short)c, HEX); // UTF16コード表示 for (byte i = 0; i < ft.getLength(); i += bn ) { for (byte j = 0; j < bn; j++) { bitdisp(buf[i+j]); } Serial.println(""); } Serial.println(""); } void test(char* pUTF8) { int n; uint16_t pUTF16[100]; n = exfonts::Utf8ToUtf16(pUTF16, pUTF8); // UTF8からUTF16に変換する // 7種類フォントサイズで表示 for (byte i=0; i < MAXSIZETYPE; i++) { ft.setFontSize(i); // フォントサイズの設定 for (byte j=0; j < n; j++) { fontdisp(pUTF16[j]); // フォントパターンの表示 } } } void test02() { } void setup() { Serial.begin(115200); ft.init(); // フォント管理の初期化 Serial.println("exfont liblary"); char *pUTF8 = "AAアイウエオ12A\¢£§¨¬°±´¶×÷埼玉さいたま"; //char *pUTF8 = "1aA!#/"; //char *pUTF8 = "あ"; test(pUTF8); } void loop() { }
サンプルでは、test()関数にて利用するフォントサイズを
ft.setFontSize(i)
で指定し、パラメタで指定されたpUTF8に格納されている文字列を
シリアルモニタに表示しています。
実際にフォントデータの取得と表示を行うのは fontdisp()関数です。
ft.getFontData(buf,c)
にて、指定した文字(UTF16)に該当するデータを取得します。
サンプルを実行すると、7種類の異なるフォントでシリアルモニタ上に
フォントパターンを文字で表示します。
作成したフォントの問題点
・半角カタカタは使えません。半角カタカナを取得しようとすると全角カタカナを返します。
・①②などの一部の特殊文字は使えません。
フォントROMのデータ配置について
u_table.h がフォントROM内の構造を示しています。
static FontInfo _finfo[EXFONTNUM] = { { 0x000000, 0x00017E, 191, 8, 4, 8 }, // 0:u_4x8a.hex { 0x000776, 0x000976, 256, 10, 5, 10 }, // 1:u_5x10a.hex { 0x001376, 0x001576, 256, 12, 6, 12 }, // 2:u_6x12a.hex { 0x002176, 0x002330, 221, 14, 7, 14 }, // 3:u_7x14a.hex { 0x002F46, 0x003100, 221, 16, 8, 16 }, // 4:u_8x16a.hex { 0x003ED0, 0x00404C, 190, 40, 10, 20 }, // 5:u_10x20a.hex { 0x005DFC, 0x005FB6, 221, 48, 12, 24 }, // 6:u_12x24a.hex { 0x008926, 0x00BEE4, 6879, 8, 8, 8 }, // 7:u_8x8.hex { 0x0195DC, 0x01CB96, 6877, 20, 10, 10 }, // 8:u_10x10.hex { 0x03E4DA, 0x041A98, 6879, 24, 12, 12 }, // 9:u_12x12.hex { 0x069F80, 0x06D53E, 6879, 28, 14, 14 }, // 10:u_14x14.hex { 0x09C5A2, 0x09FB60, 6879, 32, 16, 16 }, // 11:u_16x16.hex { 0x0D5740, 0x0D8CFE, 6879, 60, 20, 20 }, // 12:u_20x20.hex { 0x13D942, 0x140EFC, 6877, 72, 24, 24 }, // 13:u_24x24.hex };
この構造体の定義はexfonts.hで行っています。
// フォント管理テーブル
typedef struct FontInfo {
uint32_t idx_addr; // インデックス格納先頭アドレス
uint32_t dat_addr; // フォントデータ格納先頭アドレス
uint16_t f_num; // フォント格納数
uint8_t b_num; // フォントあたりのバイト数
uint8_t w; // 文字幅
uint8_t h; // 文字高さ
} FontInfo;
« 野良猫物語(1) | トップページ | IchigoJam用の支援ツールLinux版を作成しました »
「arduino」カテゴリの記事
- 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)
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
「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)
「表示器制御関連」カテゴリの記事
- NeoPixel(WS2812B)の制御 その5(2024.09.15)
- Arduino用 美咲フォントライブラリを更新しました(2024.03.21)
- Raspberry Pi Pico(MicroPython)でLEDドットマトリックスを使ってみる(2024.03.14)
- Raspberry Pi Pico MicroPython用のマルチフォントライブラリ(2023.02.09)
- MicroPython(Raspberry Pi pico)で8x8ドットNeoPixcel文字表示(2023.02.08)
コメント
トラックバック
この記事へのトラックバック一覧です: arduinoで利用可能な漢字フォントROMの製作(2):
» 約8000文字を一気に印字、「QR-701(サーマルプリンタ) + Arduino UNO R3もどき + 漢字ROM」 [Sabotenboy\s *sigh*]
全てAliExpressで通販^^;(プリンタのはまってるケースは100均のセリアにて購入)
例の漢字ROMの実データを吸い出したりしているうちに、「全角の約8000字を打ち出してみようか、QR-701で」と考え実験
ビットマップの印刷はAdafruitのサンプルで動いていたが、あの形式だ...... [続きを読む]
» 約8000文字を一気に印字、「QR-701(サーマルプリンタ) + Arduino UNO R3もどき + 漢字ROM」 [Sabotenboy\s *sigh*]
全てAliExpressで通販^^;(プリンタのはまってるケースは100均のセリアにて購入)
例の漢字ROMの実データを吸い出したりしているうちに、「全角の約8000字を打ち出してみようか、QR-701で」と考え実験
ビットマップの印刷はAdafruitのサンプルで動いていたが、あの形式だ...... [続きを読む]
「...需要は無いと思われますが公開します。」
あります、ここに^^
Adafruitで売ってるモデルと微妙にコンパチでない(ドライバボードが異なる)安いサーマルプリンタを買って、それに中華漢字ROM(JISX0208)と中華UNO R3もどきで日本語印刷を試みていますが、16*16のフォントをそのまま使ったのでは可読性が低すぎました
(一応、漢字ROMを読んで片っ端からビットマップ印刷することは出来ましたが)
http://blog.goo.ne.jp/sabotenboy_london/e/08d97fe4263989d35a4a77c3a1da01d1
と言う訳で非常にタイムリーでした、jiskan24のビットマップを眺めてどうROM化しようか考えていたところだったので
既にROM焼き器も発送済なので、届いたら使わせていただきますm(__)m
投稿: Sabotenboy | 2015年2月 8日 (日) 23時00分
Sabotenboyさん
コメント有難うございます。お役にたてて光栄です。
Sabotenboyさんのブログ拝見しまいた。なかなか面白いことやってますね。
ちょこちょこ覗きに行きます(^^)
漢字フォント関連、組み込み関係で需要があるのではないかと思いつつ、
製品も情報もなく(=需要がない)、自作したのですが実際のところどうなんでしょうね。
私も探したけど、中華製の日本語漢字ROMしか無いようで、どういうこと?
投稿: たま吉さん(管理者) | 2015年2月 9日 (月) 19時05分
aitendoの「フラッシュ/SPIプログラマ [PRG341A]」ですが、
「添付ソフトウェアにウイルスが検出された報告を上受け、添付ソフトウェアの配布を一時停止させていただきます」とあるのですが、
同じソフトウェアを入手することは可能でしょうか。
投稿: ちじたぜ | 2017年12月17日 (日) 00時39分
ちじたぜさん
別記事 「CH341A programmerを試してみました」
(リンク https://nuneno.cocolog-nifty.com/blog/2014/11/ch341a-programm.html)
にウィルスに関して記載しています。そちらを参照して下さい。
投稿: たま吉さん(管理者) | 2017年12月17日 (日) 08時42分