Groveセンサーで加速度&ジャイロを探していたら、9軸(加速度&ジャイロ&デジタルコンパス)の製品があったので試してみました。
試した作業はwikiのままなのですが、いくつか修正が必要だったので、記録として残しておきます。
【重要】wikiの情報は「v1.0」のものなので、チップが異なりますので注意してください。(MPU6050用)
準備
今回はESP32開発ボードからブレッドボード経由で接続しました。
- ESP32開発ボード
- GROVE IMU 9DOF v2.0(含AWG Groveケーブル)
- ブレッドボード
- ジャンパーワイヤー(4本)
接続
GroveのコネクタとESP32のピンをつなぎます。
I2Cは21番(SDA)と22番(SDL)になります。
ソースのダウンロード
サンプルプログラムをダウンロードします。
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」のパスが変わっていますので、以下のように修正します。
# 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が定義されていないためエラーとなっています。
なので、強制的に追加します。(いい名前ではないですが)
# define BUFFER_LENGTH 32
また、min()の宣言が異なっているので、こちらも修正しておきます。
for (uint8_t k = 0; k < length; k += std::min<int>(length, BUFFER_LENGTH)) {
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の手順で進めていけば大丈夫そうです。