ESP32-WROOM-32Eの開発環境(Arduino IDE)を作り方

組み込みエンジニア

こんにちは、ENGかぴです。

ESP-WROOM-32はWiFi通信とBluetoothを搭載した無線モジュールです。開発環境はArduino環境に準拠しているためArduino IDEに開発環境を追加することでArduinoライブラリを使用しながらソフト開発ができます。

本記事ではESP32-WRROM-32Eの開発環境をArduino IDEに組み込む方法を説明しています。ESP32-WROOM-32E開発ボード(秋月電子)で動作確認を行っています。

ESP32-WROOM-32Eの開発環境を作る

ESP32-WROOM-32Eの開発環境をArduino IDEに追加します。前提条件としてArduino IDEをインストールしておく必要があります。Arduino IDEがすでにインストールできている場合は環境設定でURLを追加しボードマネージャで検索してインストールします。以降の手順の説明はWindows10を対象としています。

Arduino IDEのインストール

Arduinoの開発環境であるArduino IDEをインストールするまでの手順とスケッチ例を使って開発を行う手順について下記リンクにまとめています。

Arduinoの開発環境の作り方とスケッチ例の使い方

ボードマネージャーのURLの追加とインストールの手順

esp32のボードマネージャのURL
esp32のボードマネージャのURL

ESP32 ArduinoCoreのドキュメントのサイトからボードマネージャのURLを追加します。下記リンクをクリックするとボードマネージャのURLのページ遷移します。

ESP32 ArduinoCoreのドキュメントーボードマネージャの追加

追加のボードマネージャのURLを追加します。Stable release link:のURLをコピーします。Stableの方は動作が安定したバージョンです。Development releaseは開発中のリンクであり動作が安定しないこともあります。Arduino IDEを起動してファイル欄から「環境設定」を選択すると設定項目が表示されます。

環境設定の追加のボードマネージャーのURLにesp32のURLを追加する
環境設定の追加のボードマネージャーのURLにesp32のURLを追加する

追加のボードマネージャの欄が空白であればそのままテキストボックス内にコピーします。すでに追加したURLがある場合は横のアイコンをクリックして追加のURLをコピーして追加します。

他のボードのURLを追加している場合は下の行に追加する
他のボードのURLを追加している場合は下の行に追加する

次にArduino IDEのツールからボード:XXXX(XXXXは現在選択しているボード)を選択して現れるタブからボードマネージャをクリックするとボードマネージャを検索できる画面に遷移します。

ボードマネージャでesp32を選択してインストール
ボードマネージャでesp32を選択してインストール

ボードマネージャで検索欄に「esp32」と入力するとesp32が候補として表示されます。(URLを追加していないと表示されません)このボードマネージャをインストールします。

ボードの選択とシリアルポートの設定

ボードの選択とシリアルポートの選択
ボードの選択とシリアルポートの選択

今回はESP32-WROOM-32Eを使用するため「ESP32 Dev Module」を選択します。ボードを選択した後はシリアルポートの選択を行います。インストールされているシリアルポート番号を選択します。COMの番号は環境により任意の番号となります。

シリアルポートを選択して接続ができるとマイコンボードへのプログラムの書き込みができるようになります。

ESP32-WROOM-32Eの動作を確認

ESP32-WROOM-32Eの動作を確認します。本モジュールはスペックが高くマルチタスクで動作させたりと様々な事ができますが今回はArduinoライブラリを使ってLEDを点灯/消灯させて動作確認を行います。

動作確認の回路図

ESP32-WROOM-32Eの動作確認の回路図
ESP32-WROOM-32Eの動作確認の回路図

ESP32-WROOM-32Eのピン配置などの情報はArduino core for the ESP32のGitHubを参照してください。タイマ管理でLEDを500ms毎に点灯/消灯させます。

タイマの管理

#define BASE_CNT 10
uint32_t timer; //条件を満たしたときのタイマ値

/* タイマ管理 */
void mainTimer(void){

    if( millis() - timer >= BASE_CNT ){ // BASE_CNT以上か
        timer = millis(); //現在の値を保存

        if( timled > TIME_UP ){ //タイマを更新
            --timled;
        }
    }
}

タイマ管理は現在の経過時間msと前回条件を満たしたときの時間msを比較して規定値であるBASE_CNT以上であればif文内部に遷移します。

規定値以上になった時点での経過時間msを保存して次の判定に使用することでtimledを更新するタイミングを作っています。

例ではBASE_CNTを10にしているためtimledの更新は10ms毎に発生します。timledの時刻更新の時限が10msになるためtimledに50をセットしてタイムアップするまでの時間は500msとなります。

millis()は1ms毎にカウントが+1した値を戻すArduinoライブラリです。電源がONしてタスクが動作開始した時点でカウントを+1するため電源ONからの時間経過の目安となります。

符号なしのuint32_tの値で宣言されており32ビットのカウント値分更新していきますが、オーバーフローするとカウント値が0に戻ってしまいます。そのため50日連続で動作させたときはタイマの判定がずれてしまいます。

10ms毎にベースカウントを更新するようにしているためオーバーフローが発生したとしても最大誤差が10ms以下になります。delay()などを使用して意図的にウェイトを置いていない限り通常メインループ1周の時間は長くても数msになることが10ms程度の誤差は問題になることはほとんどありません。

タイミングをシビアに取りたい場合はタイマ機能を使用して確実にタイミングを同期させる必要があります。その場合はタイマ割り込みを使用するなどタイミングの制御が必要です。

ソースコード全体

以下のソースコードはコンパイルして動作確認をしております。チェックはしておりますがコメントなど細かな部分で間違っている可能性があります。参考としてお使いいただければと思います。

#define TIME_UP 0
#define TIME_OFF -1
#define BASE_CNT 10
#define TIM_LED 50
#define PIN_DO1 25

/* 変数宣言*/
uint32_t timer;
int16_t timled = TIME_OFF;
uint8_t leddo = 0;

/* プロトタイプ宣言*/
void mainTimer(void);

void setup() {

    pinMode(PIN_DO1,OUTPUT);
    timled = TIM_LED;
}

void loop() {

    mainTimer();

    if( timled == TIME_UP ){
        timled = TIM_LED;
        leddo = !leddo;
        digitalWrite(PIN_DO1,leddo);
    }
}
/* タイマ管理 */
void mainTimer(void){

    if( millis() - timer >= BASE_CNT ){ // BASE_CNT以上か
        timer = millis(); //現在の値を保存

        if( timled > TIME_UP ){ //タイマを更新
            --timled;
        }
    }
}

関連リンク

Arduinoのライブラリを使って動作確認を行ったことを下記リンクにまとめています。

Arduinoで学べるマイコンのソフト開発と標準ライブラリの使い方

Seeeduino XIAOで学べるソフト開発と標準ライブラリの使い方

ESP32-WROOM-32Eで学べるソフト開発と標準ライブラリの使い方

TECH::CAMPプログラミング教養【無料体験会】

最後まで、読んでいただきありがとうございました。

タイトルとURLをコピーしました