[実験] Arduino(M5StickC)でefont Unicodeフォント表示 PROGMEM版

/efont/さんのUnicode Fontを利用して、Arduino用のフォントライブラリを作ってみました。

※現時点の情報ですので、最新情報はM5StickC非公式日本語リファレンスを確認してください。

注意

こちらは実験ですので、実際に使う場合には以下のページを参考にしてください。

利用フォント

Unicode Font from /efont/

上記のf16.bdfとb16.bdfを利用させていただき、16ピクセルフォントを作成しました。

作成物

GitHub - tanakamasayuki/efontUTF16progmem: efont UTF16 Font Data(PROGMEM) for Arduino
efont UTF16 Font Data(PROGMEM) for Arduino. Contribute to tanakamasayuki/efontUTF16progmem development by creating an ac...

上記にとりあえず置いてみました。

フォントサイズ

対象フォントファイル名フォント容量
UNICODE(BMP)全部1,441,792
フォント無しefontUTF16DisableAll.h0
漢字以外efontUTF16DisableCJK.h507,904
ハングル以外efontUTF16DisableHang.h1,081,344
漢字のみefontUTF16OnlyCJK.h1,007,616
常用漢字のみefontUTF16OnlyMiniJapanese.h753,664

全部入れたところ、1.4Mぐらいになりましたので、少し減らすオプションを作りました。指定ファイルを事前に読み込むことで、対象フォントを絞り込むことができます。

256文字単位で管理しているので、ざっくりとしか間引けませんので常用漢字など飛び飛びでいろんな場所に分散しているものは、1文字単位で読み込んだ方が良さそうです。

実行結果

サンプルコード

#include <M5StickC.h>
#include "efontUTF16progmemM5StickC.h"
void setup() {
  M5.begin();
  M5.Lcd.setRotation(0);
  M5.Lcd.setCursor(0, 0);
  printEfont("Hello", 0, 16*0);
  printEfont("こんにちは", 0, 16*1);
  printEfont("你好", 0, 16*2);
  printEfont("안녕하세요", 0, 16*3);
  printEfont("Доброе утро", 0, 16*4);
  printEfont("Päivää", 0, 16*6);
  printEfont("Здравствуйте", 0, 16*7);
}
void loop() {
}

上記でUNICODE(BMP)全部が読み込まれます。描画部分は端末依存なのでM5StickC以外の端末で使う場合にはefontUTF16progmemM5StickC.h相当の処理を自作してください。

#include <M5StickC.h>
#include "efontUTF16progmemOnlyMiniJapanese.h"
#include "efontUTF16progmemM5StickC.h"
void setup() {
  M5.begin();
  M5.Lcd.setRotation(0);
  M5.Lcd.setCursor(0, 0);
  printEfont("Hello", 0, 16*0);
  printEfont("こんにちは", 0, 16*1);
}
void loop() {
}

常用漢字しか使わないのであれば、上記のようにすればプログラムサイズを減らすことができます。

容量的にはSPIFFSで1.4Mのフォントデータを転送して使うのが楽そうな気がしますのでSPIFFSを使ったバージョンも作ってみたいと思います。

コメント

  1. hsenshu より:

    表示位置を一行で指定でき、多言語の表示が可能なのでとても
    便利に思います。

    このライブラリーは公開されて久しいのですが、これをM5Unifiled
    で利用するにはどう修正すればよいのでしょうか。

    単純に置き換えると、以下のようなエラーになります。

    ~error: ‘using M5GFX = class m5gfx::M5GFX’ {aka ‘class m5gfx::M5GFX’} has no member named ‘textsize’; did you mean ‘setTextSize’?
    15 | uint8_t textsize = M5.Lcd.textsize;

    アドバイスをお願いいたします。

    • たなかまさゆき より:

      M5Unifiledの場合にはefontも内蔵していますので、内蔵フォント版を利用するのがおすすめです
      若干仕様が違って日本語とかよく使う文字種でパッケージ化されている感じになります

      M5.Lcd.setFont(&fonts::Font0);

      上記の書式等でフォント指定ができます。

      https://tanakamasayuki.github.io/LGFXFontCatalog/

      使えるフォントは上記のページで確認可能です。

      https://zenn.dev/nananauno/articles/0eaa02009f3766

      あとはefontみたいに自分で指定したフォントをデータ化して利用することも可能です

  2. hsenshu より:

    有益な助言、参考になります。

    フォントサイズや表示位置は、基本関数を別の関数でラップする
    ことで対応することにします。