2025年9月25日木曜日

LEDマトリックス表示装置の設計・製作 4(漢字表示)

  LEDマトリックスに漢字を表示させるようにします。ドットマトリックスのため、漢字のフォントもドットタイプが必要です。このフォントとして、BDF形式(Bitmap Distribution Format)フォントデータがあります。

 mgo-tec様のサイトを参考にしました。

 東雲フォントを使い、ESP32用にライブラリ化した「ESP32_SPIFFS_ShinonomeFNT」です。ESP32マイコンには、SPIFFSという内部メモリを利用したファイルシステムがあります。ここにフォントデータを入れておき、読みだして利用するものです。

 最近のArduinoIDEの環境では、同じ内部のフラッシュメモリにアクセスする「SPIFFS」が非推奨となり、より高速(2~3倍高速)な「LittleFS」に移行しつつあるようです。上記のライブラリも少し改造することで「LittleFS」を使ったアクセスに変更することができます。


 SPIFFSからLittleFSへの変更点

 プログラムでLittleFSに変更するには、「SPIFFS.begin()」を「Litt​​leFS.begin()」、「SPIFFS.open()」を「Litt​​leFS.open()」の様に行うことで対応できます。(インクルードも変更します)

 今回の実行プログラムは、オリジナルのSPIFFSのまま実行させていきます。


東雲フォントをシリアルモニタに表示させる

 ライブラリ「ESP32_SPIFFS_ShinonomeFNT」を利用するときに、一緒にライブラリ「 ESP32_SPIFFS_UTF8toSJIS」も必要です。これは漢字データ(UTF-8)からフォントを取得するときに、S-JISコード(ShiftJIS)で参照するためです。

(1)準備

 次のプログラムを書き込みます。書き込む前に、SPIFFSに書き込むデータが約1.5MBあるため、コンパイルの設定をSPIFFSが2MB以上とれるようにしてから書き込みます。


#include <ESP32_SPIFFS_ShinonomeFNT.h< //ver beta 1.32
const char* UTF8SJIS_file = </Utf8Sjis.tbl<; //UTF8 Shift_JIS 変換テーブルファイル名を記載しておく
const char* Shino_Zen_Font_file = </shnmk16.bdf<; //全角フォントファイル名を定義
const char* Shino_Half_Font_file = </shnm8x16.bdf<; //半角フォントファイル名を定義
ESP32_SPIFFS_ShinonomeFNT SFR;

#define DISPLINEMAX 16

uint8_t msg_buf[44][16] = {0};
uint16_t msg_data[22][DISPLINEMAX] = {0};
uint16_t msg_sj_length;

void displayFontData( int len ) {
  // フォントを表示
  for (int c = 0; c < len; c = c + 1 ) {
    for (int i = 0; i < DISPLINEMAX; i = i + 1 ) {
      Serial.printf("%04x : ", msg_data[c][i] );
      for (int j = 15; j >= 0; j--) {
        if ( ( msg_data[c][i] & (1 << j) ) != 0 ) {
          Serial.printf("*");
        } else {
          Serial.printf(".");
        }
      }
      Serial.printf("\n");
    }
    Serial.printf("\n");
  }
}

String message="本日は晴天なり";
void setup() {
  Serial.begin(115200);
  //フォントファイル(SPIFFS)オープン
  SFR.SPIFFS_Shinonome_Init3F(UTF8SJIS_file, Shino_Half_Font_file, Shino_Zen_Font_file); //ライブラリ初期化。2ファイル同時に開く
  // 漢字フォント取得
  msg_sj_length = SFR.StrDirect_ShinoFNT_readALL( message, msg_buf );

  // フォントデータを16bitデータに変換
  for(int xx=0; xx<message.length()/3; xx++){
    for(int yy=0; yy<16; yy++){
      msg_data[ xx ][ yy ] = ( msg_buf[ xx * 2 ][ yy ] << 8 ) | msg_buf[ xx * 2 + 1 ][ yy ];
    } 
    for(int yy=16; yy< DISPLINEMAX; yy++){
      msg_data[ xx ][ yy ] = 0;
    }
  }
  Serial.println( message );
  // フォントを表示
  displayFontData( message.length()/3 );
}

void loop() {
}

(2)SPIFFSにファイルを転送

 次のファイルをSPIFFSに転送しておく。
  shnmk16.bdf
  shnm8x16.bdf (※shnm8x16r.bdfのファイル名を変更しておく)
  Utf8Sjis.tbl

(3)実行結果の確認

 表示するメッセージはプログラムの31行目の「本日は晴天なり」表示します。

 シリアルモニタを確認すると、フォントファイルを処理後に、BDFフォントの16進データとそのビットデータを表示させています。

 右の図では、「本」の文字がビットデータになっている様子が分かります。

 このデータをLEDマトリックスに表示すると、漢字が表示できるようになります。


LEDマトリックスに漢字を表示

 以前に使った、ライブラリ「ESP32-HUB75-MatrixPanel-I2S-DMA」を組み込み、「drawPixel」関数で表示させました。

 漢字が16x16ドットのため、横に4文字表示できます。表示では「本日は晴天なり」の4文字分が表示されています。





Yahoo! RSSから情報を得る

 ニュースサイトとして、よく見られるサイトの一つがYahoo!! Japanでしょうか。
ニュースの情報は、RSSとして閲覧できます。こちらも、多くの方が実験しておりますので、プログラムなどを得られるのではないでしょうか。

以上で、メッセージボードを構築するプログラムライブラリが揃いました。

0 件のコメント:

コメントを投稿

LEDマトリックス表示装置の設計・製作 9(画像表示)

  LEDマトリックスに画像を表示させるには、いろいろな画像形式を知る必要があります。現在、よく使われるJPG形式やPNG形式は圧縮処理されて保存されています。これに対して、BMP形式やTIFF形式は非圧縮形式で、画像データがそのまま保存されています。このため、ファイルは大きくな...