Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:0ad7e1d9fb12, 2022-12-12 (annotated)
- Committer:
- kosukesuzuki
- Date:
- Mon Dec 12 11:10:42 2022 +0000
- Revision:
- 0:0ad7e1d9fb12
mpu9250
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 | 0:0ad7e1d9fb12 | 10 | //メモ |
| kosukesuzuki | 0:0ad7e1d9fb12 | 11 | //1byte=8bit(char) |
| kosukesuzuki | 0:0ad7e1d9fb12 | 12 | //2byte=16bit(int(shortも)) |
| kosukesuzuki | 0:0ad7e1d9fb12 | 13 | |
| kosukesuzuki | 0:0ad7e1d9fb12 | 14 | int main() { |
| kosukesuzuki | 0:0ad7e1d9fb12 | 15 | int i,val; //valは1or0などの確認用 |
| kosukesuzuki | 0:0ad7e1d9fb12 | 16 | uint8_t addr,addr1; |
| kosukesuzuki | 0:0ad7e1d9fb12 | 17 | char cmd[1];//charはmbedのi2c使用であるため。 |
| kosukesuzuki | 0:0ad7e1d9fb12 | 18 | |
| kosukesuzuki | 0:0ad7e1d9fb12 | 19 | //セッシング(スリーブモード解除) |
| kosukesuzuki | 0:0ad7e1d9fb12 | 20 | i2c.start(); |
| kosukesuzuki | 0:0ad7e1d9fb12 | 21 | cmd[0]=0x00; |
| kosukesuzuki | 0:0ad7e1d9fb12 | 22 | addr1 = 0x6b; |
| kosukesuzuki | 0:0ad7e1d9fb12 | 23 | i2c.write(addr1,cmd,1);//0x6bに0x00を書き込む |
| kosukesuzuki | 0:0ad7e1d9fb12 | 24 | cmd[0]=0x02; |
| kosukesuzuki | 0:0ad7e1d9fb12 | 25 | addr1 = 0x37; |
| kosukesuzuki | 0:0ad7e1d9fb12 | 26 | i2c.write(addr1,cmd,1);//0x37に0x02を書き込む |
| kosukesuzuki | 0:0ad7e1d9fb12 | 27 | |
| kosukesuzuki | 0:0ad7e1d9fb12 | 28 | //who I amで正常か?を判断する。実際, 加速度・ジャイロと地磁気の二つを確認している。 |
| kosukesuzuki | 0:0ad7e1d9fb12 | 29 | addr = addrAG; |
| kosukesuzuki | 0:0ad7e1d9fb12 | 30 | for(i=0;i<2;i++){ |
| kosukesuzuki | 0:0ad7e1d9fb12 | 31 | cmd[0] = 0x75; //こいつを読んで, 0x71がかえってくる。 |
| kosukesuzuki | 0:0ad7e1d9fb12 | 32 | val=i2c.write( addr, cmd, 1);//内部レジスタを指定(1=1byte) |
| kosukesuzuki | 0:0ad7e1d9fb12 | 33 | //printf("val=%d",val); |
| kosukesuzuki | 0:0ad7e1d9fb12 | 34 | char v; |
| kosukesuzuki | 0:0ad7e1d9fb12 | 35 | val=i2c.read( addr, &v, 1);//レジスタの読み取り |
| kosukesuzuki | 0:0ad7e1d9fb12 | 36 | uint8_t WHO = v; |
| kosukesuzuki | 0:0ad7e1d9fb12 | 37 | //printf("val=%d, 0x%x",val,WHO); |
| kosukesuzuki | 0:0ad7e1d9fb12 | 38 | if(WHO == 0x71){ |
| kosukesuzuki | 0:0ad7e1d9fb12 | 39 | printf("0x%x/WHO_I_AM is Yes\r\n",addr>>1); |
| kosukesuzuki | 0:0ad7e1d9fb12 | 40 | }else{ |
| kosukesuzuki | 0:0ad7e1d9fb12 | 41 | printf("0x%x/WHO_I_AM is NO\r\n",addr>>1); |
| kosukesuzuki | 0:0ad7e1d9fb12 | 42 | } |
| kosukesuzuki | 0:0ad7e1d9fb12 | 43 | addr = addrM; |
| kosukesuzuki | 0:0ad7e1d9fb12 | 44 | } |
| kosukesuzuki | 0:0ad7e1d9fb12 | 45 | |
| kosukesuzuki | 0:0ad7e1d9fb12 | 46 | //加速度・ジャイロ |
| kosukesuzuki | 0:0ad7e1d9fb12 | 47 | //0x3bからの14byteに含まれる。そのデータを読む。一つのデータは16bit(=2byte)となるため, 2つのchar(8bit)として分けることができる。 short intなども可ではある。 |
| kosukesuzuki | 0:0ad7e1d9fb12 | 48 | //加速度x:0x3b[0],0x3c[1] y:0x3d[3],0x3e[4] z:0x3f[5],0x40[6] (0x41[7],0x42[8]は違うデータ) |
| kosukesuzuki | 0:0ad7e1d9fb12 | 49 | //角速度x:0x43[9],0x44[10] y:0x45[11],0x46[12] z:0x47[13],0x48[14] |
| kosukesuzuki | 0:0ad7e1d9fb12 | 50 | //上位8bitが先に並んでいる。 |
| kosukesuzuki | 0:0ad7e1d9fb12 | 51 | |
| kosukesuzuki | 0:0ad7e1d9fb12 | 52 | char data[14]; |
| kosukesuzuki | 0:0ad7e1d9fb12 | 53 | data[0] = 0x3b; |
| kosukesuzuki | 0:0ad7e1d9fb12 | 54 | val=i2c.write(addrAG,data,1); |
| kosukesuzuki | 0:0ad7e1d9fb12 | 55 | //printf("%d",val); |
| kosukesuzuki | 0:0ad7e1d9fb12 | 56 | val=i2c.read(addrAG,data,14); |
| kosukesuzuki | 0:0ad7e1d9fb12 | 57 | //printf("%d\r\n",val); |
| kosukesuzuki | 0:0ad7e1d9fb12 | 58 | |
| kosukesuzuki | 0:0ad7e1d9fb12 | 59 | |
| kosukesuzuki | 0:0ad7e1d9fb12 | 60 | i2c.stop(); |
| kosukesuzuki | 0:0ad7e1d9fb12 | 61 | } |