M5Capsuleの電源関連の仕様についてまとめ
M5Capsuleの電源関連の注意事項を改めて、ちゃんと読む
最初に目を通したが、HOLDピン?今のところ関係ないよね?と思い読み飛ばしてしまった
しかし、かなり重要なことが書かれていたので、意訳してみる
電源オンの方法
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のときは、外部電源モードを示す」など考えたが、筐体の作り直しが発生してしまう(そういう部分も想定した方がよいという勉強になった)