mpu9250test

Dependencies:   mbed

Committer:
kosukesuzuki
Date:
Tue Dec 13 14:56:29 2022 +0000
Revision:
1:4b9e46d39df0
Parent:
0:0ad7e1d9fb12
mpu9250test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kosukesuzuki 0:0ad7e1d9fb12 1 #include "mbed.h"
kosukesuzuki 0:0ad7e1d9fb12 2
kosukesuzuki 0:0ad7e1d9fb12 3 I2C i2c(p9,p10);
kosukesuzuki 0:0ad7e1d9fb12 4 Serial pc(USBTX,USBRX);
kosukesuzuki 0:0ad7e1d9fb12 5
kosukesuzuki 0:0ad7e1d9fb12 6 //スレーブアドレス
kosukesuzuki 0:0ad7e1d9fb12 7 uint8_t addrAG = 0b1101001<<1;//AD0=H(VDDIOにした)/7bitであるため. 右にズラして,左に0を追加することで, 8bitにする。 加速度ジャイロのスレーブアドレス
kosukesuzuki 0:0ad7e1d9fb12 8 uint8_t addrM = 0b0001100<<1;//磁気センサのスレーブアドレス
kosukesuzuki 0:0ad7e1d9fb12 9
kosukesuzuki 1:4b9e46d39df0 10 const double G = 9.80665;//重力加速度
kosukesuzuki 1:4b9e46d39df0 11
kosukesuzuki 0:0ad7e1d9fb12 12 //メモ
kosukesuzuki 0:0ad7e1d9fb12 13 //1byte=8bit(char)
kosukesuzuki 0:0ad7e1d9fb12 14 //2byte=16bit(int(shortも))
kosukesuzuki 0:0ad7e1d9fb12 15
kosukesuzuki 0:0ad7e1d9fb12 16 int main() {
kosukesuzuki 0:0ad7e1d9fb12 17 int i,val; //valは1or0などの確認用
kosukesuzuki 0:0ad7e1d9fb12 18 uint8_t addr,addr1;
kosukesuzuki 0:0ad7e1d9fb12 19 char cmd[1];//charはmbedのi2c使用であるため。
kosukesuzuki 0:0ad7e1d9fb12 20
kosukesuzuki 0:0ad7e1d9fb12 21 //セッシング(スリーブモード解除)
kosukesuzuki 0:0ad7e1d9fb12 22 i2c.start();
kosukesuzuki 0:0ad7e1d9fb12 23 cmd[0]=0x00;
kosukesuzuki 0:0ad7e1d9fb12 24 addr1 = 0x6b;
kosukesuzuki 0:0ad7e1d9fb12 25 i2c.write(addr1,cmd,1);//0x6bに0x00を書き込む
kosukesuzuki 0:0ad7e1d9fb12 26 cmd[0]=0x02;
kosukesuzuki 0:0ad7e1d9fb12 27 addr1 = 0x37;
kosukesuzuki 0:0ad7e1d9fb12 28 i2c.write(addr1,cmd,1);//0x37に0x02を書き込む
kosukesuzuki 1:4b9e46d39df0 29 //printf("%d",val);
kosukesuzuki 0:0ad7e1d9fb12 30
kosukesuzuki 0:0ad7e1d9fb12 31 //who I amで正常か?を判断する。実際, 加速度・ジャイロと地磁気の二つを確認している。
kosukesuzuki 0:0ad7e1d9fb12 32 addr = addrAG;
kosukesuzuki 0:0ad7e1d9fb12 33 for(i=0;i<2;i++){
kosukesuzuki 1:4b9e46d39df0 34 cmd[0] = 0x75; //こいつを読んで, 0x71がかえってくる。
kosukesuzuki 0:0ad7e1d9fb12 35 val=i2c.write( addr, cmd, 1);//内部レジスタを指定(1=1byte)
kosukesuzuki 0:0ad7e1d9fb12 36 //printf("val=%d",val);
kosukesuzuki 0:0ad7e1d9fb12 37 char v;
kosukesuzuki 0:0ad7e1d9fb12 38 val=i2c.read( addr, &v, 1);//レジスタの読み取り
kosukesuzuki 0:0ad7e1d9fb12 39 uint8_t WHO = v;
kosukesuzuki 0:0ad7e1d9fb12 40 //printf("val=%d, 0x%x",val,WHO);
kosukesuzuki 0:0ad7e1d9fb12 41 if(WHO == 0x71){
kosukesuzuki 0:0ad7e1d9fb12 42 printf("0x%x/WHO_I_AM is Yes\r\n",addr>>1);
kosukesuzuki 0:0ad7e1d9fb12 43 }else{
kosukesuzuki 0:0ad7e1d9fb12 44 printf("0x%x/WHO_I_AM is NO\r\n",addr>>1);
kosukesuzuki 0:0ad7e1d9fb12 45 }
kosukesuzuki 0:0ad7e1d9fb12 46 addr = addrM;
kosukesuzuki 0:0ad7e1d9fb12 47 }
kosukesuzuki 0:0ad7e1d9fb12 48
kosukesuzuki 1:4b9e46d39df0 49 while(1){
kosukesuzuki 1:4b9e46d39df0 50 //加速度・ジャイロ
kosukesuzuki 1:4b9e46d39df0 51 //0x3bからの14byteに含まれる。そのデータを読む。一つのデータは16bit(=2byte)となるため, 2つのchar(8bit)として分けることができる。 short intなども可ではある。
kosukesuzuki 1:4b9e46d39df0 52 //加速度x:0x3b[0],0x3c[1] y:0x3d[2],0x3e[3] z:0x3f[4],0x40[5] (0x41[6],0x42[7]は違うデータ)
kosukesuzuki 1:4b9e46d39df0 53 //角速度x:0x43[8],0x44[9] y:0x45[10],0x46[11] z:0x47[12],0x48[13]
kosukesuzuki 1:4b9e46d39df0 54 //上位8bitが先に並んでいる。(ビックエンディアン方式)→2つの8bitを結合したい。
kosukesuzuki 1:4b9e46d39df0 55
kosukesuzuki 1:4b9e46d39df0 56 char data[14];
kosukesuzuki 1:4b9e46d39df0 57 data[0] = 0x3b;
kosukesuzuki 1:4b9e46d39df0 58 val=i2c.write(addrAG,data,1);
kosukesuzuki 1:4b9e46d39df0 59 //printf("%d",val);
kosukesuzuki 1:4b9e46d39df0 60 val=i2c.read(addrAG,data,14);
kosukesuzuki 1:4b9e46d39df0 61 //printf("%d\r\n",val);
kosukesuzuki 1:4b9e46d39df0 62
kosukesuzuki 1:4b9e46d39df0 63 //2つの8bitを16bitへ統合の仕方の1例
kosukesuzuki 1:4b9e46d39df0 64 //short bh = 0x4F;short bl=0x1A; (short→16bit)
kosukesuzuki 1:4b9e46d39df0 65 //a = (bh << 8)|bl;
kosukesuzuki 1:4b9e46d39df0 66 //0b 0000 0000 0100 1111 → 0b 0100 1111 0000 0000
kosukesuzuki 1:4b9e46d39df0 67 //→0b 0100 1111 0001 1010
kosukesuzuki 0:0ad7e1d9fb12 68
kosukesuzuki 0:0ad7e1d9fb12 69
kosukesuzuki 1:4b9e46d39df0 70 short ax,ay,az,gx,gy,gz;//単位mV
kosukesuzuki 1:4b9e46d39df0 71 ax=(short)data[0]<<8|(short)data[1];
kosukesuzuki 1:4b9e46d39df0 72 ay=(short)data[2]<<8|(short)data[3];
kosukesuzuki 1:4b9e46d39df0 73 az=(short)data[4]<<8|(short)data[5];
kosukesuzuki 1:4b9e46d39df0 74
kosukesuzuki 1:4b9e46d39df0 75 float AX,AY,AZ;//電圧から数値へ
kosukesuzuki 1:4b9e46d39df0 76 AX=(float)ax*0.000488*G/7.8124;
kosukesuzuki 1:4b9e46d39df0 77 AY=(float)ay*0.000488*G/7.8124;
kosukesuzuki 1:4b9e46d39df0 78 AZ=(float)az*0.000488*G/7.8124;
kosukesuzuki 1:4b9e46d39df0 79
kosukesuzuki 1:4b9e46d39df0 80 gx=(short)data[8]<<8|(short)data[9];
kosukesuzuki 1:4b9e46d39df0 81 gy=(short)data[10]<<8|(short)data[11];
kosukesuzuki 1:4b9e46d39df0 82 gz=(short)data[12]<<8|(short)data[13];
kosukesuzuki 1:4b9e46d39df0 83
kosukesuzuki 1:4b9e46d39df0 84 float GX,GY,GZ;//電圧から数値へ
kosukesuzuki 1:4b9e46d39df0 85 GX=(float)gx*0.00763;
kosukesuzuki 1:4b9e46d39df0 86 GY=(float)gy*0.00763;
kosukesuzuki 1:4b9e46d39df0 87 GZ=(float)gz*0.00763;
kosukesuzuki 1:4b9e46d39df0 88
kosukesuzuki 1:4b9e46d39df0 89 printf("x%.3f,y%.3f,z%.3f ",AX,AY,AZ);
kosukesuzuki 1:4b9e46d39df0 90 printf("x%.3f,y%.3f,z%.3f\r\n",GX,GY,GZ);
kosukesuzuki 1:4b9e46d39df0 91
kosukesuzuki 1:4b9e46d39df0 92 //磁気
kosukesuzuki 1:4b9e46d39df0 93 //内部アドレスの0x0Aに0x12を書き込むことでAD変換。
kosukesuzuki 1:4b9e46d39df0 94 //0x03から7byteのデータが含まれるため, それを読む。各テータ変換数値が16bit
kosukesuzuki 1:4b9e46d39df0 95 //地磁気 x:0x03[0],0x04[1] y:0x05[2],0x06[3] z:0x07[4],0x08[5]
kosukesuzuki 1:4b9e46d39df0 96 //0x09[6](STMステータスメッセージ)//読む必要あり。
kosukesuzuki 1:4b9e46d39df0 97 //下位8bitが先にならんでいる。(リトルエンディアン方式)→2つの8bitを結合したい。
kosukesuzuki 1:4b9e46d39df0 98
kosukesuzuki 1:4b9e46d39df0 99 //問題点2022.12/13のメモ
kosukesuzuki 1:4b9e46d39df0 100 //日本語の紹介にあったAD変換をやろうとしたら, valが0にならない。そのため, mpu9250のardinoであったが,lpc1768にやってみた。しかし,なにもかわらなった。
kosukesuzuki 1:4b9e46d39df0 101 //現状動かない。
kosukesuzuki 1:4b9e46d39df0 102
kosukesuzuki 1:4b9e46d39df0 103 cmd[0]=0x0A;//本来は0x02
kosukesuzuki 1:4b9e46d39df0 104 addrM=0x12;//本来addrM  00001010
kosukesuzuki 1:4b9e46d39df0 105 val=i2c.write(addr,cmd,1);//AD変換(8Hz)を行う。
kosukesuzuki 1:4b9e46d39df0 106 printf("%d",val);
kosukesuzuki 1:4b9e46d39df0 107 char add;
kosukesuzuki 1:4b9e46d39df0 108 //val=i2c.read(addrM,&add,1.0);
kosukesuzuki 1:4b9e46d39df0 109
kosukesuzuki 1:4b9e46d39df0 110 //if(add&0x01){
kosukesuzuki 1:4b9e46d39df0 111 data[0]=0x03;
kosukesuzuki 1:4b9e46d39df0 112 val=i2c.write(addrM,data,1,1);
kosukesuzuki 1:4b9e46d39df0 113 //printf("%d",val);
kosukesuzuki 1:4b9e46d39df0 114 val=i2c.read(addrM,data,7,1);
kosukesuzuki 1:4b9e46d39df0 115 //printf("%d\r\n",val);
kosukesuzuki 1:4b9e46d39df0 116
kosukesuzuki 1:4b9e46d39df0 117 //if(!(data[6]&0x08)){
kosukesuzuki 1:4b9e46d39df0 118
kosukesuzuki 1:4b9e46d39df0 119 short mx,my,mz;
kosukesuzuki 1:4b9e46d39df0 120 mx=((short)data[1]<<8|(short)data[0]);
kosukesuzuki 1:4b9e46d39df0 121 my=((short)data[3]<<8|(short)data[2]);
kosukesuzuki 1:4b9e46d39df0 122 mz=((short)data[5]<<8|(short)data[4]);
kosukesuzuki 1:4b9e46d39df0 123
kosukesuzuki 1:4b9e46d39df0 124 float MX,MY,MZ;//電圧から数値へ
kosukesuzuki 1:4b9e46d39df0 125 MX=(float)mx*0.00015;
kosukesuzuki 1:4b9e46d39df0 126 MY=(float)my*0.00015;
kosukesuzuki 1:4b9e46d39df0 127 MZ=(float)mz*0.00015;
kosukesuzuki 1:4b9e46d39df0 128
kosukesuzuki 1:4b9e46d39df0 129
kosukesuzuki 1:4b9e46d39df0 130 //printf("x%.3f,y%.3f,z%.3f ",AX,AY,AZ);
kosukesuzuki 1:4b9e46d39df0 131 //printf("x%.3f,y%.3f,z%.3f\r\n",GX,GY,GZ);
kosukesuzuki 1:4b9e46d39df0 132 //printf("x%.3f,y%.3f,z%.3f\r\n",MX,MY,MZ);
kosukesuzuki 1:4b9e46d39df0 133 //}
kosukesuzuki 1:4b9e46d39df0 134 //}
kosukesuzuki 1:4b9e46d39df0 135 wait(1);
kosukesuzuki 1:4b9e46d39df0 136 }
kosukesuzuki 0:0ad7e1d9fb12 137 i2c.stop();
kosukesuzuki 0:0ad7e1d9fb12 138 }