ESP32開発ボードは様々なものが販売されています。
私も結構な数持っているのですが、「ESP32-DevKitC」はESP32開発ボードとして基本となるモデルではないでしょうか!
ESP32-DevKitCという名称で多くの互換ボードなども販売されていますが、純正品(正規品)はEspressif Systemsというメーカーの製品となります。
互換ボードでも性能的には同じなので値段の安い互換ボードを使っても全く問題になることはありませんが、ESP32はWi-FiやBluetoothといった無線機能が使えるため国内で合法的に無線機能を使うには技適申請が通っているかということは問題になります。
Espressif Systems純正のESP32-DevKitCには『ESP-WROOM-32』が使われていて、このモジュールは技適が通っているため無線機能を問題なく使うことが出来ます。
また、コンパクトなボードサイズでリポバッテリーからの駆動も可能な「Lolin(WeMos) D32」というボードがありますが、扱いやすく便利なので個人的に気に入っているESP32開発ボードの一つです。
このLolin D32にも技適取得済みのESP-WROOM-32が使われているので、日本国内でも無線機能を問題なく使うことが出来ます。
ESP-WROOM-32を使ったボードでは、ボードサイズなどArduino Uno互換で作られArduinoライクで使えるWeMos D1 R32(ESPDuino32)なんていう面白いボードもありますね!
ESP-WROOM-32は技適取得済みであり国内でも安価で入手しやすいモジュールなので、単体でテスト回路を組んだり自作基板に組み込むなどで使われ事が多いと思います。
私も先日、ファミコン(NES)エミュレータをESP32で動かすこのような自作基板を作ったのですが、このコアにESP-WROOM-32モジュールを使いました。
この投稿をInstagramで見る
ある程度ESP32の基本的なことについては理解出来ているつもりでしたが、この自作基板製作過程でESP-WROOM-32にスケッチ(プログラム)が書き込めないといったトラブルがありました。
ESP32には起動時のモードを決定するなどの特別なピンの扱いがあったりするのでいくつか注意しないといけない項目があります!
今回は自分への備忘録も兼ねて、ESP-WROOM-32の起動モードやスケッチの書き込み方法などモジュール単体で動かす基本的な方法をまとめていきたいと思います。
目次
ESP32(ESP-WROOM-32)の基本的な使い方!
ESP-WROOM-32とは?
真ん中にある小さなモジュールがESP-WROOM-32です。
ESP32開発ボードに実装されているのをよく見かけると思います。
技適申請が通っているモジュールなので国内でも問題なく無線機能を使うことができ、数百円程度で入手もしやすいESP32モジュールです。
ESP-WROOM-32モジュール内部はこのようになっています。
こんなに小さなモジュールですが内部にEspressif Systems社が提供しているESP32チップを搭載し、フラッシュメモリが内蔵されWi-Fi/Bluetooth無線通信が出来るESP32モジュールです。(画像引用)
Wi-Fi通信のみ可能なESP8266モジュールにESP-WROOM-02がありますが、これのESP32版といったところですね。
ESP32開発ボードを使わなくてもESP-WROOM-32にはマイコンチップやフラッシュメモリが内蔵されているので、プログラムを書き込んで電源供給さえすればこのモジュール単体でマイコンとして動作させることが出来ます。
ESP32-DevKitC開発ボードでは、このESP-WROOM-32に電源回路やUSBシリアルインターフェース、プログラム書き込み回路といった周辺回路が組み込まれているということですね!
今回このESP-WROOM-32単体を使いスケッチを書き込み動作確認(Lチカ)をやってみようと思います。
見ての通りモジュール単体では配線が面倒なので、ブレッドボードでも使えるようにこのようなDIP化基板(ピッチ変換基板)を使うと便利です。
ピンアウト
ESP-WROOM-32のピン配列(ピンアウト)はこのようになっています。
参考 ESP-WROOM-32 DatasheetEspressif Systems初めて使う場合、起動時のモードに関わるピンや内部フラッシュメモリとの接続に利用され使用できないピンなどがあり少し分かりにくいかもしれませんが(ESP32開発ボードと同じです)、基本的にENピン(リセットピン)をプルアップ(10kΩ)して電源(3.3V/GND)を接続すれば動作してくれます。
この点はESP-WROOM-02と比べると簡単かもしれません!
最低限の基本接続はこのようになります。
既にESP-WROOM-32に書き込まれたプログラムは最低限これで動かすことが出来ますが、プログラムの書き込みにはUSB-シリアル変換モジュールとの接続が必要となってきます。
ピン配列をまとめるとこんな感じになります。
赤枠は内部フラッシュとの接続で利用されているので実際には使えないピン、緑枠のGPIOピンは起動時に関わるピン、青枠は入力でのみ利用できるピンとなっています。
【IO0ピン】起動時の書き込み or 実行モードを決定するピン
ESP32(ESP-WROOM-32)の一部のピン(端子)は、電源投入時やリセットされ再起動した時のピンの状態(HIGH or LOW)により起動モードを決定する重要なピンがあります。(内部の設定が変わります)
具体的にESP32の起動時のモードを決定するピンは、IO0/IO2/IO5/IO12/IO15の5つのピンです。
その中で最も重要なのがIO0ピン(とIO2ピン)です。
ESP32の電源投入時やリセットがかかって再起動した際のIO0ピンの状態(HIGH or LOW)によって、プログラム書き込みモード(UART Download Mode)で起動するか、プログラム実行モード(SPI Flash Boot Mode)で起動するかが決定されます。(オレンジはデフォルト設定)
起動モードの決定 | ||
IO0 | LOW | HIGH(または未接続) |
プログラム書き込みモード (UART Download Mode) | プログラム実行モード (SPI Flash Boot Mode) | |
※IO2の状態はプログラム書き込みモードで起動する場合は LOWまたは未接続の必要があります! |
ESP32にスケッチを書き込む場合はIO0ピンをLOWの状態で起動し、また既にESP32内部に書き込まれたスケッチを実行したい場合はIO0をHIGH(または未接続)の状態で起動しないといけないということです。
この他にも起動モードを決定するピンには、IO5/IO12/IO15がありますがこれは後述します。
簡単なテストスケッチを実際に書き込み動作確認をすれば理解しやすいと思うので進めていきます。
接続(手動での書き込み&実行)
ESP-WROOM-32にプログラムを書き込み、そして実行するための最も基本的な接続です。
書き込み or 実行の決定は取り付けたスイッチを使い手動で行います。
ESP-WROOM-32は電源供給(3.3V/GND)とENピン(リセットピン)のプルアップ抵抗(10kΩ)を繋げれば最低限動作します。
それにプラスして、リセットをかけるためにENピンに接続したスイッチと起動モードを決定するIO0ピンに接続したスイッチ、そしてプログラムの書き込みに必要なUSB-シリアル変換モジュールの接続、これが最小構成の接続となります。
USB-シリアル変換モジュール | ESP-WROOM-32 |
3.3V | 3.3V |
GND | GND |
TX(TXD) | RXD0 |
RX(RXD) | TXD0 |
今回USB-シリアル変換モジュールはFTDI社製チップ(FT232RL)を使ったモジュールを使いました。
後述する自動書き込み(オートフラッシュ)の接続で使用するDTR端子やRTS端子が使えるので便利です!
Arduino IDEで書き込みが出来るようにする
ESP32(ESP-WROOM-32)をArduino IDEで使うには、『esp32 by Espressif Systems』ボードパッケージが必要となってきます。
普段ESP32を使われている方はこの項目は飛ばして下さい!
Arduino IDEの[基本設定]を開き、[追加のボードマネージャのURL]に以下URLを追加します。
次に[ツール]→[ボード]→[ボードマネージャ…]を開き、[ESP32]で検索すると対象となる[esp32 by Espressif Systems]が見つかるのでこのボードパッケージをインストールすれば完了です!
ESP32のボードパッケージのインストールに関して詳しくはこちらの記事も参考にして下さい!
【手動】スケッチの書き込み & 実行
準備が整ったので実際にLチカスケッチを書き込んで動作確認を行ってみます。
先述のようにESP32には起動モードを決定する5つのピン(IO0/IO2/IO5/IO12/IO15)があります。
また上記のピンアウトを見ると分かりますが、出力では使えない入力専用のピンもあります。
とりあえずそれらを避けてIO32ピンにLEDを接続しました。
1 2 3 4 5 6 7 8 9 10 11 12 | void setup() { pinMode(32, OUTPUT); } void loop() { digitalWrite(32, HIGH); delay(1000); digitalWrite(32, LOW); delay(1000); } |
それではスケッチの書き込みです。
先述のようにESP32は起動時のIO0ピンの状態(HIGH or LOW)で書き込みモードまたは実行モードで起動します。
スケッチの書き込みなので書き込みモードで起動する必要があります。
書き込みモードなのでIO0ピンをLOWの状態で起動(リセット)します。
IO0スイッチ[Boot]を押した状態でリセットスイッチ[EN]を押し、そしてリセットスイッチ[EN]を離すとIO0が押された状態(LOW)でリセットがかかるので書き込みモードでESP32が起動します。
- [Boot]スイッチを押した状態で[EN]スイッチを押す
- [Boot]スイッチは押した状態で[EN]スイッチを離す
- ESP-WROOM-32が書き込みモードで起動する
あとはArduino IDEからスケッチを書き込みます。
ボード設定は[esp32]の中にある[ESP32 Dev Module]で書き込めます。
シリアルポートを選択し、アップロードボタンで通常通り書き込みが出来ます。
無事書き込みが完了しても、まだLEDは点滅しません!
ESP32は書き込みモードで起動しているので、これをプログラム実行モードで起動し直す必要があります。
既にESP32内に書き込まれているスケッチを実行するには、IO0をHIGH(または未接続)の状態で起動(リセット)する必要があります。
Bootスイッチ(IO0)を押さずにENスイッチだけ押しリセットをかけると実行モードで起動してLEDが点滅します。
1秒間隔でLEDの点滅が確認できれば成功です!
この投稿をInstagramで見る
余談ですが、今回LEDを点滅させるだけのテスト動作なのでシリアルモジュールから直接3.3Vを取っていますが、FT232RLチップの3.3V出力は50mAほどしか流せないのでWi-Fiなど無線機能をアクティブに動かす場合は外部電源を用意するのが望ましくなります。
上記動画では自作したFT232RLシリアルモジュールを使っています!
起動時のモードを決定するピン
ESP-WROOM-32単体でLチカが出来ました!
上記回路が最小構成で書き込み&実行が出来る回路になるかと思います。
そしてESP32の起動時のIO0ピン(プラスIO2ピン)は、書き込み or 実行モードを決定する重要なピンだということも分かりました。
ESP32にはこれ以外にも起動時の状態を決定する重要なピンがあります。
上記LEDのテスト接続では多くの端子は未接続状態で使ったので問題にはなりませんが、実回路を組む際には多くのIO端子が使われると思います。
起動時に使われる他のピンもまとめておきます。
不用意にプルアップやプルダウンした場合に、書き込みや実行ができない場合が出てきます。
起動モードの決定 | ||
IO0 | LOW | HIGH(または未接続) |
プログラム書き込みモード (UART Download Mode) | プログラム実行モード (SPI Flash Boot Mode) | |
※IO2の状態はプログラム書き込みモードで起動する場合は LOWまたは未接続の必要があります! |
電圧(内蔵LDO)の電圧設定に利用 | ||
IO12 | LOW | HIGH |
3.3V | 1.8V |
U0TXD(シリアル)を介したデバッグログ出力設定 | ||
IO15 | LOW | HIGH |
なし | あり |
SDIOスレーブタイミング | ||||
FE出力 | RE出力 | FE出力 | RE出力 | |
GPIO5 | 0 | 1 | 0 | 1 |
GPIO15 | 0 | 0 | 1 | 1 |
※文字はデフォルト設定
IO0/IO2/IO5/IO12/IO15の5つのピンは起動時の設定に使われるので、デフォルトで上記文字の状態に内部プルアップまたはプルダウンされた状態で接続されています。
冒頭でご紹介したESP-WROOM-32を使ったファミコンエミュレータ自作基板では、IO12をSDカード読み取りのためのSPI端子として使っていたのですが、その関係でプルアップさせていたため内部電圧1.8Vで起動してプログラム書き込みが出来ないというものでした。
朝活、電子工作!
超綺麗に実装出来たけどプログラム書き込めないの、なんでなんで😂 pic.twitter.com/P5SHLqVFeC— ガジェット大好き!! (@smartphone_jp1) July 26, 2023
今回使っているESP-WROOM-32に関わらずESP32開発ボードでも同様ですが、これら起動時に関わる5つのIOピンの不用意な配線には気をつけろということですね!
まとめるとこんな感じ!
GPIOピン | 起動時の推奨値 |
IO0 | 通常時:HIGH または 未接続 書き込み時:LOW |
IO2 | 通常時:影響しない 書き込み時:LOW または 未接続 |
IO5 | HIGH または 未接続 |
IO12 | LOW または 未接続 |
IO15 | HIGH または 未接続 |
接続(自動書き込み & 実行)
折角なのでオートフラッシュ(自動書き込み)が出来る接続も見ておきます。
ESP32-DevKitCではこれまでのEN/Bootスイッチによる手動書き込み&実行以外に自動書き込みの回路も内蔵されています。
自動書き込みでは、これまでのENスイッチとBootスイッチの操作を2つのトランジスタを使いシリアル変換モジュールのDTR端子およびRTS端子を使って制御しています。
ESP32-DevKitCを含め多くのESP32やESP8266開発ボードの自動書き込みにはこのような接続が使われているのを見かけます。
NodeMCU方式って言われるのでしょうか?
トランジスタを2つ使ったマルチバイブレーターのような接続です。
真理値表を書きオシロスコープを使って各端子のタイミングを見ると分かりやすいのですが・・・こちらでは割愛します。
先程使ったFT232RLを使ったUSB-シリアル変換モジュールには、DTRやRSTというフロー制御用のピンがあるのでこれを使えば自動書き込みが出来ます。
接続はこんな感じですね!
開発ボードではS8050-J3Yという表面実装の小さなトランジスタが使われていることが多いようです。
ブレッドボードでのテストなので手元にあったトランジスタ(2SC1815)を使い組んでみましたが、うまく動作してくれました。
先程スイッチ操作で手動で書き込みや実行を行いましたが、やはりこちらの方が便利ですね!
この投稿をInstagramで見る
実際の基板実装ではパーツの数が多くなってしまうのですが、有名な開発ボードではWeMos D1 MiniやLolin D32などWeMos(Lolin)製の開発ボードの多くではUMH3Nというチップがよく使われています。
自作ESP8266ボードの製作やエミュレータ基板でこのチップを使いましたが、実装パーツを減らすことが出来るので便利です!
最後に!
ESP-WROOM-32の基本的な使い方を見ていきました。
普段よく使っているESP32開発ボードですが、そのコアとなるESP-WROOM-32を単体で組み動かしてみるとより理解も深まるかななんて思います。
既存のESP32開発ボードを使った方が電源回路や書き込み回路、またその他付随するものが既に組み込まれているので当然便利なんですが、自作基板やオリジナルの開発ボードを作るなどのテストでは、マイコンチップに周辺回路を組んでいき・・・といったこのような作業が必要となってくるかと思います。
自作基板の製作で少し失敗した部分があったので、復習や自分への備忘録的に今回はまとめてみました。
何かの参考になればと思います!
Thredsを見てやってきました。コザックです。CTSがアクティブにならないとデータを送れないような制御になっていなければRTS/CTSのショートは要らないような気がします。今時のハードウェアはまったく知らないので詳しいコメントは出来ませんが、もともとはアナログモデム時代にソフトウェアがデータを送りたいと意思表示してからモデムが安定したキャリア送出までの時間稼ぎのためのハンドシェイクでした。PC98の時代には確かに生きてましたが、今時のソリューションだと使わないような気がします。
おおー、コザックさん
コメントありがとうございます。
別の方にコメント頂いて、そう言えば学生時代にフロー制御のことやったな・・・なんて思い出し。
調べてみるとRTS/CTSのショートに関するものは結構古い記事が多く・・・
シリアル関係の話は自作基板の製作を始めた時に結構調べたんですが、今時?の構成では意図的にハードウェアやソフトウェアフロー制御を使う時以外は使わない感じみたいですね。
シリアルチップのドライバも見てみましたが、基本どれもデフォルトでは無効になっているようです!
コザックさんのコメントを読み、学生時代に授業の一環としてなにげにやっていたことが頭の中で繋がった感じです。
ありがとうございますm(__)m
高専OBでしたか・・・^_^; ハート型の基板が高専っぽいなぁ,と思っておりました。やっぱりものづくりに関しては,高専出身者が目立って活躍していますね。
今現在,ネットで調べると,CTSはオープンになっている物ばかりのようです。実際,オープンだと不安定になってもおかしくないのになぁ,と思うところです。基本的にHのはずですが,ノイズに弱いだろうな・・・と。この辺りは人柱しないとダメかもと,久しぶりの基板設計を始めています。(あ,ひょっとしたら,USB・シリアル変換チップ内で,WeakPullUpとかされていたりするのかな)。EagleはFusionになってUIがずいぶん変わってしまって難儀しています。
ところで,もう一つ教えてください。ハート型の真ん中にあるTypeCコネクタですが,スルーホールに通す足の長さが,基板1.6mmに対応する物がなかなか無く探しています。JLCPCBで一つ見つかったのですが,国内では手に入らないようで・・・。開発されたのは見たところ基板厚1.6mmの様ですが,使用されたTypeCコネクタのURLなどわかりましたら,教えていただけないでしょうか。
追記情報ありがとうございます。
感謝です(^o^)
そうですね、基板厚は1.6mmと標準のものを使っています。
Type-C端子も一般的な?データラインも使える16Pタイプのものを使っています。
基板1.6mmに対応するもの・・・自分は特に意識したことがなかったのですが、端子固定用のスルーホールに通す足の長さはCAD上で1mmのものでスルーホールを貫通しませんが、主に秋月電子さんのこちらのものを使っています。
https://akizukidenshi.com/catalog/g/gC-14356/
Aliexpressなどの海外サイトでも何度か購入していますが、16Pタイプのものは上記のものと同じでこの形状(サイズ)のものが一般的によく使われるものかな?
と思っていたので・・・スルーホールを完全に貫通しませんが、ご要望に合ってればいいのですがm(__)m
早速のご回答,ありがとうございます。
CTSとRTSのショートは,フロー制御をやっているように見せる,というところだろうと思います。PC9801時代に,シリアル通信でPC側,マイコン側それぞれで,CTSとRTSをショートして使っており,当時はそれが常識のようでした。参考になりそうな記事は,
https://www.cqpub.co.jp/hanbai/books/46/46071/46071_p113-116.pdf
これの,115ページの中程の記事です。
今,モータのノイズで,不定期に突然通信できなくなる不具合に対処しており,このCTSがオープンになっていることが気になっています。これがHでないと通信できないのですが,ノイズでLになってしまうタイミングで,通信が止まってしまうのではないかと想像しています。この記事の通りですと,常にHにするか,ショートするかのどちらかのようですね。
非常に有益な情報ありがとうございます。
RS232Cのフロー制御は学生時代(高専)にやった記憶があり、srprc100さんのコメントを見て思い出した次第で!
速いスピードで送り続けるとデータ取りこぼしが・・・くらいの記憶しかありませんが。
リンクまで付けて頂きありがとうございます。
趣味として電子工作で自作基板とか作るようになりいろんな開発ボードの回路構成とか見てきたのですが、CTS/RTSに関してsrprc100さんのおっしゃる接続を見たことが無かったのであまり気にも止めることがなかったのですが・・・
あらためて自分も少し調べてみます。
ありがとうございます(^o^)
USB,シリアル変換チップですが,CTSはオープンにしているのが,気になるのですが,RTSとショートしておく必要はないのでしょうか?
ご質問、ありがとうございます(^o^)
私の無知さ故なのですが、CTS(オープン)→RTSとショートさせるというのはどのような意図があるのでしょうか?
ご質問に質問で返してしまって恐縮なんですが、CTS/RTSフロー制御の話なのでしょうかね?
こちらの記事ではシリアルチップにFT232RLを使っていますがCH340などでも同様で自作基板で使うことが多いのでブレッドボードで以前何度もテストしたことがありますが・・・特に問題なく!
改善箇所等があれば、私も興味あるのですが・・・
ありがとうございますm(__)m