SSD1306 の使い方(やらかし編)ちゃんとリセットしないとダメ!

SSD1306 OLEDモジュールを見つめるろらたん。OLEDのリセット忘れによる表示不安定のやらかしをテーマにした記事のアイキャッチ画像。 ソフトウェア雑記

SSD1306 の使い方(やらかし編)ちゃんとリセットしないとダメ!

この記事について

JJY-SIM R3 が一段落したので、
今回はそれに関連した、ちょっとした話です。

JJY-SIM では、表示デバイスとして0.96インチのOLEDを使っています。
コントローラーはSSD1306です。

小さくて、安くて、見た目もいい。
いまでは普通に使っているOLEDなんですが、
実は昔、このSSD1306でちょっとハマったことがありました。

今回は、そのときの「やらかし」の話です。

OLEDを眺めて悩んでるろらたん

🎀 OLEDって小さいのに、存在感はちゃんとあるよね


原因はRST

原因は、いま思えばものすごく単純です。

RSTピンをちゃんとリセットしていなかった。

それだけ。

それだけなんですが、当時はなかなか気づかなかったんですよね。

データシート通りに初期化しているつもりなのに、
表示されるときもあれば、ノイズみたいな画面になるときもある。

毎回ダメならまだ分かりやすいんですが、
たまにちゃんと表示されるから、余計に悩むやつでした。

🎀 それ、原因だけ見ると一瞬だけど、ハマってる最中は地獄のやつ


OLEDを使っている理由

JJY-SIM では、動作状態や時刻を表示するために、0.96インチのOLEDを使っています。

このOLEDを選んだ理由は、シンプルです。

以前、自分の趣味プロジェクトでSSD1306のOLEDを使ったことがありました。
そのときに、見た目がけっこう気に入っていたんです。

黒背景に白い文字が浮かぶ感じ。
ちょっとした機器感が出るんですよね。

液晶のバックライトで光っている感じとは違って、
OLEDは文字そのものが光っているので、見た目が少し締まるというか。

小さいガジェットには、ちょうどいい雰囲気があります。

それに、サイズも価格もちょうどいい。

当時、AliExpressで見つけた0.96インチOLEDはかなり安くて、
キャラクタLCDは500円くらいだったのに、SSD1306のOLEDが130円くらいで売られていました。

「え、これで表示器として使えるなら、かなりいいじゃん」

と思って買ってみたわけです。

OLED SSD1306

ただし、そのOLEDはFPCタイプでした。

つまり、そのままブレッドボードに挿せるようなものではありません。
ピンヘッダも付いていないし、扱いやすいモジュールにもなっていない。

普通なら、まず変換基板を探すところかもしれません。

でも、そのときの自分は、

「じゃあ最初から基板作ればいいか」

となりました。

今思うと、ブレボとかでの実験もなしに、
いきなりそこに行くのがちょっとおかしいんですが、
まあ、気軽に基板を作ってた感覚としては、それほど変なことでもなかったんですよね。

いや、変かもしれないけど。

🎀 130円の表示器、そりゃ試すよね


いきなり不安定

基板を作って、CPUとOLEDを実装して、
いよいよSSD1306を初期化して表示させてみました。

データシートを見ながら、初期化コマンドを送る。
表示ONにする。
画面をクリアする。
文字を描画する。

一応、手順としてはちゃんとやっているつもりでした。

ところが、動作が安定しない。

あるときは、普通にきれいに表示されるんです。
文字も出るし、描画も崩れない。

「お、動いたじゃん」

と思う。

でも、次に電源を入れると、
画面がノイズみたいな表示になったりする。

さらに別のときは、何も出ない。

完全に沈黙。

これが本当に嫌でした。

毎回ダメなら、まだ分かりやすいんです。
配線ミスかな、初期化シーケンスかな、I2Cの問題かな、と順番に潰していけます。

でも、表示されるときはちゃんと表示される。

