概要
上記でM5シリーズをワンソース、ワンバイナリで動かすライブラリを作っていました。しかしながらいろいろ互換性とかを考えると難しいので、互換性をある程度捨てて開発しやすいフレームワーク的なライブラリにしたいと思います。
コンセプト
- M5StickCっぽい開発環境
- M5シリーズ共通で使えるコード、バイナリ
- 使っていて微妙なところは互換性を捨てて、組みやすさ重視
- 速度よりは利便性
- デバッグまわりの支援
個人的にM5StickCからM5シリーズを触ったので、M5StickCのライブラリが一番くわしいのでCっぽいライブラリになると思います。IMUなどの軸も、AXP192の項目などもCを基準にして、同じようだけれど違う使い方をしている場合、Cと同じように使えるように修正しています。
画面周りは大きさが違うので、個別に組む必要がありますがなるべく共通処理で動くような作りにしています。使えない機能を呼び出しても、動かないだけで副作用がないようにしているはずです。
特徴
ほぼほぼ、らびやんさんのLovyanGFXに依存しています。超高速LCDライブラリですが、主要な液晶を自動認識してくれるすごいライブラリです。高速で高機能なのですが、そこはまだ研究不足で使い込めていません、、、
LovyanGFXでM5シリーズの機種判定ができるようになっているので、その判定結果を利用して端末に対応するライブラリを使えるように設定しています。
ボタン周りもタッチパネルのM5Stack Core2を含めて、BtnAなどの既存ライブラリを利用することができます。
SDや音声まわりはまだ統一できていないので、アナログ接続のスピーカー、マイクのM5Stack Fireでも、両方I2Sのデジタル接続M5Stack Core2でも同じように使えるインターフェイスを用意していきたいと考えています。
独自拡張
M5のままでも使えるのですが、M5Liteにクラス名を変更しています。そして、独自拡張はM5Lite.Exクラス以下に追加していく方針です。
- M5Lite.Ex.setLed() : M5StickCの赤色LED or M5Stack Core2の緑色LEDなど
- M5Lite.Ex.setVibration() : M5Stack Core2の振動モーター
- M5Lite.Ex.delay() : 長時間のdelay()でも、中でM5Lite.update()を定期的に呼び出してくれる
ちょっと調整中ですが、上記みたいな拡張をしています。端末によってLEDなどのアクセス方法が違うので、統一しています。
delay()は5秒などの間隔にすると、update()が実行されずにボタンが更新されません。なので内部的に短いdelay()とupdate()を交互に呼び出すような感じにしています。まだちょっとボタン周りが意図した動きをしていないので手を入れます、、、
非互換性
非推奨関数や、個人的に微妙な関数はがっつり削ってあります。シンプルな構造にしてから、共通化をしていきたいと思っています。もう少し固まってからリファレンス資料を充実したいと思っています。
デバッグ

