発端
中古でM5StickCを購入しました。
M5stickCにデフォルトで入っているファームがイケててワクワクするという話だったので楽しみにしていましたが、中古なのでファーム書き換え済みで、デフォルトファームは入っておらず。当然ですね。
いろいろ調べると、最新のM5StickCのFactroyTestに入っているという噂を聞いたので、試してみることにします。
さっそくデフォルトファームに更新、そしてスタック
先人たちの解説を参考に、上記のgithubにあるFactoryTest.inoをビルドして、焼いてみると、「やった動いた!」と思いきや、すぐに
MPU6886 error
というエラーがM5StickCの画面に表示され、スタック。これが本当のM5スタッ...
このMPU6886 error
はなんだ?
githubのソースを見る感じ、この部分で吐き出している。
if (M5.MPU6886.Init() != 0)
{
ErrorMeg(0x31, "MPU6886 error ");
}
M5.MPU6886.Init() != 0)
の部分でこけているのか。
・・・何かのデバイスの初期化に失敗している?
M5StickCのIMUには、MPU6886搭載品(新)とSH200Q搭載品(旧)の2種類ある
「MPU6886」って、なんぞ?と思って調べてみると、6軸センサ(IMU)のことみたいで、スイッチサイエンスさんのM5stickc製品ページに以下の記載がありました。
本製品に搭載の6軸センサにつきまして、初期モデルに搭載のSH200Qから、2019年7月24日当社入荷分以降はMPU6886に変更されました。(2019年8月13日)
ひょっとして、中古で買ったM5StickCのIMUは「MPU6886」ではなく古い「SH200Q」でセンサが載っていて、それで初期化に失敗していることが原因かも?
ならば、コードを書き換えよう
「MPU6886」用の処理を 「SH200Q」 の処理に書き換えてればいいのかな、という推測のものといろいろと周辺コードを読んでいると、こちらのコードにSH200Qの初期化関数っぽいものを発見。
int IMU::Init(void) {
int imu_flag = M5.Sh200Q.Init();
if (imu_flag != 0) {
imu_flag = M5.Mpu6886.Init();
...
M5.Mpu6886.Init()
を M5.Sh200Q.Init()
に書き換えればいいのかな?と思いきや、よくよくみるとこの IMU:Init()
を使えば、どっちでも動くようによろしくやってくれるのでは...
結論
以下のコード変更で、古いM5StickCでも新しいデフォルトファームが動きました。
diff --git a/examples/Basics/FactoryTest/FactoryTest.ino b/examples/Basics/FactoryTest/FactoryTest.ino
index 308cb71..94d782e 100644
--- a/examples/Basics/FactoryTest/FactoryTest.ino
+++ b/examples/Basics/FactoryTest/FactoryTest.ino
@@ -650,7 +644,7 @@ line_3d_t rect[12] = {
{.start_point = {-1, 1, -1}, .end_point = {-1, -1, -1}},
};
-void MPU6886Test()
+void IMUTest()
{
float accX = 0;
float accY = 0;
@@ -685,7 +679,7 @@ void MPU6886Test()
while ((!M5.BtnA.isPressed()) && (!M5.BtnB.isPressed()))
{
- M5.MPU6886.getAccelData(&accX, &accY, &accZ);
+ M5.IMU.getAccelData(&accX, &accY, &accZ);
if ((accX < 1) && (accX > -1))
{
theta = asin(-accX) * 57.295;
@@ -728,7 +722,7 @@ void MPU6886Test()
Disbuff.setTextColor(WHITE);
Disbuff.setTextSize(1);
Disbuff.fillRect(0,0,52,18,Disbuff.color565(20,20,20));
- Disbuff.drawString("MPU6886",5,5,1);
+ Disbuff.drawString("IMU",5,5,1);
Displaybuff();
last_theta = theta;
@@ -1293,9 +1287,9 @@ void setup()
{
ErrorMeg(0x51, "MicroPhone error");
}
- if (M5.MPU6886.Init() != 0)
+ if (M5.IMU.Init() != 0)
{
- ErrorMeg(0x31, "MPU6886 error ");
+ ErrorMeg(0x31, "IMU error ");
}
if( InitIRTx() != true )
{
@@ -1355,7 +1349,7 @@ uint8_t xData, yData;
void loop()
{
delay(100);
- MPU6886Test();
+ IMUTest();
DisplayRTC();
DisplayMicro();
DisIRSend();
そして、👇これがデフォルトファームが動いているところ。M5StickCを手に持って傾けると、IMUがそれを検知して、液晶画面の真ん中にあるキューブが傾きに合わせて傾く。ワクワク。
めでたしめでたし!
追記(2020/5/18)
せっかくなんで、昨日書いた上のパッチを、本家にプルリクしとくかなー!と思ってgithubを眺めていたら、今日ちょっと前にこの記事のパッチをベースにプルリクしてくれている方がいたよ!仕事が早い!
この人の記事参考にしてPR出しておきました
— たなかまさゆき (@tnkmasayuki) May 18, 2020
最新版はFastLEDの依存も消えていたので、いい感じ
感謝感謝!
追記(2020/5/20)
本家にマージされました!😆😆🎉