CPU
省電力設定のためには、CPUの周波数を抑えるのが有効だが、80MHz以上に設定しておかないと通信できない。デフォルトは240MHzです。
setCpuFrequencyMhz(80);
バッテリー残量
基本はバッテリー電圧で残量を判断する。 自分はパーセント表示にこだわらないので電源電圧を見て判断している。 4.0V以上あれば十分。3.5Vとかだとほぼ電池ない感じ。
M5.Axp.GetBatVoltage();
プログラム容量
WiFiと、BLEと使っていろいろやろうとすると、あっという間にプログラムのサイズが上限値の1280KiBを超えて以下のようなエラーがでる。
Error: The program size (xxxxxxx bytes) is greater than maximum allowed (1310720 bytes)
platform.iniに以下を追加して、OTAを無効にすると容量が1280KiBから3070KiBまで増やせる。
board_build.partitions = no_ota.csv
シリアルモニタ
シリアルモニタを使うとき、M5.begin()
などではデフォルトのボーレートは115200になっているので
platformio.iniには以下を追加しておく必要がある。
monitor_speed = 115200
I2C
複数デバイス
複数のデバイスと同時並行でI2C通信する必要がある場合、ひとつはWire
、もう一つはWire1
とする必要がある。
(三つ以上同時並行で使いたいときは??)
M5のサンプルコードはWireでハードコーディングされていることが多いので、書き直す必要がありますね。
PIN
GND, 5V, SDL, SCLの順で並んでいるので、SDLとSCLのピン番号を確認して初期化すれば使える。
Wire.begin(SDL, SCL);
M5.begin()で勝手に初期化されていることがあるので要確認。
ATOM
ATOMのGroveポートはpinは26と32なので、 I2Cで使う場合は以下でOK。
Wire.begin(26, 32);
ただし、M5.begin()は以下のようにI2Cを25と21で初期化するので注意が必要。
Wire.begin(25,21,10000);
M5StickC
Groveポートのpinは32と33。
Hatの場合は共通なんだろうか? ENV2はI2Cにpinは0と26を使っている様子。
Wire.begin(0, 26);
ATOM Motion
Port Bのpinは33と23。
Wire.begin(33, 23);
WiFi
待ってもつながらないときはbeginから何度かやり直していればつながる。リトライ処理の実装は必要。
WiFi.begin(ssid, passpharse);
色
M5CoreやM5StickCなどのM5.Lcdの色指定は16bitなので、わかりやすい32bitで指定すると変換が必要になる。
uint16_t To16BitColor(uint32_t color) { uint8_t r = (color >> 16) & 0xFF; uint8_t g = (color >> 8) & 0xFF; uint8_t b = (color >> 0) & 0xFF; return ((r>>3)<<11) | ((g>>2)<<5) | (b>>3); }
ATOMなどのLEDの色指定はGRBの順になっているのでRGBで指定したければ変換が必要。
uint32_t RGB2GRB(uint32_t color) { const auto r = (color >> 16) & 0xFF; const auto g = (color >> 8) & 0xFF; const auto b = color & 0xFF; return (g << 16) | (r << 8) | b; }
Timer Camera
なかなかアップロードできなかった、upload_speedとboard_build.partitionsの設定が必要。
[env:m5stack-timer-cam] platform = espressif32 board = m5stack-timer-cam framework = arduino lib_deps = m5stack/Timer-CAM@^0.0.1 board_build.partitions = huge_app.csv monitor_speed = 115200 upload_speed = 1500000