公開日:2025/07/26
title.png

35th Season


#35-8 UNO用の漢字ROM

 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[ドット]フォントのサンプルを以下図に示します。

a185_kiritubo.png

 可読性としては、これでほぼ限界だと考えられます。複雑な漢字だと、8×8[ドット]では識別できない場面にも多々遭遇します。そもそも、数100文字のフォントが全く同じビット列(従って、全く同じ形状)になっているのではないでしょうか?
 8×8[ドット]フォントはメモリ容量が小さい場合の対応策として有効です。それでも1文字当たり8×8[ドット]なので、8バイトの記憶領域を要します。約7,000文字×8バイト≒64Kバイトの記憶領域が必要なのです。

 32KバイトしかFlashメモリを搭載していないUNOでは、半分も収録できなかったのが現状です。

64KバイトのROM

 逆の見方をすると、64Kバイトのメモリを確保できたら、UNOでも日本語フォントを使ったアプリケーションを作ることができるのです。

 ログストレージ用として購入したI2C EEPROM(24C256)が、256Kビット=32Kバイトの容量が有りました(下図)。

a343_i2ceep.jpga343_24c256.jpg

 64KバイトのROMを探している所に、半分の32Kバイトでは足りません。しかし、このチップはI2Cスレーブアドレスを外部端子で設定可能な仕様です。2個の24C256を異なるスレーブアドレスに設定してI2Cバスに接続すると、2個分で64KバイトのROMとして使用可能となります。

※実は、24C512と言うバリエーションもあって、こちらは512Kビット=64Kバイトと丁度必要なサイズです。24C512を入手して使っても良いです。当方の手元には無いので、24C256×2個を前提として進めて行きます。

日本語フォントの使い道

 一旦、UNO用の日本語フォントを作成できたとして、その使い道について考察しておきましょう。UNOと組み合わせて使う表示器の選定に関する考察です。

 手頃に使える液晶ディスプレイLCD1602などという表示器も所有しているのですが、こちらは内蔵されたフォントでしか描画できません。この様な表示器は、キャラクタディスプレイ等と呼ばれます(下図)。

ar31_lcdout.jpg


 自前の日本語フォントで描画するためには、TFTシールドの様なグラフィックスディスプレイが必要です(下図)。

a109_stack.jpg

 ただ、上図の様にUNOへTFTシールドを装着してしまうと、全ての端子(ピンソケット)が埋まってしまい、I2C端子の引き出しさえも困難と、なります。この辺りがTFTシールドの使い勝手の悪い所なのですよ……。I2C EEPROMを漢字ROMとして使おうとしている所に不似合いなので、却下です。

 色々購入してきたので、SPI接続TFTディスプレイ等、他にもグラフィックスディスプレイはあるのですが、もう一つ考えておくべき事は、描画に要する時間、描画速度です。
 今回の漢字ROMはI2C EEPROMに保持しようとしていますので、I2C通信(@400Hz)で読み出すことになります。DUEなど、内蔵メモリに日本語フォントを記録した場合と比べて、アクセス速度は格段に遅くなります。
 従って、大画面に多量の日本語を表示する用途では、漢字ROMへのアクセス(低速)のため、描画速度が低下する事態が予想されます。UNOで使用するには、もう少し表示範囲の狭い表示器が似つかわしいと思います。

OLEDディスプレイ

 前節最後の結論に従い、小さなOLEDディスプレイを対象としたいと思います(下図)。

a222_oledisp.jpg

※上の写真は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ディスプレイ表示想像図:
a358_emu1604.png 4倍角フォントによる8桁×2行表示
縦倍角フォントによる16桁×2行表示【採用】
全角フォントによる16桁×4行表示


 図らずも、キャラクタディスプレイLCD1602と同じ表示領域(16桁×2行表示)となりました(下図)。

ar31_circt.jpg

 LCD1602は、7ビットASCII文字と半角カタカナしか表示できませんが、OLEDディスプレイ+漢字ROMなら、日本語フォントを表示可能な事が優位です(下図)。

a225_oledjp.jpg

 なお、8×16[ドット]サイズのフォントを用意するには、8×16[ドット]÷8ビット×約7,000文字≒128Kバイトが必要で、前の節で検討した24C256×2個=64Kバイトでは不足するので破綻してしまいます。これではいつまで経っても初期検討が収束しません。
 割り切って、ROM化するフォントとしては8×8[ドット]のままで、描画する時に縦方向へ×2倍拡大して描画する事にしたいと思います(上の写真、Moscoviumで日本語描画した時と同じ状態)。

システム設計(さわり)

 前節までの初期検討で、材料は出揃いました。

 5V定格のUNOと接続して使えば良いので、回路図としては以下図となります。

a358_schem.png

 24C256の定格電圧VCC=2.7〜5.5[V]なので、5V定格のUNOと接続して使う場合は、VCC=5Vで使用可能です。
 回路図通りに結線するだけですのでブレッドボード上に構築しても良いのですが、使う度にブレッドボードに回路を作り込むと考えると、いささか面倒な回路規模ではあります。


 次回、続きのシステム設計や、回路の使い勝手向上も含めて検討を進めたいと思います。


btn_arduino.png

btn_prev.png btn_next.png

home