おことわり
必ずしも貴方の開発環境での正常動作を保証するものではありません.あらかじめご了承下さい.


GR-SAKURA + MPU-9150 読み出しプログラム [2014/05/19]

//MPU-9150 読み出し&出力サンプル by I.N.
//接続: AN4=SDA, AN5=SCL, どちらも4.7kオームで3.3Vプルアップ
//2013.12.18 ver.1.0 初版
//2014.05.19 ver.1.1 FreeRXduinoローカルビルド環境用に修正

#include <rxduino.h>
#include <Wire.h>
TwoWire Wire;

#define delayus(t) delayMicroseconds(t)
#define delayms(t) delay(t)
unsigned int dt,t0;

//加速度&ジャイロ
#define AG_I2C_ADR      0x68
#define AG_CONFIG       0x1A
#define AG_GYRO_CONFIG  0x1B
#define AG_ACCEL_CONFIG 0x1C
#define AG_INT_PIN_CFG  0x37
#define AG_PWR_MGMT1    0x6B
#define AG_ACCEL_XOUT_H 0x3B
#define AG_ACCEL_XOUT_L 0x3C
#define AG_ACCEL_YOUT_H 0x3D
#define AG_ACCEL_YOUT_L 0x3E
#define AG_ACCEL_ZOUT_H 0x3F
#define AG_ACCEL_ZOUT_L 0x40
#define AG_TEMP_OUT_H   0x41
#define AG_TEMP_OUT_L   0x42
#define AG_GYRO_XOUT_H  0x43
#define AG_GYRO_XOUT_L  0x44
#define AG_GYRO_YOUT_H  0x45
#define AG_GYRO_YOUT_L  0x46
#define AG_GYRO_ZOUT_H  0x47
#define AG_GYRO_ZOUT_L  0x48
#define AG_WHO_AM_I     0x75

//コンパス
#define M_I2C_ADR       0x0C
#define M_WIA           0x00
#define M_HXL           0x03
#define M_HXH           0x04
#define M_HYL           0x05
#define M_HYH           0x06
#define M_HZL           0x07
#define M_HZH           0x08
#define M_CNTL          0x0A

void setup(){
    pinMode(PIN_SW,INPUT);       //青ボタン使用
    pinMode(PIN_LED0,OUTPUT);    //LED0使用
    pinMode(PIN_LED1,OUTPUT);    //LED1使用
    pinMode(PIN_LED2,OUTPUT);    //LED2使用
    pinMode(PIN_LED3,OUTPUT);    //LED3使用
    digitalWrite(PIN_LED0,0);
    digitalWrite(PIN_LED1,0);
    digitalWrite(PIN_LED2,0);
    digitalWrite(PIN_LED3,0);

    //---Serialは外部へのデータ送信---
    //Serial.begin(38400,SCI_USB0);        //仮想USB(baudrateはダミー)
    Serial.begin(230400,SCI_SCI0P2x);   //IO0=RXD0, IO1=TXD0

    //I2C開始
    Wire.begin();
    Wire.assignSdaScl(PIN_P44,PIN_P45);        //ピン割り当て
    Wire.setFrequency(200000);                //SCL周波数200kHz

    //加速度&ジャイロ初期設定
    Wire.beginTransmission(AG_I2C_ADR);
        Wire.write(AG_PWR_MGMT1);
        Wire.write(0x00);
        Wire.endTransmission();    
    Wire.beginTransmission(AG_I2C_ADR);
        Wire.write(AG_INT_PIN_CFG);
        Wire.write(0x02);
        Wire.endTransmission();    
    Wire.beginTransmission(AG_I2C_ADR);
        Wire.write(AG_GYRO_CONFIG);
        //00h:+/- 250deg/s(default)
        //08h:+/- 500deg/s
        //10h:+/-1000deg/s
        //18h:+/-2000deg/s
        Wire.write(0x10);    
        Wire.endTransmission();    

    //コンパス初期設定
    Wire.beginTransmission(M_I2C_ADR);
        Wire.write(M_CNTL);
        Wire.write(0x01);    //変換開始
        Wire.endTransmission();    

    delayms(100);
    digitalWrite(PIN_LED0,1);
    t0=micros();
}

void loop(){
    unsigned char dat[22];
    short d[9];

    digitalWrite(PIN_LED1, 1);    //LED点灯

    //ヘッダ
    dat[0]=0xAA; dat[1]=0x55;

    //加速度&ジャイロ読み出し
    Wire.beginTransmission(AG_I2C_ADR);
    Wire.write(AG_ACCEL_XOUT_H);
    Wire.endTransmission();    
    Wire.requestFrom(AG_I2C_ADR,14);
    while(Wire.available()<14);
    for(int i=2+0;i<2+14;i++){
        dat[i]=Wire.read();
    }
    d[0]=(dat[2]*0x100)|dat[3];
    d[1]=(dat[4]*0x100)|dat[5];
    d[2]=(dat[6]*0x100)|dat[7];
    d[3]=(dat[10]*0x100)|dat[11];
    d[4]=(dat[12]*0x100)|dat[13];
    d[5]=(dat[14]*0x100)|dat[15];

    //コンパス読み出し
    Wire.beginTransmission(M_I2C_ADR);
        Wire.write(M_HXL);
        Wire.endTransmission();    
    Wire.requestFrom(M_I2C_ADR,6);
    while(Wire.available()<6);
    for(int i=16+0;i<16+6;i++) {
        dat[i]=Wire.read();
    }
    d[6]=(dat[17]*0x100)|dat[16];
    d[7]=(dat[19]*0x100)|dat[18];
    d[8]=(dat[21]*0x100)|dat[20];
    //コンパスは次の変換を開始しておく
    Wire.beginTransmission(M_I2C_ADR);
        Wire.write(M_CNTL);
        Wire.write(0x01);    //変換開始
        Wire.endTransmission();    

    //データ出力(バイナリ形式)
    //Serial.write(dat,22);

    //データ出力(テキスト形式)
    char s[256];
    sprintf(s,"%6d %6d %6d/%6d %6d %6d/%6d %6d %6d\r\n"
        ,d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8]);
    Serial.print(s);

    digitalWrite(PIN_LED1,0);    //LED消灯

    //ここまでで約2.0ms
    sprintf(s,"dt=%4d ",micros()-t0);
    Serial.print(s);

    //時間待ち(10msになるまで)
    do{
        dt=micros()-t0;
    }while(dt<10000);
    t0+=10000;

    //青ボタン処理
    if(!digitalRead(PIN_SW)) delayms(1000);
}