ESP32(ESP-WROOM-32)を使う (書き込み回路の改造)
◆自動書き込みが出来ない
ESP32用のブレッドボードが完成したので、プログラム作りを開始したいのですが、Arduino IDE からプログラムの自動書き込みが出来ません。スイッチを操作した手動書き込みは出来ますが、やはり自動書き込みが出来ないと不便です。
この現象はUSB/シリアルチップなどの相性で発生するらしくて、ENピンとGNDの間にコンデンサを入れることで解決出来るそうです。ただ、そうは言っても、何が起こっているのか確認しないでコンデンサを入れるのも情けない話です。
ということで、回路を調べてみました。
◆回路図
ESP-32 DEVKIT の回路図はネットを探すといろいろ出てきますが、自動書き込み信号の発生回路は以下のようになっていました。
.png)
配線がたすき掛けになっているのでラッチかと思いましたが、そうではありません。トランジスタの向きが上下で逆になっていたりして、とにかく見づらいし、回路の他の部分との接続関係も判り難いです。どうせ基板全体の回路図が見たくなるので現物を追いながら私の好みに書き直したのが以下の回路図です。
・ESP32 DEVKIT V1の回路図 (ESP-WROOM-32との接続は省略しています) 図をクックで別窓に拡大

なるほど、GPIO2にはLEDが接続されていて更に10kΩでプルダウン、GPIO5は10kΩでプルアップされていました。こういうことは回路図だと判り易いです。
問題のプログラムの書き込み信号は、DTRとRTS信号からQ1,Q2のトランジスタで作ったロジックで生成されていました。ENの立ち上がりを遅らせる必要があるので、Q1のコレクタとGNDの間にコンデンサが必要になるようです。
ここで判らないのは、スイッチ操作で書き込みモードに入れる場合には、最初に EN=0, GPIO=0 の状態を作り(両方のボタンを押す)、その後 EN=1, GPIO0=0 にした(ENのボタンを離す)後で EN=1, GPIO0=1 の状態(両方のボタンを離す)に変化させます。真理値表を見ると、最初の EN=0, GPIO=0の状態は無いのでスタティックにその状態を作ることは出来ません。そうなると過渡的にその状態を作っていることになります。まあ実際にはコンデンサを入れてLOWになる時間を延ばしているのですが、本当にそんな設計するもんでしょうか?ここは何か私が勘違いしているのかも知れません。
ともかく、ここには最初から0.1uFのコンデンサが入っていたのですが、これでは足らないようで、C-ENとして0.1uFを追加して合計0.2uFにするとうまく自動書き込みが出来るようになりました。ちなみに0.047uFを追加した場合は50%くらいの成功率でした。
あと、C-ENを1uFまで増やしてもうまく動作したので、2枚ある基板のうち1枚は追加コンデンサ0.1uF、もう一枚は1uFにして様子を見ることにしました。
ちなみに、このコンデンサと並列にタクトスイッチが接続されているので、接点の保護用に51Ωくらいの抵抗(Rs)を入れておきたいところです。しかし、スペースの関係で断念しました。まあしょっちゅう操作するスイッチでは無いので良いかと。操作頻度が高いスイッチでこういうことをしてはいけません。ともかくそういう事情があるのでここのコンデンサの容量をむやみに増やすのは危険だと思います。
◆ENピンの波形
・オリジナルの状態 立ち上がり時間=1mS (10kΩ x 0.1μF)

この波形では自動書き込みNG。
・0.1uF追加後 立ち上がり時間=2mS (10kΩ x 0.2uF)

この波形なら自動書き込みOKでした。
・1uF追加後 立ち上がり時間=10mS (10kΩ x 1.1uF)

これでもOK
・全体波形

右側のパルスでリセットがかかってプログラムがスタート(再起動)するようになっているようです。この例では4.5秒後になっていますが、この長さはプログラムのサイズで変わってくるはずです。
・書き込み信号部分全体

最初に幅の狭いパルスが出た後に、100msくらいのパルスが出ていました。このどちらを使っているのか調べ切れていません。
◆実際の基板の様子

ENボタンのそばに変な角度で取り付けられているコンデンサがありますが、

