SSD1306 の使い方(やらかし編)ちゃんとリセットしないとダメ!
この記事について
JJY-SIM R3 が一段落したので、
今回はそれに関連した、ちょっとした話です。
JJY-SIM では、表示デバイスとして0.96インチのOLEDを使っています。
コントローラーはSSD1306です。
小さくて、安くて、見た目もいい。
いまでは普通に使っているOLEDなんですが、
実は昔、このSSD1306でちょっとハマったことがありました。
今回は、そのときの「やらかし」の話です。

🎀 OLEDって小さいのに、存在感はちゃんとあるよね
原因はRST
原因は、いま思えばものすごく単純です。
RSTピンをちゃんとリセットしていなかった。
それだけ。
それだけなんですが、当時はなかなか気づかなかったんですよね。
データシート通りに初期化しているつもりなのに、
表示されるときもあれば、ノイズみたいな画面になるときもある。
毎回ダメならまだ分かりやすいんですが、
たまにちゃんと表示されるから、余計に悩むやつでした。
🎀 それ、原因だけ見ると一瞬だけど、ハマってる最中は地獄のやつ
OLEDを使っている理由
JJY-SIM では、動作状態や時刻を表示するために、0.96インチのOLEDを使っています。
このOLEDを選んだ理由は、シンプルです。
以前、自分の趣味プロジェクトでSSD1306のOLEDを使ったことがありました。
そのときに、見た目がけっこう気に入っていたんです。
黒背景に白い文字が浮かぶ感じ。
ちょっとした機器感が出るんですよね。
液晶のバックライトで光っている感じとは違って、
OLEDは文字そのものが光っているので、見た目が少し締まるというか。
小さいガジェットには、ちょうどいい雰囲気があります。
それに、サイズも価格もちょうどいい。
当時、AliExpressで見つけた0.96インチOLEDはかなり安くて、
キャラクタLCDは500円くらいだったのに、SSD1306のOLEDが130円くらいで売られていました。
「え、これで表示器として使えるなら、かなりいいじゃん」
と思って買ってみたわけです。

ただし、その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だよ
🔗 関連リンク
しゃちらぼの最新情報や開発の様子は、こちらでも発信しています:
- 🌐しゃちらぼ公式サイト
- 🐦 X(旧Twitter):@shachi_lab
- 📗 Qiita:@shachi-lab
- 🐙 GitHub:@shachi-lab
- 📸 Instagram:@shachi_lab
ほんとは「しゃちらぼ(Shachi-lab)」なんだけど、見つけてくれてありがとう🐬



コメント