シリアルモニタからデバッグ情報を表示できるようにしています。update()の中で処理していますので、M5Lite.Ex.delay()を呼び出せば自動的に使えるようになります。
INFO
M5Lite Info Mac Address : 8C:AA:B5:??:??:?? IP Address : 0.0.0.0 Board : M5Stack Core2 LCD : Width:320, Height:240 RTC : 2020-09-08 22:27:10
こんな感じの表示になります。Wi-Fiの情報はM5Liteライブラリより前にWiFi.hを読み込んでいる場合だけ表示されます。ここは徐々に追加していく予定です。
AXP192
AXP192 : Battery Temp : 28.8 C V : 4.188 V I : 0.0 mA ASP(ESP32) V : 4.994 V VBus(USB) V : 5.046 V I : 60.0 mA VIN(5V-In) V : 0.000 V I : 0.0 mA
AXP192の情報がざっくり表示されます。DC出力電圧や各GPIOの状態も今後追加予定。
IMU
IMU : MPU6886(6-AXIS) ACCEL X : -0.025391 Y : 0.012695 Z : 1.083496 GYRO X : 1.586914 Y : 12.084961 Z : -3.723145 TEMP T : 43.283352 C
搭載しているIMUと、現在値を取得します。加速度とかは置き方によって数値を確認する必要があるので、たまに使うかな?
RTC
RTC : 2020-09-08 22:30:41
時間がでるだけなのでINFOでいいかも、、、
MEM
=============================================================== Memory Info =============================================================== esp_get_free_heap_size() : 262060 esp_get_minimum_free_heap_size() : 255364 xPortGetFreeHeapSize() : 262060 xPortGetMinimumEverFreeHeapSize() : 255364 heap_caps_get_free_size(MALLOC_CAP_EXEC) : 179708 heap_caps_get_free_size(MALLOC_CAP_32BIT) : 312952 heap_caps_get_free_size(MALLOC_CAP_8BIT) : 262060 heap_caps_get_free_size(MALLOC_CAP_DMA) : 262060 heap_caps_get_free_size(MALLOC_CAP_PID2) : 0 heap_caps_get_free_size(MALLOC_CAP_PID3) : 0 heap_caps_get_free_size(MALLOC_CAP_PID3) : 0 heap_caps_get_free_size(MALLOC_CAP_PID4) : 0 heap_caps_get_free_size(MALLOC_CAP_PID5) : 0 heap_caps_get_free_size(MALLOC_CAP_PID6) : 0 heap_caps_get_free_size(MALLOC_CAP_PID7) : 0 heap_caps_get_free_size(MALLOC_CAP_SPIRAM) : 0 heap_caps_get_free_size(MALLOC_CAP_INTERNAL) : 312952 heap_caps_get_free_size(MALLOC_CAP_DEFAULT) : 262060 heap_caps_get_free_size(MALLOC_CAP_INVALID) : 0 heap_caps_get_largest_free_block(MALLOC_CAP_EXEC) : 113792 heap_caps_get_largest_free_block(MALLOC_CAP_32BIT) : 113792 heap_caps_get_largest_free_block(MALLOC_CAP_8BIT) : 113792 heap_caps_get_largest_free_block(MALLOC_CAP_DMA) : 113792 heap_caps_get_largest_free_block(MALLOC_CAP_PID2) : 0 heap_caps_get_largest_free_block(MALLOC_CAP_PID3) : 0 heap_caps_get_largest_free_block(MALLOC_CAP_PID3) : 0 heap_caps_get_largest_free_block(MALLOC_CAP_PID4) : 0 heap_caps_get_largest_free_block(MALLOC_CAP_PID5) : 0 heap_caps_get_largest_free_block(MALLOC_CAP_PID6) : 0 heap_caps_get_largest_free_block(MALLOC_CAP_PID7) : 0 heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM) : 0 heap_caps_get_largest_free_block(MALLOC_CAP_INTERNAL) : 113792 heap_caps_get_largest_free_block(MALLOC_CAP_DEFAULT) : 113792 heap_caps_get_largest_free_block(MALLOC_CAP_INVALID) : 0 heap_caps_get_minimum_free_size(MALLOC_CAP_EXEC) : 179688 heap_caps_get_minimum_free_size(MALLOC_CAP_32BIT) : 306236 heap_caps_get_minimum_free_size(MALLOC_CAP_8BIT) : 255364 heap_caps_get_minimum_free_size(MALLOC_CAP_DMA) : 255364 heap_caps_get_minimum_free_size(MALLOC_CAP_PID2) : 0 heap_caps_get_minimum_free_size(MALLOC_CAP_PID3) : 0 heap_caps_get_minimum_free_size(MALLOC_CAP_PID3) : 0 heap_caps_get_minimum_free_size(MALLOC_CAP_PID4) : 0 heap_caps_get_minimum_free_size(MALLOC_CAP_PID5) : 0 heap_caps_get_minimum_free_size(MALLOC_CAP_PID6) : 0 heap_caps_get_minimum_free_size(MALLOC_CAP_PID7) : 0 heap_caps_get_minimum_free_size(MALLOC_CAP_SPIRAM) : 0 heap_caps_get_minimum_free_size(MALLOC_CAP_INTERNAL) : 306236 heap_caps_get_minimum_free_size(MALLOC_CAP_DEFAULT) : 255364 heap_caps_get_minimum_free_size(MALLOC_CAP_INVALID) : 0
メモリの空き容量を取得します。読み解くのが結構たいへんです、、、
WIFI
=============================================================== Wi-Fi Connect =============================================================== ...............................Connect IP Address : 192.168.0.2
なんとWi-Fiに接続しちゃいます。本当はSSIDとKEYを指定して接続できるようにする予定です。一度設定すれば、次からは引数無しで呼び出すことで最後に接続したときの情報が保存されます。
NTP
=============================================================== NTP Sync =============================================================== NTP : ntp.jst.mfeed.ad.jp Local Time : 2020-09-08 22:33:29 RTC : 2020-09-08 22:33:29
Wi-Fiに接続してある場合に、NTPサーバーと同期してRTCを設定します。
RESET
ESP32をリセットします。
その他
URLを指定してOTAをしたり、GPIOの状態を表示したりもしたいですがもう少し時間がかかるかな?
使い方

