M5Stackのプログラム開発環境で、PlatformIOがよさそうとのことで、VisualStudio Codeで少し試してました。
ですが、M5Stackによる傾斜計が、この環境ではうまく動きませんでした。
開発環境と実行結果の整理
色々と試したところ、Arduino IDE環境でもライブラリのバージョンによって動かなくなったりしました。整理してみたのが、下記の表です。
開発環境とビルド&実行結果 | 備考 | ||||||
---|---|---|---|---|---|---|---|
項番 | PlatformIO | Arduino IDE | M5Stackライブラリ | ESP32 BLE for Arduino | ビルド | 実行 | |
1 | - | 1.8.5(スイッチサイエンス 版) |
0.2.2 | 0.4.9 | ○ | ○ | 開発時の環境 |
2 | - | 同上 | 同上 | 0.4.7 | ○ | ○ | 開発時に一番近い環境。※1 |
3 | - | 同上 | 0.2.5 | 同上 | ○ | ○ | M5Stackライブラリを最新化。 |
4 | - | 同上 | 同上 | 1.0.1 | × | - | ESP32 BLE for Arduinoライブラリを最新化。※2 |
5 | - | 1.8.8 | 同上 | 1.0.1 | ○ | × | Arduino IDEを最新にし、ボードマネージャで「Arduino core for the Arduino」をインストール。※3 |
6 | ○ | - | 同上 | 同上 | ○ | × | PlatformIOでの挙動。 →MPU9250を検出しない。 |
※1 2019/1/1現在、ESP32 BLE for Arduinoの0.4.9が使えなくなっているため、0.4.7にした。 ※2 「fatal error: esp_bt.h: No such file or directory」というコンパイルエラーが発生。 →「Arduino core for the Arduino」を最新化する必要がある模様。 ※3 ビルドは通るが、MPU9250をうまく検出しない。(WHO AM Iが00h) →PlatformIOでの挙動と同じになった。 |
ざっとまとめると、
- Arduino IDE環境で、「ESP32 BLE for Arduino」ライブラリをバージョン0.4.7(0.4.9)にしておけば問題ない。
- 「ESP32 BLE for Arduino」ライブラリを1.0.1に更新する場合、「Arduino core for the ESP32」も更新する必要がある。
- 「Arduino core for the ESP32」を最新化(stable版)すると、MPU9250を検出しなくなる。(具体的には、WHO AM Iレジスタのreadで、0x71になるはずが0x00となる)
- PlatformIO環境、Arduino IDE環境で同じ挙動。
となります。
以下、動作確認で使用したサンプルコードです。(1秒ごとに、WHO AM Iレジスタをreadする単純なものです)
#include “M5Stack.h”
#include “utility/MPU9250.h”MPU9250 IMU;
void setup()
{
M5.begin();
Wire.begin();// Set up for data display
M5.Lcd.setTextSize(1); // Set text size to normal, 2 is twice normal etc.
}void loop()
{
M5.Lcd.fillScreen(BLACK); // clears the screen and buffer
// Read the WHO_AM_I register, this is a good test of communication
byte c = IMU.readByte(MPU9250_ADDRESS, WHO_AM_I_MPU9250);
Serial.print(“MPU9250 “);
Serial.print(“I AM “);
Serial.print(c, HEX);
Serial.print(” I should be “);
Serial.println(0x71, HEX);M5.Lcd.setCursor(20, 0);
M5.Lcd.print(“MPU9250”);
M5.Lcd.setCursor(0, 10);
M5.Lcd.print(“I AM”);
M5.Lcd.setCursor(0, 20);
M5.Lcd.print(c, HEX);
M5.Lcd.setCursor(0, 30);
M5.Lcd.print(“I Should Be”);
M5.Lcd.setCursor(0, 40);
M5.Lcd.print(0x71, HEX);
delay(1000);
}
ハードウェアの挙動を見てみる
ハードウェアの挙動はどうなっているんだろうと思って、I2Cバスの信号をオシロスコープで見てみました。(上段が正常動作時、下段が異常動作時)
異常動作時でも、波形を見た感じ、うまく動いているように見えます。WHO AM Iレジスタの読み出しに対して、ちゃんと0x71を送り返しています。
違いは水色で囲んだ部分で、正常動作時はwrite(WHO AM Iレジスタ番号の0x75)とread(WHO AM Iレジスタの内容0x71)の間に1クロック分の隙間があります。この違いが影響しているのかまではわかっていませんが、「MPU9250はそれなりに動いているが、APIからの戻り値がおかしい」ことがわかりました。
Arduino IDE環境での対処方法を調査
ネットでググってみたところ、mgo-tec電子工作さんの情報で、stable版でI2Cが正しく動作しないとのことでした。こちらの情報によると、2018/8/14のcommitで修正されているとのこと。
そこで、Arduino IDEの環境設定で、ボードマネージャのURL指定をstable版ではなくdeveloper版に、「Arduino core for the ESP32」を一番新しい1.0.1-rc2にupdateして、ビルドし直してみました。
結果は、正常動作するようになりました。I2Cの信号波形は、上記の異常動作時の波形と同様(write/read間の隙間がない)です。
PlatformIO環境での対処方法を調査
ここまでで、Arduio IDE環境では正常動作するようになりましたが、PlatformIO環境ではまだ正常動作してません。
Arduino IDE環境と同様に、「Arduino core for the ESP32」ライブラリを最新化してみればよさそうです。
PlatformIOでのライブラリをざっと見たところ、下記にあるものが「Arduino core for the ESP32」ライブラリに相当するようです。(ユーザー名は、各環境に合わせて読み替えてください)
C:Usersユーザー名.platformiopackagesframework-arduinoespressif32
なお、PlatformIOでの表現は「Espressif 32」となっていて、バージョンは「1.5.0」となっています。(2019/1/1時点での最新)
ソースファイル(esp32-hal-i2c.c)の日付を見ると、2018/7/30となっています。前述の通り、対処版のコミットが2018/8/14なので古い版となっていることがわかります。(Release Notesでは、「released about a month ago」となってはいるんですが…)
Arduino IDE環境での「Arduino core for the ESP32」ライブラリとのdiffを取ってみたところ、バージョン1.0.0のものとほぼ一致しました。(「Arduino core for the ESP32の1.0.0≒Espressif 32の1.5.0」という感じでしょうか)
PlatformIO環境では、すでに最新バージョンとなっているように見えているので更新しようがありません。
そこで、関係するソース(Wire、esp32-hal-i2cあたり)だけ、Arduino IDE環境から持ってきてみました。
具体的には、下記の4ファイルの置き換えになります。
- C:Usersユーザー名.platformiopackagesframework-arduinoespressif32librariesWiresrcWire.h
- C:Usersユーザー名.platformiopackagesframework-arduinoespressif32librariesWiresrcWire.cpp
- C:Usersユーザー名.platformiopackagesframework-arduinoespressif32coresesp32esp32-hal-i2c.h
- C:Usersユーザー名.platformiopackagesframework-arduinoespressif32coresesp32esp32-hal-i2c.c
結果としては、この対処(ソース置き換え)でMPU9250を検出するようになりました。