niszetの日記

細かい情報を載せていくブログ

キャラクタLCDで文字列をスクロールするやつの解説(2回目)

フォント/字形周りの話です。

前回の記事

niszet.hatenablog.com

HWの話を先に書こうと思ったのですが、ちょっと書き出したら深みにはまって初見だと難しい話になってきたので、先にフォント/字形周りの話をします。HWの話も次回以降に。

とりあえず難しいことはさておいて、キャラクタ液晶というのは基本的にROM(読み取り専用の領域)に書かれている文字を使い、もしそこにないのであればRAM領域に字形データを登録してそれを使うということでした。

実際に文字として認識されるdotの並び、つまり字形(フォント)を全部自作しても良いのですが、それでは大変です。

なので、今回は公開されているフォントとArduinoで使用できるライブラリがないかを探し、それぞれ見つけたのでほぼそのまま利用しています。

使用したフォントとライブラリについて

フォントの話も深みにはまりそうなので、ここでは単にその字形データを扱いたいなという話に留めましょう。

フォントデータについて、個人の趣味で使うだけならあまり気にしなくても良いかもしれませんが、ライセンスまわり(利用条件)が結構ややこしいのでフリーで使えるもので、出来れば字形が高さ8bot分で収まっているもの(PLCDの液晶の文字表示領域は幅5高さ8です)がないかを探しました。

この条件に該当するのが美咲フォントでした。

littlelimit.net

私は名前は聞いたことがあるレベルでしたが、界隈?ではポケコン(ポケットコンピュータ)向けのフォントとして有名らしいですね。 なお、8x8の美咲フォント以外にもバリエーションがあり、表示領域の条件によっては他のフォントが選択肢に入るかもしれませんので見ておくと良いでしょう。今回は高さ8で良いので美咲フォントを選択します。

このフォントデータからArduino上で扱うために字形情報を取り出せば良いわけですが、これについては既にTamakichiさんのArduino向けの実装がありましたので今回はこちらを使わせていただいています。

github.com

文字データについては文字コードに対していくつか実装パタンがあるので、詳しくはGitHubリポジトリやTamakichiさんのブログを読みましょう。

nuneno.cocolog-nifty.com

注意点としては全ての字形が登録されているわけではないので所望の文字が出ない場合があります(トーフになるとのことだけど手元ではなっていない)JISの字形全部入れるとArduinoには入れられないので、他のコトもするとなるとバランスが取れている実装だなと思います。

美咲フォントは1文字あたり8x8領域を使用しますが、実際には縦横外周1行1列が真っ白なので連続して文字を表示したときにくっつかないようになっています。Tamakichiさんの実装では上1行分のデータを取り除いて読み出し時に補完しています。8x8 bitなので、ちょうどchar型で収まるというのも取り回し的には便利ですね。

が、PLCD1602は文字領域の横幅が5dotしかありません。そのため、この文字データを1文字が1文字の表示領域にそのまま送り出すと3bit分表示が出来ません。これについてはST7032iがどのように字形データを取り扱っているか?という話になるので、次回に回します。

ここではとりあえず、丁度良いフォントデータとそれをArduinoで読むライブラリがあり、入力した文字に対して対応する字形データを出すことができそうだぞ、というところまでわかればよいでしょう。

なお一応書いておきますが、今回の私の実装に関連する問い合わせについてはそれぞれの作者様ではなく私にお願いします。

余談:文字コードのツラミ

ArduinoではUTF8で文字列を扱いますが、なんと日本語の処理についてはArduinoのString等ではうまく扱えません(文字列長とか) また、文字データも連番で入っているわけではないので、ここからここまでの文字コードで対応しているよ~という処理で弾くことも出来ません。上記のライブラリは登録済みデータかどうかを文字のコードがindexに入っているかというチェックをしているため、字形データ+登録済み文字コードのデータ領域が使用されます。 手元で少しずつチェック用のコードを書いていますが、とても面倒くさい…。既に実装があれば使いたいなぁ…というお気持ち(お気持ち表明文)

ようやく概略が終わったので、次こそはHWの中の話が出来る・・・はず。

しかし、話の内容が文字のスクロールに一向に近づいている気がしないぞ…?

次の記事

niszet.hatenablog.com