これが厄介なんですよね。

「コードは合ってるのか?」
「いや、でも失敗するということは何か違うのか?」
「電源の立ち上がり?」
「I2Cのタイミング?」
「初期化コマンドの順番?」
「待ち時間が足りない?」

みたいに、だんだん疑う範囲が広がっていく。

🎀 たまに動くやつ、いちばん性格悪い


データシートどおり?

このOLEDは、いくつかのキャパシタや抵抗を接続する必要があるので、
その容量や接続を疑いましたが、
これらは、データーシートのリファレンス回路のままにしていました。
何度か確認しましたが、接続不良もなさそうでした。

次に疑うのはソフトです。

SSD1306の初期化コマンドが間違っているんじゃないか。
コマンド列の順番が違うんじゃないか。
表示メモリの書き方が違うんじゃないか。

実際、SSD1306は初期化コマンドがそこそこあります。

表示クロック、マルチプレックス比、表示オフセット、チャージポンプ、アドレッシングモード、COMピン設定、コントラスト、表示ON/OFF……。

細かい設定がいろいろあって、
最初に触ると、どれが本当に必要なのか分かりにくいんですよね。

しかも、世の中にあるサンプルコードも微妙に違う。

モジュールによって設定が少し違っていたり、
ライブラリごとに初期化コマンドの順番が違っていたりする。

なので、

「データシート通りにやってるはずなんだけどなあ」

と思いながら、
何度も初期化シーケンスを見直していました。

でも、なかなか決定打がない。

表示されるときは表示されるので、
完全に間違っている感じでもない。

この「半分正しい」感じが、またややこしい。

🎀 “通りにやったはず”って言い始めると、だいたい沼の入り口


RSTピンを疑う

しばらく悩んだあと、ふと回路を見直していて気づきました。

OLEDのRSTピンを、ちゃんと制御していない。

VDDに接続したままにしていました。

電源を入れれば、内部で勝手にリセットされるだろう。
そんな感じで思い込んでいたんです。

でも、SSD1306はちゃんとリセットをかける前提で考えた方がよかった。

もちろん、電源投入時の状態や電源の立ち上がり方によって、
たまたま正常に初期化できることはあります。

でも、それは「ちゃんと動いている」ではなくて、
「たまたま動いている」だったんですよね。

ここが大事でした。

🎀 VDDにつないで安心した気になるやつ、わかるけど危ない


ジャンパーでRSTをつなぐ

さっそく試しました。

幸い、CPU側に空きポートがありました。
そこで、ジャンパー線を使ってOLEDのRSTピンをCPUのGPIOに接続しました。

そして起動時に、

  • RSTをLOWにする
  • 少し待つ
  • RSTをHIGHに戻す
  • そのあとSSD1306の初期化コマンドを送る

という処理を入れました。

結果。

完全に安定しました。

それまでの不安定さが、嘘みたいになくなりました。

何度電源を入れ直しても、ちゃんと表示される。
ノイズ画面にもならない。
沈黙もしない。

「ああ、これだったのか」

という感じでした。

🎀 勝ったというより、負けを認めた感じだね


デバイスのリセットは大事

このとき、改めて思いました。

デバイスのリセットは大事。

ものすごく当たり前の話なんですが、
実際にハマると身にしみます。

特に、マイコンの周辺デバイスって、
電源を入れれば必ずきれいな初期状態になる、とは限らないんですよね。

電源の立ち上がりが遅い。
電源電圧が中途半端な時間がある。
CPUが起動する前に周辺デバイスが変な状態になる。
逆に、CPUの方が先に動き出して、デバイス側がまだ不安定。

そういうことは普通にあります。

だから、ソフト側から明示的にリセットできるなら、
ちゃんとリセットした方がいい。

この経験は、その後の回路設計にも残りました。

「このデバイス、RSTあるならちゃんとGPIOにつなごう」

と思うようになったんです。

