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

« 野良猫物語(1) | トップページ | IchigoJam用の支援ツールLinux版を作成しました »

2015年2月 3日 (火)

arduinoで利用可能な漢字フォントROMの製作(2)

「arduinoで利用可能な漢字フォントROMの製作」の続きです。

SPI接続のフラッシュメモリ W25Q64BV に漢字を含む14種類のフォントデータを載せて
arduinoで汎用的に利用できる 漢字フォントROMを作成しました。
その作成手順とテストをまとめました。

まずは14種類のフォントファイルから、漢字フォントROM用データの作成です。
ツールを作成しました。需要は無いと思われますが公開します。

1.ツールによる漢字フォントROM用データの作成
    作成するデータは、14種類のフォント(全角、半角)を格納したバイナリファイルです。
    arduinoが採用している文字コード系 UTF-8に親和性のあるUTF-16のインデックスを
    付加したデータとなります。

    作成はすべてWinddows 8.1上で行いますが、perl(ActivePerl)が必要です。

    手順
    1)ツールをここ(fonts.zip)からダウンロードして下さい。
       解凍すると、\fontsフォルダ下に次のファイルが入っています。

      01

   2)この中にフォントデータは含まれていません。次のサイトから入手して、
     上記フォルダbdf内にファイルを配置して下さい。
     フォルダbdfには全部で14個のファイルを配置します。
    (1)8×8 ドット日本語フォント「美咲フォント」 X11 BDF 形式
      ファイル: misaki_bdf_2012-06-03.tar.gz

      解凍したファイルから、次のファイルを .\bdf フォルダに配置して下さい。
         misaki_4x8_iso8859.bdf
         misaki_gothic.bdf

    (2)/efont/ 日本語 ビットマップフォント集
       ファイル: japanese-bitmap-fonts-0.4.5.tar.bz2

       解凍したファイルから、次のファイルを .\bdf フォルダに配置して下さい。
         .\kappa20\10x20a.bdf
         .\kappa20\k20.bdf
         .\naga10\5x10a.bdf
         .\naga10\knj10.bdf
         .\shinonome12\shnm6x12a.bdf
         .\shinonome12\shnmk12.bdf
         .\shinonome14\shnm7x14a.bdf
         .\shinonome14\shnmk14.bdf
         .\shinonome16\shnm8x16a.bdf
         .\shinonome16\shnmk16.bdf
         .\x11\12x24a.bdf
         .\x11\jiskan24.bdf

  3)
バイナリフォントデータの作成
     コマンドプロンプトを開き、\fonts のディレクトリに移動します。
     makeall.bat を実行します。
     これにより、バイナリフォントデータを作成します。
     ほかに、幾つかのファイルを生成しますが、利用するファイルは次の2つです。
       .\utf_fontbin\u_font.bin  … 全種半角全角結合フォント
       .\u_table.h                   … Arduinoライブラリ exfont用フォントテーブル構造体ソース

     その他の生成されたファイルについては、添付のREADME.txtに説明を記述しています。

     これで、フォントデータの作成は終了です。
     一部のフォントでUTF16コード変換でエラーが発生しますが、無視して結構です。

  < 2016/04/18 追記、2016/04/19 修正

   バイナリファイル版を用意しました。

     下記からダウンロードして解凍してご利用下さい。
     ココログの制約から2つに分割しています。
       ダウンロード exfontbin.z01 (800.0K)
       ダウンロード exfontbin.zip (510.4K)

     解凍はwinrarを使い、上記2つのファイルを同じフォルダに入れて exfontbin.zipの方を
     解凍ツールで解凍すれば、解凍出来ます。   

        ライブラリではフォルダ内のu_font.bin、u_table.h を利用します。
     本ファイルを利用するのであれば ステップ1はスキップして下さい。
     ライセンスに関しては、添付のREADME.txtを参照して下さい。
     フォントに関してはフォント製作者に著作権があります。各フォントのライセンスに関する
     記載内容を確認の上、個人・非商用利用に限り配布可能と判断いたしました。
     本配布について問題があるようでしたらご指摘下さい。
   
2. フラッシュメモリへの書込み
   手持ちの CH341A Programmer を使って書込みます。
   前回は「Serprog/Arduino flasher」で行いましたが、これを使うと非常に楽ちんです。

   国内だとaitendoさんで購入出来ます: フラッシュ/SPIプログラマ [PRG341A]
   
     04

  Aliexpressebayなんかだと、400円くらいから購入出来きます。
   
    03

   操作は、利用するフラッシュメモリの種類を設定して、書き込むデータとして
   作成した u_font.bin を指定して読み込みます。 
   あとは、[auto]ボタンを押して、 書込みを開始します。

  Photo

  数分で書込みが完了します。
  CH341A programmer については、「CH341A programmerを試してみました」にも
  使い方等を書いています。
 
