1.ESP32の機能と性能
左の写真はESP32(正確にはESP-WROOM-32)単体の表面と裏面です(「秋月電子:ESP-WROOM-32」から引用)。
WiFiとBluetooth通信機能を備えたパッケージのサイズは18×25.5mmで、現時点の単体価格は700円。ESP8266と同様に基本は無線モジュールでありながら、デュアルコアで高機能なCPUを搭載しているのでさまざまな利用が考えられそうです。
機能や性能を把握するために、ESP32とESP8266との性能対比表を掲げておきます。
これから分かるように主な特徴は次のとおりです。
・WiFiに加えBluetoothが使えるようになった。
・CPUの性能が格段に向上した。
・RAMやフラッシュなどのメモリー容量が増大した。
・ピンの数が増えGPIO、A/D、UART、SPI等の機能が充実。
また、対比表にはありませんが、
・電源電圧が2.2~3.6VとESP8266より幅が広がった(ESP8266は3.0~3.6V)。
・アナログ入力の電圧範囲が0~3.3Vになった(ESP8266は0~1V)。
といった点は実際に使用する上で大変楽になります。これらに加えて開発環境も充実してきましたが、ESP8266と同様にArduino IDEを利用できるのも大きな特徴と言えるでしょう。
2.ESP32開発ボードの手配と準備
まずはMCUボードを準備しましょう。今回調達した部品は次のとおりです。これ以外に配線類は手元にあるものを使用。計測や計測センサー類へ供給する電源は、『超小型格安チップ「ESP-WROOM-02(ESP8266)」はどこまで使えるか?』で作成した計測ボードと専用電源を使用します。
〔新たに調達した部品〕
・秋月電子通商 ESP32-DevKitC ESP-WROOM-32開発ボード 1,480円
・秋月電子通商 マイクロSDカードスロットDIP化キット 300円
・秋月電子通商 ブレッドボード6穴版 EIC-3901 280円
準備作業は簡単で、ESP32をブレッドボードに差し込むだけです。ESP32は横幅が広いので、一般的な片側5穴のブレッドボードでは窮屈です。片側の電源ラインを取り除いて拡張した6穴ボードなら、写真のように両側に余裕があるため、この部分を使ってジャンプワイヤーなどで配線することができます。同じボードにSDカード装置を組み込む予定なので、ESP32は右いっぱいに詰めて設置しています。
3.ESP32用Arduino IDEのインストール
ここでは、すでにESP8266用のArduino IDEがインストールされていることを前提とします。もしまだであれば、本サイトの『超小型格安チップ「ESP-WROOM-02(ESP8266)」はどこまで使えるか?』の「Ⅰ. 開発準備と専用電源の製作(ESP-WROOM-02)」後半の解説に従ってArduino IDEをインストールして下さい。
これによって、Arduino IDEは「C:\Program Files(x86)\Arduino」配下にインストールされます。この時作成されるアイコンのリンク先は「C:\Program Files (x86)\Arduino\arduino.exe」になっているので、必要ならデスクトップなどに「Arduino」等の名前でショートカットを作成してください。このIDEは、Arduino UnoやESP8266での開発に使用することになります。
ESP32用の環境は上記の環境とは独立して、マルチ環境で開発が可能になるようにします(後述のように切り替え時に若干の調整は必要になりますが)。以下にその手順を示します。
(1)Arduino IDEのダウンロード
Arduino IDE Downloadサイトから最新のArduino IDEをダウンロードして下さい。このとき、必ず「Windows ZIP file for non admin install」を選択して下さい(下図の赤矢印)。
次の画面が現れるので、赤矢印の[JUST DOWNLOAD]をクリックするとダウンロードが始まります。
以上でarduino-esp32-master.zipがダウンロードされます。
(2)インストール作業 - その1
まず、ESP32用Arduino IDEをインストールするフォルダー(例えばArduinoESP32など)を作成してください。
先にダウンロードしたarduino-esp32-master.zipを、作成したフォルダーに解凍します。フォルダー(例えばArduinoESP32内に)arduino-1.8.5というフォルダーが現れます。
必要に応じて「~\arduino-1.8.5\arduino.exe」のショートカットを「Arduino1.8.5(ESP32)」などの名前で作成してください。ワンクリックでESP32用のIDEを起動するためです。
(3)インストール作業 - その2
続いて、GitHubからArduino Core for the ESP32をダウンロードして ESP32のボード情報を追加します。
まずここから「Arduino core for the ESP32」をダウンロードしてください。下の画面のように、[Clone or download]を選択して現れるダイアログから[Download ZIP]をクリックします(赤矢印のように)。
次の手順でインストールを進めます。
1) arduino-esp32-master.zipがダウンロードされるので、適当なフォルダーに解凍します。
2) ESP32用Arduino IDEインストール先のhardwareフォルダーに\espressif\esp32フォルダーを作成します。
3) \arduino-1.8.5\hardware\espressif\esp32\に、解凍したarduino-esp32-masterフォルダー内の
すべてを複写します。
4) \arduino-1.8.5\hardware\espressif\esp32\tools\get.exeを管理者権限で実行します。
※管理者権限で実行しないと、必要な追加ファイルが正しくインストールされません。
5) モニター画面が開き、10分程度で所要ファイルのインストールが終わって自動的に閉じます。
(4)ボードの設定作業
次の手順でESP32ボードの設定を行います。
1) ESP32開発ボードをPCに接続します。
2) ESP32用のArduino IDE(先の例では「Arduino1.8.5(ESP32)」)を立ち上げます。
3) [ツール]タブを開いて「ボード」をポイントして表示される一覧から[ESP32 Dev Module]を選択します。
4) 再び[ツール]タブを開いて、その他の項目をポイントして表示される一覧から下図のように設定します。
※シリアルポートは各人の環境に合わせて設定してください。
5) これでボードの設定が完了です。ESP32のサンプルスケッチをコンパイルして試すことができます。
次のようにESP32用のサンプルスケッチから「SimpleTime」をロードしてコンパイルしてみます。
コード4~5行目のWiFiのssidとpasswordに有効な値を設定すれば実行することができます。
・IDEの[ツール]タブを開いて「シリアルモニタ」をクリックする。
・開発ボードの右側の[BOOT]または[FLASH]ボタンを押したままで左側の[RESET]を押下する。
・シリアルモニターに次のように表示される。
・ssidとpasswordwoを修正して「マイコンボードに書き込む」ボタンをクリックする。
・コンパイルと書き込みが完了すると実行状態がシリアルモニターに表示される。
以降は、先に作成したリンク「Arduino」または「Arduino1.8.5(ESP32)」をクリックすることで、開発環境を切り替えることができます。ただし、手元のテストではボード設定が前の状態を引き継いでしまうので、切り替えた時点で[ツール]タブを開いてボード選択と設定をやり直しています。
ESP8266の場合は「ボードマネジャ」を選択して[Generic ESP8266 Module]を選択します。そして下図のようにボード設定を変更します。環境を切り替える都度にボードの再設定が必要になりますが、さほど頻繁に切り替えることはないはずなので実用上は問題ないと思います。
ESP32のArduino IDE環境はまだ成長中であり、関連ライブラリーなどは改版が相次いでいます。したがってバージョンアップ情報や新規ライブラリの登場に注意して、適宜メンテナンスすることが重要です。
4.以前のプログラムを修正する
Arduino IDEのバージョンアップに伴いコンパイラーのエラー検出が厳重になりました。『超小型格安チップ「ESP-WROOM-02(ESP8266)」はどこまで使えるか?』で作成したプログラムで、コンパイルエラーになるお粗末な部分が2カ所発覚しました。最終的なAirMonitorと、それまでの各ステップで作成したプログラムすべてについて、事前に以下の2カ所を修正する必要があります。なお、以降の各章に設置したダウンロード用のソースファイルは修正済みです。
①void setDate()内の変数の初期化抜けエラー
byte week; // <--- ここがエラー
if (buf.length() == 7) {
week = (buf.charAt(6) & 0x07);
if (week < 0x01 || week > 0x07)
week = 0x01;
}
↓
byte week = 0x00; // <--- このように修正する
if (buf.length() == 7) {
week = (buf.charAt(6) & 0x07);
if (week < 0x01 || week > 0x07)
week = 0x01;
}
②int readln()内の返却値抜け
while (df->avaiable()) {
:
:
}
return pos; // <--- これが抜けていた
以上!