あみらぼ

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

ESP32-WROVERで(やっと)Lチカ!

さて、前回、WROVER初起動で一発成功するも、その後どうやっても自動書き込みが

できない、というアメとムチの洗礼を受けました。

自動書き込みにこだわってるとくじけそうなので、他の事を始めます。

後に書きますが、ちょっと意外な挙動も見つけました。

 

引き続き、以下の方法をArduino IDEに組み込む方法を募集中です。

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

 

前回、とりあえず1つのピンでLチカできる事は確認しましたが、

ゆくゆくは(IO0も含めて)使えるピンは全部使う予定なので、

使えそうなピン全てにLEDを接続して、点灯、消灯が可能か確認していきます。

 

まず、安全に使えそうな出力ピンの一覧です。(WROVERの場合です、念のため)

4、13、14、18、19、21、22、23、25、26、27、32、33

次に、条件付きで使えるけどできたら避けた方がよさそうなピンの一覧です。

  • 0、当然、起動モードにかかわる
  • 2、こちらも、起動モードにかかわる
  • 1、3、TX、RX。今回書き込みに使ってたから試してないけど多分問題ない
  • 5、こちらも、起動モードにかかわる
  • 12、こちらも、起動モードにかかわる
  • 15、こちらも、起動モードにかかわる

とりあえず、0、2、12、15、含め、計18個LEDに繋いでみました。

f:id:amilabo:20200301000242j:plain

右側に見えるarduino pro miniや、他のいくつかのパーツは、

以前に作っていた物のテスト時の残骸で、今回のWROVERのテストとは無関係です。

 

LEDは全て、例のarduino uno(の互換機)を買ったときにオマケでついてきた

大量のパーツの中の一部です。絶対使わないと思ってたけど、役立ちました。

わざわざ全部のピンにLEDつけたのは、例のあやしいはんだ付けが、

ちゃんと全部のピンで導通できているかの確認も含めるためです。

あと、LED警察に怒られそうなので、念のため書いておきますが、

電流制限抵抗が各色1本しかないのはわかってて使っています、

2つ以上のLEDは同時に点灯しないので、OKなはずです。

 

www.youtube.com

テスト結果。各ピン順番に点灯した後、特に意味もなく高速に点灯してみました。

とりあえず、起動後は0、2、5、12、15含め、全ピン使えそうです。

 

起動後は特に問題なさそうですが、起動時にちょっと怪しげな動作を見つけました。

起動、リセット関わらず、最初に1秒ほどIO0とIO14のLEDが高速点滅します。

IO0はまぁわかるとして、IO14が点滅したのは意外でした。

IO14は、起動時に短絡してても問題なく使えると思っていましたが、まずそうです。

f:id:amilabo:20200301063103j:plain

何の信号かは謎ですが、ありえるとしたら、MTMSあたりでしょうか?

いずれにしても、IO0、2、5、12、15に加えて、IO14を使うときは、

起動時にはHi-Zになっている事が確実な端子に繋ぐのが安全そうです。

 改めて、使う際に気を付けた方がよさそうな端子のまとめ。

  • 0、起動モードに影響、起動時にHIGHが出る?
  • 2、起動モードに影響、起動時PULL_DOWN
  • 5、起動モードに影響、起動時PULL_UP
  • 12、起動モードに影響、起動時PULL_DOWN
  • 14、起動モードには影響しないが、起動時にHIGHが出る?
  • 15、起動モードに影響、起動時PULL_UP

(起動時PULL_UP/DOWNは、データシートから確認した値です)

 

と、ここで疑問に思ったのですが、IO0が起動時に点滅した件です。

どこを見ても、IO0は起動時にGNDに直結するようなスイッチや回路になってますが、

起動時にIO0にHighがでているという事は、GNDに直結すると大電流が流れて、

ICにダメージをあたえたりすることはないのでしょうか??

恐らく、IO0がGNDになった事を認識して即座に出力を止めるとは思いますし、

以下のようにデータシートにも直結で問題無いような回路が書かれているので、

大丈夫かと思いますが、気になる場合は、小さい値の抵抗を入れた方がいいかもです。

f:id:amilabo:20200301064120j:plain

また、WROVERとは全く関係ない話なのですが、使用した緑のLEDが何か変です。

