//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); } |