ESP32でつまずいた記録:ドライバが入らない、OLEDが映らない
養鶏場の日除けすだれを自動化するプロジェクト、その第一歩の記録です。ELEGOOのESP32スターターキットを使い始めて、最初の「Lチカ」からOLEDに文字を出すまで。CP2102ドライバのインストールでハマり、OLEDの表示でもう一度ハマりました。同じところで詰まる人は多いはずなので、原因と解決をそのまま残しておきます。
そもそも、なぜすだれを自動化しようと思ったのか
きっかけは養鶏場でのことでした。暑い日が続いていた時期、ひよこたちが苦しそうにしていたんです。日差しを遮ろうと金網全体にすだれをかけていたのですが、これが完全に裏目に出ていました。すだれで覆いすぎて風が全然通っていなかったんですね。
日陰は作りたい。でも風は通したい。しかも気温や天気は日によっても時間帯によっても変わります。理想を言えば、暑くなったらすだれを下ろして、涼しくなったら上げる、という調整をこまめにやりたいところです。
ところが日中は仕事があって、様子を見に行くことができません。だったら気温や天気に応じて自動ですだれを上げ下げできる仕組みを作ればいいんじゃないか——というのが、このプロジェクトの出発点です。
そもそもESP32って何?
自動化すると決めたはいいものの、私はエンジニアではありません。何を使えばいいのかも分からないところからのスタートでした。調べていくうちに行き着いたのがESP32です。
ESP32は、Wi-FiとBluetoothを内蔵した小さなマイコンボードです。マイコン、つまり「マイクロコントローラ」というのは、ものすごく小さくてシンプルなコンピュータのようなもの。パソコンと違って画面もキーボードもありませんが、そのぶん消費電力が非常に小さく、電池でも長時間動かせます。センサーで何かを測ったり、モーターやライトを動かしたりといった「機械を制御する」用途にぴったりです。
似たようなものにArduino(アルドゥイーノ)がありますが、ESP32はWi-Fi機能が最初から載っているのが大きな違い。しかも1個1000円前後で買えてしまいます。今回のように屋外に置いて環境を測り、あとからスマホでデータを見たい、といった用途にはうってつけです。
プログラムはパソコンで書いて、USBケーブル経由で書き込みます。一度書き込んでしまえば、あとはESP32単体で動き続けてくれる。これなら仕事に行っている間も、勝手に気温を見てすだれを動かしてくれるはずです。
今回は個別に部品を揃えるのではなく、ELEGOOのESP32スターターキットを購入しました。ボードのほかにセンサーやディスプレイ、ジャンパー線などが一式入っているので、まず動かしてみるにはこれが手っ取り早いだろうという判断です。
この日のゴール
というわけで、プロジェクトのいちばん最初の一歩。まずはESP32が動くことを確認して、キット付属の0.96インチOLED(小さな有機ELディスプレイです)に文字を表示するところまでを目標にしました。開発環境はWindows、Arduino IDEを使用しています。
壁1:ESP32がポートに出てこない
Arduino IDEでLチカ(LEDを点滅させる、電子工作の「Hello, World」的なやつ)を書き込もうとしたら、まずこのエラーが出ました。
'LED_BUILTIN' was not declared in this scope
これは標準のBlinkが使うLED_BUILTINという定数が、ESP32のボード定義には無いのが原因でした。内蔵LEDのピン番号を直接指定すれば解決します。多くのESP32ボードは内蔵LEDがGPIO 2なので、LED_BUILTINを2に書き換えました。
コンパイルは通るようになったものの、今度は書き込みで別のエラー。
Failed uploading: no upload port provided
ポートが選ばれていないようです。ツール→ポートを見るとCOM1しかありません。試しにCOM1を選んでみると、次はこうなりました。
A fatal error occurred: Failed to connect to ESP32:
No serial data received.
ここで気づいたのですが、COM1はWindowsに元からある別物で、ESP32ではありません。ESP32を挿すと普通はCOM3以降に出てくるはずです。ところがUSBを抜き差ししてもポートが増えたり減ったりしない。つまりPCがESP32を認識していない、ドライバが無い状態だったわけです。
壁2:CP2102ドライバが入手できない
このキットのESP32は、USB-シリアル変換にCP2102(Silicon Labs製)というチップを使っています。Windowsが認識しないので、専用ドライバ「CP210x VCP Driver」を入れる必要がありました。
ところが、Silicon Labsの公式ページがとにかく分かりにくい。検索で出てくるURLは古くてページが存在しなかったり、ダウンロードのリンクが見つからなかったり。挙句の果てには、間違えて技術資料のPDF(ドライバではなくCの解説文書)をダウンロードしてしまう始末でした。
最終的には、ドライバ本体のZIPを直接URL指定で取得することで解決しました。
https://www.silabs.com/documents/public/software/CP210x_Universal_Windows_Driver.zip
ZIPを展開して、中のCP210xVCPInstaller_x64.exeを実行してインストール完了。インストール後にESP32を挿し直すと、ついにCOM3が現れました。これを選んで書き込むと、基板の青色LEDが点滅。ようやく環境構築が完成した瞬間です。
ちなみにドライバが見つからないときは、キットメーカー(ELEGOO等)の配布ページを探すのも手です。「ELEGOO ESP32 driver」で検索すると専用ドライバが見つかることが多いですし、Windows Updateの「オプションの更新プログラム」に出てくることもあります。
壁3:OLEDに何も表示されない
環境が動いたので、次はキット付属の0.96インチOLED(SSD1306)に「Hello!」を出そうとしました。ライブラリはAdafruit SSD1306とAdafruit GFXをインストール。配線はI2Cの4本です。
| OLED | ESP32 |
|---|---|
| VCC | 3V3 |
| GND | GND |
| SCL | GPIO22 |
| SDA | GPIO21 |
ここで少し戸惑ったのが、OLEDの4ピンは一列に並んでいるのに、ESP32側の3V3・GND・D21・D22はバラバラの位置にあるということ。ブレッドボードに挿して揃えることはできないので、メス-オスのジャンパー線で1本ずつ、離れたピン同士をつないでいきます。
配線してコードを書き込んだのですが、画面は真っ暗。しかもシリアルモニタには「OLED not found」すら出ません。反応がまったく無い状態でした。
切り分け:I2Cスキャナで配線を確認
表示コードを疑う前に、そもそもESP32がOLEDを見つけられているのかを確認することにしました。ここで使ったのがI2Cスキャナ。つながっているI2C機器のアドレスを調べる、短いコードです。
結果はFound: 0x3Cの連続でした。つまり配線は正しく、OLEDも生きていて、アドレスも0x3Cで合っていることが確定。ハードは問題なしということが分かりました。
原因:Wire.begin()のピン指定が抜けていた
答えは意外なところにありました。OLEDの表示コードにWire.begin(21, 22)を追加したら、あっさり表示されたのです。
ESP32ではI2Cのピンを明示的に指定しないと、うまく初期化されないことがあるようです。I2Cスキャナのコードにはこの一行が入っていたので通信できていたのですが、OLEDのコードには入っていませんでした。これが「not foundも出ないのに表示もされない」という不思議な症状の正体でした。
最終的に動いたコードの要点は、setup()の中でWire.begin(21, 22)を呼んでからディスプレイを初期化すること。そして描画したあとにdisplay.display()を呼ばないと画面に反映されない、という点です。
今日はまった2つのポイント(まとめ)
- ドライバ問題 — ESP32がCOMポートに出てこないのは、たいていCP2102ドライバが無いから。公式ページが分かりにくければZIPを直リンクで取得。ELEGOO配布版も有効です。
- OLED表示不良 — ESP32では
Wire.begin(SDA, SCL)を明示しないとI2Cがうまく動かないことがある。表示されないときは、まずI2Cスキャナで配線とアドレスを切り分けるのが近道です。
今回いちばんの学びは、「エラーが出ない(not foundも出ない)のに動かない」ときほど、思い込みで表示コードをいじるより、スキャナのような下のレイヤーで事実を確認したほうが早い、ということでした。今回はそれで一発でした。
次にやること
OLEDに文字が出せたので、次はBME280(温湿度・気圧センサー)で気温を読んで画面に表示します。BME280も同じI2C接続なので、今日の配線とWire.beginの知識がそのまま使えるはず。すだれを気温で自動制御する、という本命機能の第一歩になる予定です。
コメント