2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

古いM5StickCで、新しいM5StickCのデフォルトファームを動かす

Last updated at Posted at 2020-05-17

発端

中古でM5StickCを購入しました。

M5stickCにデフォルトで入っているファームがイケててワクワクするという話だったので楽しみにしていましたが、中古なのでファーム書き換え済みで、デフォルトファームは入っておらず。当然ですね。

いろいろ調べると、最新のM5StickCのFactroyTestに入っているという噂を聞いたので、試してみることにします。

さっそくデフォルトファームに更新、そしてスタック

先人たちの解説を参考に、上記のgithubにあるFactoryTest.inoをビルドして、焼いてみると、「やった動いた!」と思いきや、すぐに

MPU6886 error

というエラーがM5StickCの画面に表示され、スタック。これが本当のM5スタッ...

このMPU6886 errorはなんだ?

githubのソースを見る感じ、この部分で吐き出している。

FactoryeEst.ino
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の初期化関数っぽいものを発見。

IMU.cpp
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でも新しいデフォルトファームが動きました。

FactoryeEst.ino
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がそれを検知して、液晶画面の真ん中にあるキューブが傾きに合わせて傾く。ワクワク。
IMG_9918.jpg

めでたしめでたし!

追記(2020/5/18)

せっかくなんで、昨日書いた上のパッチを、本家にプルリクしとくかなー!と思ってgithubを眺めていたら、今日ちょっと前にこの記事のパッチをベースにプルリクしてくれている方がいたよ!仕事が早い!

感謝感謝!

追記(2020/5/20)

本家にマージされました!😆😆🎉

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?