IoT何をいまさら(48) M5Stack、Powerについて

JosephHalfmoon

前回、「お楽に」プロトを作ってみましたが、気になったのは消費電力です。内蔵の電池でどのくらいの期間動作するのだろうか?本当だったら色々な動作状態で電流を測りまくりたいところですが、設定メンドイ、気力もない。しかし、よくしたものでM5StackにはPowerというモジュールがあり、バッテリの管理関係がいろいろできるようになっています。まずは、その辺、ソフトで出来るところから押さえておこうじゃないの、と考えました。

まずは、Powerモジュールを使って電源関係を調べるにあたって書いてみたコードのsetup()部分です。

void setup() {
  M5.begin();
  Wire.begin();
  M5.Lcd.setTextSize(2);
  
  M5.Power.begin();
  M5.Lcd.setCursor(0, 0);
  if(!M5.Power.canControl()) {
    M5.Lcd.println("CAN NOT CONTROL.");
    while (1) {
      delay(1000);
    }
  } else {
    M5.Lcd.println("CAN CONTROL.");  
  }
}

Powerモジュールが動作するためには、バッテリを管理しているIP5306というICとI2Cで通信できないとならないのです。しかし、ちと恐ろしいことに、M5Stackでもどうも古いやつは部品が違っているのか、通信できないやつがあるようなのです。その識別のために

M5.Power.cancontrol()

などという関数が存在しているので、まずはそいつを使って調べてみます。駄目だったら、しかたがないので無限ループに突入しておしまい。LCD画面に表示されるであろう、CAN NOT CONTROL.というメッセージを見て途方に暮れようという趣向です。

走らせてみました。

CAN CONTROL. ですぞ。

良かった、話がつながって。その後、NOT FULL. In charging. 100% PSW.などと表示がされていますが、そこの表示をしている loop() 部分がこちら。

void loop() {
  M5.Lcd.setCursor(0, 32);
  if (M5.Power.isChargeFull()) {
    M5.Lcd.println("FULL charged."); 
  } else {
  M5.Lcd.println("NOT FULL. "); 
  }
  M5.Lcd.setCursor(0, 64);
  if (M5.Power.isCharging()) {
    M5.Lcd.println("In charging. "); 
  } else {
    M5.Lcd.println("Not in charging."); 
  }
  String batLev = String(M5.Power.getBatteryLevel());
  batLev += String("%");
  M5.Lcd.setCursor(0, 96);
  M5.Lcd.println(batLev);
  M5.Lcd.setCursor(0, 128);
  if (M5.Power.isResetbySoftware()) {
    M5.Lcd.println("SOFT."); 
  } else if (M5.Power.isResetbyWatchdog()) {
    M5.Lcd.println("WDT. "); 
  } else if (M5.Power.isResetbyDeepsleep()) {
    M5.Lcd.println("DEEP."); 
  } else if (M5.Power.isResetbyPowerSW()) {
    M5.Lcd.println("PSW. ");
  } else {
    M5.Lcd.println("ELSE."); 
  }
~以下略~

まず、最初にバッテリが満タンかどうかを調べるために

M5.Power.isChargeFull()

に聞いてみています。満タンではないとの回答。次に問うたのは、では充電中か否かです。

M5.Power.isCharging()

ちゃんとケーブル接続しとります。ここはちゃんと、In charging.と期待通りのお答え。次にバッテリ残量を聞いてみましょう。

M5.Power.getBatteryLevel()

実はこの関数、本日2020年1月21日時点のAPIの公式ページのAPIの関数見出しでは戻り値型がboolとなっているのです。でも下の説明を読めば、整数が返ってくることは明らか。そのつもりで書いてみると、上のように

100%

という結果でした。100%なのに満タンでないとはこれ如何に?疑問は残りますがとりあえず先に進みます。その後は、誰がRESETをかけたのかという質問。識別できるのは以下の4つ。

  1. ソフトウエアリセット(プログラムでRESET関数呼んだ)
  2. ウオッチドッグタイマ
  3. Deepsleepによる
  4. Powerスイッチ

上の写真の状態ではPSW、つまりPowerスイッチでした。これも納得。

さて、上記のコードはloop()で回っているので、電源にチャージしているケーブルを抜いてみました。

ちゃんと、変化しましたね、

Not in charging.

つまり、内蔵のバッテリのみで動作している状態であるということが認識できたわけです。目出度い。

ついでに、ボタンBに仕込んであった、ソフトウエアRESETも起動してみました。こんな感じ。

SOFT-RESETかかってますね。

後は、電源をOFFって、数時間放置してバッテリの減り具合をちょっと観察してみましょう。

約1時間半後、75%

結構減ったな。。。

約2時間後、75%

ムムム、変わらぬ。

約8時間後、起動せず!0かい。ま、上のペースならそうか。

この感じからすると M5.Power.getBatteryLevel() で読み取れる数字はちょっとクセがありそうに想像されますが、これを使ってSleep時とか、LCDの表示ON/OFFとか、WiFi使ったとき、BT使ったときなど、いろいろ電池の持ちを測ってみると大体の目安くらいにはなりそうです。測定用のプログラムを作るのはまた次回かな。

IoT何をいまさら(47) M5Stackでプロトタイプ作成、お楽に

IoT何をいまさら(49) M5Stack、バッテリ切れを測る