« GLCDシールドの制作 | トップページ | SPIの倍速化 »

Arduinoで漢字表示(4)

漢字表示プロジェクトの最新状況です。やっと、UTF-8でエンコードした文字列を表示できるようになりました。

Unicode版のフォントデーター

このプロジェクトの最終目的はRSSリーダーを作ることです。そのため;

efontさんのUnicodeフォント全部を収録するとデーター量が多くなるため、日本語表示に必要なブロックを抜き取って使用しました。以下のフォント情報を収録しています。

Codespace_4

JISだと、全角となる記号類(☆○など)や、ギリシャ文字(αβなど)・キリル文字がこのフォントでは半角となります。GLCDの小さいスクリーンに表示するという点では、横幅が少ない半角がよいですが、判読性という点ではやや劣ります。ただし、ロシア語Webサイトではキリル文字は全角でなく半角相当で表示されるので、本来は半角相当のフォントデザインが正解なのだと思いますが、6ドット幅だとちょっときついようです。

フォントのデーター量はData Flashへの格納サイズで573KBとなり、かなり大きいです。JIS第一・二水準文字ならこの半分程度で格納できますので、日本語表示のみであればデーター量的にはJISの方が有利です。ただし、以前にも書きましたがJISコード並びでフォントROMを作るとUnicodeからJISコードに変換するための巨大なテーブルが別途必要になります(この文字コード表を見ても分かるように、UnicodeとJISのコード体系は機械的に変換できず、文字毎の対応表をメモリ上に作る必要があると思います)。対応表はアクセス速度を考えると、シリアル接続の外部メモリーでなくMCU内蔵のFlashメモリーに格納する必要があります。MCU内蔵Flash容量の制約を考えると、データー量が増大してもコード変換が不要なUnicode形式がベターと考えています。

Unicodeの概要は以下のリンクが参考になります:

Unicode - Wikipedia
UCSとUTF
文字コード、標準化について

今回作成したArduino形式のフォントデーターを以下に示します:
 「glcdfont_12_ucs2.zip」をダウンロード

Arduinoへのフォントデーターの転送

PCからシリアル回線経由でフォントデーターを転送し、ArduinoのData Flash Memoryに書き込む、以下のツールを作っています。

  • UploadUcs2.exe(PC側のアップローダー)
  • FontWriteDF.pde(Arduino側のデーター書き込みスケッチ)

UpladUcs2.exeの実行には.Net Framework 2.0以上が必要です。送信を始めてしまうとマウスイベントを受け付けなくなるため、中断するためにはタスクマネージャーから強制終了する必要があります。ArduinoからのレスポンスをSerialPort.ReadChar メソッド で監視しているのですが、このメソッドがブロッキングタイプで他のイベントを受け付けなくなるようです。Arduinoからの受信処理を別スレッドに分ける必要があると思いますが、ここは手抜きをしています。

上記のファイルを以下に示します:
 「UploadTools.zip」をダウンロード

ks0108 GLCDライブラリの機能追加

漢字を表示するために、以下のメソッドを追加しました:

  • PutUChar(unsigned int c): 引数としてUCS2コードを指定して対応する文字を表示する
  • Puts_U(char* str): UTF-8でエンコードした文字列を表示する。文字列の最後はnull (0)で終わっていること。この関数内でUTF-8をUCS2に変換し、一文字毎にPutUChar()を呼び出します

上記の追加を行ったソースを以下に示します:
 「ks0108_unicode.zip」をダウンロード

1byteの英数字もPuts_U()メソッドで表示が可能です。フォントはData Flashに書き込んだ半角フォントを使用します。SelectFont()関数によるフォントの指定は不要です。

ライブラリの使用方法

簡単な表示を行うスケッチを以下に示します:

#include <at45db161d.h>
#include <ks0108.h>

ATD45DB161D dataflash;      // SPI Data Flash Memory libraryのインスタンス宣言

void setup()
{
  delay(1000);
  Serial.begin(115200);
  dataflash.Init();                   // Data Flash libraryの初期化
  GLCD.Init(NON_INVERTED);  // GLCD libraryの初期化

  GLCD.ClearScreen();
  GLCD.GotoXY(0, 0);
  GLCD.Puts_U("Arduinoを始めよう\n");
  GLCD.Puts_U("123123ABCABC\n");
  GLCD.Puts_U("±×αβΣΩ☆△$¥@\n");
  GLCD.Puts_U("①②③ⅠⅡⅢ㍉㌔㌢㊤㊥");
}

void  loop()
{
}

ATD45DB161D dataflashの宣言は、ks0108ライブラリの中でもData Flashからフォントデーターを読み出すために使用しているため、dataflashのインスタンス名は変えないで下さい。インスタンス名が固定ですのでどこかのヘッダファイルに入れてしまうのが間違いを防ぐ意味でよいと思うのですが、ライブラリ間で参照するインスタンスをどこで宣言するのがよいかよく分からず、スケッチ本体で宣言しています。

自分のVista環境の場合、Puts_U()関数の引数に文字列リテラルを指定するとUTF-8でエンコードされ、正しく表示ができました。ちなみに、IDEのシリアルモニターはShit-JISで送信するようです。文字列リテラルに改行コード(\n)を入れると改行することができます。

スケッチを実行した際の表示を以下に示します。

Utf8_kanji

一部の記号類が半角になっていることが分かります。ローマ数字(4行目の丸付き数字の次)は殆ど判読できないです、、

漢字を表示するための最小限の機能は作ることができましたが、画面幅を超えた場合の折り返し処理やスクロールなど欲しい機能は他にもあります。ここから先はRSSリーダーアプリを作る中で少しずつ解決していきたいと思います。

« GLCDシールドの制作 | トップページ | SPIの倍速化 »

Arduino」カテゴリの記事

コメント

この記事へのコメントは終了しました。

2018年10月
  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      
無料ブログはココログ