あみらぼ

電子工作がメインのDIYもの作り雑記

ESP32-WROVER初起動!

さて、前回、WROVERの電源まわりが整いましたので、

ついに(やっとのことで)WROVERの初起動となります。

端子がブリッジしてないか、回路が間違ってないか、何度も確認しましたが、

それでも不安しかないのは、開発キットではないのでしかたないですね。

 

まずは、IO1とRESETをスイッチにして、それを手動で押したり離したりする、

手動モードでシリアル変換モジュールと繋ぎ、工場出荷時のファームを吸い出し…。

かなり緊張…、しながらおそるおそる行って…。まさかの一発成功!

当たり前と言われるかもしれませんが、まずは一安心です。

その調子で、Arduino IDEからLチカを書き込み、こちらも無事成功!

ここまでくれば、あとはもう大丈夫!と思っていました。

 

さて、次に、書き込み方法ですが、このスイッチを押したり離したりする方法、

2つのスイッチの意味と理屈さえわかってしまえば、どうということはなく、

手順を混乱する事はないのですが、やはり面倒なのは間違いありません。

と、いうことで、これを自動化する回路をブレッドボード上に実装。

開発ボードの回路図見たり、n-mosを使用する例などを見て、

最小限の面積で収まるよう、買ってきた部品で実装したのですが、

ここで問題発生!何度やっても書き込みに失敗します。

初回起動を手動の方法でやったのは不幸中の幸いですね、

もし最初から自動モード実装してたら、初回起動で失敗して、

モジュールをぶっ壊したのではないかと超絶不安な思いをしたに違いありません。

 

ただ、自動モードをあきらめるわけにもいきません。

というのも、今回のためにFTDI FT232のUSBシリアル変換モジュールを買ったので。

WROVERよりも、このUSBシリアル変換モジュールの方が高いのですから。

最初は、arduino uno(互換機)のatmega328pをひっぺがして、抵抗分圧すれば、

arduino unoをUSBシリアル変換モジュールとして使うこともできるし、

(実際、その方法でarduino pro miniも何の問題なく使えてたし)、

恐らくESP32も、手動モードでなら使えると思っていたのですが…。

いちいちarduino unoのIC抜くのも面倒だし、速度の事とかも考えると、

6ピンで5v、3.3v両対応のシリアル変換モジュールあれば、

今後も何かと役に立つと思って、ちゃんとしたのを買ったのですが…。

自動モードで使えないのであれば、本当に損した気分です。

 

改めて、手動モードで試すと上手くいくので、モジュールは無事で、

やはり自動モードの回路の方に問題があるようです。

N-MOSのソースとかドレインの記号がややこしいので、何度も確認するも問題なし。

また、挙動をみる限り、どうやらリセットはできているようで、そこから

connecting...が続いて進んでいない様子。IO0の方が上手く動いていない?

んー、USBシリアル変換モジュールの説明をもう一度確認してみる。

f:id:amilabo:20200301035332j:plain

3番が5V出力固定なのは、承知済みで、特に気にしていなかったのですが、

2番と6番のCTSRTS。どのモジュールも、6ピンかそれ以下だし、

arduinoの時も、リセット端子の事をRSTだったりDTRだったりで、

表記の揺れ?みたいなのがあったので、当然CTS=DTRって事だよね…。

TX、RXは確実だから、試しにCTSRTSひっくり返してみる。でも失敗。

んー、CTSとかDTRとかをちゃんと調べてみようか…。

原因がわかりました!CTS=DTRは大間違いです!

うん、シリアル通信の原理等をちゃんと理解してなかった自分が100%悪いですね。

でもさ…、どこにも7ピンのシリアル変換モジュールなんて見当たらないじゃん…。

あったとしても、とりあえずICのピン全部出しときましたみたいな基盤だし…。

最大6ピンって事は、それでまず全て事足りるってことだって思うよね、普通…。

どうやっても言い訳ですね。この辺にしておきます。

ただ、大事な事なのでもう一度、

6ピンのシリアル変換は万能じゃない!

調べに調べると、6ピンでも、CTSのケースとDTRのケースがあるみたいですね。

ただ、その辺の情報って、本当に知ってる人が調べないと見つからないほど少ない。

それなら、7ピンのシリアル変換モジュールがあってもいいんじゃないかなぁ…。

大事な事なので、何度でも言います。

CTSとDTRは全くの別物!

 

さて、後悔してばかりいても始まらないので、対策を考えます。

まず、IC自体にはDTRの端子があるので、そこを無理やり引き出せないかな?

f:id:amilabo:20200301041506j:plain

絶望本当に、考えなしにこれを買った過去の自分をぶん殴りたい…。

せめて、SSOPパッケージのICが乗ったモジュールを買っておけばできたのに…。

んー、FTDIのドライバ設定とかでCTSにDTR信号出せたり…しないよね、ですよねー。

あとは…、パーツ何個かでDTRに相当する信号を出せる回路を考えるか…、

しばらく考えたけど、1回目のリセットからダウンロードモードに入れても、

2回目のリセットでダウンロードモードに入らないようにする回路は思いつかない。

複雑な回路とかマイコン使えばできそうだけど、そこまでするのもなぁ…。

ひたすら調べたところ、海外の方で、esp32の書き込みプログラム中の、

「DTRから出す」という個所を「CTSから出す」に置き換える方法がある様子。

英語自体は、何を言ってるかは確かにわかるんだけど、要約すると、

「それできる.pyファイル作ったから、あとはわかるよね!」って感じ。

多分この方法が正攻法なんだろうけど、Arduino IDEから動いてるのはexeっぽくて、

ここにその.pyファイルをつっこむってのはできるんだろうか?

できたとして、書き込みのための操作手順が増えたら元も子もないし…。

 

ちょっと詰んできた感じなので、まずはIO0だけ手動ボタンで使おうと思います。

結局手動でボタン押すのは悔しいけど、リセットの方は自動になったし、

IO0のボタン押すタイミングはそれほどシビアじゃないみたいなので…。

connecting...って表示が出てから、RESETを繰り返すらしいので、

その間に一回でもIO0を1~2秒くらい押せば問題ない様子。

 

上記の.pyファイルを書き込み前に実行する方法、

https://www.esp32.com/viewtopic.php?t=6113

もし、コレをArduino IDEに組み込める方法がわかる方がいらっしゃいましたら、

ぜひ教えてくださいm(__)m。きっと他の方の同様の悲劇の助けにもなると思います。

 

ひたすらシリアル変換モジュールの後悔と愚痴で長くなってしまったので、

続きは次回。やっと、WROVERを使い始められると思います。

 

最後に、本当に大事な事なのでさらに念を押して何度でも言っておきます。

CTSとDTRは全くの別物!

6ピンのシリアル変換は万能じゃない!