これが最初からENピンに入っていたコンデンサでした(謎のチップコン)。自動書き込みエラーの防止のため、ボードメーカーが追加したのだと思いますが、どうせ基板のパターンを直すなら、部品が直角に付くように設計しておいて欲しいです。日本人ならこんな設計はしないでしょうね。
・コンデンサ増設後

チップコンが無かったので、普通のリードタイプのセラコンをこの位置にはんだ付けしました。
◆電源電流波形

ついでに電源電流を測定しておきました。これはGND側に入れた1Ωのシャント抵抗の電圧波形です。つまり、1目盛20mVが20mAに相当しています。
これはリセット後の消費電流の変化を見ていますが、最大で90mA流れていて、Arduino UNO と比べるとかなり多いです。ただ、昔言われてたように極端に消費電力が大きいということは無い感じです。ただこれはWiFiを使っていない状態なので、電波を出すともっと電流が増えると思います。
◆まとめ
ということで、無事プログラムの自動書き込みが出来るようになりました。中華な基板を使う場合、こういう苦労ある訳ですが、その分技術力が上がるくらいに思って、割り切るしか無いでしょうね。
追加したチップコンの容量は私の環境の場合の話なのでいつでもこれでうまく行くかどうかは判りません。
なお環境は下記です
Win.10 64ビット、USBドライバはCP210x 6.7.4.261 、Arduino IDE 1.8.12
esptool.py v2.6, Chip is ESP32D0WDQ6 (revision 1), Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
◆覚え書き
・モジュールのヘッダーピンが垂直にはんだ付けされていなかったので、ペンチで修正しました。
・基板の側面がVカットを折っただけの状態で、ささくれていたので軽くやすり掛けしました。
・UNOだとシリアルモニタやターミナルソフトを接続するとボードのリセットがかかりますが、ESP32(DEVKIT)ではリセットはかかりませんでした。UNOはDTRの微分でリセットしているのに対しESP32の回路にはロジックが入っているのでリセットがかからないのだと思います。強制的にリセットが入らないので、こっちの方が使い易いかも知れません。
ESP32用のブレッドボードが完成したので、プログラム作りを開始したいのですが、Arduino IDE からプログラムの自動書き込みが出来ません。スイッチを操作した手動書き込みは出来ますが、やはり自動書き込みが出来ないと不便です。
この現象はUSB/シリアルチップなどの相性で発生するらしくて、ENピンとGNDの間にコンデンサを入れることで解決出来るそうです。ただ、そうは言っても、何が起こっているのか確認しないでコンデンサを入れるのも情けない話です。
ということで、回路を調べてみました。
◆回路図
ESP-32 DEVKIT の回路図はネットを探すといろいろ出てきますが、自動書き込み信号の発生回路は以下のようになっていました。
.png)
配線がたすき掛けになっているのでラッチかと思いましたが、そうではありません。トランジスタの向きが上下で逆になっていたりして、とにかく見づらいし、回路の他の部分との接続関係も判り難いです。どうせ基板全体の回路図が見たくなるので現物を追いながら私の好みに書き直したのが以下の回路図です。
・ESP32 DEVKIT V1の回路図 (ESP-WROOM-32との接続は省略しています) 図をクックで別窓に拡大

