Timer Cameraと「M5Stamp CAT-Mモジュール」で画像送信する

先日、「M5Stamp CAT-Mモジュール」の動作確認を行いました(記事は こちら)。
「ATOMS3」と「M5Stamp CAT-Mモジュール」をつなぐことで、Wi-Fiルータを使わずに、「ATOMS3」で取得したデータをWebサーバに送信することができました。

さて、このように、Wi-Fiネットワークなしでデバイスの取得データをWebサーバに送信できるようになると、IoTデバイスを独立して好きなところに設置できるようになります。
これまで私が特にやりたかったのは、IoTカメラをWi-Fiのないところに設置して、一定時間間隔で写真を撮影、それをWebサーバに送信して遠隔地からでも見れるようにするというものですが、「M5Stamp CAT-Mモジュール」を使えばそのようなこともできそうです。
さらに、それらのデバイスの消費電力によっては、小さなソーラーパネルでの常時稼働も可能な、本当にシンプルなIoTカメラがつくれるかもしれません。

カメラデバイスとして、私は主に「Timer Camera」を使っています。
「Timer Camera」に少し細工をすることで、小型のソーラーパネル(0.5W)での常時稼働を実現できています(記事は こちら)。
今回は、「M5Stamp CAT-Mモジュール」を使うことで、このようなことをWi-Fiネットワークなしで実現できないか、確認してみたいと思います。

まずは、先日「ATOMS3」で動作確認したのと同じ処理を、「Timer Camera」で実施してみます。

「Timer Camera」のGROVEポートに「M5Stamp CAT-Mモジュール」をつなぎます。
以下のようにつなぎます。

Timer CameraM5Stamp CAT-Mモジュール
GGND
V5V
G4Rx
G13Tx

「M5Stamp CAT-Mモジュール」へは、「Timer Camera」のGROVEポート(V端子)経由で電源供給されることになります。
「Timer Camera」のGROVEポート(V端子)は、スタンバイ時には電源遮断されますので、スタンバイ時には「M5Stamp CAT-Mモジュール」も含め、消費電力がほぼゼロになるはずです。
また、今回の「Timer Camera」の細工では、内蔵バッテリーの代わりにNi-MH電池4本をつないでいます。「Timer Camera」の回路図を見ると、電池とGROVEポートの間には電源遮断のためのトランジスタが1個入っているだけで、電池から、あまり電圧が落ちることなしに「M5Stamp CAT-Mモジュール」に電源供給されそうです。先日の記事で「M5Stamp CAT-Mモジュール」は電源の取り扱いがシビアだと書きましたが、この構成であれば、Ni-MH電池が十分に充電できている限り、「M5Stamp CAT-Mモジュール」も安定動作することが期待できます。

スケッチはこちらです。

#define TINY_GSM_MODEM_SIM7080

#include <TinyGsmClient.h>
#include "battery.h"
#include "bmm8563.h"

const char apn[]      = "n-aeonmobile.com";
const char lte_user[] = "user@n-aeonmobile.com";
const char lte_pass[] = "0000";

const int rx_pin = 13; // GROVE 4th pin of TimerCamera
const int tx_pin = 4; // GROVE 3rd pin of TimerCamera

unsigned long interval = 20; // unit:sec

TinyGsm       modem(Serial1);
TinyGsmClient client(modem);

boolean sendRequest(float val0) {
  : 省略
}

