桜のはなびらどっとねっとロゴ

桜のはなびらどっとねっと

Raspberry Pi 2でグラフィック液晶の制御(3) テキスト表示編

この記事は1年以上前に投稿された記事です。 この警告表示について

IMG_4754_20150718

今まで液晶にBMPデータを送信してそれを表示してきましたが、今回はキャラクタ液晶と同じく文字データを送って表示できるようにしてみたいと思います。

関連記事リンク

必要なもの

  • 前回使用した一式(グラフィック液晶・抵抗類他)
  • 8×8ドットのビットマップフォント
    私は「美咲フォント」を使用しました。

美咲フォント とは

8×8のビットマップフォントである美咲フォントは元々はポケコンに日本語を表示させるためのフォントで恵梨沙フォントが見にくかったからという経緯で開発されたそうで、2002年ごろから開発をはじめて今なお改修されているフォントです。

収録文字はJIS 第一水準・第二水準までで、ほとんどの文字が7×7に収められているため見やすいのが特徴です。

選定理由

フォントを選定する際に一番重要だった部分は「なるべく転送方法が複雑にならない」ということで、次に「ビットマップ化が容易である」ということでした。そこで考えた転送方法は以下のとおりでした。

  • テキストデータをImageMagickなどを利用して画像にしてから読み込み、転送
    これがまず思いつきました。しかし、方法を探してもよくわからず、結構複雑な手順を踏まないといけないということがわかりました。PHPなら結構簡単にできるみたいなんですがね。よってこの方法は諦めました。
  • 漢字パターンの配列入りヘッダファイルを読み込ませる
    よく海外ユーザーが1バイト文字でやっている手です。キャラクタ液晶のような英数字+カナ+α程度の表示をさせるのであればこれが一番手っ取り早いし確実ですが、今回は漢字表示が目的であり、すると常用漢字だけでも2000字以上、学習漢字に絞っても1000字程度ありますのでやり終わる頃には年が明けてしまいます。よってこの方法は却下しました。
  • フォントデータを解析して転送する
    次に考えたのがビットマップフォントをフォントファイルから抜き出して液晶に転送するという方法で、BDFという形式が単純でこれを採用しようかと思いました。
    しかし、フォントファイルというのは基本的に横1列ずつにデータがわかれています。
    これはこのグラフィック液晶を使用する場合、少々面倒で複雑になってしまうのでこれもやめました。それにBDFの資料が少なすぎるので。
  • フォント一覧を書き込んだBMPファイルを作って小分けにして転送する
    この方法はBMPファイルに文字をすべて並べ、その文字から画像データを抜き出す方式です。これなら前回のBMPデータ転送の応用で作れますし、処理も文字コード分オフセットして読み込んでやればいいだけなので簡単です。
    おまけに先ほど紹介した美咲フォントにはフォントマップを画像データとして収録したものが用意されていました。ですのでこの方法を採用しました。

普通のマイコン制御ならなるべくメモリが少なくて済む方法を採用するべきなのですが、このRaspberry Piはなんといっても1GBもの広大なメモリ空間があるのでそんなの気にする必要なんて微塵もないので(少ないに越したことはないが)BMPデータを読み込んで表示したいと思います。

制御方法

上でも少し触れましたが、美咲フォントには画像ベースでフォントを収録しているPNGファイルが用意されていますので今回はそれを読み込んで細切れにして呼び出して使用したいと思います。

まず、美咲フォントのサイトからPNG形式のデータをダウンロードします。そのデータを解凍し、misaki_gothic.pngもしくはmisaki_mincho.pngのどちらか好きな方を「右90度」で回転させモノクロBMPファイルとして保存します。これにより文字コードが90度回転した状態で配列に入ります。

その配列からJISコードに則り該当する箇所にあるデータを読み出すのですが。
JISコードを取得する方法は色々あり、いくつか試してみたがどうもうまく行きませんでした。

そこで気づいたのがEUC-JPはJISコードとほぼ同じ、Char型に入れると1バイトずつに別れる。という事でこれを利用してEUCコードから識別コードを引いてやればJISコードが得られます。
例えばEUCコードで「あ」は「A4A2」となり、区点(JIS)コードだと「0402」となります。このため、EUCコードの上位ビットと下位ビットから0xA0を引いてやればJISコードが得られます。

というわけでチャートとしてはこんなかんじになります。

【文字入力】→CHAR型に代入→CHAR型から文字コードを取得→計算する→
→計算されたJISコードを元に変数からフォントデータを読み込み→【液晶に転送】

コーディング

基本的には前回のコードがベースです。ここからBMP制御命令と読み込み命令を削除したものを用意してください。

削除する箇所:45~59行 68~76行

このコードの#include郡以降、int mainまでの間に以下の行を追加します。

液晶解像度とフォント画像サイズはこのままでOK。font_pathは先ほど作成したフォントデータ画像ファイルのパスに変更します。

main関数のできるだけ上の方に以下の行を追加します。

先ほどBMP読み込み命令を削除したところに以下の行を追加します。

変数名とサイズ指定を書き換えただけですが、念のため一旦削除して書き換えたほうがいいです。

ユーザーの入力を受け付ける部分を書きます。
今回はユーザー入力を受け付けますが、入力したいデータがあるならそれに合わせて変更してください。なお、ユーザー入力を連続して受け付けるのであれば、ここから先をループさせてください。

これでSText変数に入力された文字が入ります。
なお、今回は念のためバッファを1024文字分取っていますが、16文字なら2バイトなので32文字必要ですので最低32文字分は確保してください。

データを転送するページを指定して綺麗に掃除します。

npで白黒反転を決め、文字が白なら黒(0x00)で文字が黒なら白(0xFF)でベタ塗りします。

文字を転送するためのループをします。

文字コードを1文字分読み込んで、それを計算し、その文字コードが上下bit両方「0」なら転送終了とみなし処理を終了します。
次に文字を転送する液晶のアドレスを指定し、計算した文字コードを元に、配列のオフセットを計算しそこから文字パターンを読み込んで転送します。

以上でコーディングが終了しました。

これをすべて合わせると以下の様なコードになります。

これを文字コードをEUC-JPに指定して保存し、前回と同じ要領でコンパイルします。
EUC-JPでないと文字コードを変換しないといけないので必ずEUCで保存しコンパイルします。

実行

実行時はローケルを「ja_JP.EUC-JP EUC-JP」に変更してから実行してください。
変更はraspi-configから実行できます。

euc

※SSHでリモートで操作している場合はそっちの設定も変更してください。

これですべてをEUC-JPにして以下の文字を転送するとトップ画像のように表示されるはずです。

IMG_4754_20150718

 

ちなみに今回は2バイト文字の部分のみを使用したので英数字を転送する場合は全角で転送してください。

SPI接続の場合

詳しい説明は省きますが、SPI接続の場合の転送コードはこうなります。

ちなみに内容を簡単に説明すると、文字パターンを読み込んだ後、一旦1行分配列にプールしてそれを一気に液晶に転送しています。

このコードで以下の文章を表示するとこんなかんじになります。

※こ今回使用したSPI接続の液晶は上のパラレルのグラフィック液晶と比べて2行分ドット数が少ないのでこうしましたが、同じドット数なら上の液晶と同じようになると思います。

IMG_4756

 

“Raspberry Pi 2でグラフィック液晶の制御(3) テキスト表示編” への1件のコメント

コメントを残す

メールアドレスが公開されることはありません。