まだ調整中なので、本格利用するのはおすすめできませんがESP32Liteとかで検索するとインストールできます。たぶんM5Liteでも検索できるはず?
もともとおもちゃ箱的なライブラリなので、中身と名前がずれていっています、、、
#include <WiFi.h> // Define before M5Lite #include "M5Lite.h" void setup() { M5Lite.begin(); M5Lite.Axp.ScreenBreath(10); M5Lite.Imu.Init(); M5Lite.dis.drawpix(0, CRGB(255, 0, 0)); M5Lite.dis.drawpix(2, CRGB(0, 255, 0)); M5Lite.dis.drawpix(4, CRGB(0, 0, 255)); M5Lite.dis.drawpix(6, CRGB::White); // Info & Help M5Lite.Debug.dispInfo(); M5Lite.Debug.dispHelp(); } void loop() { static int vol = 11; M5Lite.Lcd.setCursor(0, 4, 1); M5Lite.Lcd.printf("M5StackAuto\n"); M5Lite.Lcd.printf("Battery\n"); M5Lite.Lcd.printf(" Temp :%6.1f\n", M5Lite.Axp.GetTempInAXP192()); // AXP192 Internal temperature M5Lite.Lcd.printf(" V(V) :%6.3f\n", M5Lite.Axp.GetBatVoltage()); // Battery Voltage(3.0V-4.2V) M5Lite.Lcd.printf(" I(mA):%6.1f\n", M5Lite.Axp.GetBatCurrent()); // Battery Current(+:charge, -:decharge) M5Lite.Lcd.printf("ASP\n"); M5Lite.Lcd.printf(" V(V) :%6.3f\n", M5Lite.Axp.GetAPSVoltage()); // ESP32 Voltage M5Lite.Lcd.printf("VBus(USB)\n"); M5Lite.Lcd.printf(" V(V) :%6.3f\n", M5Lite.Axp.GetVBusVoltage()); // USB Voltage M5Lite.Lcd.printf(" I(mA):%6.1f\n", M5Lite.Axp.GetVBusCurrent()); // USB Current M5Lite.Lcd.printf("VIN(5V-In)\n"); M5Lite.Lcd.printf(" V(V) :%6.3f\n", M5Lite.Axp.GetVinVoltage()); // 5V IN Voltage M5Lite.Lcd.printf(" I(mA):%6.1f\n", M5Lite.Axp.GetVinCurrent()); // 5V IN Current if (M5Lite.Imu.imuType != 0) { float ax; float ay; float az; float gx; float gy; float gz; float t; M5Lite.Imu.getAccelData(&ax, &ay, &az); M5Lite.Imu.getGyroData(&gx, &gy, &gz); M5Lite.Imu.getTempData(&t); if (!M5Lite.Ex.useLcd) { Serial.printf(" %f,%f,%f,%f,%f,%f,%f\n", ax, ay, az, gx, gy, gz, t); } M5Lite.Lcd.printf(" Accel Gyro\n"); M5Lite.Lcd.printf("X%5.2f%7.1f\n", ax, gx); M5Lite.Lcd.printf("Y%5.2f%7.1f\n", ay, gy); M5Lite.Lcd.printf("Z%5.2f%7.1f\n", az, gz); } RTC_TimeTypeDef RTC_TimeStruct; RTC_DateTypeDef RTC_DateStruct; M5Lite.Rtc.GetTime(&RTC_TimeStruct); M5Lite.Rtc.GetData(&RTC_DateStruct); M5Lite.Lcd.printf("%04d-%02d-%02d\n", RTC_DateStruct.Year, RTC_DateStruct.Month, RTC_DateStruct.Date); M5Lite.Lcd.printf("%02d:%02d:%02d\n", RTC_TimeStruct.Hours, RTC_TimeStruct.Minutes, RTC_TimeStruct.Seconds); if (M5Lite.BtnA.wasPressed()) { Serial.println("M5Lite.BtnA.wasPressed()"); M5Lite.Beep.tone(1000, 100); } if (M5Lite.BtnB.wasPressed()) { Serial.println("M5Lite.BtnB.wasPressed()"); vol--; M5Lite.Beep.setVolume(vol); Serial.printf("vol = %d\n", vol); } if (M5Lite.BtnC.wasPressed()) { Serial.println("M5Lite.BtnC.wasPressed()"); vol++; M5Lite.Beep.setVolume(vol); Serial.printf("vol = %d\n", vol); } if (M5Lite.BtnA.wasReleased()) { Serial.println("M5Lite.BtnA.wasReleased()"); } if (M5Lite.BtnB.wasReleased()) { Serial.println("M5Lite.BtnB.wasReleased()"); } if (M5Lite.BtnC.wasReleased()) { Serial.println("M5Lite.BtnC.wasReleased()"); } if (M5Lite.Touch.enable) { TouchPoint_t p = M5Lite.Touch.getPressPoint(); M5Lite.Lcd.printf("Touch\n"); M5Lite.Lcd.printf(" X : %4d\n", p.x); M5Lite.Lcd.printf(" Y : %4d\n", p.y); } if (M5Lite.BtnA.isPressed()) { M5Lite.Ex.setLed(true); } else { M5Lite.Ex.setLed(false); } if (M5Lite.BtnB.isPressed()) { M5Lite.Ex.setVibration(true); } else { M5Lite.Ex.setVibration(false); } // delay & M5Lile.update() M5Lite.Ex.delay(100); }
いまのところ、こんな感じのコードになっています。M5Lite.begin()と書いてありますが、M5.begin()とかでも動きます。
まとめ
一通りM5Stack Core2の機能が使えるようには作っていますが、デバッグ機能の作り込みが楽しくてなかなか進んでいません、、、
コメント