青色のLEDは、Vf2.5v程度で0.3mA流して十分点灯しているのがわかりますが、

緑色のLEDは、青色のLEDと同程度の輝度にすると、30mA近くの電流が流れました。

その差、実に100倍です。上記の動画がその通りなのですが、電流制限抵抗の値、

青色は2200Ωなのに対して、緑色は22Ωです。(その際どちらもVf2.5v程)

LEDによって、電力に対する発光効率に差があるのはわかりますが、

それにしても酷すぎませんかね?ましてや、青色ではなく緑色なのに。

オマケで貰ったようなLEDなのでこれ以上あれこれ考えない事にしますが、

あまりにも非効率なのと、ICのピン単位の出力限界もあるので、使わない事にします。

 

ちなみに、起動後のLED消灯時の消費電流を計ったところ、約40mA程でした。

省電力という感じではないですが、datasheetによると30~68mAとのことなので、

おおむね予想通りといったところですね。(改めて緑色LEDの異常さがわかります…)

 

さて、想定外の挙動はありましたが、起動後は18本のピンが使える事がわかりました。

ということは、9×9のマトリクス状に配線すれば、WROVER単体で、

81個のLEDが使えそうですね!(もちろんそんな事はやりませんがw)

いずれにしても、Wifi&BT内蔵、DualCore240Mhz、4MFlash、512KRAM、8MPSRAM、

という、一昔前からすれば、夢のような小型マイコンでこんな事をしていたのでは、

苦労した先人たちに申し訳がたちませんし、もったいないお化けが出そうです。

PCやスマホといったドラ〇もんもびっくりな未来道具の一番の使用用途が、

ネットでエロサイトを見る事、といったくらいがっかりな未来です。

 

次回は、もうちょっと進歩した事をできればと思います。ではでは。

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ピンのシリアル変換は万能じゃない!

ESP32-WROVER-Bの電源!

さて、前回、WROVERをブレッドボードに乗せるとこまでできましたが、

テストをするにあたり、まずは電源まわりです。

arduino unoのatmega328pなんかではそこまで気にしませんでしたが、

ESP32は電源関係がかなりシビアなようです。

Wifiとか使わなければ数十mA程度のようですが、それでも電源投入時には、

一時的にかなりの電流が流れるようで、USB5Vからとるのは、

USB側にとっても、ESP32側にとっても、割と危険なようです。

電源3.3Vと電圧は低く、電流は多く、というあたりは、

マイコンも、より最近のコンピュータに近づいてるという感じでしょうか。

 

と、いうわけで電源をUSBからとるのは早々にあきらめて、別途電源にしました。

f:id:amilabo:20200301000320j:plain

左側の黒い基盤が、使用している電源モジュールです。

以前に、arduino unoの互換品を買ったときに、タダみたいな価格でついてきた、

大量のおまけパーツの中の一つなのですが、このモジュールの便利さには驚きました。

最初は、何じゃこりゃ?と思ったのですが、一度つかってみると、

なぜ今まで知らなかったのか、と思うほどで、もうコレの無い生活には戻れませんw

  • ブレッドボードの電源ラインにがっちり安定して固定できる
  • 5v、3.3vの2種類のレギュレータがついていて、ブレッドボードの上段と下段でそれぞれ任意の電圧を指定できる。(もちろん同じ電圧も可能)
  • 手軽に押せるプッシュスイッチ付き
  • DCジャックに適当なACアダプタを繋ぐだけでOK。(今は手元にあった9VのACアダプタ使ってますが、DCジャック付きの9V電池スナップももちろん使える)

多少高くつくかもしれませんが、ブレッドボードを頻繁に使う人なら、

この電源モジュール単体で買うのも全然アリだと思います。

(ブレッドボードと、電源モジュールの幅、電源ラインの形状は要確認)

 

ACアダプタと、基板上のレギュレータの仕様からして、1A程度は大丈夫そうです。

さらに、電源投入時の大電流に備えるため、手元に転がってた1000μFの

電解コンデンサを2個(合計2000μF)繋いでおきました。

さすがにこのコンデンサに電源モジュールから突然電源を入れるのは怖いので、

まずコンデンサとGNDの間に抵抗を介してゆっくり充電して、その後、

