GROVE「IMU 9DOF v2.0」を試してみた

Groveセンサーで加速度＆ジャイロを探していたら、9軸（加速度＆ジャイロ＆デジタルコンパス）の[製品](http://www.seeedstudio.com/item_detail.html?p_id=2400)があったので試してみました。

試した作業は[wiki](https://wiki.seeedstudio.com/Grove-IMU_9DOF_v2.0/)のままなのですが、いくつか修正が必要だったので、記録として残しておきます。

【重要】wikiの情報は「v1.0」のものなので、チップが異なりますので注意してください。（MPU6050用）

# 準備
今回はESP32開発ボードからブレッドボード経由で接続しました。

- ESP32開発ボード
- GROVE IMU 9DOF v2.0（含AWG Groveケーブル）
- ブレッドボード
- ジャンパーワイヤー（4本）

# 接続
GroveのコネクタとESP32のピンをつなぎます。
I2Cは21番（SDA）と22番（SDL）になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/bcaee4ba-d705-30c7-1537-a61285871f50.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/9e6eef7a-53a0-8dda-60fb-2141619a931a.png)

# ソースのダウンロード
サンプルプログラムをダウンロードします。
https://raw.githubusercontent.com/SeeedDocument/Grove-IMU_9DOF_v2.0/master/res/Grove_IMU_9DOF_9250.zip

【注意】wikiのライブラリへのリンクは古いものです

その後、スケッチの「ライブラリをインクルード」でダウンロードしてきたファイルを指定します。

# コンパイル＆ビルド
スケッチ例から「IMU_9DOF_Demo_Compass_Calibrated」を指定して読み込み、コンパイルします。

しかし以下のエラーになります。

```
In file included from C:\Users\mine\Documents\Arduino\libraries\Grove_IMU_9DOF_9250\examples\IMU_9DOF_Demo_Compass_Calibrated\IMU_9DOF_Demo_Compass_Calibrated.ino:6:0:

C:\Users\mine\Documents\Arduino\libraries\Grove_IMU_9DOF_9250/MPU9250.h:41:26: fatal error: avr/pgmspace.h: No such file or directory
```

「pgmspace.h」のパスが変わっていますので、以下のように修正します。

```MPU9250.h
#ifndef _MPU9250_H_
#define _MPU9250_H_

#include "I2Cdev.h"
#if (defined(__AVR__))
#include <avr/pgmspace.h>
#else
#include <pgmspace.h>
#endif
```

もう一度コンパイルすると、今度は別のエラーになります。

```
C:\Users\mine\Documents\Arduino\libraries\Grove_IMU_9DOF_9250\I2Cdev.cpp: In static member function 'static int8_t I2Cdev::readBytes(uint8_t, uint8_t, uint8_t, uint8_t*, uint16_t)':

C:\Users\mine\Documents\Arduino\libraries\Grove_IMU_9DOF_9250\I2Cdev.cpp:276:62: error: 'BUFFER_LENGTH' was not declared in this scope

             for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) {

                                                              ^

C:\Users\mine\Documents\Arduino\libraries\Grove_IMU_9DOF_9250\I2Cdev.cpp: In static member function 'static int8_t I2Cdev::readWords(uint8_t, uint8_t, uint8_t, uint16_t*, uint16_t)':

C:\Users\mine\Documents\Arduino\libraries\Grove_IMU_9DOF_9250\I2Cdev.cpp:416:70: error: 'BUFFER_LENGTH' was not declared in this scope

             for (uint8_t k = 0; k < length * 2; k += min(length * 2, BUFFER_LENGTH)) {

                                                                      ^
```

今は、BUFFER_LENGTHが定義されていないためエラーとなっています。
なので、強制的に追加します。（いい名前ではないですが）

```I2Cdev.cpp：90
#define BUFFER_LENGTH 32
```

また、min()の宣言が異なっているので、こちらも修正しておきます。

```I2Cdev.cpp：278
            for (uint8_t k = 0; k < length; k += std::min<int>(length, BUFFER_LENGTH)) {
```
```I2Cdev.cpp：418
            for (uint8_t k = 0; k < length * 2; k += std::min<int>(length * 2, BUFFER_LENGTH)) {
```

※本当は、他のところの「min()」も直したほうがいいです

これでビルドに通るようになります。
（ワーニングは残ってますが、とりあえず気にしない）

## その他の注意事項
古いコード（MPU6050のライブラリ）等が先に入っていたりすると、ソースファイルの参照先がそっちになっていたりします。
おかしいなと思ったら、ファイルのパスを確認してみてください。

# 実行
ビルドしたコードをESP32に送り、実行すると、まず以下のようなメッセージがシリアルモニタに表示されます。

```
MPU9250 connection failed
```

テスト接続に失敗しているようですが、その後は気にせずに、以下のようなに計測値が表示されます。

```
calibration parameter: 
0.00         0.00         0.00
     
Acceleration(g) of X,Y,Z:
0.03,0.05,1.03
Gyro(degress/s) of X,Y,Z:
1.30,0.37,-1.35
Compass Value of X,Y,Z:
25.20,31.64,22.85
The clockwise angle between the magnetic north and X-Axis:
51.47 
The clockwise angle between the magnetic north and the projection of the positive X-Axis in the horizontal plane:
51.26
```

センサーを動かすと、一応値も変わるようです。

# まとめ
途中、エラーの修正が必要ですが、基本的にはwikiの手順で進めていけば大丈夫そうです。