Elec

STM32マイコンでCO2センサー OLEDモジュール編

← ポチっていただけると嬉しいです

STM32マイコンでCO2センサーをとりあえず作ってみましたっていう記事。

STM32マイコンからCO2センサで測定してOLEDに表示
先日買ったCO2センサ その後、制御用にSTM32マイコンボードと表示用に有機ELモジュールを同じくアリエクから買いまして、とりあえず測定&表示するとこまでできました。 10秒毎に測定し表示するだけなので、まだまだブラッシュアップが必要です...

これの個別説明編。今回はOLEDモジュールです。

買ったのはこちら。

1.07US $ 18% OFF|Oled65c6p|128x64 Oled Display Module Ssd1315 I2c Interface For Arduino
Smarter Shopping, Better Living! Aliexpress.com

送料は別途かかりましたが、1個182円ですよ。この円安時代にもぅどこで採算取れてるんだろうか?まぁこっちはWelcomeですが。

似たような製品はAMAZONにもありますし、秋月にもあります。

0.96インチ 128×64ドット有機ELディスプレイ(OLED) 白色: オプトエレクトロニクス 秋月電子通商-電子部品・ネット通販
電子部品,通販,販売,半導体,IC,LED,マイコン,電子工作0.96インチ 128×64ドット有機ELディスプレイ(OLED) 白色秋月電子通商 電子部品通信販売

秋月のはまったく同じかと思ってたらコントローラが違うようです(後述)

基本的にはOLEDに接続されているコントローラにコマンドを投げる
形で表示させます。
H/V-Sync+RGBなディスプレイとは全然違うわけです。
LCDなキャラクタディスプレイをいじってた人ならとっつきやすいはず。

そのOLEDのコントローラですが、
アリエクの商品説明ではSSD1315
同じモジュールらしき秋月の説明ではSSD1306
と微妙に違います。

データシートを見ると、SSD1315の方がSSD1306の上位互換っぽかったので、SSD1306だと仮定して進めてみて、とりあえず動作させたのが先日の報告時となります。
その後SSD1315特有の機能(BlankingやFadeOut)を試してみたらなんと動いてしまったので、実はSSD1315だったようです(もしくはSSD1306にも隠し機能があるとか)。

アリエクさんを疑ってしまって申し訳ありません。まさかアリエクさんが正しいとは。。。

SSD1306やSSD1315のデータシートは本家からもらうには以下のWebからリクエストしないといけなくて、業務で使うわけではない場合は申し込みづらいかもしれません。

OLED Display - Solomon Systech (International) Limited
As OLED display technology and its manufacturing process become mature, more and more applications have adopted OLED as ...

まぁググればいくらでもダウンロードできますから心配はないです。
SSD1306なんて秋月からもダウンロードできますし。

で、入手したデータシートはSSD1306が2008年4月のRev1.1。SSD1315が2017年4月のRev1.1。これより新しいのは見つけられませんでした。
しかし、SSD1306とSSD1315ほとんど機能変わらないのに全然日付が違いますね。
ひょっとして上位品という位置づけじゃなくて、ディスコンでの代替え品っていう感じなのかもしれません。

コントローラ自体のI/Fとしては懐かしの6800/8080用パラレルI/FやSPIもあるようですが、このモジュールはI2Cのみとしている潔い仕様です。
マイコンから制御にはI2CかSPIが楽なのでまぁいいでしょう。

また、中にGraphic Display Data RAM(GDDRAM)といういわゆるフレームバッファが1面分あるようです。

I2Cのアドレスとしては78/79か7A/7Bかが選べる仕様ですし、その仕様が活かせるようにモジュールに抵抗がついてました。
まぁ特にバッティングしないのでそのまま使用しますので、スレーブアドレスとしては78(Write)/79(Read)となります。

で、データフォーマットですが、
忘れがちなのがコントロールバイトってやつですね。こんな感じで定義されています。

