見出し画像

M5Capsule「PC接続時は動くのに、バッテリ駆動時は動かない?」

追記:2024年7月19日
ようやく、M5Unifiedを使わなくても(M5.begin()しなくても)M5 Capsuleでバッテリで駆動する方法がわかった。M5.begin()の関数内で、GPIO46がHighにしている。この処理を書けば、バッテリ駆動でも電源がオンのままになる。初期状態は、POWER HOLDピンがLOWなので、電源オフになるということのようだ。M5.begin()時のノイズから解放される。なんで、こうなっているかも、おそらく理解した、別の記事にする。

virtual void begin(config_t cfg)
{
    // Allow begin execution only once.
    if (_board != m5gfx::board_t::board_unknown) { return; }

    #if defined ( CONFIG_IDF_TARGET_ESP32S3 )
        // Power Hold pin for Capsule/Dial/DinMeter
        m5gfx::gpio_hi(GPIO_NUM_46);
        m5gfx::pinMode(GPIO_NUM_46, m5gfx::pin_mode_t::output);
    #endif
pinMode(GPIO_NUM_46, OUTPUT);
digitalWrite(GPIO_NUM_46, HIGH);

during program execution, setting HOLD (GPIO46) to 0 will achieve a power cutoff shutdown.

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


詳しく調査した記事



以下、元の記事


初歩的なミスすぎて、自分以外に、こんな低レベルなミスをしている人はいないかもしれないが、、、

3行で

  • M5 Capsuleで、外部電源を供給しているとき(5Vin、またはUSB端子から電源を供給時)は動作するが、バッテリ駆動にすると、一瞬だけ起動した後、動作しなくなる症状に遭遇した

  • バッテリ駆動でも、WAKE BUTTONボタンを押し続けると、動作するという不可解な状態だった(SLEEPに入ってしまっているのだろうか)

  • M5Unifiedライブラリをインストールして、M5.begin()をすることで解決した

FastLEDで内蔵のRGB LEDを緑に光らせるサンプル、以下のコードの(1)、(2)、(3)が必要のようだ

#include <Arduino.h>
#include <FastLED.h>
#include "M5Unified.h" // (1) ライブラリを読み込む

#define NUM_LEDS 1
CRGB leds[NUM_LEDS];

void setup() {
  auto cfg = M5.config(); // (2) デフォルトの設定値
  M5.begin(cfg); // (3) 設定を反映

  FastLED.addLeds<NEOPIXEL, GPIO_NUM_21>(leds, NUM_LEDS);
  leds[0] = CRGB::Green;
  FastLED.show();
}

void loop() {
  delay(1000);
}

今後

  • とりあえず、解決したが、原因の究明をしておきたい

  • おそらく、M5.begin()に必要な処理があるのだろう

  • M5.begin()すると、M5 Capsuleの内蔵スピーカーからノイズが聞こえる、コンパイル時間が長くなりそうで、容量も大きくなりそう、と思って省略してしまった

    • 入門時に外部電源で動作確認していて、省略しても動作するものだと勘違いした

敗因

  • 初歩的なミスで時間を費やしてしまい猛省

  • USB-OTGの実装をしていて、外部電源を供給すると動くという症状から、USB-OTG関連を疑ってしまい問題の特定に時間がかかった

    • USB-OTG時はM5が電源のソースになるため電力不足で落ちていると思ってしまった

  • 焦る気持ちを抑えて、目的の機能を試す前に、初歩的な動作確認を積み重ねて仕様を整理して頭に入れていく必要があると感じた

    • M5 Capsuleで早くUSB-OTG(USB-Host)を試したい!って鼻息を荒くして、焦った結果である


USB Hostの動作確認は、はまることなく動作確認できたのだが、思わぬところではまってしまった。


M5.begin()での設定


この記事が気に入ったらサポートをしてみませんか?