google-site-verification: google3bd66dd162ef54c7.html
fc2ブログ

ESP32(ESP-WROOM-32)を使う (書き込み回路の改造)

◆自動書き込みが出来ない
ESP32用のブレッドボードが完成したので、プログラム作りを開始したいのですが、Arduino IDE からプログラムの自動書き込みが出来ません。スイッチを操作した手動書き込みは出来ますが、やはり自動書き込みが出来ないと不便です。

この現象はUSB/シリアルチップなどの相性で発生するらしくて、ENピンとGNDの間にコンデンサを入れることで解決出来るそうです。ただ、そうは言っても、何が起こっているのか確認しないでコンデンサを入れるのも情けない話です。

ということで、回路を調べてみました。

◆回路図
ESP-32 DEVKIT の回路図はネットを探すといろいろ出てきますが、自動書き込み信号の発生回路は以下のようになっていました。
ESP32のプログラム書き込み信号生成回路
配線がたすき掛けになっているのでラッチかと思いましたが、そうではありません。トランジスタの向きが上下で逆になっていたりして、とにかく見づらいし、回路の他の部分との接続関係も判り難いです。どうせ基板全体の回路図が見たくなるので現物を追いながら私の好みに書き直したのが以下の回路図です。

・ESP32 DEVKIT V1の回路図 (ESP-WROOM-32との接続は省略しています) 図をクックで別窓に拡大
ESP32 DEVKIT V1の回路図
なるほど、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)
ENの波形
この波形では自動書き込みNG。

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

・1uF追加後 立ち上がり時間=10mS (10kΩ x 1.1uF)
1uF増量
これでもOK

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

・書き込み信号部分全体
書き込みモード遷移パルス(EN)
最初に幅の狭いパルスが出た後に、100msくらいのパルスが出ていました。このどちらを使っているのか調べ切れていません。

◆実際の基板の様子
ESP32 DEVKIT V1(30pin)
ENボタンのそばに変な角度で取り付けられているコンデンサがありますが、

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

・コンデンサ増設後
ESP32 DEVKIT V1 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の回路にはロジックが入っているのでリセットがかからないのだと思います。強制的にリセットが入らないので、こっちの方が使い易いかも知れません。
関連記事

コメントの投稿

管理者にだけ表示を許可する

No title

検索でたどり着いたのですが、興味深い記事で参考になりました。
一点、すでに解決されているかもしれませんが、

> 最初の EN=0, GPIO=0の状態は無いので
この件ですが、MCUはENの立ち下がりエッジでGPIO0を読むわけでは無いため、そもそもそのような状態を作る必要が無い、ということかと思いました。

つまり、遷移としては以下のようになるかと思います。
- EN=1, GPIO0=1: MCUは実行状態
- EN=0, GPIO0=1: MCUがシャットダウンする
- EN=1, GPIO0=0: MCUが起動する ENの立ち上がりがやや遅延するのでMCUはGPIO0=0を読み出し、ブートローダーモードに入る
- EN=1, GPIO0=1: MCUは実行状態

t.takanashiさん、情報ありがとうございます

なるほど、CPUをリセットするにはENとGPIO0の両方を0にしないといけないものだと思ってました。
でも言われてみればそういう仕様って変ですよね。ENのネガエッジでリセット、ポジエッジでスタート。つまりENは普通のCPUのリセットと同じようなものということでしたか。
カレンダー
02 | 2024/03 | 04
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 - - - - - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。
記事の内容のご利用は読者の自己責任でお願いします。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード