M5Stack Atom Matrix
私の周囲で最近話題になっていた M5Stack Atom Matrix をポチっとしたのが到着。24mm四方の小さな筐体にESP32(WiFi, Bluetooth込み), MPU6886(加速度/ジャイロ/温度センサー), 5x5 LEDマトリクス, 前面ボタン等が詰め込まれたデバイスである。背面のラベルに内蔵デバイス用も含めたピンの説明がびっしり書かれているのがけなげで微笑ましい。
とりあえずWiFiのスマート家電リモコン(左)と加速度センサーを使ったおもちゃ(右)を作ってみたのがこれ。
開発&トラブルシュートメモ
開発環境
例によってArduinoで。
- ボードマネージャからESP32ボードをインストール、M5Stick-Cボードを選択
- ライブラリからM5Atomをインストール
- M5AtomやM5Stick-Cのスケッチ例を見ながら適当に作る
基本情報
- データシート等
https://docs.m5stack.com/#/en/core/atom_matrix - M5Atomライブラリのソース
https://github.com/m5stack/M5Atom
英語のスペルがかなり怪しかったりで、品質も推して知るべし。LEDのRGBの順序が違うとか初歩的なissueが上がっている。まぁ自分で直しながら使えってことか。
LEDマトリクス
- LEDマトリクスはかなりちらつきがある。LED制御信号にジッタが出るのか、WiFiが動作してるときに関係のない色がちらちら光る感じ。ESP8266 Jitter · Issue #367 · FastLED/FastLED · GitHub などを参考にFastLEDのフラグをいじってみるも効果なし。
- restartしたりlight/deep sleepに入ると、LEDがランダムな状態で光りっぱなしになることがある。非常に困る。⇒ ESP32のボードマネージャを最新(1.0.4)にしたら解消した様子。
追記: これらの問題はM5Atomライブラリの実装に原因があり、FastLEDを直接使えば回避できる。詳しくはこちらを参照: https://tomoto335.hatenablog.com/entry/m5atom-dont-use-library
WiFi
- WiFi接続が起動後に必ず一度失敗する。ここで議論されている回避策を入れたら効果あり。ただシャットダウン前に特定のコードを実行する必要があり、リセットボタンには無力である。
ESP32 WiFi.begin works only every second time - workaround · Issue #2501 · espressif/arduino-esp32 · GitHub - 参考: WiFi接続のステータスコード、生の数字を覚えてないと何気につらい
https://github.com/espressif/arduino-esp32/blob/master/libraries/WiFi/src/WiFiType.h#L40
追記: しばらく使っていると接続状態なのにhost unreachableやtimeoutが発生するなど、なかなか安定しない。原因不明。
消費電力
- 消費電力は見た目の割に大きく、平常運転(modem sleep)で約55mAの電流を消費する。けっこうぬくくなる。
- 最大CPU周波数をデフォルトの240MHzから80MHzに下げたら50mAくらいに下がった様子。ついでにLEDが安定することを期待したが変化なし。WiFi接続は若干速くなった気がする。
- deep sleepでも20mA+の電流を消費する。たぶんLEDマトリクスの電源を切る回路が入っていなくて電圧かかりっぱなしなのではないか。
- 参考: ESP32のsleep modeの解説
https://lastminuteengineers.com/esp32-sleep-modes-power-consumption/ - 参考: ESP32の消費電力管理
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/power_management.html
スマートアウトレット
- 以前紹介したこれを使う。
- APIの叩き方は巷にあるPythonライブラリを参考にする。最もシンプルな使用例はこれ https://github.com/tylergets/python-vesync 、さらに高度な使用例はこちら: https://github.com/markperdue/pyvesync
リモコン起動時間
スマートアウトレットリモコンとして使うには、押したいときにすぐ押せないとエクスペリエンス的によろしくない。その観点では常時通電/WiFi接続/機器状態ポーリングして即時反応できるようにスタンバイさせておくのが理想的だが、一日一回押すかどうかのユースケースでは電気も電波ももったいない。そこで普段は電源offあるいはdeep sleep状態にしておき、起動をどれだけ早くできるか試してみた。
工夫のない実装だと、DHCPを使ったWiFi接続→Login API呼び出し→機器状態取得API呼び出しの3ステップでおよそ5秒かかっていた。リモコンの起動待ちとしては少々長い。
WiFi接続でDHCPを使わず静的IPを使い、またLoginで取得したトークンをSPIFFSに保存してLogin API呼び出しをスキップするようにしたところ、3秒弱に縮んだ。感覚的にはまあ実用範囲内である。