Arduino UNOで使用可能な漢字ROMを作って行きたいと思います。
これまで、いくつかのプラットフォームにて日本語フォントデータを作成・活用して来ました(下表)。
マイコンボード |
メモリ容量 [バイト] |
フォントサイズ | 記事 | |
[ドット] | [バイト] | |||
Arduino DUE | 512K | 16×16 | 256K | 「#12-3 Arduino DUEで日本語表示」 |
Moscovium | 200K | 8×8 | 64K | 「#18-4 Moscoviumで日本語表示」 |
M5StickC Plus | 1,280K | 15×15 | 240K | 「#23-4 M5StickC Plusで日本語表示」 |
フォントサイズに関しては当然、構成するドット数の多い方が、より細かい細部を表現できて可読性も向上します。その点に於いては8×8[ドット]フォントよりも16×16[ドット]フォントの方が優れていると言って良いでしょう。
JIS規格の第一・第二水準漢字でおよそ約7,000文字が規定されており、これだけの文字数のフォントデータを保持するためには、大量のメモリ容量が必要です。従って、フォントのドット数を制限するのは、フォントデータを記録するROMの容量に寄ります。
512Kバイトを超えるような大容量のFlashメモリを有するDUEやM5StickC Plusでは、16×16[ドット]等の比較的大きなフォントを使えたのです。一方、Flashメモリ等のROMを持たず、RAMマクロで全てのメモリを実装するFPGA(Cmod A7ボード)で開発しているオリジナル16ビットCPUコアMoscoviumでは、8×8[ドット]フォントに妥協せざるを得ませんでした。
8×8[ドット]フォントのサンプルを以下図に示します。
可読性としては、これでほぼ限界だと考えられます。複雑な漢字だと、8×8[ドット]では識別できない場面にも多々遭遇します。そもそも、数100文字のフォントが全く同じビット列(従って、全く同じ形状)になっているのではないでしょうか?
8×8[ドット]フォントはメモリ容量が小さい場合の対応策として有効です。それでも1文字当たり8×8[ドット]なので、8バイトの記憶領域を要します。約7,000文字×8バイト≒64Kバイトの記憶領域が必要なのです。
32KバイトしかFlashメモリを搭載していないUNOでは、半分も収録できなかったのが現状です。
逆の見方をすると、64Kバイトのメモリを確保できたら、UNOでも日本語フォントを使ったアプリケーションを作ることができるのです。
ログストレージ用として購入したI2C EEPROM(24C256)が、256Kビット=32Kバイトの容量が有りました(下図)。
64KバイトのROMを探している所に、半分の32Kバイトでは足りません。しかし、このチップはI2Cスレーブアドレスを外部端子で設定可能な仕様です。2個の24C256を異なるスレーブアドレスに設定してI2Cバスに接続すると、2個分で64KバイトのROMとして使用可能となります。
※実は、24C512と言うバリエーションもあって、こちらは512Kビット=64Kバイトと丁度必要なサイズです。24C512を入手して使っても良いです。当方の手元には無いので、24C256×2個を前提として進めて行きます。
一旦、UNO用の日本語フォントを作成できたとして、その使い道について考察しておきましょう。UNOと組み合わせて使う表示器の選定に関する考察です。
手頃に使える液晶ディスプレイLCD1602などという表示器も所有しているのですが、こちらは内蔵されたフォントでしか描画できません。この様な表示器は、キャラクタディスプレイ等と呼ばれます(下図)。
自前の日本語フォントで描画するためには、TFTシールドの様なグラフィックスディスプレイが必要です(下図)。
ただ、上図の様にUNOへTFTシールドを装着してしまうと、全ての端子(ピンソケット)が埋まってしまい、I2C端子の引き出しさえも困難と、なります。この辺りがTFTシールドの使い勝手の悪い所なのですよ……。I2C EEPROMを漢字ROMとして使おうとしている所に不似合いなので、却下です。
色々購入してきたので、SPI接続TFTディスプレイ等、他にもグラフィックスディスプレイはあるのですが、もう一つ考えておくべき事は、描画に要する時間、描画速度です。
今回の漢字ROMはI2C EEPROMに保持しようとしていますので、I2C通信(@400Hz)で読み出すことになります。DUEなど、内蔵メモリに日本語フォントを記録した場合と比べて、アクセス速度は格段に遅くなります。
従って、大画面に多量の日本語を表示する用途では、漢字ROMへのアクセス(低速)のため、描画速度が低下する事態が予想されます。UNOで使用するには、もう少し表示範囲の狭い表示器が似つかわしいと思います。
前節最後の結論に従い、小さなOLEDディスプレイを対象としたいと思います(下図)。
※上の写真は8×16[ドット]のASCIIフォントを使って16桁×2行表示した時の様子。
上図のOLEDディスプレイは3.3V定格なので、5V定格のUNOで使うにはレベルシフタL/Sを挟む必要があります。
表示領域は128×32[ドット]です。ここへ8×8[ドット]フォント(全角)を描画すると、16桁×4行の表示が可能ですが、0.91インチと言う小さな表示器なので、これでは文字が小さすぎて、老眼のおじさんには視認できません(1🔎_−)!
と言って、フォントサイズを縦・横×2倍に拡大(4倍角)してしまうと8桁×2行の表示となって、今度は情報量が少なすぎるという板挟みです。そこで折衷案として、縦方向だけ×2倍に拡大した8×16[ドット]フォント(縦倍角)を使い、16桁×2行表示で使いたいと思います。下図が仮想的に比較した実験です。
8×8[ドット]フォントのOLEDディスプレイ表示想像図: | |
![]() |
4倍角フォントによる8桁×2行表示 |
縦倍角フォントによる16桁×2行表示【採用】 | |
全角フォントによる16桁×4行表示 |
図らずも、キャラクタディスプレイLCD1602と同じ表示領域(16桁×2行表示)となりました(下図)。
LCD1602は、7ビットASCII文字と半角カタカナしか表示できませんが、OLEDディスプレイ+漢字ROMなら、日本語フォントを表示可能な事が優位です(下図)。
なお、8×16[ドット]サイズのフォントを用意するには、8×16[ドット]÷8ビット×約7,000文字≒128Kバイトが必要で、前の節で検討した24C256×2個=64Kバイトでは不足するので破綻してしまいます。これではいつまで経っても初期検討が収束しません。
割り切って、ROM化するフォントとしては8×8[ドット]のままで、描画する時に縦方向へ×2倍拡大して描画する事にしたいと思います(上の写真、Moscoviumで日本語描画した時と同じ状態)。
前節までの初期検討で、材料は出揃いました。
5V定格のUNOと接続して使えば良いので、回路図としては以下図となります。
24C256の定格電圧VCC=2.7〜5.5[V]なので、5V定格のUNOと接続して使う場合は、VCC=5Vで使用可能です。
回路図通りに結線するだけですのでブレッドボード上に構築しても良いのですが、使う度にブレッドボードに回路を作り込むと考えると、いささか面倒な回路規模ではあります。
次回、続きのシステム設計や、回路の使い勝手向上も含めて検討を進めたいと思います。