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

# 発端


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

M5stickCにデフォルトで入っているファームがイケてて[ワクワクする](https://twitter.com/masanori_y_/status/1259111558015148035)という話だったので楽しみにしていましたが、中古なのでファーム書き換え済みで、デフォルトファームは入っておらず。当然ですね。

いろいろ調べると、最新のM5StickCの[FactroyTest](https://github.com/m5stack/M5StickC/tree/master/examples/Basics/FactoryTest)に入っているという噂を聞いたので、試してみることにします。

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

[先人たちの解説](https://qiita.com/itiB_S144/items/7a232c1a31151fcb5e5b)を参考に、上記のgithubにあるFactoryTest.inoをビルドして、焼いてみると、「やった動いた！」と思いきや、すぐに

~~~
MPU6886 error
~~~

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

# この```MPU6886 error```はなんだ？

[github](https://github.com/m5stack/M5StickC/blob/master/examples/Basics/FactoryTest/FactoryTest.ino)のソースを見る感じ、この部分で吐き出している。

~~~c:FactoryeEst.ino
if (M5.MPU6886.Init() != 0)
     {
         ErrorMeg(0x31, "MPU6886 error ");
     }
~~~

```M5.MPU6886.Init() != 0)```の部分でこけているのか。

・・・何かのデバイスの初期化に失敗している？


# M5StickCのIMUには、MPU6886搭載品(新)とSH200Q搭載品(旧)の２種類ある

「MPU6886」って、なんぞ？と思って調べてみると、6軸センサ(IMU)のことみたいで、[スイッチサイエンスさんのM5stickc製品ページ](https://www.switch-science.com/catalog/5517/)に以下の記載がありました。

> 本製品に搭載の6軸センサにつきまして、初期モデルに搭載のSH200Qから、2019年7月24日当社入荷分以降はMPU6886に変更されました。（2019年8月13日）

ひょっとして、中古で買ったM5StickCのIMUは「MPU6886」ではなく古い「SH200Q」でセンサが載っていて、それで初期化に失敗していることが原因かも？

# ならば、コードを書き換えよう

「MPU6886」用の処理を 「SH200Q」 の処理に書き換えてればいいのかな、という推測のものといろいろと周辺コードを読んでいると、[こちらのコード](https://github.com/m5stack/M5StickC/blob/master/src/IMU.cpp)にSH200Qの初期化関数っぽいものを発見。

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

```diff: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 width="300" alt="IMG_9918.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638709/e5c6ed85-fa16-b48c-7618-7629efdf3ad4.jpeg">

めでたしめでたし！

# 追記(2020/5/18)

せっかくなんで、昨日書いた上のパッチを、本家にプルリクしとくかなー！と思ってgithubを眺めていたら、今日ちょっと前にこの記事のパッチをベースに[プルリクしてくれている方](https://github.com/m5stack/M5StickC/pull/105)がいたよ！仕事が早い！

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">この人の記事参考にしてPR出しておきました<br>最新版はFastLEDの依存も消えていたので、いい感じ</p>&mdash; たなかまさゆき (@tnkmasayuki) <a href="https://twitter.com/tnkmasayuki/status/1262260420951212033?ref_src=twsrc%5Etfw">May 18, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

感謝感謝！

# 追記(2020/5/20)

本家に[マージ](https://github.com/m5stack/M5StickC/commit/e7e52360f25efc8cf66f3ec2ec79c83387618e76#diff-66b057e28fd05ffb9749e2922a2ff788)されました！😆😆🎉