なるほど、GPIO2にはLEDが接続されていて更に10kΩでプルダウン、GPIO5は10kΩでプルアップされていました。こういうことは回路図だと判り易いです。
問題のプログラムの書き込み信号は、DTRとRTS信号からQ1,Q2のトランジスタで作ったロジックで生成されていました。ENの立ち上がりを遅らせる必要があるので、Q1のコレクタとGNDの間にコンデンサが必要になるようです。
ここで判らないのは、スイッチ操作で書き込みモードに入れる場合には、最初に EN=0, GPIO=0 の状態を作り(両方のボタンを押す)、その後 EN=1, GPIO0=0 にした(ENのボタンを離す)後で EN=1, GPIO0=1 の状態(両方のボタンを離す)に変化させます。真理値表を見ると、最初の EN=0, GPIO=0の状態は無いのでスタティックにその状態を作ることは出来ません。そうなると過渡的にその状態を作っていることになります。まあ実際にはコンデンサを入れてLOWになる時間を延ばしているのですが、本当にそんな設計するもんでしょうか?ここは何か私が勘違いしているのかも知れません。
ともかく、ここには最初から0.1uFのコンデンサが入っていたのですが、これでは足らないようで、C-ENとして0.1uFを追加して合計0.2uFにするとうまく自動書き込みが出来るようになりました。ちなみに0.047uFを追加した場合は50%くらいの成功率でした。
あと、C-ENを1uFまで増やしてもうまく動作したので、2枚ある基板のうち1枚は追加コンデンサ0.1uF、もう一枚は1uFにして様子を見ることにしました。
ちなみに、このコンデンサと並列にタクトスイッチが接続されているので、接点の保護用に51Ωくらいの抵抗(Rs)を入れておきたいところです。しかし、スペースの関係で断念しました。まあしょっちゅう操作するスイッチでは無いので良いかと。操作頻度が高いスイッチでこういうことをしてはいけません。ともかくそういう事情があるのでここのコンデンサの容量をむやみに増やすのは危険だと思います。
◆ENピンの波形
・オリジナルの状態 立ち上がり時間=1mS (10kΩ x 0.1μF)

この波形では自動書き込みNG。
・0.1uF追加後 立ち上がり時間=2mS (10kΩ x 0.2uF)

この波形なら自動書き込みOKでした。
・1uF追加後 立ち上がり時間=10mS (10kΩ x 1.1uF)

これでもOK
・全体波形

右側のパルスでリセットがかかってプログラムがスタート(再起動)するようになっているようです。この例では4.5秒後になっていますが、この長さはプログラムのサイズで変わってくるはずです。
・書き込み信号部分全体

最初に幅の狭いパルスが出た後に、100msくらいのパルスが出ていました。このどちらを使っているのか調べ切れていません。
◆実際の基板の様子

ENボタンのそばに変な角度で取り付けられているコンデンサがありますが、

これが最初からENピンに入っていたコンデンサでした(謎のチップコン)。自動書き込みエラーの防止のため、ボードメーカーが追加したのだと思いますが、どうせ基板のパターンを直すなら、部品が直角に付くように設計しておいて欲しいです。日本人ならこんな設計はしないでしょうね。
・コンデンサ増設後

チップコンが無かったので、普通のリードタイプのセラコンをこの位置にはんだ付けしました。
◆電源電流波形

ついでに電源電流を測定しておきました。これはGND側に入れた1Ωのシャント抵抗の電圧波形です。つまり、1目盛20mVが20mAに相当しています。
これはリセット後の消費電流の変化を見ていますが、最大で90mA流れていて、Arduino UNO と比べるとかなり多いです。ただ、昔言われてたように極端に消費電力が大きいということは無い感じです。ただこれはWiFiを使っていない状態なので、電波を出すともっと電流が増えると思います。
◆まとめ
ということで、無事プログラムの自動書き込みが出来るようになりました。中華な基板を使う場合、こういう苦労ある訳ですが、その分技術力が上がるくらいに思って、割り切るしか無いでしょうね。
追加したチップコンの容量は私の環境の場合の話なのでいつでもこれでうまく行くかどうかは判りません。
なお環境は下記です
Win.10 64ビット、USBドライバはCP210x 6.7.4.261 、Arduino IDE 1.8.12
esptool.py v2.6, Chip is ESP32D0WDQ6 (revision 1), Features: WiFi, BT, Dual Core, 240MHz, VRef calibration in efuse, Coding Scheme None
◆覚え書き
・モジュールのヘッダーピンが垂直にはんだ付けされていなかったので、ペンチで修正しました。
・基板の側面がVカットを折っただけの状態で、ささくれていたので軽くやすり掛けしました。
・UNOだとシリアルモニタやターミナルソフトを接続するとボードのリセットがかかりますが、ESP32(DEVKIT)ではリセットはかかりませんでした。UNOはDTRの微分でリセットしているのに対しESP32の回路にはロジックが入っているのでリセットがかからないのだと思います。強制的にリセットが入らないので、こっちの方が使い易いかも知れません。