ESP32 スケッチからの「書き込みに失敗しました」
Arduinoのスケッチは非常にオープンにできていて、イタリア人は「寛大なんだなー」と感激してしまうほど。日本の企業だったら成功した暁の利益「囲い込み」のために、流用させないためのありとあらゆるプロテクトをかける?と言うのが昔の流儀だった。それはそうとして、ESP32はそのような寛大な配慮によりArudinoでもないのにスケッチが使えるようになっている。いろいろ手順は必要だが、その方法は世界中の技術者がWeb上にレポートしているので、自分のような新参者も全く困らない環境になっている。しかし、私を含めた多くの人たちが、表題の問題に1度は直面しているようだ。中には解決できずに諦めてしまった人もいるのではないだろうか。
私が直面した問題「書き込みに失敗しました」と解決方法:
1. USB-マイクロUSB問題
USBのコネクタは実に様々のコネクターが存在していて、いにしえのデジカメのデーター交換用として使用されていたUSB-AとかUSB-Bコネクタがあったが、これらは今や全く使い道がない「ゴミ」となっている。マイクロUSBはAndroid系のスマホ、タブレットで使用されていた。(いまはほとんど表裏のないUSB-Cタイプになっている)このケーブルで外部機器とデータのやり取りをした人はどのくらいいるのだろうか。スマホの台数から見たら1%以下でしょう。ほとんどのユーザーは充電用のケーブルとしか使用していないはず。最近流行の充電式ハンディー扇風機もマイクロUSBが充電口。実はこれが曲者で、100円ショップなどで販売されているUSBケーブルはデータ線が入っておらず、電源しかつながらない物が圧倒的に多い。これをESP32に使うと電源を示す赤LEDは点灯するものの書き込みはできず、エラーとなります。(あたりまえ)しかし、まさかデーター線がないとはすぐには思わないので・・・私は3本くらい試してみましたが、全てダメでした。しかも、写真のようにUSBのちゃんとしたロゴも入ってるのに信号レス!ロゴを入れたらちゃんと規格のものを作れ!と言いたいが?
実際、マイクロUSBのデバイスがなく、導通を確認しようにもテスターで当たるのも端子が小さすぎて不可能なため、確認には苦労しました。結局「データ線あり」ケーブルを新たに買う羽目に。データ線のあるマイクロUSBケーブルをちゃんと用意しよう!
2. ENのタイミング問題
ESP32のFlashへの書き込みを制御する「Boot」と言う信号とリセットに相当する「EN」があり、それぞれPUSHスイッチもついているのですが、書き込み時、書き込み終了後、まさに「Boot」するタイミングが正確に記載された資料を見つけることができなかった。
結局Web上の諸先輩方のレポートや状況から、さらにEspressif Systemsのデータシートにある回路図から推察するに、流れとしては書き込み直前までBoot信号はLにしておき、書き込み時H書き込み完了でH->Lとし、ENをL(リセット)にしてまさに「Boot」する、ようです。しかしどのようなタイミングが要求されているのかはよくわからない。
解決方法として、ESP-WROOM-32の「EN-GND間に10マイクロFのコンデンサを追加する」というのが行われているが、これはすなわち、ENの立ち上がり、立ち下がりを遅くして(時定数的にはmsオーダーになるはず)いるということ。結果オーライではあるが具体的にどのタイミングがどう効いているかは私にはわからず。ちなみに、Windowsでスケッチを動かした時に起きる、とよく報告されているようだが、MacBookでも試してみまた、全く同じ現象が発生し解決にはならず。(私のボードDOIT ESP32 DEVKIT V1だけかもしれません?)
この問題に悩んでいると、先に進まないので、「そういうものだ」という結論に。
本当はスケッチがコンパイル前にボードと何か通信の確認をすると言うことをやってくれればいいのだが、そう言う仕様にはなっていないようだ。