2015年8月31日月曜日

ESP-WROOM-02プログラミング:スリープのテスト

前回のメモ:3つのSleepの使い分けについての検証用プロジェクト


プロジェクト概要:
 無線LANルータに対して接続を確立した後、処理を行わずスリープを誘発する

 Sleepの設定を切り替えてビルドし、各Sleepの挙動をチェックするために用いる
 Deep_Sleepについては大きく使用方法が異なるのでここでは割愛
 ※外部機器による電流値の測定が必要/表面上の動作にはまったく差が無い


データシートより/通信およびスリープ中の電流値


準備すること:
 ・ArduinoIDE上でのESP8266開発環境構築
 ・ESP-WROOM-02を接続してもよい無線LANルータのSSIDとパスワードをメモ
 ・電流値を測定できる外部機器


作成方法:
 ・ソースをコピペして以下の情報を修正する
   ・SSID
   ・SSIDに対するパスワード
   ・測定したいスリープモード設定行のみを有効にする
    (SLEEP無効/MODEM_SLEEP/LIGHT_SLEEP)
 ・ビルドしてダウンロードモードのESP-WROOM-02に書き込み
  (→過去メモ参照)


実行方法:
 ・外部機器でESP-WROOM-02の電流値を測定開始
 ・ESP-WROOM-02をブートモードで起動
 ・デバッグ出力より無線LANルータとの接続を確認
  (『WiFi connected』の表示を確認)
 ・起動~ルータとの接続~スリープ状態までの電流値を測定する


うまくいかない場合は以下をチェック:
 無線LANルータの規格
   →ESP-WROOM-02が対応できるのは802.11b/g/n

 ・チップへの給電が十分か
   →通信時は80mA以上消費する

 ・ダウンロードモードからの設定変更は忘れていないか
   →GPIO0ピンをL→Hに戻し忘れることが多い
    ブートモードにしないと当然ながら起動しない


注意点:
 ・無線LANルータの設定(ステルスID/接続先限定など)によっては動かない


測定結果:

 グラフはこちら

 802.11gにて無線LANルータと接続した
 10msecの分解能でESP-WROOM-02の電流値を測定
 (電流センサモジュールArduinoUno、SDカードシールドを使用/精度は参考程度)
 以下はすべてloop()内での電流値について

 ・NONE_SLEEP(スリープ無効)は常に70mA
 ・MODEM_SLEEPは定常状態が15mA
  150msec前後の周期でパルス状の電流変化(ピーク70mA程度)あり
・LIGHT_SLEEPは定常状態が1mA程度
  MODEM_SLEEPよりも高い頻度で15mAと70mAの変化が混じる

 スリープ時に定期的に消費される70mAは無線LANルータとの接続を維持するための通信と思われる
 測定の分解能が不足しているためこの環境でこれ以上の測定はあまり意味が無い

おまけ:
 setup()実行前の初期化段階で200mA程度の電流値を測定
 測定時の分解能の低さを考えるとピークはもっと高いかも
 状態別電流値の代表値を参考に定格電流を決めると起動でしくじるかも


#include <esp8266wifi.h>

extern "C" {
#include "user_interface.h"
}

//無線LANルータのIDおよびパスワード
const char* ssid     = "XXXXXXXX";
const char* password = "YYYYYYYY";

void setup() {  
//スリープモードの選択
//    wifi_set_sleep_type(NONE_SLEEP_T);
//    wifi_set_sleep_type(MODEM_SLEEP_T);
  wifi_set_sleep_type(LIGHT_SLEEP_T);

  Serial.begin(115200);
  delay(10);

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}
void loop() {
  delay(5000);
}

0 件のコメント:

コメントを投稿