OLEDを試す

ee9king に投稿

USB MeterのType-C対応も作ってみたりしたが、基板が薄くなると扱いづらい上にすぐ壊れてしまい、面白みがない。表示もLCDのままだと面白くないなぁと思っていたが、どうもOLEDを使うと消費も少なく暗がりでも見える。いまさらながらOLEDでの表示を試してみようということになった。

使ったのは、aitendoの128x32のOLEDモジュール。この大きさならUSBメータの16x2のキャラ液晶より小さく作れそう。

搭載ドライバはSSD1306と書かれていて、これをググると128x64サイズのモジュールがたくさん出てくる。出所、一緒っぽいな、Adafruits。やっぱ、ここかいな、32ピクセルでもきっと同じでしょうな。でも、あんまり参考になるソースがなさそうですので、がんばることにしました。

液晶の構造

ちまたのグラフィックLCDと同じようです。例の、なんでこんな並び方?みたいなやつです。横方向はピクセル単位で縦方向はpage単位になっていて、pageは8bit構成です。128x32の場合は、pageは4ページ分ということです。

 

この並びは、フォント作る時の並びで知っているので、多分大丈夫でしょうが、2ページにまたがる時はちょっと面倒そうです。

インタフェース

このモジュールはI2Cです。みたところ、I2Cのものが多いようです。それほど高速の書き換えを所望ではないということなのか、そもそもこれで十分なのかわかりませんが、扱いやすいということも事実としてはあるでしょう。I2Cのスレーブアドレスは、7bitで0111100b(3Ch)か0111101b(3dh)で、最後のビットがSA0だと記されています。でこのSA0は何かというと、D/C#ピンの論理で決まるようですが、モジュールになってしまっていて回路図もないのでピンの状態が分からない。。。きっと、0でしょ、だから3Chでやります。

I2CではLSBがR/WビットでWrite=0なので、Writeするときは、(3Ch << 1)+0=78h となります。仕様書のI2Cフォーマットです。

この絵で、ちょっと勘違いしてしまうのが(私だけかもしれませんが)、ControlバイトというのとDataバイトというものです。Dataというが表示するドットのデータなのか、コマンドのデータなのか、わかんないじゃん!、見たいな気分になるが、ここで言っているコントロールバイトは、データが連続するか、以降のデータがコマンドなのかデータなのか、ということだけを示す1byteだということです(Co bit、D/C bitのみで、あとの6ビットは全0)。そして、コマンドに付随して送るパラメタもふくめてコマンドということであって、データはあくまで表示のデータのみということ。

そしてもう一つ勘違いしてしまう原因になっているのが、Coビット(Continuous bit)である。これはコントロールバイトの次の送信データが1バイトかそれ以上かを示すためのもので、1バイトしか送らないときは、送るたびに毎回Stop状態に戻してやる必要がある。

全く同じ話を、I2Cを試すのページでも記載していますね。。。。とほほ、学習能力が乏しいことがばれてしまった。しかし、秋月LCDのAQM0802でのCoビットは1で連続データですね、逆です。

コマンドを送る時でも、1バイトで終わることは少ないし、あっても送った後にSTOP状態に移行するので特に問題ないと思われるので、Coは常に0でもいいように思える。よって次のように送信する。(実際それで作った)

  • コマンドの時:スタート(アドレス)→コントロール(00h)→コマンド→コマンド・・・ストップ
  • データの時 :スタート(アドレス)→コントロール(40h)→データ→データ→・・・・ストップ

前述したように、コマンドに含むパラメタもコマンドである。表示データ送信前に、例えば必ず位置指定するだろうから、コマンド送ってStop状態を経てからデータ送信制御に移るという制御になる。

初期化

初期化は、I2Cコマンドによる初期化ルーチンがApplication noteに記載(仕様書の最後)されている。

この通り送ればよい。すべてコマンドである、つまりコントロールバイトは40hにして、このルーチンを連続で送信すればよい。注意点としては、電源投入後、若干の待ち時間が必要である。これがないと、初期化できない。Power ON and OFF sequenceに記載があり(下図)

  1. VDDが安定したら、RES#を少なくとも3us間Lowにしなはれ。
  2. RES#をLowにしたら少なくとも3us待ちなはれ、そしたらVCCが安定するから。
  3. VCCが安定したら、表示オン(AFhコマンド)送りなはれ、そしたら100ms後に、COMがonして表示されるよ。

しかし、モジュールの回路図というか接続図がないから、RES#がどう動いているかなんて、わかんないじゃん。R,Cがたくさんついているけど、そもそもどこの接続かわかんないし。ということで、40ms待ってイニシャライズするとうまくいったが、ポート設定後すぐにイニシャライズさせるとダメだった。1つ無駄にして壊すしかわからないと思われる。写真はaitendoさんから拝借。オフのシーケンスも記載されているが、ここは実際オフするタイミングはわからないから、どうしようもないんだけど、、電源抜いてすぐに入れなおすと、表示がうまく始まらないことがある。

 

上記の回路図は、HiLetGOのOLEDモジュールの回路図(らしい)ものであるが、見た感じの写真ではどうもこれっぽいです。662KとあるICはTorexのLDOで票印に662Kとありますが、XC6206Pの3.3V出力です。(データシートも貼っときます)この回路が事実だとすると、自分の回路構成では662Kは不要で、RES#が4.7K+4.7uFとなっていることから、V=V0*{1-exp(-t/RC)}から算出した、V=2.4Vの遅延は約30msである。よって、適当であったが40msの遅延を持たせたのは妥当だったということになる。

アドレッシングモード

制御コマンドのうち、アドレッシングモードというのを設定必要みたい。デフォルトがあるみたいだから、なくてもいいようだが。ドットをどのように書いていく(ポジションをシフトしていく)かを決めるモードで、横方向なのか縦方向なのかを設定する。これも、もう横方向で向こうまで行ったら開業して戻ってくる普通のでいいんじゃないんかな。

//Addressing Mode
#define SET_ADDRESSING_MODE 0x20
#define ADDRESSING_HORI     0x00
#define ADDRESSING_VERT     0x01
#define ADDRESSING_PAGE     0x02

    i2c_send(SET_ADDRESSING_MODE);
    i2c_send(ADDRESSING_HORI);

 

スクロールモード

スクロールモードという動作ができるようだが、これは、横方向に動くのみで縦方向(この場合32ドットの方向)のスクロールはできない。斜めはできるみたい、、どういう意味があるのか不明。

 

こんな感じ。

 

 

 

 

添付

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページのアドレスとメールアドレスは自動的にリンクに変換されます。
  • 行と段落は自動的に折り返されます。