フォト
2017年5月
  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 31      
無料ブログはココログ

« ArduinoでI2C接続EEPROM AT24C1024Bを利用するテスト | トップページ | Arduinoで美咲フォントを使った8x8ドットマトリクスLED »

2014年1月19日 (日)

EEPROM AT24C1024Bへの美咲フォントデータの格納

Arduinoで8x8ドットマトリクスLEDで
美咲フォントを使った日本語を表示を行うために現在いろいろとやってます。
意外と面倒です。

何気に苦労してやっとEEPROM AT24C1024Bにフォントデータを格納して、
指定したフォントデータの取り出しまで出きるようになりました。

テストプログラム(メインのみ)

void setup() {
  
  int code;
  wchar_t u16str[50];
  char str[] = "こんにちは、埼玉県♪";
  byte fontdata[8];
  char buf[32];
  unsigned long addr;
  int i;
  i2c_init();
  Serial.begin(9600);	// 9600bpsでポートを開く
  
  // UTF-8からUTF16に変換
  int len = Utf8ToUtf16(u16str, 50 ,str,strlen(str));
  Serial.print("len=");Serial.println(len,DEC);
 
  // フォントデータの取得
  int rc; 
  for (int j=0; j < len; j++) { 
    code = findcode(u16str[j]);
    addr = (unsigned long)code * 8;
    rc = (int)Sequential_read(addr, fontdata, (byte)8);
   
    // データ表示 
    sprintf(buf," u+%04x:c+%04d: ",u16str[j],code);
    Serial.print(buf);
    for (int i=0; i< 8; i++) {
      sprintf(buf,"%02x ",fontdata[i]);
      Serial.print(buf);
    }
    Serial.println("");
    print_font(fontdata);
  }
}

実行結果
実行結果

フォントデータの格納形式
  1)美咲フォントデータ本体(7120文字 x 8バイト: 56kバイト)
      生データはJISコード順ですが、arduinoでは文字コードとしてUTF-8を
      使っているため、UTF-16順にデータを並び替えて格納しました。
      
      収録フォント(括弧内は美咲フォントの収録フォント数)
        U+0020-007F 半角 ASCII文字 (95文字)
        U+0080-00FF 全角 ラテン補助 (11文字)
        U+0390-03FF 全角 ギリシア文字及びコプト文字(48文字)
        U+0400-04FF 全角 キリール文字(キリル文字)(66文字)
        U+2000-206F 全角 一般句読点 (15文字)
        U+2100-214F 全角 文字様記号 (3文字)
        U+2150-218F 全角 数字に準じるもの (10文字)
        U+2190-21FF 全角 矢印 (6文字)
        U+2200-22FF 全角 数学記号 (45文字)
        U+2300-23FF 全角 その他の技術用記号 (1文字)
        U+2460-24FF 全角 囲み英数字 (20文字)
        U+2500-257F 全角 罫線素片 (32文字)
        U+25A0-25FF 全角 幾何学模様 (12文字)
        U+2600-26FF 全角 その他の記号 (7文字)
        U+3000-303F 全角 CJKの記号及び句読点  (24文字)
        U+3040-309F 全角 平仮名 (174文字)
        U+30A0-30FF 全角 片仮名 (90文字)
        U+3200-32FF 全角 囲みCJK文字・月 (8文字)
        U+3300-33FF 全角 CJK互換用文字 (28文字)
        U+4E00-9FFF 全角 CJK統合漢字 (6356文字)
        U+FF00-FFEF 全角 半角・全角形 (91文字)

      UTF-16の広いコード空間に大して美咲フォントはスカスカなので、
      存在するフォントデータのみを詰めて格納しています。
      このデータは容量的に Arduino UNOの内部メモリに格納は無理なので
      EEPROM AT24C1024Bに格納します。

2)UTF-16コードテーブル (2バイト x 7120文字分 15kバイト)
     美咲フォントが対応している文字のUTF-8コード(2バイト)を格納順に
     並べたテーブルです。このテーブルを2分検索してフォントデータの
     格納位置を調べます。
     このテーブルは検索速度を考慮してArduino UNOのフラッシュメモリ上
     に配置しています。

当初、美咲フォントをJIS形式で格納してテーブルを用いてデータ参照を
考えていたのですが、これをやると、
     UTF-16コード  => 格納アドレス
のデーブルが必要で (2バイト+2バイト) x 7120文字 = 29kバイト必要で
Arduino UNOのフラッシュメモリ上に乗らないので止めました。

UTF-8からUTF16に変換は自力では無理そうなので、
やんちのプログラミングメモ(http://yanchde.gozaru.jp/) さんが公開している
関数を利用させていただきました。
    Utf8ToUtf16 http://yanchde.gozaru.jp/utf8_to_utf16/utf8_to_utf16_2.html

これでやっと、8x8ドットマトリクスLEDの表示の準備ができました。
フォントデータの格納のために、変換用ツール、PCからの書き込みツールなど
いろいろと作る必要がありました。

« ArduinoでI2C接続EEPROM AT24C1024Bを利用するテスト | トップページ | Arduinoで美咲フォントを使った8x8ドットマトリクスLED »

arduino」カテゴリの記事

AVR」カテゴリの記事

コメント

コメントを書く

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

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/58975181

この記事へのトラックバック一覧です: EEPROM AT24C1024Bへの美咲フォントデータの格納:

« ArduinoでI2C接続EEPROM AT24C1024Bを利用するテスト | トップページ | Arduinoで美咲フォントを使った8x8ドットマトリクスLED »