3. arduinoでの漢字ROMの利用
   作成した漢字ROMを使うには、次の物が必要です。
    ・arduinoで 漢字ROM (W25Q64BV) を利用する回路を作成する。
    ・漢字ROM を利用するスケッチ (プログラム)を作成する。

1)arduinoで 漢字ROM (W25Q64BV) を利用する回路の作成
  対象は、arduino Unoで利用する場合とします。
  W25Q64BVは、3.3V駆動のため、CD4050でレベル調整しています。
  回路図
01_2
  実際の結線接続イメージ

02Dscn3574

3.3Vで駆動できるArduinoでは直接、接続して利用します。



2)スケッチ(プログラム)の作成
  ライブラリを作成しました。ダウンロードして各自のarduino IDEに
  ライブラリとして登録して下さい(スケッチ保存場所ディレクトリのlibrariesに
  exfontsと、W25Q64を入れる)。

  ダウンロード: libraries.zip
  解凍すると、2つのフォルダ
   ・exfonts : 漢字利用ライブラリ :
   ・W25Q64: SPI接続 フラッシュメモリ W25Q64 利用ライブラリ
  が得られます。

  一点、修正作業があります。 
  「1.3)バイナリフォントデータの作成」で作成したu_table.hを、
  exfontsのフォルダに入れて下さい。既に同名のファイルが入っていますが、
  オリジナルのフォントデータの修正等により、内容が異なる場合があります。

3)サンプルプログラムの実行
    arduino IEDを起動して、
       メニュー [ファイル] - [スケッチの例] - [exfonts] - [exfonts_sample]
    を選択します。

   04 
 

#include <SPI.h>
#include <W25Q64.h>
#include <exfonts.h>

exfonts ft;  // フォント管理オブジェクト

// ビットパターン表示
// d: 8ビットパターンデータ
//
void bitdisp(uint8_t d) {
  for (byte i=0; i<8;i++) {
    if (d & 0x80>>i) 
      Serial.print("#");
    else
      Serial.print(".");
  }
}

// フォントデータの表示
// c(in) : フォントコード(UTF16コード)
//
void fontdisp(uint16_t c) {
  byte buf[MAXFONTLEN]; 
  ft.getFontData(buf,c);        // フォントデータの取得
  byte bn= ft.getRowLength();   // 1行当たりのバイト数取得
  
  Serial.print(ft.getWidth(),DEC);
  Serial.print("x");      
  Serial.print(ft.getHeight(),DEC);      
  Serial.print(" ");      
  Serial.println((unsigned short)c, HEX);  // UTF16コード表示

  for (byte i = 0; i < ft.getLength(); i += bn ) {
      for (byte j = 0; j < bn; j++) {
        bitdisp(buf[i+j]);
      }
      Serial.println("");
  }
  Serial.println("");
} 

void test(char* pUTF8) {
  int n;
  uint16_t pUTF16[100];
  n = exfonts::Utf8ToUtf16(pUTF16, pUTF8);  // UTF8からUTF16に変換する

  // 7種類フォントサイズで表示
  for (byte i=0; i < MAXSIZETYPE; i++) {
    ft.setFontSize(i);      // フォントサイズの設定
    for (byte j=0; j < n; j++) {
      fontdisp(pUTF16[j]);  // フォントパターンの表示
    }
  }
}

void test02() {
  
}

void setup() {
  Serial.begin(115200);
  ft.init();  // フォント管理の初期化
  Serial.println("exfont liblary");
  char *pUTF8 = "AAアイウエオ12A\¢£§¨¬°±´¶×÷埼玉さいたま";
  //char *pUTF8 = "1aA!#/";
  //char *pUTF8 = "あ";
  test(pUTF8);
}

void loop() {
}

サンプルでは、test()関数にて利用するフォントサイズを
  ft.setFontSize(i)
で指定し、パラメタで指定されたpUTF8に格納されている文字列を
シリアルモニタに表示しています。

実際にフォントデータの取得と表示を行うのは fontdisp()関数です。
  ft.getFontData(buf,c)
にて、指定した文字(UTF16)に該当するデータを取得します。

サンプルを実行すると、7種類の異なるフォントでシリアルモニタ上に
フォントパターンを文字で表示します。

05


作成したフォントの問題点
・半角カタカタは使えません。半角カタカナを取得しようとすると全角カタカナを返します。
・①②などの一部の特殊文字は使えません。

フォントROMのデータ配置について
u_table.h がフォントROM内の構造を示しています。

