M5Stack×Moddable入門その2~I2Cでバッテリー情報を読み取る
センサー情報とかを取得する練習としてバッテリー残量をとってみることにした。起動していてイマイチ残量がわからないというのもあったので。
IP5306
M5stackにはIP5306という電源制御モジュールが搭載されており、schematicを読んでいるとI2C通信ができるようにカスタマイズされたものが搭載されているようだ。
Power Management IC (IP5306) is customized I2C edition,its I2C address is 0x75. Clickhere to check IP5306 datasheet
ということで、この0x75
アドレスに対してIC2通信をしてみる。
レジスタの情報とかはリンクされているデータシートを読んでみることにしたが中国語だった。
中国語混じりのデータシート意味分からん。
— STC (@stc1988) 2020年7月2日
テクノロジーで勝利している pic.twitter.com/QwFvg4SlKV
— STC (@stc1988) 2020年7月3日
どうもバッテリー残量を取得できるレジスタ情報の記載がなく困っていたが、色々と紆余曲折もありつつ最終的にはM5stack公式のリポジトリにIP5306にアクセスするコードがあったので、これを参考にすることにした。
M5Stack/Power.cpp at master · m5stack/M5Stack · GitHub
結局は自分でデータシートと格闘するよりも既存のCやC++のデバドラ探してきて移植したほうが楽そうである印象。
Moddableとしての実装
I2C通信するドライバを作成するにあたっては、他のModdableのリポジトリにあるドライバのコードを見てながら真似てみた結果、I2Cクラスを拡張して、IP5306と通信して情報取得するドライバを作ることができた。
I2C通信先のアドレスとレジスタのアドレスおよび読み取った値のビットマスク方法が分かっていれば、特に難しいことはなさそう。
ということで3つのボタンにそれぞれ、充電中か否か / フル充電か否か / バッテリー残量 を取得する処理を割り当てて表示するものができあがった。
フル充電状態が何故か取得できんけど、充電中かどうかと残量に関しては取れるようになった。 pic.twitter.com/tXnU7wZFO4
— STC (@stc1988) 2020年7月3日
フル充電状態はなぜか取れないけど、残量が分かればまぁいいでしょう。
おまけ:起動音を消す
起動時の音が結構うるさい。
%MODDABLE%/build/devices/esp32/targets/m5stack/setup-target.js
に機器固有の初期処理が書いてあるので、鳴動処理をコメントアウトすることで解消された
また、このファイル中で、ディスプレイ下に配置された3つのボタンをピン番号を指定してglobal.button
として登録されている