void setup() {
  delay(500);
  Serial.begin(115200);
  bat_init();
  bmm8563_init();
  bmm8563_setTimerIRQ(interval);
  esp_sleep_enable_timer_wakeup(interval*1000*1000);
  Serial1.begin(115200, SERIAL_8N1, rx_pin, tx_pin);
  Serial.println("Wait...");
  pinMode(2, OUTPUT);
  digitalWrite(2, HIGH);
  delay(3000);

  // モデム初期化
  Serial.println("Initializing modem...");
  modem.init();
  String modemInfo = modem.getModemInfo();
  Serial.println("Modem Info: " + modemInfo);
  // 接続
  Serial.println("Connecting to "+ String(apn));
  while (!modem.gprsConnect(apn, lte_user, lte_pass)) {
    Serial.println("NG.");
    delay(10000);
    Serial.println("retry");
  }
  Serial.println("OK.");
  // 接続待ち
  Serial.print("Waiting for network...");
  if (!modem.waitForNetwork()) {
    Serial.println(" fail");
    delay(10000);
    return;
  }
  Serial.println(" success");
  bool res = modem.isGprsConnected();
  Serial.printf("GPRS status: %s\n", res ? "connected" : "not connected");

  // Get Data
  float val0 = random(0, 1000) / 10.0;
  Serial.println(val0);

  // Send Data
  if(!sendRequest(val0)) {
    bat_disable_output();
    esp_deep_sleep_start();;
  }
  Serial.println("Send request is finished.");

  digitalWrite(2, LOW);
  bat_disable_output();
  esp_deep_sleep_start();
}

void loop() {}

「ATOMS3」用の処理を「Timer Camera」用に書き直した他、ディープスリープの代わりにスタンバイモードに移行するように処理内容を変更しています。

電池ボックスのスイッチをONにすると、問題なく、データをWebサーバに送信することができました。

この時の消費電流波形を観測してみました。

波形の形状は「ATOMS3」の時とほぼ同じです。
1回の処理にかかる時間は「8011.0ms」、その期間の平均消費電流値は「130.20mA」となりました。また、スタンバイ時の消費電流値はゼロ(実際は、今回の調査方法では若干のマイナス)でした。
10分毎にデータ送信する場合、平均消費電流値は「1.74mA」となり、単三型Ni-MH電池(2000mAh)で「47.9日」にわたり稼働できる計算になります。
この程度の電流消費であれば、0.5Wのソーラーパネルでも、十分に常時稼働させることができそうです。

次に、このデバイスで実際に写真を撮影し、Webサーバに送信させてみたいと思います。
事情によりここにスケッチは掲載しませんが、先ほどのスケッチでデータ送信しているところを「カメラ初期化」→「写真撮影」→「画像送信」に変更しただけです。
送信する画像のサイズは「UXGA(1600 x 1200)」、画質は「10」にしました。
また、カメラの自動調整のため、カメラ初期化と写真撮影の間に4.8秒の待ち時間を入れています。

電池ボックスのスイッチをONにすると、問題なく、撮影した画像データをWebサーバに送信することができました。

この時の消費電流波形を観測してみました。

1回の処理にかかる時間は「18232.5ms」、その期間の平均消費電流値は「166.28mA」となりました。また、スタンバイ時の消費電流値は、先ほどと同じくゼロ(実際は、今回の調査方法では若干のマイナス)でした。
10分毎にデータ送信する場合、平均消費電流値は「5.05mA(25.87mW)」となり、単三型Ni-MH電池(2000mAh)で「16.5日」にわたり稼働できる計算になります。
0.5Wのソーラーパネルの最大能力で3.5時間発電すると、「500mW × 3.5h = 1750mWh」の発電ができる計算になりますが、この発電量で稼働できるのは「1750mWh / 25.87mW = 67.65h = 2.8日」となり、2.8日に1回の割合で晴天の日があれば、このソーラーパネルが発電する電力で常時稼働できることになります。
カメラの初期化を最初に行い、ネットワーク接続処理中にカメラの自動調整を行うようにすれば、自動調整用の4.8秒の待ち時間は不要となり、その分だけ全体の処理時間も短縮できそうです。

このような改善を行うことで、もう少し曇天の日の割合が多くても、このIoTカメラシステムを0.5Wのソーラーパネルで常時稼働できそうな見込みが得られました。


なお、私がM5Stack、M5StickCの使い方を習得するのにあたっては、以下の書籍を参考にさせていただきました。


ごく基本的なところから、かなり複雑なスケッチや、ネットワーク接続など、比較的高度なものまで、つまづかずに読み進めていけるような構成になっており、大変わかりやすい本です。


このサイトで書いている、M5Stackシリーズ(M5Stack、M5StickCなど)に関するブログ記事を、「さとやまノート」という別のブログページに、あらためて整理してまとめました。

他のM5Stackシリーズの記事にも興味のある方は「さとやまノート」をご覧ください。