見出し画像

M5Capsuleの電源関連の仕様についてまとめ

  • M5Capsuleの電源関連の注意事項を改めて、ちゃんと読む

  • 最初に目を通したが、HOLDピン?今のところ関係ないよね?と思い読み飛ばしてしまった

  • しかし、かなり重要なことが書かれていたので、意訳してみる

Power On: The device can be awakened and powered on either by pressing the "WAKE" button or by the RTC-triggered IRQ signal. After the wake-up signal is triggered, during program initialization, it is necessary to set the "hold" (GPIO46) pin to a high level (1) to maintain power. Otherwise, the device will return to sleep mode.
Power Off: When not externally powered via USB, the device can be turned off by pressing the RST button. Alternatively, during program execution, setting HOLD (GPIO46) to 0 will achieve a power cutoff shutdown.

https://docs.m5stack.com/en/core/M5Capsule


電源オンの方法

  • WAKEボタンを押すことで目覚める(目覚めるけど、完全に起きるわけじゃない!)

  • 電源をオンを維持したいならば、wake-upシグナルを受けたあと、プログラムの初期時にHOLDピンをHIGHレベル(1)にする必要がある

    • HOLDは「Power Hold」という意味で、「電源を維持する」と捉えればよいと思う

  • そうしないと、sleepモードに入る(wake-upで起きたけど、何もしないと、また寝てしまう)

補足:IRQの話も書いてあるが、複雑になるので割愛

pinMode(GPIO_NUM_46, OUTPUT);
digitalWrite(GPIO_NUM_46, HIGH);

電源オフの方法

  • USB(5Vinを含むと思う)で電源が供給されていない場合(バッテリ駆動の場合)、RSTボタンで電源がオフになる

    • 筆者が実験で確認した限りでは:電源が供給されている場合、RSTボタンは、リセットになる

  • (バッテリ駆動の場合の)他の方法として、プログラム実行中に、HOLDピンをLOW(0)にすればシャットダウンする

筆者が実験によって得た内容

(間違えているかもしれない)

  • 外部電源を供給した瞬間に電源がオンになりアプリが起動する

    • 外部電源を供給する場合、Wakeボタンを押す必要はない

    • 電源をオンにする(5Vinに電源を供給する)物理スイッチでアプリを起動できる

  • アプリ起動中&外部電源供給中&HOLDピンがLOW設定:外部電源が断たれると、シャットダウンする

  • アプリ起動中&外部電源供給中&HOLDピンがHIGH設定:外部電源が断たれると、バッテリ駆動に切り替わる(このとき再起動はしない)


実現したい事と課題

  • 「バッテリ駆動」と「外部電源駆動」の両方で動くアプリを作りたい

    • 外部電源の供給時、電源のオン、オフは物理的なスイッチで切り替えられる

  • 外部電源駆動のときは、電源を断った瞬間に、シャットダウンさせたい

    • 物理的な電源スイッチを切っても動き続けるのは違和感がある

    • 物理スイッチをオフにして、さらにRSTボタンを押さないといけないのは手間

  • その場合、HOLDピンをLOWにする必要があるが、HOLDピンをLOWにすると、バッテリ駆動ができなくなってしまう

  • HOLDピンをHIGHにすると、外部電源が供給時に、物理スイッチで電源をオフにしてもバッテリ駆動で起動しつづけてしまう


バッテリ駆動か電源駆動か判定したい

  • そんな経緯があって、バッテリ駆動なのか、外部電源駆動なのか、知りたいと思って、APIを調べるが、見つけられていない

  • M5.Power.isCharging()は、M5Capsuleでは、現状未対応のようだ


応急対応

  • 応急対応として、起動時のsetup()関数で、wakeボタンが押されているかを判定して、

  • 押されていたら、バッテリ駆動と解釈して、HOLDピンをHIGHにする実装をした

  • バッテリ駆動の場合は、wakeボタンを押して起動する

  • そのまま、バッテリ駆動と解釈するまでwakeボタンを押しつづけてもらう

  • ボタンの判定処理が完了するまでHOLDピンはLOWであり、その状態では起動できないので、誤って「バッテリ駆動モード」を「外部電源モード」と解釈することがない仕様

    • 体感で0.8秒くらいの長押しが必要

  • 念のため、バッテリ駆動判定したことをRGB LEDで示す仕様にした

  • ただし、Wakeボタンを押しながら、外部電源を供給すると、バッテリ駆動と解釈してしまう

    • 筆者の事例の場合、外部電源で起動する場合は、M5Capsuleを「電源スイッチ付きのケース」に入れるので、wakeボタンが押せない仕様ではある

void setup()
{
  // external power supply mode
  pinMode(GPIO_NUM_46, OUTPUT);
  digitalWrite(GPIO_NUM_46, LOW);  

   // battery mode
  if (digitalRead(GPIO_NUM_42) == LOW) {
    digitalWrite(GPIO_NUM_46, HIGH);
    leds[0] = CRGB::Yellow; // バッテリ駆動と判定したことを示すためLEDを光らせる
    FastLED.show();
    delay(100);
  }
}



微妙な対応だが、これで、一応は、バッテリ駆動でも、外部電源駆動でも使えるようになった

「あるGPIOピンがHIGHのときは、外部電源モードを示す」など考えたが、筐体の作り直しが発生してしまう(そういう部分も想定した方がよいという勉強になった)


いいなと思ったら応援しよう!