★ Raspberry Piで8x8 LEDマトリックスを制御(2)/漢字表示 ★


実行例(「今度は、漢字表示ができるようになりました」とスクロール表示)

【1】はじめに

前回、日時をスクロール表示するシンプルな時計のようなものを作成しましたが、漢字が扱えませんでした。
今回同じ回路で、漢字に対応したサンプルプログラムを作成しましたので紹介します。
具体的には、漢字を含む全角のテキストファイルを読み込んで、その内容をLEDマトリックスに表示するプログラムになります。

【2】フォント形式

前回に引き続き美咲フォントを使用します。一般的な漢字フォントは本来16x16以上のドット数が必要ですが、使用しているLEDマトリックスは、8x8ドットであり使用できません。 美咲フォントは、もともとポケットコンピュータ(ポケコン)用に作成され、8x8ドットに対応しています。
美咲フォントは、複数のフォント形式があり、前回はPC-E500 用を使用していましたが、(私には)形式がわからないという問題がありました。
ネットで検索した結果、FONTX形式の美咲フォントについて、調査しているHPがありました(下記の参考にリンク先を記載しています)。
このため、今回は、FONTX形式を使用します。
FONTXは、下記の形式のヘッダ部分+漢字FONT(バイナリデータ)形式となります。
ヘッダ部分をC言語構造体で表現すると下記のようになります。
typedef struct {
        char Identifier[6];
        char FontName[8];
        unsigned char XSize;
        unsigned char YSize;
        unsigned char CodeType;
        unsigned char Tnum;     // number of MojiCode Entory
        struct {
                unsigned short Start;
                unsigned short End;
        } Block[];
} font_head;

上記のTnumが全文字コード数であり、Block[x].Start~Block[x].Endに文字コードのリストがあります。このリスト通りにヘッダに続く漢字フォントデータが格納されています。
これらの情報から、各文字コードに対する、文字コードに該当するオフセット(先頭からのバイト数)を計算することができます。
今回作成したプログラムでは、下記部分がオフセット計算部分になります。
font_head *pFH;
・・・
int SjisToImg(char *sjis, char *binary)
{
・・・
                /* KANJI code offset Serch */
                offset = font_base;
                for(j=0; j< pFH->Tnum; j++){
                        if(pFH->Block[j].Start <= code &&
                           pFH->Block[j].End >= code){
                                offset += (code - pFH->Block[j].Start) * 8;
                                break;
                        }
                        offset += (pFH->Block[j].End - pFH->Block[j].Start + 1) * 8;
                }

・・・

変数のcodeが文字コード(入力)で、offsetがcodeに対応するオフセット(出力)となります。
変数のpFHは、美咲フォントのデータ全部をメモリに展開したそのメモリの先頭を指しています。
変数のfont_base は、ヘッダ部分のサイズで、「font_base = 18+4*pFH->Tnum」になります。

【3】文字コード

FONTX形式の美咲フォントで扱う文字コードは、SJIS(シフトJIS)形式です。
SJISは、従来Windowsで使用されていましたが、現在は国際規格のUNICODEが主流となっています。
Raspberry PiのOSも、UNICODEであるUTF-8が標準的に使用されています。
今回作成したプログラムは、テキストファイルを読み込んで、LEDマトリックスに表示しますが、読み込むテキストファイルの形式はSJISでなければなりません。
今回の動画では、以下のテキストファイル(kanji.utf-8)を作成しました。
今度は、漢字表示できるようになりました

普通にテキストエディタで作成すると、UTF-8形式になっています。
このままでは、今回作成したツールでは、LEDマトリックスに表示できないので、iconvという文字コード変換ツールを使用します。
下記の例では、UTF-8形式のテキストファイルkanji.utf-8から、SJIS形式のテキストファイルkanji.sjisを作成します。
iconv -f utf-8 -t sjis kanji.utf-8 -o kanji.sjis

kanji.utf-8とkanji.sjis、それぞれのファイルをcatコマンドで表示すると、kanji.sjisは文字化けを起こします(がこれで良いです)。
$ cat kanji.utf-8
今度は、漢字表示できるようになりました
$ cat kanji.sjis
§?A
    ?須?ε・???蒂欺
$

【4】プログラム

ソースコードは、こちらから、ダウンロードしてください(LedKanji.zip)。

【4-1】サブルーチン

今回は、前回のコードをベースにしていますので、変更/追加した関数のみ記載します。
関数名説明
FontInitフォントファイル(MISAKI.FNT)読み込み
SjisToImg文字列(SJIS)から、LEDマトリックスに表示するためのバイナリデータを作成する(※1)
write_binary文字列をLEDマトリックスに表示する(※2)

(※1)(※2)
前回はFONTデータを参照して、LEDマトリックスに表示する関数(write_font)を使用していました。
今回は、これをSjisToImgと、wite_binaryの2つに分解しています。一旦バイナリデータを作成しています。
これは、以下の理由からです。
・前回は、数字だけ表示したためASCIIからのオフセット計算が単純であったが、
 今回はFONTXを解釈するため処理が複雑になっている
・前回は、FONT内の文字データ(バイナリ)の文字が横倒しになっていたが、
 今回のFONTは横倒しになっていないため、スクロール処理のため、
 横倒しのバイナリデータを作成している

【4-2】コンパイルと実行

コンパイルは、LedKanji.cをgccでコンパイルします。
コンソールから下記のようにインプットすると、"LedKanji"という実行ファイルが作成されます。
gcc LedKanji.c -o LedKanji

実行は、以下のように入力してください。
sudo ./LedKanji kanji.sjis
本プログラムでは、SJIS形式のテキストファイルを、LEDマトリックスにスクロール表示するプログラムです。
フォントファイルは、前記のとおり美咲フォントの「FONTX2 形式」を使用しています。
美咲フォントのHPからダウンロードした「MISAKI.FNT」ファイルを実行ファイルと同じディレクトリにコピーしてください。
また、【3】で作成した、SJISのテキストファイル(kanji.sjis)を実行ファイルと同じディレクトリにコピーしてください。
停止はプログラミングしていないので、[CTRL]+[C]で強制終了させてください。

【参考】

マイコンで日本語を表示させる為にFONTX2の仕様を調べました
8×8 ドット日本語フォント「美咲フォント」
【改訂記録】
2018/05/20版:公開

[ホームへ戻る]

Copyright (c) 1997-2018, BearBeetle, Allrights reserved.