ESP32は、最も人気のあるWi-Fiベースのマイクロコントローラーモジュールの1つであり、多くのポータブルIoTアプリケーションで人気のある選択肢です。デュアルコアプログラミングをサポートする強力なコントローラーであり、Bluetooth Low Energy(BLE)のサポートも組み込まれているため、iBeaconデバイスやGPSトラッカーなどのポータブルアプリケーションに最適です。ただし、このようなバッテリー駆動のアプリケーションでは、主な懸念事項はバッテリーのバックアップです。このバッテリバックアップは、デバイスのバッテリバックアップを増やすための理想的な状態でESP32をスリープモードでプログラム できるように、マイクロコントローラユニットをよりスマートに制御することで増やすことができます。
このプロジェクトでは、広く普及しているWi-FiおよびBluetooth対応のマイクロコントローラーユニットESP32の通常動作モードとディープスリープモードでの消費電流を確認します。また、違いをテストし、ESP32をディープスリープモードにする方法を確認します。また、マイクロコントローラーの消費電力を最小限に抑える方法に関する記事で、デザインの電力効率を大幅に向上させるために使用できるその他のヒントを確認することもできます。さらに、他のマイクロコントローラーのスリープモードに興味がある場合は、ArduinoスリープモードとESP8266NodeMCUスリープモードをチェックアウトすることもできます。
要件
これを行うには、EspressifのESP32ベースのDevkit V4.0を使用します。これには、USBからUARTへのブリッジと、簡単に接続できる他のESP32ピン配置があります。プログラミングはArduinoIDEで行われます。まったく新しい場合は、Arduinoを使用してESP32を使い始めるために、先に進む前にリンクされた記事を読んでください。
このプロジェクトの要件は次のとおりです-
- ボタンを押すだけでディープスリープモードになります。
- 別のボタンを押すと、ディープスリープモードから復帰します。
- ESP32の状態を検出するために、LEDが1000ミリ秒のターンオン時間で点滅します。スリープモード中はオフになります。
したがって、追加のコンポーネントが必要です-
- LED-1個
- 押しボタン(タクタイルスイッチ)-2個
- 4.7k抵抗-2個
- 680R抵抗-1個
- ブレッドボード
- ワイヤーを接続します
- 5Vアダプターまたは電源ユニット
- マイクロUSBケーブル
- PCまたはラップトップのESP32プログラミングインターフェイスを備えたArduinoIDE。
ESP32スリープモード回路図
プッシュボタンでESP32をスリープ状態にするための回路図を以下に示します。
回路図は非常に単純です。2つのボタンがあります。スリープボタンはESP32をディープスリープモードにし、別のスイッチを使用してESP32をスリープモードからウェイクアップします。両方のボタンはPIN16とPIN33で接続されています。両方のボタンを押すとアクティブローとして構成されるため、追加のプルアップが提供されます。ただし、ESP 32がスリープモードであるか通常の動作状態モードであるかを検出するために、LEDはIOピン4に接続されています。
ESP32のスリープモードの概要
ESP32には、アクティブモード、モデムスリープモード、ライトスリープモード、ディープスリープモード、休止状態モードなど、さまざまな電源モードがあります。
通常の動作状態では、ESP32はアクティブモードで実行されます。中ESP32アクティブモード、CPU、無線LAN / BTハードウェア、RTCメモリ、RTC周辺機器、ULPコプロセッサ、全てが活性化され、作業は、作業負荷に応じ。ただし、異なる電源モードでは、1つまたは複数の周辺機器がオフになります。さまざまな電源モードの動作を確認するには、以下の表に従ってください-
ハードウェア |
アクティブモード |
モデム-スリープモード |
ライトスリープモード |
ディープスリープモード |
冬眠 |
CPU |
オン |
オン |
一時停止 |
オフ |
オフ |
WiFi / BT |
オン |
オフ |
オフ |
オフ |
オフ |
RTCおよびRTC周辺機器 |
オン |
オン |
オン |
オン |
オフ |
ULP-Coプロセッサー |
オン |
オン |
オン |
オンオフ |
オフ |
上記の表からわかるように、ULPセンサー監視パターンと呼ばれることが多いESP32ディープスリープモード( CPU、WiFi / BT、RTCメモリ、および周辺機器)では、ULPコプロセッサーがすべてオフになっています。RTCメモリとRTC周辺機器のみがオンになります。
ウェイクアップ状況では、ESP32をディープスリープモードからウェイクアップするウェイクアップソースからESP32に通知する必要があります。ただし、RTCペリフェラルがオンになっているため、ESP32はRTC対応のGPIOを介してウェイクアップできます。他のオプションもあります。外部ウェイクアップ割り込みピンを介して、またはタイマーを使用してESP32をウェイクアップすることでウェイクアップできます。このプロジェクトでは、ピン33でext0ウェイクアップを使用しています。
ディープスリープモード用のESP32のプログラミング
完全なプログラムは、このページの下部にあります。Arduino IDE用に作成されているため、要件に簡単に適合させることができます。コードの説明は次のとおりです。
コードの冒頭で、
// PushButton 変数を作成します PushBntpushBtn = {GPIO_NUM_16、0、false}; // LEDピンを定義します uint8_tled_pin = GPIO_NUM_4; //ウェイクアップピンを定義します uint8_twakeUp_pin = GPIO_NUM_33;
上記の3行は、ウェイクアップピン、LEDピン、およびスリープモードピンを定義します。
void setup(){ //セットアップコードをここに配置して、1回実行します 。// シリアルポートを115200に設定します Serial.begin(115200); delay(1000); //内部プル アップpinMode(pushBtn.pin、INPUT_PULLUP);を使用し てプッシュボタンピンを入力として設定します 。 //プッシュボタンピンを使用して割り込みハンドラーを立ち下がりモードに設定します attachInterrupt(pushBtn.pin、isr_handle、FALLING); // Ledピンを ouputpinMode(led_pin、OUTPUT); として設定します 。 // blinkLed()関数で実行され、優先度1でコア0で実行されるタスクを作成します xTaskCreate( blinkLed、/ *タスク関数。* / "blinkLed"、/ *タスクの名前。* / 1024 * 2 、/ *タスクのスタックサイズ* / NULL、/ *タスクのパラメータ* / 5、/ *タスクの優先度* / &taskBlinkled); / *作成されたタスクを追跡するためのタスクハンドル* / delay(500); //ピン33をLOWロジックレベルのext0ウェイクアップソースとして設定します esp_sleep_enable_ext0_wakeup((gpio_num_t)wakeUp_pin、0); }
上記では、割り込みはコードスニペットによって立ち下がりモードに設定されています
attachInterrupt(pushBtn.pin、isr_handle、FALLING);
したがって、スイッチを押すたびに、ロジックレベルがロジック1(3.3V)からロジック0(0V)に変更されます。ボタンピンの電圧が低下し、ESP32はスイッチが押されたことを識別します。LEDを点滅させるために作成されたタスクもあります。
xTaskCreate( blinkLed、/ *タスク関数。* / "blinkLed"、/ *タスクの名前。* / 1024 * 2、/ *タスクのスタックサイズ* / NULL、/ *タスクのパラメータ* / 5、/ *優先度タスクの* / &taskBlinkled); / *作成されたタスクを追跡するためのタスクハンドル* / delay(500);
ピン33は、ext0として識別される外部ウェイクアップソースとして以下のコードスニペットを使用して構成されています。
esp_sleep_enable_ext0_wakeup((gpio_num_t)wakeUp_pin、0);
次に、whileループで-
void loop(){ //メインコードをここに配置して繰り返し実行します: if(pushBtn.pressed){ Serial.printf( "PushButton(%d)Pressed \ n"、pushBtn.pin); Serial.printf( "'blinkLed'タスクを一時停止します\ n"); // flashLedタスクを一時停止します vTaskSuspend(taskBlinkled); digitalWrite(led_pin、LOW); Serial.printf( "スリープ状態になります….. \ n"、pushBtn.pin); pushBtn.pressed = false; //今すぐスリープ状態になります esp_deep_sleep_start(); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause(); switch(wakeupReason) { case ESP_SLEEP_WAKEUP_EXT0:Serial.println( "スリープからのウェイクアップに外部信号ext0を使用");ブレーク; case ESP_SLEEP_WAKEUP_EXT1:Serial.println( "スリープからのウェイクアップに外部信号ext1を使用");ブレーク; case ESP_SLEEP_WAKEUP_TIMER:Serial.println( "スリープからのウェイクアップにタイマー信号を使用");ブレーク; case ESP_SLEEP_WAKEUP_TOUCHPAD:Serial.println( "スリープからのウェイクアップにタッチパッド信号を使用");ブレーク; case ESP_SLEEP_WAKEUP_ULP:Serial.println( "スリープからのウェイクアップにULP信号を使用");ブレーク; デフォルト:ブレーク; Serial.printf( "'blinkLed'タスクを再開します\ n"); // flashLedタスクを再開します vTaskResume(taskBlinkled); } }
whileループは、スリープボタンが押されているかどうかを常にチェックします。ボタンを押すと、LED点滅タスクが停止または一時停止し、espディープスリープスタート機能が実行されます-
esp_deep_sleep_start();
この状況で、ext0外部割り込みボタンを押すと、すぐにディープスリープモードから復帰し、LED点滅タスクを再開します。
最後に、LED点滅機能は以下のスニペットで見ることができます。それは1000ミリ秒秒でLEDを点滅させます。
void flashLed(void * param){ while(1){ static uint32_t pin_val = 0; //ピン値を切り替えます pin_val ^ = 1; digitalWrite(led_pin、pin_val); Serial.printf( "Led -----------------%s \ n"、pin_val? "On": "Off"); / * 1000msまたは1秒ごとにLEDを切り替えるだけです* / vTaskDelay(1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete(NULL); }
ディープスリープモードでのESP32のテスト
回路はブレッドボードで構成され、MetraviXBエディションマルチメータを使用して電流を測定します。アクティブモードで回路に流れる電流はほぼ58mAですが、ディープスリープモードでは電流はほぼ4.10mAです。下の画像は、ESP32アクティブモードの消費電流を示しています-
ディープスリープモードでは、消費電流は約3.95mAに低下して記録されます。下の画像は、ESP32ディープスリープモードの消費電流を示しています-
ただし、ディープスリープモードでは、ESP32の消費電流はほぼ150uAです。ただし、このESP32Devkitボードの記録された消費電流はほぼ4.10mAです。これは、CP2102とリニアレギュレータによるものです。これら2つは5V電源ラインに接続されています。ほぼ2mAの電流を消費している電力線に接続された電源LEDもあります。
したがって、ESP32は、バッテリ駆動の操作に非常に役立つディープスリープモード状態で非常に少量のエネルギーを消費することを簡単に識別できます。それがどのように機能したかの詳細については、以下にリンクされているビデオをチェックしてください。ご不明な点がございましたら、下のコメントセクションに残すか、フォーラムを使用してその他の技術的な質問をご覧ください。