もちろん、GPIOの数には限りがあります。
全部のリセットピンを個別に制御できるとは限りません。

でも、表示デバイスみたいに起動時の状態が見えるものは、
できるだけちゃんと制御しておきたい。

🎀 起動直後って、思ってるよりみんな寝起き悪いんだよね


リセットを忘れないようにした

そんなことがあったので、JJY-SIM の回路図を書くときは、
OLEDのRSTを忘れないように意識していました。

これはもう、過去のやらかしから来ています。

「SSD1306はリセットしないと危ない」

という記憶が残っていたんですよね。

別にSSD1306が悪いわけではありません。

こちらがちゃんと扱えば、普通に安定して動くデバイスです。
小さいし、安いし、見た目もいい。

ただ、ちゃんと扱わないと、ちゃんと動かない。

当たり前なんだけど、こういう当たり前は一回ハマらないと忘れがちです。

🎀 失敗したところだけ、回路図を見る目がちょっと鋭くなるんだよね


電源投入直後のノイズ画面

ちなみに、JJY-SIM R3でも、
電源を入れた瞬間に、まれにノイズっぽい画面が見えることがあります。

一瞬だけ、画面にランダムな点や線のようなものが出る感じです。

これは故障ではありません。

OLEDがまだ初期化される前に、
内部RAMの中身がそのまま表示されているだけです。

電源が入った直後、OLEDの表示RAMには意味のあるデータが入っているわけではありません。
その状態で一瞬表示が有効になると、初期化前のゴミデータが見えてしまうことがあります。

そのあと、ブートローダーが動いて、
ファームウェアが起動して、
OLEDにリセットがかかって、
初期化コマンドが送られて、
画面がクリアされます。

なので、通常動作に入れば問題ありません。

むしろ、自分としてはその一瞬のノイズを見ると、
昔RSTをつないでいなくて悩んだことを思い出します。

「ああ、そういえばこれでハマったな」

って。

🎀 ノイズ画面で思い出が再生されるの、ちょっと嫌だね


失敗も経験

今回の話は、技術的にはすごく小さい話です。

SSD1306のRSTをちゃんと制御しましょう。

それだけです。

でも、こういう小さいやらかしって、あとで効いてくるんですよね。

データシートを読むときに、
リセット条件を見るようになる。

電源投入時のシーケンスを見るようになる。

「このピン、未接続で本当にいいのか?」
と一回立ち止まるようになる。

そういう意味では、いい失敗だったのかもしれません。

いや、当時は全然よくなかったですけど。

🎀 こういう小さい失敗、あとでちゃんと設計に残るんだよね


おわりに

SSD1306のOLEDは、今でも好きな表示デバイスです。

小さい機器に載せるにはちょうどいいし、
表示も見やすいし、
何よりちょっとガジェット感が出る。

JJY-SIM でも、あのOLED表示があることで、
ただの基板ではなく、少し「動いてる機械」っぽく見える気がしています。

でも、その裏には昔のやらかしがあります。

RSTをつながず、
電源ONで勝手に初期化されると思い込み、
ノイズ画面に悩まされ、
最後にジャンパー線で負けを認めた話。

こういう地味な失敗が、
今の回路図の中にちゃんと残っていたりします。

まあ、できれば一発で気づきたかったですけどね。

🎀 次からは、最初からRSTつなごうね


📪 お問い合わせなど

技術的なご相談やご質問などありましたら、
📩お問い合わせフォーム  
または、
📮info@shachi-lab.com までお気軽にどうぞ。

🎀 コメントでもXでも、気軽にどうぞ。お仕事の相談もOKだよ


🔗 関連リンク

しゃちらぼの最新情報や開発の様子は、こちらでも発信しています:

💬「シャチラボ」で検索してきた方も大歓迎!
ほんとは「しゃちらぼ(Shachi-lab)」なんだけど、見つけてくれてありがとう🐬

コメント

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