(2014.5.18 作成)
こちらのサイトで紹介しているMPU-6050クラスを使用するサンプルです。コードはこちらからダウンロードすることが出来ます。
STM32とArduinoどちらも一定時間ごとにセンサーの値を読み取ります。
10ms単位で変換を繰り返します。STM Studioにて動作確認を行うため、変換データはグローバル変数としています。
#include "DKS_I2C_Discovery_F3.h" #include "DKS_MPU6050.h" #include "DKS_Wait_Discovery_F3.h" extern "C" { float accerelate[3] = {0}; float gryoData[3] = {0}; float temperature(0.0f); int main(void) { DKS::I2C::I2C i2c(I2C1,2,2); DKS::MPU6050 mpu(&i2c, false); bool res; //接続確認 ACKを返すか = このアドレスのデバイスが存在するか res = i2c.CheckAck(mpu.GetDeviceAddress()); if (res==false) while(1); //接続確認 MPU6050が機能しているか。Who Am Iに返事するか。 res= mpu.TestConnection(); if (res==false) while(1); mpu.Init(); DKS::Wait wait(TIM2); while(1) { mpu.GetData(&accerelate[0], temperature, &gryoData[0]); wait.wait_ms(10); } } }
200ms毎にデータを取得します。変換データはシリアルモニタで確認します。
またVDDは3.46VがMaxなのでBOB-08745を使用して電圧変換しています。
このプログラムに限った話ではありませんが、Arduinoの場合STM32と異なりプログラムがsetupとloopの2つに分かれています。この結果i2cとmpu6050は setup()でnewしてloop()で使うようにしなければsetup()関数を抜けたところで削除されてしまいます。Arduinoって簡単にしようとして逆に難しくしているってこと無いでしょうか???
#include <DKS_I2C_Arduino.h> #include <DKS_I2C_Base.h> #include <DKS_MPU6050.h> float accerelate[3] = {0}; float gryoData[3] = {0}; float temperature(0); DKS::MPU6050 *mpu; DKS::I2C::I2C *i2c; void setup() { i2c=new DKS::I2C::I2C(); Serial.begin(9600) ; mpu=new DKS::MPU6050(i2c, false); //false = address 0xD0 bool res; //接続確認 ACKを返すか = このアドレスのデバイスが存在するか res = i2c->CheckAck(mpu->GetDeviceAddress()); if (res==false) while(1); //接続確認 MPU6050が機能しているか。Who Am Iに返事するか。 res= mpu->TestConnection(); if (res==false) while(1); mpu->Init(); Serial.println("accerelate / Temperature / Gryo"); } void loop() { mpu->GetData(&accerelate[0], temperature, &gryoData[0]); delay(200); Serial.print(accerelate[0]); Serial.print(","); Serial.print(accerelate[1]); Serial.print(","); Serial.print(accerelate[2]); Serial.print(" / "); Serial.print(temperature); Serial.print(" / "); Serial.print(gryoData[0]); Serial.print(","); Serial.print(gryoData[1]); Serial.print(","); Serial.println(gryoData[2]); }