static FontInfo _finfo[EXFONTNUM] = {
	{ 0x000000, 0x00017E,  191,  8,  4,  8 }, // 0:u_4x8a.hex
	{ 0x000776, 0x000976,  256, 10,  5, 10 }, // 1:u_5x10a.hex
	{ 0x001376, 0x001576,  256, 12,  6, 12 }, // 2:u_6x12a.hex
	{ 0x002176, 0x002330,  221, 14,  7, 14 }, // 3:u_7x14a.hex
	{ 0x002F46, 0x003100,  221, 16,  8, 16 }, // 4:u_8x16a.hex
	{ 0x003ED0, 0x00404C,  190, 40, 10, 20 }, // 5:u_10x20a.hex
	{ 0x005DFC, 0x005FB6,  221, 48, 12, 24 }, // 6:u_12x24a.hex
	{ 0x008926, 0x00BEE4, 6879,  8,  8,  8 }, // 7:u_8x8.hex
	{ 0x0195DC, 0x01CB96, 6877, 20, 10, 10 }, // 8:u_10x10.hex
	{ 0x03E4DA, 0x041A98, 6879, 24, 12, 12 }, // 9:u_12x12.hex
	{ 0x069F80, 0x06D53E, 6879, 28, 14, 14 }, // 10:u_14x14.hex
	{ 0x09C5A2, 0x09FB60, 6879, 32, 16, 16 }, // 11:u_16x16.hex
	{ 0x0D5740, 0x0D8CFE, 6879, 60, 20, 20 }, // 12:u_20x20.hex
	{ 0x13D942, 0x140EFC, 6877, 72, 24, 24 }, // 13:u_24x24.hex
};

この構造体の定義はexfonts.hで行っています。
// フォント管理テーブル
typedef struct FontInfo {
   uint32_t    idx_addr;  // インデックス格納先頭アドレス
   uint32_t    dat_addr;  // フォントデータ格納先頭アドレス
   uint16_t    f_num;     // フォント格納数
   uint8_t     b_num;     // フォントあたりのバイト数
   uint8_t     w;         // 文字幅
   uint8_t     h;         // 文字高さ
} FontInfo;

« 野良猫物語(1) | トップページ | IchigoJam用の支援ツールLinux版を作成しました »

arduino」カテゴリの記事

AVR」カテゴリの記事

表示器制御関連」カテゴリの記事

コメント

「...需要は無いと思われますが公開します。」

あります、ここに^^
Adafruitで売ってるモデルと微妙にコンパチでない(ドライバボードが異なる)安いサーマルプリンタを買って、それに中華漢字ROM(JISX0208)と中華UNO R3もどきで日本語印刷を試みていますが、16*16のフォントをそのまま使ったのでは可読性が低すぎました
(一応、漢字ROMを読んで片っ端からビットマップ印刷することは出来ましたが)
http://blog.goo.ne.jp/sabotenboy_london/e/08d97fe4263989d35a4a77c3a1da01d1

と言う訳で非常にタイムリーでした、jiskan24のビットマップを眺めてどうROM化しようか考えていたところだったので
既にROM焼き器も発送済なので、届いたら使わせていただきますm(__)m

Sabotenboyさん

コメント有難うございます。お役にたてて光栄です。
Sabotenboyさんのブログ拝見しまいた。なかなか面白いことやってますね。
ちょこちょこ覗きに行きます(^^)

漢字フォント関連、組み込み関係で需要があるのではないかと思いつつ、
製品も情報もなく(=需要がない)、自作したのですが実際のところどうなんでしょうね。
私も探したけど、中華製の日本語漢字ROMしか無いようで、どういうこと?


コメントを書く

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

トラックバック

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

この記事へのトラックバック一覧です: arduinoで利用可能な漢字フォントROMの製作(2):

» 約8000文字を一気に印字、「QR-701(サーマルプリンタ) + Arduino UNO R3もどき + 漢字ROM」 [Sabotenboy\s *sigh*]
全てAliExpressで通販^^;(プリンタのはまってるケースは100均のセリアにて購入) 例の漢字ROMの実データを吸い出したりしているうちに、「全角の約8000字を打ち出してみようか、QR-701で」と考え実験 ビットマップの印刷はAdafruitのサンプルで動いていたが、あの形式だ...... [続きを読む]

» 約8000文字を一気に印字、「QR-701(サーマルプリンタ) + Arduino UNO R3もどき + 漢字ROM」 [Sabotenboy\s *sigh*]
全てAliExpressで通販^^;(プリンタのはまってるケースは100均のセリアにて購入) 例の漢字ROMの実データを吸い出したりしているうちに、「全角の約8000字を打ち出してみようか、QR-701で」と考え実験 ビットマップの印刷はAdafruitのサンプルで動いていたが、あの形式だ...... [続きを読む]

« 野良猫物語(1) | トップページ | IchigoJam用の支援ツールLinux版を作成しました »