関数1行で UTF-8 文字列をフリーの日本語漢字 ( 東雲 )フォントに変換できるようにしてみました

shinonome_pack00 ESP8266 ( ESP-WROOM-02 )

こんばんは。

今回は、フリーの16×16ドット日本語漢字フォント、東雲(しののめ)フォントを、たった1行の関数だけでUTF-8 文字列からフォントドット列へ変換できるライブラリを作ってみました。
これは、ESPr Developer ( ESP-WROOM-02, ESP8266 ) 用のものです。
ただし、SDカード読み取り専用です。
SPIFFS用はまだできていません。

今までは、SD_UTF8toSJIS ライブラリを使って、UTF-8 文字列から Shift_JIS コードへ変換して、それから SD_ShinonomeFONTread ライブラリで16×16ドット東雲フォントを取得していました。
それだと、プログラム(スケッチ)を入力するのにとても手間がかかっていました。
プログラミングのビギナーの方には、文字コードの変換方法が具体的に分かるかなと思って、改良せずにしばらくそのままにしていましたが、いざ、ディスプレイに文字を表示させようとすると、パッとできなくて、私自身が面倒になってきて、こりゃ、使えないな! と思ってきました。

ということで、今回は新たにライブラリを見直して、UTF-8変換ライブラリも同梱させた東雲フォントライブラリにしてみました。
初期化後は、たった1行の関数で日本語文字列を東雲フォントドット列に変換できます。
読み取り速度はあまり変わっておりません。

では、この使い方を説明してみます。
今まで使っていただいた方々は、以下、重複しているところが多々ありますので、読み飛ばしてください。

スポンサーリンク

1.使うもの

●ESPr Developer ( ESP-WROOM-02 開発ボード) スイッチサイエンス製

ESP-WROOM-02開発ボード
スイッチサイエンス(Switch Science)

ESPr Developer(ピンソケット実装済)
スイッチサイエンス(Switch Science)

当ブログで何度も紹介しているお勧めボードです。
日本の電波法をクリアした技適認証済みの ESP-WROOM-02 ( ESP8266 )に電源レギュレーターやUSBシリアルインターフェースなどをパッケージにしたボードです。
Arduino IDE で開発ができて、Wi-Fi が使用できて、メモリはArduino MEGA以上あるという優れものボードです。

ESP-WROOM-02 単体から構成してもいいのですが、全て揃えても2000円くらいになってしまいますので、このボードがお勧めです。
動作安定性は抜群です。

SparkFun マイクロSDカードスロット・ピッチ変換基板

SparkFun マイクロSDカードスロット・ピッチ変換基板

手軽にmicro SD カードスロットを増設できる安価な基板です。

●micro SD カード
当方で動作確認したものはこれです。


アクセスが速い Class 10 のものを使用しましたが、Class 4 でもあまり変わりませんでした。
これには標準サイズのSDカードアダプターは付属していないので、パソコンのカードスロットに挿入する場合は別途購入が必要です

また、これも問題なく動作しました。

その他のメーカーのものでも、おそらく動作するとの思われますが、稀に動作しないものもありますのでご注意ください。

●ブレッドボード
このブレッドボードがお勧めです。

サンハヤト SAD-101 ニューブレッドボード
サンハヤト
¥529(2024/04/28 13:49時点)

ESPr Developer を挿しても、両側に2列空いているので、とても有難いです。

●その他、2.54mmピンヘッダ、ジャンパーワイヤー、USBケーブル、パソコン等

2.組み立て、および接続

ESPr Developer や micro SDHCカードスロット変換基盤には2.54mmピンヘッダをハンダ付けしておきます。
ESPr Developer の使い方は以下のページを参照してください。

ESPr Developer ( ESP-WROOM-02 開発ボード )の使い方をザッと紹介

接続方法は、以前の記事でも紹介しましたが、こんな感じです。

ESPr Developer ( ESP-WROOM-02, ESP8266 ) では、SDカードの読み書き用のGPIOピンは決まっています。
他のピンでは使用できませんのでご注意ください。

 写真ではこんな感じです。

3.Arduino IDE の設定

当ブログで何度も紹介しておりますが、Arduino IDE に ESP8266ボードをインストールしておきます。
その方法は以下のページをご覧ください。

Arduino IDE に Staging(Stable)版ESP8266 ボードをインストールする方法

4.ライブラリのインストール

以下の新しいライブラリをインストールしてください。

SD_ShinonomeFNT_Pack

