Adafruit_ILI9341クラスを拡張し、fontxの描画機能を組み込み、漢字を表示できるようになった。クラス名はHumblesoft_ILI9341でGitHubで公開している。zipでダウンロードし、Arduino で".ZIP形式のライブラリをインストール"すれば使えるようになるはず。サンプルとして同梱しているのは、文市(あやち)さんがblogで公開されているILフォント、IPAフォントをfontx化したもの。小さいフォントが多いfontxには珍しく、16,24,32dotのフォントが提供されているのがありがたい。今回は16dotのフォントを使用したが、フラッシュの空き容量からすると24dotぐらいまでは使用できそう。
fontxの使用は、通常の文字描画に使用するprint(),println()メソッドで行う。Printクラスのvirtual methodであるwrite()を拡張し、fontxのフォントが設定されていなければ、親クラスのwrite()を呼び出し、設定されていると自前でutf-8のデコード、unicode-shiftjis変換を行い、fontxの文字の描画を行う。C++だと、こんな感じで機能の拡張を行えて便利だ...と久しぶりに思った。
写真はサンプルプログラムkanjiDisp.inoの実行後の状態。ソースプログラムは、こんな感じ。
[cpp]
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include "Humblesoft_ILI9341.h"
IMPORT_BIN("fontx/ILGH16XB.FNT", font_h);
IMPORT_BIN("fontx/ILGZ16XB.FNT", font_z);
extern uint8_t font_h[], font_z[];
Humblesoft_ILI9341 tft = Humblesoft_ILI9341();
void setup() {
delay(100);
tft.begin();
tft.setFontx(font_h,font_z);
tft.setRotation(3);
tft.fillScreen(ILI9341_BLACK);
tft.setTextSize(1);
tft.print("Humblesoft_ILI9341 漢字表示デモ\nABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
tft.print("\n");
tft.print("このプログラムはILフォントを使用しています。");
tft.print("ILフォントはIPAフォントを元に作成されたfontx形式のフォントです。\n");
tft.setTextSize(4);
tft.setTextColor(ILI9341_GREEN);
tft.setCursor(0, tft.getCursorY() + 10);
tft.print("Hello世界\n");
tft.setCursor(80, tft.getCursorY() + 10);
tft.setTextSize(3);
tft.setTextColor(ILI9341_YELLOW);
tft.print("ILI9341\n");
}
void loop() {
}
[/cpp]
まぁまぁ上手く実装できたのではなかろうか。
あと、NetLCDも対応済。コードを送るだけで漢字を描画できる。
ILI9341にはあと少し拡張したい機能がある。タッチパネルもなんとかしたい。ほかにもやりたいことがいろいろある。さぁ何をしよう。