今回は、ESP32(下図)に再びフォーカスを当ててみます。
このモジュールは、非同期シリアル(UART)で接続すると、ATコマンドを使ってWiFi経由でインターネットに接続することが出来る強力な無線通信モジュールです。
USB⇔UART変換チップとの通信で埋まっていて、UARTユニットが使用できないUNOからESP32を制御したくて、高速ソフトウェアシリアルライブラリ(HsswSerial)を作ってしまった程です。
その後、UNOとESP32を使って「#11-5 WiFi電波時計」など、いくつかのアプリケーションを作ってきました。
実はこの機体、Arduino IDEに開発環境をインストールすると、C言語で作成したプログラムをArduino IDEからUSB経由で書き込んだり、シリアルモニタ(USB経由)でデバッグしたり、と言った開発を行えるようになります。240MHzのデュアルコアCPU(Xtensa LX6)や4MバイトFlashメモリ、520KバイトRAMなどを内蔵する、かなり強力なマイコンボードとして使えるのです。
正直、ESP32を使って作る、具体的なアプリケーションのアイディアがあるわけでは無いのですが、将来そのようなケースが発生した場合のために、「ESP32の開発環境を整えておこう」と、言うのか今回のテーマとなります。使い慣れたArduinoの環境(IDE)を使って開発できるのですから、これは大きな利点です。
なお、Arduino IDEで作ったプログラムをESP32に書き込んでしまうと、UNOなどからUART接続して制御していた「ATコマンドファームウェア」は、上書きされて消えてしまいます。
本ページでは、ATコマンドを使ったWiFiアクセスを引き続き利用したいので、Arduino IDEで開発し終わった後で「ATコマンドファームウェア」を再び書き込む手段についても環境を整備しておこうと思います。
※同様に、「ATコマンドインターフェイスが重要」だと考える方は、最初にこちらの節を確認して、ATコマンドファームウェアの回復手順を自力で実行できそうかどうか、吟味した方が良いと思います。
早速、Arduino IDEにESP32のツール群(ボード)をインストールして行きましょう。まずは、「追加のボードマネージャURL」を検索します。手順はこちら(※)をご覧ください。
※↑リンク先はATTinyCoreのインストールについて書いてありますので、適宜ATTinyCore→ESP32と読み替えてください。
本ページで追加したESP32ボードマネージャのURLは、以下図の通りです。
ウインドウをOKで閉じたら、 「ツールメニュー ⇒ ボード ⇒ ボードマネージャ」を開き、「ESP32」で検索すると、上で追加したボードが見つかるので、適切なバージョンを選択して「インストール」してください(下図)。
これで追加完了です。要らなくなったら、ここで「削除」もできます。
インストールが成功すると、「ツールメニュー ⇒ ボード」に以下の様なメニュー項目が追加されています。
ESP32関係のボードが沢山追加になっています。手元のESP32ボードは「ESP32 Dev Module」で良い様です。市販されているマイコンボードにはいくつもバリエーションがあるので、異なるボードをお持ちの方はどれを選んで良いか迷うかもしれませんね……。
手元のESP32ボードは、「ボード」以外のオプションメニューに関してデフォルトのままで使用できました。
シリアルポートは、ESP32をPCへUSB接続した時に現れた通信ポート名を指定してください。UNO等と同様、普通にUSB経由でプログラムの書き込みをしたり、シリアルモニタを開いたりすることが可能です。
ESP32用のツール群(コンパイラやコアライブラリなど)は、以下の場所にインストールされています。
<User>\AppData\Local\Arduino15\packages\esp32\
<User>は、Windowsのユーザディレクトリです。ユーザ名やWindowsエディションによって、若干パスが異なる場合があります。<User>\AppDataは通常、不可視ディレクトリなので、エクスプローラなどからは見えていません。不可視属性のファイル/ディレクトリを表示する設定に変更して辿ってください。
手元の環境でesp32ディレクトリの並びには「#13-9 もっと小さくATtiny2313」でインストールしたATTinyCoreディレクトリや、DUE用のarduinoディレクトリが存在しています。
esp32ディレクトリ下のコアライブラリや設定ファイルなどを斜め読みした結果、「ESP32 Dev Module」でコンパイルした時のプリデファインは以下の通りでした。
その他、ちょっとしたプログラムを組みながら確認したところ、以下の様な状態を確認しました。
UNOからUARTでESP32のWiFiアクセスを使ったところで、RAM 2KバイトしかないUNOにできることは限られていました。本格的なWiFiアプリケーションを作ろうと思った時、きっと力になってくれることでしょう。
DUEの時もそうでしたが、特定のI/Oユニットやライブラリを使わずに実現できる、円周率計算プログラム(calc_pi.ino)を使って、ESP32環境のコンパイル&書き込みを試してみようと思います。以下に、ESP32対応したプログラムをリンクしておきます。
円周率計算プログラム:calc_pi.ino
以下、コンパイル&書き込みの手順です。ESP32をUSBケーブルでPCと接続し、通信ポート名(COMx)、を確認しておいてください。
※コンパイル終了後のメッセージによると、プログラムに使用可能なメモリはFlash 1.25Mバイト、RAM 320Kバイトみたいです。アレレ?Flash 4MバイトとかRAM 520Kバイトとか言うふれ込みはどこへ行ってしまったのだろう(1@_@)?もしかして、選択するボード名が違っている?
上の処理がエラー無く終了すると、ESP32にリセットがかかってプログラムが動作し始めます。シリアルモニタを開いて、以下の様に実験してみてください。
実験サンプル:【 】
【pi,5116】
OK+ start calculation
OK+ PI=3.
1415926535 8979323846 2643383279 5028841971 6939937510
:
: (中略)
:
4786724229 2465436680 0980676928 2382806899 6400482435
4037014163 149665
OK+ digits=5116 (size=1280)
OK+ time=1578842[us]
OK+ check=0xb222d46e
OK: pi F_CPU=240000000
こちらに、Arduino DUE @84MHzで実行した結果が有ります。ESP32で約1.58sに対して、DUEでは約6.47sでした。クロック周波数比だと、240MHz:84MHzなのですが、それに比べると、少しESP32の計算時間は短時間で終了しているようです。平たく言うと、ESP32の方が速い(単位クロック周波数当たりの処理速度)。
う〜ん……、Thumb ARMがヘボいのか、Xtensaが優秀なのか??
※ESP32は大容量RAMだけでなく、だいぶ高速に処理できることが判ったので、円周率を10,000桁程度まで計算できるようにしておきました。期待値はこちら。
オンボードLED(Arduino端子番号D2)が付いているボードであれば、オンボードLEDが約1秒間隔で点滅しているはずです。それも確認しておいてください。digitalWrite()関数などのコアライブラリが正常に機能していることの確認になります。
その他チップスですが、ESP32のシリアルモニタにはリセット直後、ブートローダのメッセージが出力されます。この時はまだsetup()関数内のSerial.begin(BAUD)関数実行前なので、プログラムで設定した通信速度BAUDではなく、ブートローダの設定値115,200baudでメッセージが出力されます。
シリアルモニタはプログラムの設定値BAUDに設定して使うでしょうから、BAUD≠115,200baudだった場合、プログラム書き込み終了直後、ブートローダのメッセージ部分がごみになって出力されます。
頭にごみが載るだけなので、これを許容するなら、BAUDは好きな通信速度で良いです。嫌う場合は、Serial.begin(115200)で使うと良いと思います。
手元のESP32ボードは、最初からピンヘッダがはんだ付けされて届いたのだけど、このピンヘッダが斜めに取り付けられてしまっており、ブレッドボードには挿さりません。ESP32をマイコンボードとして使って開発するなら、ブレッドボードの使用は必須な訳で、ブレッドボードに挿さらないマイコンボードなんて、最悪です。
強者は、ピンヘッダのはんだを吸い取り、真っすぐになるようにはんだ付けし直して使うみたいですが、そのような高等スキルは備わっておりません(1^_^;)。
しかし、そう悲観することはないのです。
実は手元のESP32ボード、非常に幅が広いので、仮にピンヘッダを真っすぐに直して、ブレッドボードに挿せたとしても、ブレッドボードの横幅ほとんどを使い切ってしまうため、まともに回路を組むことはできません。そこで、170タイポイントのミニブレッドボード(下図)です。
これをESP32ボードの左右のピンヘッダに1個づつ装着すると、以下図の様に広い領域を使って、ゆったりと外部回路を形成することが可能となります。
左右1個づつ別なブレッドボードに挿し込むので、ピンヘッダが多少歪んでいても問題なく挿さります。お試しください。
サクッと、LogiscopeもESP32で実行可能な様に更新しておきました。
ESP32対応版プログラム:logiscope.ino
ESP32対応版スクリプト:logiscope.olv
Logiscopeの実行には拙作Olive+が必要です。ダウンロードコーナなどからダウンロードしてWindowsにインストールしておいてください。使い方などについては、「逆引き索引」のLogiscopeから過去記事を当たってください。
なお、他機種用のLogiscopeと異なり、ESP32では、以下の制約があります。
1端子の信号波形取得機能(【trg】コマンド)や内部アドレスアクセス機能など、上述の制約以外は機能しているので、そこそこ使えるはずです。
CPUのクロック周波数が240MHzと言う事で、【trg】コマンドによる波形取得ではかなり高速な信号波形でも取得できるのではないか?と期待していたのですが、その期待には応えてくれませんでした。
ESP32では、I/Oポートなどの周辺ユニットはクロックAPB_CLKで動作しています。このAPB_CLKはCPU_CLK/4に固定されているため、CPU_CLK=240MHzのESP32ではAPB_CLK=60MHzであり、実質サンプリングレートは60MHz相当に低下しています。
これは、周辺ユニットまでCPUクロックで動作しているDUE @84MHzやSTM32 @72MHzと比べてビハインドであり、DUEやSTM32の方が高速な信号波形の取り込みには適しています。
消費電流やEMI等の関係で、周辺ユニットを240MHzで動作させることは出来なかったのだと思いますが、ちと残念でした……。
Arduino IDEでESP32のプログラムをコンパイル&書き込みできることが確認でき、ESP32開発環境が整ったので、ESP32にはATコマンドファームウェアを書き戻しておこうと思います。
以下の2点をインターネットから探して、ダウンロードしておいてください。
まず、フラッシュダウンロードツールを解凍したら、例えば以下の場所などに格納しておいてください。
<User>\AppData\Local\Arduino15\packages\esp32\tools\
使う時に辿り着ければどこでも良いのですが、格納場所としては上のパスで悪くないと思います。
ATコマンドファームウェアも、適切な場所に解凍してください。以上で準備完了です。書き込み手順を以下に示します。
書き込み終わったら、こちらを参照して、ATコマンドにアクセスしてみてください。
確認したところ、ATコマンドで不揮発(NV)メモリに記憶させておいたはずの各種設定は、消えていましたm(1x_x)m。接続先APのSSID名や接続パスワード、などなど、もう一度最初から設定し直す必要があります。
以上で、元に戻りました、と言いたいところですが、正確には「元通り」にはなっていません。手持ちのESP32は、購入した状態のATコマンドファームウェアver.1.1.1でした。今回書き込んだのはver.2.0.0なので、少し新しくなっています。
バージョンが変わったことで、少し使い勝手の変わってしまったコマンドもあるかもしれませんが、それは良いでしょう。リリースノートを見る限り、使い勝手の変化はなさそうだし、相当数のバグ修正が成されており、安定性は向上していると思われます。
240MHzの高速CPUとか、520KバイトのRAMとか、なかなか魅力的なスペックが並んでいる割に、あまり使い倒す気になれないのは何故だろう……?正直、CPU Xtensaが好みでは無いので、プログラムを組んだり、積極的に使いたいとは思わないみたいです。ビビッ😍と来ないの😑……。