合資会社 満福

アプリ

会社概要

連絡先

合資会社 満福ブログ

Winstar OLED WEH001602AをArduinoで使う

2014-05-03 19:26:00 +0900 - 土田岳雄

OLEDモジュールを衝動買い

まったく時が経つのは実に早いもので、前回のブログ記事はお正月でしたね(笑)。

共立電子で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」が表示されました。うーん、思ったより簡単で拍子抜け。

4bitモードだと不安定?

メッセージを変えてコンパイルして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互換なライブラリにしろよって声が聞こえて来そうな、ぜんぜん違うコードなのだけど、まあスペックシートから起こしたらこうなったって感じなので、これを参考にもっと高機能でいかすライブラリをどなたか書いてくださる事を希望します。