前回から、Arduino UNOで使用可能な漢字ROMを作り始めました。今回は、OLEDディスプレイ/漢字ROMシールドの工作から、実動作確認まで済ませたいと思います。
こちらから、前回設計した回路図について復習しておいてください。
ここで、以前入手したUNO用の万能シールド(下図)が1個余っている事を思い出しました。
こちらの気温・湿度計測シールド工作用に1個購入したのですが、その後追加購入した二代目スタータキットにも含まれていたので、1個余っていました。万能シールド上に回路を実装して、UNOにシールドとして装着するだけで日本語表示器が使える様にして行きたいと思います。
前回設計した程度の込み入った回路になってくると、無計画にぶっつけ本番で工作するのは無謀が過ぎるというものです。下図の様な配置配線図を作ってから工作に移るのがよろしいでしょう。
配置配線図解説:
ここまで準備して細心の注意を払っても、実際の工作にはトラブルがつきものです。いくつかのトラブルを乗り越えて完成したOLEDディスプレイ/漢字ROMシールドを以下図に示します。
上図では、肝心なOLEDディスプレイを実装していません。実装すると、L/Sと二階建てになって全体像が見渡せなくなるためです。中央付近のピンソケットに挿すだけ(着脱可能)なので、後ほど実験中の写真でご確認ください。
遭遇したトラブルの1つをご紹介しておくと、配置配線図左上の5V配線ですが、最初スズメッキ線で配線していたため、UNOに装着した時、USBコネクタとショートしてしまいました。耐熱被覆線へ切り替えて回避できたのですが、初めからそうと判っていたら、もう少し配線の取り回しを工夫できたかもしれません……。実際に工作してみないと、積み重ねた下の基板とショートするなんて、考えもしませんよね??やれやれ。
続けて、UNOで実行するソフトウェアの設計を実施します。
手持ちのI2C EEPROM、24C256は1個当たり32Kバイトなので、スレーブアドレスをずらして2個使い、合計64KバイトのEEPROMとして使います。フォントデータを24C256×2個に分割して記録するので、以下の様にアクセスしなければなりません。
組み込み用途で日本語フォントデータを保持する事を考えた時、シフトJIS(S-JIS)符号の優位性については、こちらで述べた通りです。S-JIS符号化された文字列から漢字ROMのアドレスを計算して日本語フォントデータを取り出す手順は以下となります。
日本語フォントデータ読み出し手順:
EEPROMを漢字ROMとして使用する以上、使い始める前に日本語フォントデータを書き込む必要があります。今回作成するプログラムのシリアルモニタコマンドで、2個の24C256に日本語フォントを書き込むコマンドを用意する予定です。
フォントデータは、こちらの記事で作成したVerilog MEMファイルを使うので、リンクを辿って作成しておいてください。以下の様な64ビットMEMファイルが出来上がります。
日本語フォントのMEMファイル例:
@0000
0123456789abcdef
123456789abcdef0
23456789abcdef01
3456789abcdef012
:
: (中略)
:
0000000000000000
// chkcod=0x1357
UNO側のプログラムでは、上で作成したMEMファイルを受信して、順次24C256へ書き込みを実施して行きます。24C256への書き込みはページ書き込みを使いますが、以前指摘した通りArduinoのWireライブラリが糞(下品は陳謝)なため、1ページ64バイトの書き込みはできず、16バイトのページ書き込みに制限しています。
16バイト毎の書き込みなので、MEMファイル2行分です。
なお、24C256の書き込みには、tWR=10ms(MAX)の時間がかかります。UARTの通信時間によって待ち時間が変動するため、日本語フォントデータの書き込みにはWindows側でもスクリプトを使い、UNO側プログラムとの間でハンドシェークしながら書き込み実行する事としました。
完成したプログラムを以下にリンクします。
リンク:ole_kprint.ino
コンパイルしてUNOへ書き込むと、シリアルモニタから以下のコマンドを受け付ける様になっています。
シリアルモニタコマンド仕様:
なお、【kprn】コマンドに渡す文字列はS-JIS符号化されている必要があるので、Arduino IDEのシリアルモニタではダメです(UTF-8符号化されるため)。Tera Term等、S-JIS符号の転送が可能な通信ソフトウェアを使ってください。
Arduino UNOにOLED/漢字シールドを装着したら、こちらのプログラムをコンパイルしてUNOに書き込んでください。以下図に実験中の様子を示します。
こちらのTFTシールドと比べて圧倒的な優位は、UNOの全入出力端子に、シールド上のピンソケットからアクセス可能な事です。他のセンサモジュールなどを接続して使用する事ができますから。
以下の実験サンプルに従って、実験を進めて行きましょう。ドキドキの「火入れ」です。
実験サンプル:【 】内はシリアルモニタからの送信データ
【scan】
OK+ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +a +b +c +d +e +f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- 3c -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: 50 51 -- -- -- -- -- -- 58 59 -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
OK: scan i2c slave address
まず最初に、I2Cスレーブアドレスをスキャンしてみました。OLEDディスプレイ(0x3c)、24C256×2個(0x50,0x51、およびシャドウ0x58,0x59)のスレーブアドレスが表示されたら、正しく工作できたと、ひとまず安心して良いと思います。
続いて、24C256×2個へ日本語フォントデータを書き込み、漢字ROMを完成しておきましょう。書き込みには、以下のスクリプトを使います。
書き込みスクリプト:ole_kprint_wrfon.olv
※スクリプト(.olv)を実行するには拙作Olive+をWindowsにインストールしてください。
こちらで用意したフォントファイル(MEMファイル)を「ole_kprint_wrfon.mem」にリネームして、スクリプトと同じディレクトリに配置してください。
必ずシリアルモニタを閉じてから、上のスクリプトをWindowsで実行してください。
シリアルポート名を問い合わせてくるので、Arduino UNOのポート名を指定して「DTRを有効にする」にチェックした状態で「OK」ボタンを押してください。書き込みが始まりますので、プログレスバーが100%になるまで待機してください。9,600baudの通信速度で約3分ほどかかります。「OK: wrfon」と表示されたら書き込み終了です。
再びシリアルモニタを開いて、書き込んだデータの整合性を検証しましょう。
【rdchk】
OK+ ................................
OK: chkcod=0xd668
MEMファイル最終行に記載された検証用符号(chkcod)と同じ値が確認できたら、正しく書き込みできています。EEPROMは不揮発メモリなので、一度書き込んでおけば電源を切断しても記憶は消えません。プログラムのバグなどが原因の誤消去を心配する場合は、書き込み後、24C256のWP端子を電源VCCとショートしてください。
最後に、日本語フォントを使ってOLEDディスプレイにメッセージを描画してみましょう。Tera Term等、S-JIS符号の転送が可能な通信ソフトウェアを使って、以下の様に実験してみてください。
【kprn,0,こんにちは、世界 \x82\x40\x82\x41\n】
OK: kprn
【kprn,1,UNOで日本語表示しました。\n】
OK: kprn
実行後の様子が、最初にお見せした写真です。
色々なマイコンボードを入手した今でも時々使いたくなるArduino UNOで、OLEDディスプレイと漢字ROMを手軽に使える様にするシールドを工作することができました。シールドを装着するだけで日本語表示器が使えるのでCoolです。