【自作タイムラプス】ESP32-CAMをDeepSleepモードで省電力化してみた【Time Lapse】

タイムラプス

自作のタイムラプスカメラの稼働時間延長にトライしてみた。
arduinoにはDeepSleepモードがあって、待機電力をかなり減らせるみたい。
20210227110453.jpg

普通だと平均80mAほど消費しているようですが、DeepSleepを使うと10~150μA程度に消費電力を抑えることができるそうです。
10マイクロから150マクロなんてほとんど流れてない状態みたいですね。

20210301121545.png

現在使用中のコードはこちら

【ESP32-CAM】タイムラプス用のカメラを自作してみた。【DIY】

スポンサーリンク

コードの考察

DeepSleepのコードについては、ArduinoIDEにスケッチのサンプルがある。

ファイル → スケッチ例 → ESP32 → Deepsleep

いくつかサンプルがあるが、ここではTimerWakeupを選択する。

62行目

esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR);

TIME_TO_SLEEP * uS_TO_S_FACTOR がスリープ時間になっている。
1000000Usが1秒なので、180*1000000として3分となる。

esp_deep_sleep_start();

88行目でDeepSleepがスタートする。

スポンサーリンク

DeepSleepで変数が消える

DeepSleepは半分リセットみたいなものなので、Void Loop() を使わずにSetup()で起動する。

ここで困るのが、変数が消えてしまうこと。変数が消えてしまうと画像のファイル名もリセットされてしまい起動するたびにファイルが上書きされてしまう。
適当にテキストファイルを作ってファイル番号をRead、Writeさせる方法も考えたが、少し複雑になるのとSDの消費電力を考慮して見送った。

スポンサーリンク

RTC_DATA_ATTR を使ってみる

RTC_DATA_ATTR を使うことで、ESP32のメモリーに変数を書き込むことができるようになるので、電源が落ちない限り保持することが可能になるみたい。

これにより、電源を切っても保持されるEEPROMで親番のファイル名を保持し、子番はRTC_DATA_ATTRで電源が切れるまで保持することにした。

こうすることでファイルが上書きされることを防ぐ。ただし、この方法だと256×999枚を超えるとP001_001.jpgから上書きされる。

できあがったタイムラプスのコード

#include "esp_camera.h" #include "soc/soc.h" #include "soc/rtc_cntl_reg.h" #include "SD.h"   //SD Card Pins  #define sd_sck  14  #define sd_mosi 15  #define sd_ss   13  #define sd_miso  2   // read and write from flash memory  #include <EEPROM.h>   // define the number of bytes you want to access  #define EEPROM_SIZE 1  #define PWDN_GPIO_NUM     32  #define RESET_GPIO_NUM    -1  #define XCLK_GPIO_NUM      0  #define SIOD_GPIO_NUM     26  #define SIOC_GPIO_NUM     27  #define Y9_GPIO_NUM       35  #define Y8_GPIO_NUM       34  #define Y7_GPIO_NUM       39  #define Y6_GPIO_NUM       36  #define Y5_GPIO_NUM       21  #define Y4_GPIO_NUM       19  #define Y3_GPIO_NUM       18  #define Y2_GPIO_NUM        5  #define VSYNC_GPIO_NUM    25  #define HREF_GPIO_NUM     23  #define PCLK_GPIO_NUM     22   RTC_DATA_ATTR int myF_No = 0;  RTC_DATA_ATTR int myS_No = 0;   char myFileName_str1[4]; char myFileName_str2[4];  void setup() {   WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG

従来のタイムラプスと比較してみた

微量の電流を計る機材がないため、USBテスターで調べてみた。
従来のプログラムだと待機時に0.02Aを示していた。

20210227114649.jpg

今回のプログラムだと0.00Aと表示された。数値的にはどの程度の電流が流れているかは分からないが、明らかに消費電力が抑えれていることが分かる。20210227114648.jpg
今後、稼働時間を測定してみたい。

参考サイト


(Visited 21 times, 21 visits today)

コメント

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