コウスケ スズキ
/
mpu9250cover
mpu9250test
Embed:
(wiki syntax)
Show/hide line numbers
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 }
Generated on Tue Dec 13 2022 14:56:45 by 1.7.2