上位2ビットはこういう定義です。

これで、こんなフォーマットで投げてやるわけです。

これはWrite時ですが、Readはステータス(DisplayがOnかOffかだけ)かGDDRAMのデータくらいしか読めないのであまり使わないかな。

書き込むコマンドは可変長。
Continuation bitを立てることで延々とコマンドを垂れ流すことができ、オーバーヘッドが少し削減できますね。

ですが、使い勝手を考えて、私はCO立てずに1個1個コマンドを送るようにしてます。
一番多く投げたいデータはまとめて送れるのでそんなに影響はありません。

コマンドWriteの一つの例を出してみます。

コントラスト設定のコマンドはこのように定義されています。

Set Contrast Control コマンドが 0x81
その後にコントラスト値のデータを1バイト(01~FF)
コマンドなのでD/C#=0

これをI2Cで送る(書き込む)には、
0x78:スレーブアドレス(Write)です。
0x00:コントロールバイト(CO=0、D/C#=0、残り0)
0x81:Set Contrast Control
0x7F:コントラスト値=7F
をまとめて送ればいいわけです。この4バイトを送るのにCOビットは立てなくていいです。
また、I2Cなので先の図のようにStart/Ack/Stopはちゃんとやってください。STM32でHALだと特に気にしなくていいかと思いますが。

また、データとしてはGDDRAMのデータになりますが、このRAMに書く場合は
0x78:スレーブアドレス(Write)です。
0x40:コントロールバイト(CO=0、D/C#=1、残り0)
0x**:データ1
0x**:データ2

と後はデータを必要な量を続けてやればいいわけです。

データってGDDRAMのどこから書くことになるのよ?っていうGDDRAMのアドレス指定については、コマンドでアドレッシングモードとスタートアドレス等を設定できます。
データについてはアドレスは勝手にインクリメントされていきますので楽ですね。
データとしては1dotにつきOn/Offの1bitしか必要が無いので、128dot×64dot÷8bit=1024バイトで1画面のデータとなります。

初期化

SSD1315の初期化が必要です。
SSD1306のデータシートにはフローチャートで載っているんですが、SSD1315の方は無いんですね。
なので、SSD1306を参考にしました。

Set Mux Ratio A8h,3Fh
A8hっていう最初の1バイトはSet Mux Ratioっていうコマンドのことで、そのパラメータが3Fhってことになります。
で、このMux RatioOってのは画像を何ライン出すかってことみたいです。設定値は表示ライン-1。フルに画像を使うので3Fに設定で64ラインってことになります。

Set Display Offset D3h,00h
フレームバッファを実際に画像出力するオフセットですね。ここをいじればスクロールしたような画像になりますかね。初期化なのでオフセットは0に設定。

Set Display Start line 40h
これはコマンドとパラメータが一緒になった1バイトになります。
上の2ビット01がコマンド。残り6ビットがパラメータです。
フレームバッファの描画ラインを示しますのでこちらをいじってもスクロールができるってことになりますね。
ここも今は必要ないので0。なので40h。

Set Segment Re-Map A0h
これも上位7ビットがコマンドで下の1ビットがパラメータ。0
画像上下フリップの設定ですかね。これがあるので、OLEDモジュールをどう配置しても上下逆で困ったってことはなくなります。

Set COM Output Scan Direction C0h
こっちは左右フリップかなぁ。なんか色々とありますね。
こちらも1バイトで完結。なぜかBit3がパラメータとなってます。

Set COM pins Hardware Configuration DAh,02h
ややこしいですね。もう表示してみないと理解しづらいですんで、とりあえず指定のままで。
こちらは2バイト目の[5:4]がパラメータ、

Set Contrast Control 81h,7Fh
先程の例で紹介したコントラスト設定です。2バイト目がパラメータで0~255設定。7Fはデフォルト値

Set Entire Display On A4h
A4でフレームバッファの内容表示。A5で全点灯。

Set Normal Display A6h
反転のON/OFFですね。A6はNORMAL。A7で反転。

Set OSC Frequency D5h,80h
クロックの設定だけど、もっと最初にやっておかなくていいのかなぁ。
これ回路図とかわからないとどうしていいかわからないのでとりあえずデフォルトのまま。

Charge Pump Setting 8Dh,14h
OLEDなので高電圧が必要。このモジュールは3.3Vしか入ってないので内部の昇圧回路をONにしてね!ってことだと思います。14Hはデフォルトでイネーブル(7.5V)。

Set Display On AFh
画面ONですね。チャージポンプをENABLEにしてから画面ONにするようです。

ちなみにこのルーチンの通りにコマンド入れるとぐちゃぐちゃが画面表示となります。
おそらく電源On時のRAMの値が不定値なのでそれがそのまま表示されているんだろうと思います。

アドレッシングモード

結構多機能ですべてを理解して紹介するのは大変なのですので簡潔に行きましょう。
画面の座標(アドレス)をどう割り振るかってモードです。
一般的な画面のイメージだと左上が00としたらそこから右に01、02、右端に言ったら改行(CR/LF)してインクリメントって感じかなって思います。そのイメージがHorizontal Addressing Modeです。

この横方向、縦方向のスタート/エンドを設定できるので、任意の四角エリアだけ書くってことも出来ます。

勝手に改行するんじゃない!っていうのが Page Addressing Mode

ひねくれて縦にいくぜ!っていうのがVertical Addresing Mode

どのモードでも縦の8ピクセルをまとめて1バイトとするのは変わらず。
下の方がMSB

なので、HorizontalAddressingModeかPageAddressingMode時で
01,02,04,08,10,20,40,80とデータをWriteするとこんな画像になるってことです。

まぁわかりやすいですよね。

なので、フォントデータを作るべく、Excelでドット絵→画像データの変換を行うようにしました。

OLED表示例

面倒だし、私もわかりにくいので、いくつかの設定でどんな感じに表示されるのか?を実際に試してみました。
アドレッシングモードはHorizontal固定です。
まず画素の表示順に関係ありそうなこの2つでどう変わるかを見ていきます。


  1. DA:A[5]=0/A[4]=1、C0h これを標準としたい配置。

  2. DA:A[5]=0/A[4]=1、C8h 上下反転しました

と、進めようとしましたが、このブログの画像ではいまいちわかりにくいので絵柄を変えてやり直し。

  1. DA:12h、C0h


    これを基本にしましょう。

  2. DA:12h、C8h


    C0→C8は上下フリップするだけですね。

  3. DA:02h、C0h


    これはややこしい。
    基本画像の上半分がまず1ライン飛ばしで表示され、
    その間に下半分の画像が1ライン飛ばしで表示されているようです。

  4. DA:02h、C8h


    C0→C8は↑の画像を上下フリップするだけ。

  5. DA:32h、C0h


    基本画像の奇数ラインと偶数ラインが反対になった感じです。

  6. DA:32h、C8h


    C0→C8は↑の画像を上下フリップ。

  7. DA:22h、C0h


    3の画像の奇数ラインと偶数ラインが反対になっている感じです。

  8. DA:22h、C8h


    C0→C8は↑の画像を上下フリップ。

というわけで、私の感性にぴったりなのは基本とした1番目、その上下反転な2番目の設定です。
他の設定はどういう使い方のときに使いやすいのかよくわかりません。

OLED表示例(SSD1315特有)

  1. FadeOut
  2. Blinking

OLED表示例(スクロール、ZOOM)

FadeOut/Blinking、スクロール/ZOOMも試したんですが、動画じゃないとわからないので動画です。

ですが、余計なところもたくさん写ってるのでクリップ編集しないといけなくて、面倒なので出来ていません。

時間とやる気があれば追記します。

とりあえず今回はこの辺で。。。

 

コメント

タイトルとURLをコピーしました