esp-open-rtosを使ってみる

日本語フォントドライバー

esp-open-rtosでのSPIFFSの使い方が分かったので、SPIFFS領域に漢字フォントファイルを置いて、
読み出してみることにしました。
使用するフォントファイルはFONTX形式のフォントファイルで、こ ちらで公開されているものを利用させていただきました。

FONTX形式のフォントファイルについては、こちらこ ちらで紹介されていますが、
文字コードテーブルに格納されている文字コードはSJISで格納されています。
そこで、UTF8の文字列をSJISの文字列に変換する必要が有ります。
Linuxであればiconv()一発でUTF8→SJISに変換できるのですが、ESPにはそのような関数は有りません。

調べたところ、こ ちらにUTF8→SJIS変換テーブル(Utf8Sjis.tbl)が公開されていましたので、
ありがたく使わせていただくことにしました。

ドライバーのサンプルコードはこちらで 公開しています。
SPIFFS領域に漢字フォントをアップロードするので、ビルドはものすごく時間がかかります。
実行すると、以下の様に漢字フォントのパターンを表示します。
以下の例は16ドットフォントを使った場合ですが、8ドットフォントや24ドットフォントも使うことができます。
filesディレクトリに置かれているフォントファイルが、ビルド時にSPIFFSにアップロードされます。
SDK version:0.9.9
SPIFFS memory, work_buf_size=512, fds_buf_size=220, cache_buf_size=1400
SPIFFS mount OK
mode : sta(18:fe:34:d4:2f:77)
add if0
SPIFFS Directory List
Utf8Sjis.tbl [803d] size:240878
ILGZ16XB.FNT [805b] size:283146
ILMH16XB.FNT [802e] size:4113
ILMZ16XB.FNT [804c] size:283146
ILGH24XB.FNT [8001] size:12305
ILGZ24XB.FNT [801f] size:636586
ILGH16XB.FNT [8010] size:4113
22
scandone
sjis[0]=0x8abf
[ShowFont pw=16 ph=16]
00................
01.*.....*...*....
02..*..**********.
03...*...*...*....
04.....*********..
05.**..*...*...*..
06..*..*********..
07.........*......
08.....*********..
09..*......*......
10..*.***********.
11.**.....***.....
12.*.....**..**...
13.*..****....***.
14................
15................

sjis[1]=0x8e9a
[ShowFont pw=16 ph=16]
00................
01.......*........
02.......*........
03..************..
04..*..........*..
05..*.********.*..
06.........**.....
07.......**.......
08.......*........
09.**************.
10........*.......
11........*.......
12........*.......
13.....*..*.......
14......***.......
15................

sjis[2]=0x54
[ShowFont pw=8 ph=16]
00........
01........
02.******.
03...*....
04...*....
05...*....
06...*....
07...*....
08...*....
09...*....
10...*....
11...*....
12........
13........
14........
15........

sjis[3]=0x45
[ShowFont pw=8 ph=16]
00........
01........
02.******.
03.*......
04.*......
05.*......
06.*****..
07.*......
08.*......
09.*......
10.*......
11.******.
12........
13........
14........
15........

sjis[4]=0x53
[ShowFont pw=8 ph=16]
00........
01........
02..****..
03.*...**.
04.*......
05.**.....
06..**....
07....**..
08......*.
09.*....*.
10.**...*.
11..****..
12........
13........
14........
15........

sjis[5]=0x54
[ShowFont pw=8 ph=16]
00........
01........
02.******.
03...*....
04...*....
05...*....
06...*....
07...*....
08...*....
09...*....
10...*....
11...*....
12........
13........
14........
15........

sjis[6]=0xb6
[ShowFont pw=8 ph=16]
00........
01........
02...*....
03...*....
04.******.
05...*.**.
06...*.**.
07...*.**.
08..**.**.
09..*..**.
10..*..*..
11.*...*..
12.*..**..
13........
14........
15........

sjis[7]=0xdd
[ShowFont pw=8 ph=16]
00........
01........
02.*......
03.**.....
04..**..*.
05......*.
06......*.
07.....**.
08.....*..
09....**..
10...**...
11..**....
12..*.....
13........
14........
15........

sjis[8]=0xbc
[ShowFont pw=8 ph=16]
00........
01........
02..*.....
03...**...
04........
05.*....*.
06..*...*.
07.....**.
08.....*..
09....**..
10....*...
11..**....
12..*.....
13........
14........
15........

sjis[9]=0xde
[ShowFont pw=8 ph=16]
00........
01..**....
02.*.*....
03..*.....
04........
05........
06........
07........
08........
09........
10........
11........
12........
13........
14........
15........



このドライバーを使って、SSD1306(OLED)に漢字を表示してみました。
SSD1306への表示はextras/ssd1306のドライバーと、16ドットフォントを使っています。
コードとフォントファイルはこち らで 公開しています。
i2cとSPIの両方に対応しています。

i2cモジュールの場合、ソースコード上の以下の行を有効にしてください。
#define I2C_CONNECTION
ESP8266との接続は以下となります。
OLED(i2c) ESP8266
GND GND
VDD 3.3V
SCK GPIO5
SDA GPIO4




SPIモジュールの場合、ソースコード上の以下の行を削除してください。
#define I2C_CONNECTION
ESP8266との接続は以下となります。
OLED(SPI) ESP8266
GND GND
VCC 3.3V
DO GPIO14
DI GPIO13
RES GPIO0(※)
DC GPIO4(※)
CS GPIO5(※)

(※)ソースを変更することで他のGPIOに変更することができます。



左 i2cモジュール
右 SPIモジュール




こちらで紹介している0.66インチのSSD1306(OLED)に漢字を表示してみま した。
SSD1306への表示はextras/ssd1306のドライバーと、16ドットフォントを使っています。
解像度が64x48しかないので、16ドットフォントを使うと1行に4文字しか表示できません。
コードはこち らで公開しています。

ESP8266との接続は以下となります。
OLED(i2c) ESP8266
GND GND
VDD 3.3V
SCK GPIO5
SDA GPIO4



128x64のモジュールと比べると同じフォントを使っても、文字が大きく表示されるので、ドットの大きさが違う事が分かります。


続く....