gombeのブログ

マイコンの電子工作系PIC32/KiCad/C/C++/3D/

NUCLEOでFONTX形式を埋め込む(日本語表示)

ARM系でNUCLEOシリーズは有名ですね。最近は膨大なFlashモリーを有し、日本語フォントまで置けるようになりました。

最近の電子工作でよく使われる形式であるFONTX形式の解説等はelm-chan氏がかいたFONTXの使いかたにあります。だからこれと言って説明するものもないのですが一応100円の16x16PanelLED(ws2812)が手に入ったので一応メモします。image

このFONTX形式は全角と半角でフォント自体が異なる形となっています。SJISのコードを扱います。だから判別コードも必要に応じて挿入する必要があります。まあそこら辺は検索すれば何とかなるでしょう()文字をプログラムに入れる場合ソースコード文字コードSJISによって文字化けすることや、最悪コンパイルエラーになりかねないので(不明な文字呼ばれしたり)\x83みたいにエスケープします。これは日本語フォントの表示において発生し、英語などはおそらく起こりませんが、半角の\が¥になったりはするかもしれません。この場合どのような環境でも組み込まれたアプリケーション上では特定の文字を表示できます。またそれは可読性を失いますがもう一つのやり方としてファイルにSJISのテキストデータを入れることで可読性や環境に左右されず英語などにすぐ変更できるようになります。

このパネルLEDは横にいくつか連結でき、縦は16固定ですが横は16*n(n=1,2,3...)で解像度を増やすことができます。これで時計を作った時のメモです。

FONTX形式のファイルをconst uint8_tの配列としてのデータに変換したあと、先ほどのページの任意文字のポインタ取得用のソースコードに通すとフォントデータの先頭アドレスが得られるのでソレを使って描画するだけで日本語が出てきます。

実験では日本語のフォントだと200k位のプログラム領域を消費し、全角と半角で16xと12xを入れたら90%くらいの使用率になりましたXDまあまだまだ領域はあるのでこれに時計やタイマーなどコードを突っ込んでいきます。 ただ、PanelLED自体消費電力が実測で1枚あたり十数Aとなり、とてもじゃないけど手に負えないのですが、文字の表示だけだったら1Aあれば何とかなりそうです。まあやってみて調節する際は注意してください。暴走すると電源が逝ってしまいますので。。。

先頭の方にある写真では○も一緒に描いたせいで読みづらいです。がロボという文字が見えると思います。

最後にプログラム中にファイルを埋め込む方法について示したいと思います。C言語が簡単と思いますがファイルを0xで始める16進数に変換し、カンマ区切りのcsvファイルを作成し、それをそのままProjectに追加し、作りたいところでこのように書くとソース自体スッキリすると思います。一応mbed上では拡張子は.incなどにしておきます。ローカルの環境では結構.csvでもいけるっぽいけどまあ移植性を考えたら.incがいいと思います。.hは#includeで定番ですがヘッダー(先頭)なので一応。

また”は半角に直しなさいよ(なんかうまく表示されないっぽい。誰か教えてください)

[c] const static uint8_t font_ZENKAKU[]={

include ”font.inc”

}; [/c] こんな感じにすると#include文が置き換えなのでうまく作成できるかと思います。