mpu9250test

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 
00003 I2C i2c(p9,p10);
00004 Serial pc(USBTX,USBRX);
00005 
00006 //スレーブアドレス
00007 uint8_t addrAG =  0b1101001<<1;//AD0=H(VDDIOにした)/7bitであるため. 右にズラして,左に0を追加することで, 8bitにする。 加速度ジャイロのスレーブアドレス
00008 uint8_t addrM = 0b0001100<<1;//磁気センサのスレーブアドレス
00009 
00010 const double G = 9.80665;//重力加速度
00011 
00012 //メモ
00013 //1byte=8bit(char)
00014 //2byte=16bit(int(shortも))
00015 
00016 int main() { 
00017     int i,val; //valは1or0などの確認用
00018     uint8_t addr,addr1;
00019     char cmd[1];//charはmbedのi2c使用であるため。
00020     
00021     //セッシング(スリーブモード解除)
00022     i2c.start();
00023     cmd[0]=0x00;
00024     addr1 = 0x6b;
00025     i2c.write(addr1,cmd,1);//0x6bに0x00を書き込む
00026     cmd[0]=0x02;
00027     addr1 = 0x37;
00028     i2c.write(addr1,cmd,1);//0x37に0x02を書き込む
00029     //printf("%d",val);
00030     
00031     //who I amで正常か?を判断する。実際, 加速度・ジャイロと地磁気の二つを確認している。
00032     addr = addrAG;
00033     for(i=0;i<2;i++){
00034         cmd[0] = 0x75; //こいつを読んで, 0x71がかえってくる。 
00035         val=i2c.write( addr, cmd, 1);//内部レジスタを指定(1=1byte)
00036         //printf("val=%d",val);
00037         char v;
00038         val=i2c.read( addr, &v, 1);//レジスタの読み取り
00039         uint8_t WHO = v;
00040         //printf("val=%d, 0x%x",val,WHO);
00041         if(WHO == 0x71){
00042             printf("0x%x/WHO_I_AM is Yes\r\n",addr>>1);
00043             }else{
00044                 printf("0x%x/WHO_I_AM is NO\r\n",addr>>1);
00045                 }
00046         addr = addrM;
00047     }
00048         
00049     while(1){
00050         //加速度・ジャイロ
00051         //0x3bからの14byteに含まれる。そのデータを読む。一つのデータは16bit(=2byte)となるため, 2つのchar(8bit)として分けることができる。 short intなども可ではある。
00052         //加速度x:0x3b[0],0x3c[1] y:0x3d[2],0x3e[3] z:0x3f[4],0x40[5]   (0x41[6],0x42[7]は違うデータ)
00053         //角速度x:0x43[8],0x44[9] y:0x45[10],0x46[11] z:0x47[12],0x48[13]
00054         //上位8bitが先に並んでいる。(ビックエンディアン方式)→2つの8bitを結合したい。
00055         
00056         char data[14];
00057         data[0] = 0x3b;
00058         val=i2c.write(addrAG,data,1);
00059         //printf("%d",val);
00060         val=i2c.read(addrAG,data,14);
00061         //printf("%d\r\n",val);
00062          
00063         //2つの8bitを16bitへ統合の仕方の1例
00064         //short bh = 0x4F;short bl=0x1A; (short→16bit)
00065         //a = (bh << 8)|bl;
00066         //0b 0000 0000 0100 1111 → 0b 0100 1111 0000 0000 
00067         //→0b 0100 1111 0001 1010
00068     
00069     
00070         short ax,ay,az,gx,gy,gz;//単位mV
00071         ax=(short)data[0]<<8|(short)data[1];
00072         ay=(short)data[2]<<8|(short)data[3];
00073         az=(short)data[4]<<8|(short)data[5];
00074         
00075         float AX,AY,AZ;//電圧から数値へ
00076         AX=(float)ax*0.000488*G/7.8124;
00077         AY=(float)ay*0.000488*G/7.8124;
00078         AZ=(float)az*0.000488*G/7.8124;
00079         
00080         gx=(short)data[8]<<8|(short)data[9];
00081         gy=(short)data[10]<<8|(short)data[11];
00082         gz=(short)data[12]<<8|(short)data[13];
00083         
00084         float GX,GY,GZ;//電圧から数値へ
00085         GX=(float)gx*0.00763;
00086         GY=(float)gy*0.00763;
00087         GZ=(float)gz*0.00763;
00088         
00089         printf("x%.3f,y%.3f,z%.3f  ",AX,AY,AZ);
00090         printf("x%.3f,y%.3f,z%.3f\r\n",GX,GY,GZ);
00091         
00092         //磁気
00093         //内部アドレスの0x0Aに0x12を書き込むことでAD変換。
00094         //0x03から7byteのデータが含まれるため, それを読む。各テータ変換数値が16bit
00095         //地磁気 x:0x03[0],0x04[1] y:0x05[2],0x06[3] z:0x07[4],0x08[5]
00096         //0x09[6](STMステータスメッセージ)//読む必要あり。
00097         //下位8bitが先にならんでいる。(リトルエンディアン方式)→2つの8bitを結合したい。
00098         
00099         //問題点2022.12/13のメモ
00100         //日本語の紹介にあったAD変換をやろうとしたら, valが0にならない。そのため, mpu9250のardinoであったが,lpc1768にやってみた。しかし,なにもかわらなった。 
00101         //現状動かない。
00102         
00103         cmd[0]=0x0A;//本来は0x02
00104         addrM=0x12;//本来addrM  00001010
00105         val=i2c.write(addr,cmd,1);//AD変換(8Hz)を行う。
00106         printf("%d",val);
00107         char add;
00108         //val=i2c.read(addrM,&add,1.0);
00109         
00110         //if(add&0x01){
00111             data[0]=0x03;
00112             val=i2c.write(addrM,data,1,1);
00113             //printf("%d",val);
00114             val=i2c.read(addrM,data,7,1);
00115             //printf("%d\r\n",val);
00116             
00117             //if(!(data[6]&0x08)){
00118                 
00119                 short mx,my,mz;
00120                 mx=((short)data[1]<<8|(short)data[0]);
00121                 my=((short)data[3]<<8|(short)data[2]);
00122                 mz=((short)data[5]<<8|(short)data[4]);
00123                 
00124                 float MX,MY,MZ;//電圧から数値へ
00125                 MX=(float)mx*0.00015;
00126                 MY=(float)my*0.00015;
00127                 MZ=(float)mz*0.00015;
00128                 
00129         
00130                 //printf("x%.3f,y%.3f,z%.3f  ",AX,AY,AZ);
00131                 //printf("x%.3f,y%.3f,z%.3f\r\n",GX,GY,GZ);
00132                 //printf("x%.3f,y%.3f,z%.3f\r\n",MX,MY,MZ);
00133                 //}
00134             //}
00135         wait(1);
00136         }
00137     i2c.stop();
00138 }