SSブログ

ESP8266への気付き [ESP32]

esp8266_io0.pngESP8266のIO0って、出力設定しないと暴れているよね!なんで???

Deep Sleep!
ESP.deepSleep( 100 * 1000 * 1000UL , WAKE_RF_DEFAULT );
で省電力に入った場合、指定した時間の間だけ省電力で、その後タイムアウトすると8mAくらい消費している感じ。

Light Sleep!
light sleepモードは1mA程度に抑えられるのは助かる。んが、結構手続きが面倒かも。あと起床する手段が必要だが外部割込みが使える。以下のサイトがよく判る。
http://okiraku-camera.tokyo/blog/?p=4996

以下のリンク先のPDFのサンプルをそのまま使っても、ただしくlight sleep modeに入らないのがムカつくよね。タイムアウトで抜ける処理をやりたいのに、、、
https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_en.pdf

http://okiraku-camera.tokyo/blog/?p=4996
上記リンクのサンプルを若干アレンジして試してみたのだが、かなりの頻度でlight sleepから抜けてしまう現象が発生していた。またコールバックルーチンがいきなり呼ばれてしまう、、、
割込み入力端子はプルアップ抵抗とスイッチのみ接続し、GNDに落とすトリガーを入れている。
なぜいきなり省電力から抜けるのか結局判らない。ただし対策としてコールバックルーチンの中で端子状態を確認し、GNDレベルでなければ再度light sleepに入る様に対策して、確実に省電力状態に入る様にした。


以下、サンプルコード
/*
 ESP8266 light sleep test. 

  気づき
  1.ESP8266をlight sleepに入れると、タイマー系は全て停止してしまうので、
     sleepに入っていた時間を知る事ができない。
  2.wifi再接続時は13秒とか掛かる事が多い。
  3.なぜか一発でlight sleepに入らない事も多い。
  4.上記は、light sleepに入った途端にコールバックルーチンが呼ばれてしまう様で、ポートで端子状態を確認が必要。
  5.コールバックルーチンの中でdelayとかyieldとか呼ぶと、コアを吐いて死んでしまう。

  参考
  http://okiraku-camera.tokyo/blog/?p=4996
*/
#include  <ESP8266WiFi.h>
extern "C" {
  #include "user_interface.h"
  #include "gpio.h"
}

/**********************************************************/
/* defines                                                */
/**********************************************************/
#define  ASSOC         0
#define  INT_X         2
#define  GPS_POWER_PIN 15

#define  FPM_SLEEP_MAX_TIME       0xFFFFFFF

/**********************************************************/
/* global variables                                       */
/**********************************************************/
bool lightSleepLoop;

/**********************************************************/
/* setup.                                                 */
/**********************************************************/
void setup()
{
  Serial.begin( 115200 );
  delay( 20UL );
  Serial.println();
  Serial.println( "ESP8266 light sleep test." );

  /* GPIOの初期化。消費電力を抑える目的でもある */
  pinMode( ASSOC, OUTPUT ); digitalWrite( ASSOC, LOW ); /* active high */
  pinMode( INT_X, INPUT_PULLUP ); /* active low input */
  pinMode( GPS_POWER_PIN, OUTPUT ); digitalWrite( GPS_POWER_PIN, LOW ); /* active high */

  /* enter light sleep mode. */
  enterLightSleep( FPM_SLEEP_MAX_TIME );
}

/**********************************************************/
/* loop.                                                  */
/**********************************************************/
void loop()
{
  delay( 500 );
  digitalWrite( ASSOC, (digitalRead( ASSOC ) == LOW) ? HIGH : LOW );
}

/**********************************************************/
/* call back routine from wake up.                        */
/**********************************************************/
void fpm_wakup_cb( void )
{
  if( digitalRead( INT_X ) == LOW && digitalRead( INT_X ) == LOW && digitalRead( INT_X ) == LOW )
    lightSleepLoop = false;
  Serial.write( 'c' );
}
 
/**********************************************************/
/* enter the light sleep mode.                            */
/**********************************************************/
void enterLightSleep( uint32_t period )
{
  WiFi.mode( WIFI_OFF );
  wifi_set_opmode_current( NULL_MODE ); 
  wifi_fpm_set_sleep_type( LIGHT_SLEEP_T ); 
  wifi_fpm_open();
  gpio_pin_wakeup_enable( INT_X, GPIO_PIN_INTR_LOLEVEL );  /* or GPIO_PIN_INTR_HILEVEL */
  wifi_fpm_set_wakeup_cb( fpm_wakup_cb ); // Set wakeup callback
  lightSleepLoop = true;
  do
  {
    wifi_fpm_do_sleep( period ); // sleep until gpio activity.
    delay( 50UL );
    Serial.write( '*' );
  } while( lightSleepLoop );
  gpio_pin_wakeup_disable();
  wifi_fpm_close(); // disable force sleep function
}

light sleep時のタイマー
うすうすはそうじゃないか?とは思っていたが、しかしwifi_fpm_do_sleepの引数はμs単位の時間を指定できる事もあり、何度かタイムアウトで省電力から抜けないか?と試したが、少なくともESP-WROOM-02ではできなかった。
light sleep時はタイマー自体が止まってしまうようで、他のマイコンでよくある低消費電力モードに入ってもRCオシレータは動いている!という事は無いのかもしれない。
この為、ESP8266単体で省電力に入っていた時間を知る事はできないのかもしれない。復帰した時にNTPなどに接続すればイイのだが、、、イチイチそんな目的の為にNTPに接続するのもねぇ!
※micros()で省電力に入る直前、直後の時間を出力しても、省電力の時間分進んでいる事は無かった。

3.3Vレギュレータ!
ESP8266とは関係無い?が、3.3Vレギュレータはこれを使った。
無負荷時電流が小さいのが助かる。
http://akizukidenshi.com/catalog/g/gI-11299/


ESP8266_TOUT_ADC.pngTOUT!
TOUTを使って電圧測定をしてみた。その前に、TOUTのADCは10bitのADCであり、入力範囲は0V~1Vであるらしい。
プロットさせてみたのが左のグラフ。簡易的にデータを取った為かどうか判らないが、直線ではない。でも小数点以下1桁くらいの精度の電圧測定なら十分な気もする。これって、内部で補正されているんだっけ?
※Vinは分圧してからTOUTに接続している。



ソフトウエアシリアルのバッファサイズを変更する!
なんであんなケチケチバッファを割り当てているねん?

SoftwareSerial gpsSerial( GPS_TXD, GPS_RXD ); // RX, TX
gpsSerial.begin( 9600, SWSERIAL_8N1, GPS_TXD, GPS_RXD, false , 4096, 4096 );
// 最後から二番目はバッファサイズ、最後は割込み時のバッファサイズ。大きなデータを受信する時は大きめに!

nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。