フォト
2024年9月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
無料ブログはココログ

« aitendo I2CマトリックスキットをArduino動かしてみました (2) | トップページ | Arduino用美咲フォントライブラリを作成しました(2) »

2016年3月15日 (火)

Arduino用美咲フォントライブラリを作成しました

2016/07/05 更新、2018/05/18 追記

先日aitendo I2Cマトリックスキットで利用していたフォント周りの関数を取り出して
ライブラリ化しました。フォントデータは美咲フォントを利用してます。

フォントを教育漢字1,006字(小学校で習う漢字)+ひらがな・カタカナ・記号・半角等の
1,710字に絞って Arduino Uno(Atmega328)のフラッシュメモリ上に格納しました。
UTF16・UTF8対応です。

取りあえず公開します。自由に使って下さい。
   Arduino用 美咲フォントライブラリ 教育漢字・内部フラッシュメモリ乗せ版
     ダウンロード misakiUTF16.zip (24.8K)   2016/07/05 修正更新しました。
   
    ※以後最新版は下記にて随時更新公開いたします。
    ・Arduino-misakiUTF16
      https://github.com/Tamakichi/Arduino-misakiUTF16

利用は解凍してarduinoのlibrariesフォルダに入れて下さい。
Arduino IDEを再起動後、メニューにライブラリとして"misakiUTF16"の名称で登録されます。
2つのサンプルプログラムを用意しています。"スケッチの例"にて選択して利用できます。

サンプルの一つ、"banner" はシリアルコンソール上に表示するプログラムなので、
用意する部品も不要で、直ぐ動作確認出来ます。
もう一つは、先日のaitendo I2Cマトリックスキット用のプログラムです。

bannerのスケッチ 2016/07/10 修正しました

#include <misakiUTF16.h>

//
// フォントパターンをコンソールに表示する
// 引数
//  pUTF8 表示する文字列
//  fore  ドットに使用するキャラクタ
//  back  空白に使用するキャラクタ
//
// ※半角文字は全角文字に置き換えを行う
//
void banner(char * pUTF8, char* fore, char* back) {
  int n=0;
  byte buf[20][8];  //160x8ドットのバナー表示パターン

  // バナー用パターン作成
  while(*pUTF8)
    pUTF8 = getFontData(&buf[n++][0], pUTF8);  // フォントデータの取得
    
  // バナー表示
  for (byte i=0; i < 8; i++) {
    for (byte j=0; j < n; j++) 
        for (byte k=0; k<8;k++)
          Serial.print(bitRead(buf[j][i],7-k) ? fore: back);
    Serial.println();    
  }
  Serial.println();
}

void setup() {
    Serial.begin(115200);
    banner("abcdef","$"," ");
    banner("misakiUTF16ライブラリ","$"," ");    
    banner("あいうえお","##","  ");
    banner("埼玉☆さいたま","[]","  ");
    banner("みさきフォント","@"," ");    
}

void loop() {
}

実行例

01

8x8なので複雑な漢字は当然潰れます。雰囲気で読んで下さい。

仕様等について
  ライブラリの仕様のついては以下の通りです。

  ・フォントサイズ                    8x8ドッド(美咲フォント)
  ・利用可能フォント数        1,710字(Arduinoのフラッシュメモリ上に格納)
        内訳
           漢字 教育漢字 1,006字(小学校で習う漢字)
           非漢字 全角        546字(全角英数字、ひらがな、かたかな、記号)
           半角フォント        158字(半角記号、半角英数、半角カタカナ)

  ・文字コード   UTF16、UTF8

  ・利用可能API
    ・UTF8文字列をUTF16文字列に変換する。
     byte Utf8ToUtf16(uint16_t* pUTF16, char *pUTF8)

    ・UTF8文字をUTF16に変換する
      byte charUFT8toUTF16(char *pUTF8, uint16_t *pUTF16)

    ・UTF16半角コードをUTF16全角コードに変換する。半角でない場合はutf16の値を返す。
      uint16_t utf16_HantoZen(uint16_t utf16)

    ・半角カナを全角に変換する。半角カタカナでない場合はucodeの値を返す。
     uint16_t hkana2kana(uint16_t ucode)
      
    ・UTF16に対応するフォントデータ取得する。
     boolean getFontDataByUTF16(byte* fontdata, uint16_t utf16)

    ・指定したUTF8文字列の先頭文字のフォントデータを指定したアドレスに返す。
      戻り値として、次のUTF8文字列のアドレスを返す。
      char* getFontData(byte* fontdata,char *pUTF8)


  指定した文字に対するフォントが存在しない場合、getFontDataByUTF16()はエラーを
  返します(サンプルプログラムではその処理は行っていません)。
   => 2019/01/30 修正
         フォントが存在しない場合は、豆腐("□")フォントを取得し正常終了します。
         何らかの異常発生時のみエラー(false)を返します。

文字コードとしてUTF16を利用しているのは、Arduino IDEがUTF-8を利用しているためです。
シフトJISを採用するとライブラリの実装的には楽なのですが、Arduino IDEにて全角を利用する場合、
文字列を可読性のないシフトJISコード(16進数)バイナリデータとして定義する必要があります(たぶん)。
そこで、UTF16を採用しました。

UTF-8の場合、1文字のサイズが可変長になり、インデックステーブルの構造が面倒に
なるので、1ワードで扱えるUTF16にしました。

UTF8・UTF16間のコード変換は計算で出来でき、UTF16を採用することでユニコードの処理
が楽になります。

関連記事
  ・OLED(SSD1306)で美咲フォントを使った漢字表示
  ・Arduino用フォントライブラリを更新しました (本ライブラリの更新の記事)
  ・Arduino用美咲フォントライブラリを作成しました(2) (本記事の続き)
  ・Arduino用美咲フォントライブラリを作成しました(本記事です)
  ・itendo I2CマトリックスキットをArduino動かしてみました
 
  ・Arduino-misakiSJIS(本ライブラリのシフトJISバージョン)
   https://github.com/Tamakichi/Arduino-misakiSJIS

« aitendo I2CマトリックスキットをArduino動かしてみました (2) | トップページ | Arduino用美咲フォントライブラリを作成しました(2) »

arduino」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Arduino用美咲フォントライブラリを作成しました:

« aitendo I2CマトリックスキットをArduino動かしてみました (2) | トップページ | Arduino用美咲フォントライブラリを作成しました(2) »