まったく時が経つのは実に早いもので、前回のブログ記事はお正月でしたね(笑)。
共立電子でArduino用のパーツを物色していて、表示に美しさに惹かれてWinstarのWEH001602Aを衝動買い。あまり説明を良く読まずにかったのが悪かったのですが、このパーツArduinoのLCDライブラリ(LiquidCrystal)では使えません。
デジットblogのここにもさらっと書かれていますが、
☆コントローラ:WS0010
●LCD標準コントローラHD44780系コントローラと同じ操作性
●コマンドセットは基本的に同じ
●イニシャライズ等プログラム的に一部変更が必要
WS0010 DATASHEET
HD44780系コントローラと同じ操作性
と書かれているところが味噌で、残念ながらHD44780互換では無かったです。
あとは手がかりとなるのはデータシートらしいのですが、そもそも組込み屋でもない私にはデータシートの読み方が分からず、どうやってこれをソースコードに落としこめばいいのかさっぱりです。
ちなみに上記のデジットBlog内のデータシートのリンク先よりも、WINSTAR本家のこのページのデータシート(WS0010を選択)のほうが新しいです。
とりあえずデータシートは置いといて、誰かサンプルコードぐらいで書いてるんじゃないかと検索してみると、参考になりそうなNicolas Electronicsのページや、そのままずばりArduino用のライブラリ(Adafruit)などいくつか見つかりました。
やはり先人たちがやってくれていた、私がわざわざコードを書く必要は無かったのだと安心して、サンハヤトのArduino用ユニバーサル基板に目をしょぼしょぼさせながらWHE001602Aをハンダ付けして自作シールドを作成。
手元のジャパニーノに接続しAdafruitのライブラリのサンプルをコンパイルしてみると、あっさり「Hello OLED World」が表示されました。うーん、思ったより簡単で拍子抜け。
メッセージを変えてコンパイルしてArduinoをリセットすると、時々文字が化けて全く読めない状態になった。しかもUSBを抜き差ししてもなかなか元に戻らない。
いろいろ原因を探していてこのページを見つけた。それによるとこのOLEDの電源に問題があってノイズが乗りやすく、4bitモードで下位ビットのデータを送出する時にノイズが乗ると誤動作してしまうらしい。おまけにOLEDの利点でもある低消費電力が災いして、USBから抜いた後もしばらく、その状態を維持したままになってしまうとのこと。なるほど納得な説明だ。
これを避けるには素直に8ビットモードで使うか、ノイズ対策しろということなんだろうけど、単に表示するだけなら8ビットモードで動かすのが簡単だけど、Arduinoのピンを余分に4つも使うのは勿体ないし、かとハード的に対策するのも面倒。
何度も実験してみて一度正常に表示されれば、その後は安定して表示されているので、初期化ルーチン工夫すればなんとかなりそうってことで、ここでいよいよさきほどのスペックシートを読んでみたら、最終ページにそのものずばりな事が書かれてる!
Notes
Repeated procedures for an 4-bit bus interface
Noise causing transfer mismatch between the four upper and lower bits can be corrected by a reset triggered by consecutively writing a “0000” instruction five times. The next transfer starts from the lower four bits and then first i nstruction “Function set” can be executed normally.
Please insert the synchronization function in the head of procedures. The repeated procedures are show as follows
要するに4ビットモードでおかしくなっちゃったら”0000”を5回送ってリセットしろという事ですね。
Adafruitのコードを眺めて、なんとなくスペックシートとソースコードとの関連も見えてきたので、トライアンドエラーの末なんとか動くようになったのが以下のコードです。
Liquid error: undefined method `safe’ for nil:NilClass
LiquidCrystal互換なライブラリにしろよって声が聞こえて来そうな、ぜんぜん違うコードなのだけど、まあスペックシートから起こしたらこうなったって感じなので、これを参考にもっと高機能でいかすライブラリをどなたか書いてくださる事を希望します。