コウスケ スズキ
/
mpu9250cover
mpu9250test
main.cpp@1:4b9e46d39df0, 22 months ago (annotated)
- Committer:
- kosukesuzuki
- Date:
- Tue Dec 13 14:56:29 2022 +0000
- Revision:
- 1:4b9e46d39df0
- Parent:
- 0:0ad7e1d9fb12
mpu9250test
Who changed what in which revision?
User | Revision | Line number | New 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 | } |