GitHub のこちらのページにアップしていますので、ZIPファイルをダウンロードして、Arduino IDE にインストールしてください。
ZIPファイルをそのまま IDE へインストールする方法は以下のページを参照してください。

GitHubにある ZIP形式ライブラリ のインストール方法

また、このライブラリには同時に以下のライブラリがインストールされている必要があります。
インクルードは不要ですが、このライブラリが存在している必要がありますのでご注意ください。

リンク先が誤っておりました。
以下のSDカード用のライブラリが正解です。大変失礼いたしました。
m(_ _)m
2016/11/24 

SD_UTF8toShift_JIS

現在のバージョンは Beta ver 1.21 です。
古いバージョンのライブラリはフォルダごと削除してから新たにインストールしてください。
GitHub のこちらのページにあります。
今まで、UTF-8 の2バイトコード文字が変換できなかったのですが、修正しました

5.フォントファイル等をmicro SDHCカードへコピーしておく

予め、micro SDHC カードへフォントファイル等をコピーしておきます。
まず、micro SDHC カードがフォーマットされていない場合は以下のページを参照してください。

micro SD 、micro SDHC カードの初期化(フォーマット)方法

次に、fontフォルダを作成しておいてください。

そこに以下のファイルをコピーしておきます。

  • shnm8x16.bdf
    (8×16ドット東雲フォント 半角英数字カナ用 保守・開発 /efont/さん
    オリジナルのファイルネームは
    shnm8x16r.bdf ですが、ESP8266 SDカードライブラリでは英数字8文字+拡張子3文字なので、’r’ をカットしました。

  • shnmk16.bdf
    (16×16ドット東雲フォント 日本語かな漢字用 保守・開発 /efont/さん

  • Utf8Sjis.tbl
    (UTF-8→Shift_JIS 変換テーブル mgo-tec作)

これらのファイルはGitHubのこちらのページにありますので、ZIPファイルを解凍して、fontフォルダをそのままSDカードにコピーしても良いと思います。

東雲フォントは /efont/さんが保守開発をしていて、ライセンスはPublic Domain です。
ユーザーの利便性を考え、こちらで再配布させていただきました。
/efont/さんに感謝いたします。 ありがとうございました。
m(_ _)m

6.サンプルスケッチの入力

では、Arduino IDE のファイルメニュー/スケッチの例/SD_ShinonomeFNT_Pack の中に、
SD_Shinonome_Sample
というサンプルファイルがありますので、それを開いて「名前を付けて保存」してください。
こんな感じのスケッチです。

【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)

/*
 * SDカード読み取り専用、東雲フォントライブラリサンプルスケッチ
 * 予めSDカードにfontフォルダを作成しておき、以下のファイルをコピーしておく
 * Utf8Sjis.tbl (UTF-8 Shift_JIS変換テーブル)
 * shnmk16.bdf (全角東雲フォント)
 * shnm8x16.bdf (半角東雲フォント)
 */

#include <SD_ShinonomeFNT_Pack.h>

/*
 sclk = 14;
 mosi = 13; //Master Output Slave Input ESP8266=Master
 miso = 12; //Master Input Slave Output
*/

const uint8_t cs_SD = 15;

const char* UTF8SJIS_file = "font/Utf8Sjis.tbl"; //UTF8 Shift_JIS 変換テーブルファイル名
const char* Shino_Zen_Font_file = "font/shnmk16.bdf"; //全角東雲フォントファイル名を定義
const char* Shino_Half_Font_file = "font/shnm8x16.bdf"; //半角東雲フォントファイル名を定義

enum { MaxTxt = 16 }; //MaxTxt = 文字列の最大数(半角数)

SD_ShinonomeFNT_Pack SFR (cs_SD, MaxTxt); //東雲フォントクラス定義

uint8_t Sino_font_buf[MaxTxt][16]; //東雲(しののめ)フォントバッファ
uint16_t sj_length; //Shift_JISコードのバイト数

void setup() {
  String str1 = "東雲日本語漢字";
  String str2 = "こんにちは";
  
  Serial.begin(115200);
  Serial.println();
  //東雲フォントライブラリ初期化
  SFR.SD_Shinonome_Init(UTF8SJIS_file, Shino_Half_Font_file, Shino_Zen_Font_file);

  sj_length = SFR.ShinonomeFNTread_ALL(str1, Sino_font_buf); //東雲フォント一括変換
  Serial_Monitor_Dot_Display(sj_length, Sino_font_buf); //シリアルモニターにドット表示
   
  uint8_t sj_code[MaxTxt];
  sj_length = SFR.SjisShinonomeFNTread_ALL(str2, sj_code, Sino_font_buf); //文字列のShift_JISコードと、東雲フォント両方を取得
  Serial_Monitor_Dot_Display(sj_length, Sino_font_buf); //シリアルモニターにドット表示

  //取得したShift_JISコードバイト数とコードをシリアルモニターに表示
  Serial.print("str2 Shift_JIS bytes = ");
  Serial.println(sj_length);
  Serial.print("str2 = ");
  for(int i=0; i<sj_length; i++){
    Serial.write(sj_code[i]);
  }
}

void loop() {
}

void Serial_Monitor_Dot_Display(uint16_t Len, uint8_t font_buf[][16]){
  int i, j, k;

  for(i=0; i<16; i++){
    for(j=0; j<Len; j++){
      for(k=7; k>=0; k--){
        if(bitRead(font_buf[j][i], k) == 1){
          Serial.print('*');
        }else{
          Serial.print(' ');
        }
      }        
    }
    Serial.println();
  }
}

【解説】

●9行目:
新しい東雲フォントライブラリのインクルードです。
Pack という名前がついています。
これを使うと、UTF8SJISライブラリのインクルードは不要です。
ただ、先にも述べましたが、UTF8SJISライブラリが予めインストールされている必要がありますので、ご注意ください。

●19-21行:
UTF8Sjisテーブルファイルや、東雲フォントファイルのパスを定義しています。

●25行:
東雲フォントライブラリのクラス名定義です。
SFR というところは好きな名前を指定できます。
ここで、SDカードの CS ピンや、最大文字数を指定します。

●27行:
Sino_font_buf では8bit の整数の2次元配列です。
東雲フォントは16×16ドットですが、基本的に半角の8×16ドット毎に処理します。
なぜかというと、半角英数字のASCIIコードは1バイト ( 8bit )コードなので、8×16毎に処理した方が全角と半角混在文字列には有利な為です。

●31-32行:
Windows パソコンの標準設定では、Arduino IDE に日本語文字を入力すると UTF-8コードで入力されるようです。
このようにString文字列に日本語を入力しておきます。

●37行:
SD_ShinonomeFNT_Pack ライブラリの初期化です。
これをセットアップ関数内で1回設定しておきます。

●39行:
今回の記事の目玉です。
この1行でString文字列から東雲フォントを一発変換します。
Shift_JISコードのバイト数が返ってきますので、引数sj_lengthへ代入します。

●40行;
シリアルモニターに疑似的にフォントをドット表示するための関数です。
58-73行で関数化してます。

●42-43行:
この関数は、40行目の関数と異なり、引数のsj_codeに変換したShift_JISコードが代入されます。
それを51行目のSerial.write でシリアルモニターに出力すると、シリアルモニターに日本語文字列を表示することができます。
ただし、これはWindowsパソコンの場合だけかもしれません。
当方のWindows環境では、シリアルモニターはなぜかShift_JISコードなのです。
もし、UTF-8ならばこれは不要です。

●47-52行:
43行で取得したShift_JISコード列をシリアルモニターに出力して日本語表示させています。

●58-72行:
シリアルモニターにフォントのドット列をアスタリスク’*’ で疑似表示させています。
シリアルモニターは115200bps で設定しておいてください。

6.コンパイル実行

では、スケッチをコンパイル実行させてみてください。
コンパイル書き込み終了したら、間髪入れずにシリアルモニターを115200bps で起動してください。
すると、このように表示されればOKです。

いかがでしょうか?
うまく表示されましたでしょうか。
もし不具合が出た場合には以下のコメント欄でご連絡いただけると助かります。

では、今回はここまでです。
近いうちにSPIFFS用のライブラリや、8×8ドットの美咲フォントもこういう形式にしたいと思っています。

ではまた・・・。

Amazon.co.jp 当ブログのおすすめ

スイッチサイエンス ESPr Developer 32 Type-C SSCI-063647
スイッチサイエンス
¥2,420(2024/04/29 04:52時点)
ZEROPLUS ロジックアナライザ LAP-C(16032)
ZEROPLUS
¥22,504(2024/04/28 16:05時点)
Excelでわかるディープラーニング超入門
技術評論社
¥2,068(2024/04/28 22:36時点)

コメント

タイトルとURLをコピーしました