コンデンサとGNDを直結にするようにしています。で、その後にWROVERの3.3vを接続、という手順にすれば、突入電流にもきっとある程度対応できるはず…。電源モジュールの電源が入っている間は、コンデンサが十分充電されているので、WROVERの電源を繋いだり切ったりは気軽にやってもきっと問題ないはず…。

あと、電源モジュールの電源切るときは、コンデンサとGNDを切断してから

電源モジュールの電源切れば、逆電圧の心配もなさそうですし、

コンデンサ電荷もしばらく残るので、またすぐ電源入れるような時は、

最初にやった抵抗を介してゆっくり充電するステップを踏まなくても、

電源モジュールの電源入れてからコンデンサとGNDを接続すれば安全なはずです。

 

あと、ESP32の電源は容量だけじゃなくて、質も重要、というのを見かけたので、

f:id:amilabo:20200229195720j:plain

WROVERモジュールの近くに、0.47μFの無誘導積層セラコンをつけておきました。

無誘導0.47μFでたった10円だったので、お得かなと思って買ってみたものです。

「無誘導」というのがどれほど効果的かはわかりませんが、

少なくとも、一般的な0.1μFの積セラ(通称おまじないコンデンサ)よりは、

高周波領域の電源ノイズを減らす事などにはよく役立ってくれそうです。

 

以上、電源だけの話でかなり長くなってしまったので、続きは次回

ESP32-WROVER-B買ってみた!

どうも、本ブログ初投稿の記事です。

唐突にブログを始めたので、WROVERを買うに至った経緯はいろいろありますが、

それを説明し始めると、あまりに長すぎて早々にくじけそうなので、まず現状から。

 

近所の電子部品屋さんで、ESP32-WROVER-Bを買ってみました。

ESP32-WROOMやDevkitでもよかったのですが、最終的に作りたいものが、

モジュール単体の最小構成で動作させたいとか、PSRAMが欲しくなりそうとかで、

ESP32-WROVER-Bのモジュール単体に挑戦する事にしました。

 

で、まずテストするにあたって、どうブレッドボード上に乗せるかですが…。

WROVERの変換基盤は売ってない…。通販で変換基盤買おうかとも思いましたが、

まずはテストだし、変換基盤使うと幅が広くてブレッドボードで扱いにくそう、

ということから、気合いで手はんだでモジュール幅そのままを乗せる事にしました!

 

f:id:amilabo:20200229195501j:plain

f:id:amilabo:20200229195628j:plain

ESP32-WROVERは、ESP32-WROOMと違い、端子が2列のみなので、

こんなことができるようです。なんとも危うい方法で、こんなの載せたら

怒られそうなやり方ですが…、メリットもあります。

何と、この方法だと、ブレッドボードの両端2ピンずつ使えます!

変換基盤や開発ボードでは(物理的に)まず不可能でしょう。

足に使ってるのは、昔、他の機器を作った時にはんだ付け後に切り取った

抵抗やその他パーツの切れ端たちです。

いつか何かにつかえるかと取っておいた貧乏性が、こんな所で役立ちました。

 

さらに、使える可能性のある端子は全部出しました

これも、ゆくゆく考えてる設計が、全ピン使ってもかなりギリギリで、

使えるか微妙なピンも、一通りテストしておきたかったからです。

WROVERのPSRAMのCLKとCSのために2ピン減ってるのが地味にイタいですね。

とゆか、PSRAMで使う2ピンはモジュール上で端子自体出てないのに、

どうせ使えないSPI-FLASHの端子が全部出てるのはなぜなのでしょう??

どうせ使えないなら、ピン数減らして小型化できそうですが…。

オシロとか繋いで、SPI-FLASHの通信状態とか確認するため??

もしくは、内部FLASH使わずに、モジュール外に別のFLASHを接続するため??

 

疑問は残りますが、これでまずはテストできるはず!

WROVERの裏面には端子名も記載されてるので見やすいはず!と思ったのですが…。

f:id:amilabo:20200229195719j:plain

どの端子がブレッドボードのどこに繋がってるかサッパリわかりません!

画像だと横から見ればわかりそうですが、実際、モジュール自体かなり小さいので、

肉眼だと斜めの平行線がびっしりで、頭がパニックになりそうになりますw

テストと割り切って使うか、ブレッドボードにシールか何かはる必要ありそうですね。

 

と、いうあたりで続きは次回