コウスケ スズキ
/
20224222
i2c 2
main.cpp@1:b38a436a0059, 2022-04-22 (annotated)
- Committer:
- kosukesuzuki
- Date:
- Fri Apr 22 19:03:26 2022 +0000
- Revision:
- 1:b38a436a0059
- Parent:
- 0:bf86efb237ca
i2c
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kosukesuzuki | 0:bf86efb237ca | 1 | /* |
kosukesuzuki | 0:bf86efb237ca | 2 | MPU9250をi2c通信してみた。 |
kosukesuzuki | 0:bf86efb237ca | 3 | |
kosukesuzuki | 0:bf86efb237ca | 4 | 1バイトずつ送受信する場合は、スタートコンディション・ストップコンディションなどのアドレス送信などの制御が必要です。 |
kosukesuzuki | 0:bf86efb237ca | 5 | 連続だったら、いいらしい。(参照 https://os.mbed.com/users/okini3939/notebook/I2C_jp/ ) |
kosukesuzuki | 0:bf86efb237ca | 6 | |
kosukesuzuki | 0:bf86efb237ca | 7 | 「マスターが受信する」によって、取得するため |
kosukesuzuki | 0:bf86efb237ca | 8 | |
kosukesuzuki | 0:bf86efb237ca | 9 | 1.slave address(スレーブアドレス→内部レジスタ) |
kosukesuzuki | 0:bf86efb237ca | 10 | 2.ack(受信) |
kosukesuzuki | 0:bf86efb237ca | 11 | 3.data1(8bits) |
kosukesuzuki | 0:bf86efb237ca | 12 | 4.ack=1(送信) |
kosukesuzuki | 0:bf86efb237ca | 13 | 5.data2(8bits) |
kosukesuzuki | 0:bf86efb237ca | 14 | 6.ack=1(送信) |
kosukesuzuki | 0:bf86efb237ca | 15 | |
kosukesuzuki | 0:bf86efb237ca | 16 | (参照 http://www.picfun.com/c15.html ) |
kosukesuzuki | 0:bf86efb237ca | 17 | */ |
kosukesuzuki | 0:bf86efb237ca | 18 | |
kosukesuzuki | 0:bf86efb237ca | 19 | #include "mbed.h" |
kosukesuzuki | 0:bf86efb237ca | 20 | |
kosukesuzuki | 0:bf86efb237ca | 21 | Serial pc(USBTX,USBRX); |
kosukesuzuki | 0:bf86efb237ca | 22 | I2C i2c(p9, p10); |
kosukesuzuki | 0:bf86efb237ca | 23 | |
kosukesuzuki | 0:bf86efb237ca | 24 | const int addr = 0xD0; //加速度とジャイロのスレーブアドレス |
kosukesuzuki | 0:bf86efb237ca | 25 | |
kosukesuzuki | 1:b38a436a0059 | 26 | short int axl,axh; //x軸の加速度 |
kosukesuzuki | 1:b38a436a0059 | 27 | short int ayl,ayh; //y軸の加速度 |
kosukesuzuki | 1:b38a436a0059 | 28 | short int azl,azh; //z軸の加速度 |
kosukesuzuki | 1:b38a436a0059 | 29 | |
kosukesuzuki | 1:b38a436a0059 | 30 | short int gxl,gxh; //xの角速度 |
kosukesuzuki | 1:b38a436a0059 | 31 | short int gyl,gyh; //yの角速度 |
kosukesuzuki | 1:b38a436a0059 | 32 | short int gzl,gzh; //zの角速度 |
kosukesuzuki | 0:bf86efb237ca | 33 | |
kosukesuzuki | 0:bf86efb237ca | 34 | int main() |
kosukesuzuki | 0:bf86efb237ca | 35 | { |
kosukesuzuki | 0:bf86efb237ca | 36 | i2c.frequency(100000); |
kosukesuzuki | 0:bf86efb237ca | 37 | pc.printf("Start!!\r\n"); |
kosukesuzuki | 0:bf86efb237ca | 38 | |
kosukesuzuki | 0:bf86efb237ca | 39 | while(1) { |
kosukesuzuki | 1:b38a436a0059 | 40 | //加速度 |
kosukesuzuki | 0:bf86efb237ca | 41 | //x軸加速度取得 |
kosukesuzuki | 0:bf86efb237ca | 42 | |
kosukesuzuki | 0:bf86efb237ca | 43 | //1.slave address(スレーブアドレス→内部レジスタ) |
kosukesuzuki | 0:bf86efb237ca | 44 | i2c.start(); |
kosukesuzuki | 0:bf86efb237ca | 45 | i2c.write(addr);// slaveアドレス |
kosukesuzuki | 0:bf86efb237ca | 46 | i2c.write(0x3b);// 内部レジスタ(59) |
kosukesuzuki | 0:bf86efb237ca | 47 | i2c.stop(); |
kosukesuzuki | 0:bf86efb237ca | 48 | |
kosukesuzuki | 0:bf86efb237ca | 49 | //2.ack=0(受信) |
kosukesuzuki | 0:bf86efb237ca | 50 | i2c.start(); |
kosukesuzuki | 0:bf86efb237ca | 51 | i2c.read(false); //ack(受信) |
kosukesuzuki | 0:bf86efb237ca | 52 | //3.data1(8bits) |
kosukesuzuki | 0:bf86efb237ca | 53 | i2c.write(0x3c);//data1(60)1 |
kosukesuzuki | 0:bf86efb237ca | 54 | i2c.stop(); |
kosukesuzuki | 0:bf86efb237ca | 55 | |
kosukesuzuki | 0:bf86efb237ca | 56 | //4.ack=0(送信) |
kosukesuzuki | 0:bf86efb237ca | 57 | i2c.start(); |
kosukesuzuki | 0:bf86efb237ca | 58 | i2c.write(addr|0x01); //ack=1(送信) |
kosukesuzuki | 1:b38a436a0059 | 59 | axh = i2c.read(0);//data取り出す |
kosukesuzuki | 0:bf86efb237ca | 60 | i2c.stop(); |
kosukesuzuki | 0:bf86efb237ca | 61 | |
kosukesuzuki | 0:bf86efb237ca | 62 | i2c.start(); |
kosukesuzuki | 0:bf86efb237ca | 63 | //5.data2(8bits) |
kosukesuzuki | 0:bf86efb237ca | 64 | i2c.write(0x3d);//data2(61)2 |
kosukesuzuki | 0:bf86efb237ca | 65 | //6.ack=1(送信) |
kosukesuzuki | 0:bf86efb237ca | 66 | i2c.write(addr|0x01); //ack=1(受信) |
kosukesuzuki | 1:b38a436a0059 | 67 | axl = i2c.read(0);//data取り出す |
kosukesuzuki | 0:bf86efb237ca | 68 | i2c.stop(); |
kosukesuzuki | 0:bf86efb237ca | 69 | |
kosukesuzuki | 0:bf86efb237ca | 70 | //以下2~6を繰り返す。 |
kosukesuzuki | 0:bf86efb237ca | 71 | |
kosukesuzuki | 0:bf86efb237ca | 72 | |
kosukesuzuki | 0:bf86efb237ca | 73 | //y軸加速度取得 |
kosukesuzuki | 0:bf86efb237ca | 74 | i2c.start(); |
kosukesuzuki | 0:bf86efb237ca | 75 | i2c.read(false); //ack(受信) |
kosukesuzuki | 0:bf86efb237ca | 76 | i2c.write(0x3e); //data(62)3 |
kosukesuzuki | 0:bf86efb237ca | 77 | i2c.stop(); |
kosukesuzuki | 0:bf86efb237ca | 78 | |
kosukesuzuki | 0:bf86efb237ca | 79 | i2c.start(); |
kosukesuzuki | 0:bf86efb237ca | 80 | i2c.write(addr|0x01); //ack=1(送信) |
kosukesuzuki | 1:b38a436a0059 | 81 | ayh = i2c.read(0);//data取り出す |
kosukesuzuki | 0:bf86efb237ca | 82 | i2c.stop(); |
kosukesuzuki | 0:bf86efb237ca | 83 | |
kosukesuzuki | 0:bf86efb237ca | 84 | i2c.start(); |
kosukesuzuki | 0:bf86efb237ca | 85 | i2c.write(0x3f); //data(63)4 |
kosukesuzuki | 0:bf86efb237ca | 86 | i2c.write(addr|0x01); //ack=1(送信) |
kosukesuzuki | 1:b38a436a0059 | 87 | ayl = i2c.read(0);//data取り出す |
kosukesuzuki | 0:bf86efb237ca | 88 | i2c.stop(); |
kosukesuzuki | 0:bf86efb237ca | 89 | |
kosukesuzuki | 0:bf86efb237ca | 90 | //z軸加速度取得 |
kosukesuzuki | 0:bf86efb237ca | 91 | i2c.start(); |
kosukesuzuki | 0:bf86efb237ca | 92 | i2c.read(false); //ack(受信) |
kosukesuzuki | 0:bf86efb237ca | 93 | i2c.write(0x40); //data(64)5 |
kosukesuzuki | 0:bf86efb237ca | 94 | i2c.stop(); |
kosukesuzuki | 0:bf86efb237ca | 95 | |
kosukesuzuki | 0:bf86efb237ca | 96 | i2c.start(); |
kosukesuzuki | 0:bf86efb237ca | 97 | i2c.write(addr|0x01); //ack=1(送信) |
kosukesuzuki | 1:b38a436a0059 | 98 | azh = i2c.read(0);//data取り出す |
kosukesuzuki | 0:bf86efb237ca | 99 | i2c.stop(); |
kosukesuzuki | 0:bf86efb237ca | 100 | |
kosukesuzuki | 0:bf86efb237ca | 101 | i2c.start(); |
kosukesuzuki | 0:bf86efb237ca | 102 | i2c.write(0x41); //data(65)6 |
kosukesuzuki | 0:bf86efb237ca | 103 | i2c.write(addr|0x01); //ack=1(送信) |
kosukesuzuki | 1:b38a436a0059 | 104 | azl = i2c.read(0);//data取り出す |
kosukesuzuki | 0:bf86efb237ca | 105 | i2c.stop(); |
kosukesuzuki | 0:bf86efb237ca | 106 | |
kosukesuzuki | 0:bf86efb237ca | 107 | |
kosukesuzuki | 1:b38a436a0059 | 108 | //ジャイロセンサ |
kosukesuzuki | 1:b38a436a0059 | 109 | //x |
kosukesuzuki | 1:b38a436a0059 | 110 | i2c.start(); |
kosukesuzuki | 1:b38a436a0059 | 111 | i2c.read(false); //ack(受信) |
kosukesuzuki | 1:b38a436a0059 | 112 | i2c.write(0x42); //data |
kosukesuzuki | 1:b38a436a0059 | 113 | i2c.stop(); |
kosukesuzuki | 1:b38a436a0059 | 114 | |
kosukesuzuki | 1:b38a436a0059 | 115 | i2c.start(); |
kosukesuzuki | 1:b38a436a0059 | 116 | i2c.write(addr|0x01); //ack=1(送信) |
kosukesuzuki | 1:b38a436a0059 | 117 | gxh = i2c.read(0);//data取り出す |
kosukesuzuki | 1:b38a436a0059 | 118 | i2c.stop(); |
kosukesuzuki | 1:b38a436a0059 | 119 | |
kosukesuzuki | 1:b38a436a0059 | 120 | i2c.start(); |
kosukesuzuki | 1:b38a436a0059 | 121 | i2c.write(0x43); //data |
kosukesuzuki | 1:b38a436a0059 | 122 | i2c.write(addr|0x01); //ack=1(送信) |
kosukesuzuki | 1:b38a436a0059 | 123 | gxl = i2c.read(0);//data取り出す |
kosukesuzuki | 1:b38a436a0059 | 124 | i2c.stop(); |
kosukesuzuki | 1:b38a436a0059 | 125 | |
kosukesuzuki | 1:b38a436a0059 | 126 | //y |
kosukesuzuki | 1:b38a436a0059 | 127 | i2c.start(); |
kosukesuzuki | 1:b38a436a0059 | 128 | i2c.read(false); //ack(受信) |
kosukesuzuki | 1:b38a436a0059 | 129 | i2c.write(0x44); //data |
kosukesuzuki | 1:b38a436a0059 | 130 | i2c.stop(); |
kosukesuzuki | 1:b38a436a0059 | 131 | |
kosukesuzuki | 1:b38a436a0059 | 132 | i2c.start(); |
kosukesuzuki | 1:b38a436a0059 | 133 | i2c.write(addr|0x01); //ack=1(送信) |
kosukesuzuki | 1:b38a436a0059 | 134 | gyh = i2c.read(0);//data取り出す |
kosukesuzuki | 1:b38a436a0059 | 135 | i2c.stop(); |
kosukesuzuki | 1:b38a436a0059 | 136 | |
kosukesuzuki | 1:b38a436a0059 | 137 | i2c.start(); |
kosukesuzuki | 1:b38a436a0059 | 138 | i2c.write(0x45); //data |
kosukesuzuki | 1:b38a436a0059 | 139 | i2c.write(addr|0x01); //ack=1(送信) |
kosukesuzuki | 1:b38a436a0059 | 140 | gyl = i2c.read(0);//data取り出す |
kosukesuzuki | 1:b38a436a0059 | 141 | i2c.stop(); |
kosukesuzuki | 1:b38a436a0059 | 142 | |
kosukesuzuki | 1:b38a436a0059 | 143 | //z |
kosukesuzuki | 1:b38a436a0059 | 144 | i2c.start(); |
kosukesuzuki | 1:b38a436a0059 | 145 | i2c.read(false); //ack(受信) |
kosukesuzuki | 1:b38a436a0059 | 146 | i2c.write(0x46); //data |
kosukesuzuki | 1:b38a436a0059 | 147 | i2c.stop(); |
kosukesuzuki | 1:b38a436a0059 | 148 | |
kosukesuzuki | 1:b38a436a0059 | 149 | i2c.start(); |
kosukesuzuki | 1:b38a436a0059 | 150 | i2c.write(addr|0x01); //ack=1(送信) |
kosukesuzuki | 1:b38a436a0059 | 151 | gzh = i2c.read(0);//data取り出す |
kosukesuzuki | 1:b38a436a0059 | 152 | i2c.stop(); |
kosukesuzuki | 1:b38a436a0059 | 153 | |
kosukesuzuki | 1:b38a436a0059 | 154 | i2c.start(); |
kosukesuzuki | 1:b38a436a0059 | 155 | i2c.write(0x47); //data |
kosukesuzuki | 1:b38a436a0059 | 156 | i2c.write(addr|0x01); //ack=1(送信) |
kosukesuzuki | 1:b38a436a0059 | 157 | gzl = i2c.read(0);//data取り出す |
kosukesuzuki | 1:b38a436a0059 | 158 | i2c.stop(); |
kosukesuzuki | 0:bf86efb237ca | 159 | |
kosukesuzuki | 0:bf86efb237ca | 160 | |
kosukesuzuki | 1:b38a436a0059 | 161 | double acc_ax = short((axh<<8) | (axl)); |
kosukesuzuki | 1:b38a436a0059 | 162 | double acc_ay = short((ayh<<8) | (ayl)); |
kosukesuzuki | 1:b38a436a0059 | 163 | double acc_az = short((azh<<8) | (azl)); |
kosukesuzuki | 1:b38a436a0059 | 164 | |
kosukesuzuki | 1:b38a436a0059 | 165 | double acc_gx = short((gxh<<8) | (gxl)); |
kosukesuzuki | 1:b38a436a0059 | 166 | double acc_gy = short((gyh<<8) | (gyl)); |
kosukesuzuki | 1:b38a436a0059 | 167 | double acc_gz = short((gzh<<8) | (gzl)); |
kosukesuzuki | 0:bf86efb237ca | 168 | |
kosukesuzuki | 0:bf86efb237ca | 169 | double AX = (acc_ax)*2/32768*9.81; |
kosukesuzuki | 0:bf86efb237ca | 170 | double AY = (acc_ay)*2/32768*9.81; |
kosukesuzuki | 0:bf86efb237ca | 171 | double AZ = (acc_az)*2/32768*9.81; |
kosukesuzuki | 0:bf86efb237ca | 172 | |
kosukesuzuki | 1:b38a436a0059 | 173 | double GX = (acc_gx)*0.0128114995; //0.02562299 |
kosukesuzuki | 1:b38a436a0059 | 174 | double GY = (acc_gy)*0.0128114995; //0.0128114995(測定レンジ±500) |
kosukesuzuki | 1:b38a436a0059 | 175 | double GZ = (acc_gz)*0.0128114995; |
kosukesuzuki | 1:b38a436a0059 | 176 | |
kosukesuzuki | 0:bf86efb237ca | 177 | pc.printf("%f %f %f\r\n",AX,AY,AZ); |
kosukesuzuki | 1:b38a436a0059 | 178 | pc.printf("%f %f %f\r\n",GX,GY,GZ); //GXがずれている |
kosukesuzuki | 0:bf86efb237ca | 179 | wait(0.01); |
kosukesuzuki | 0:bf86efb237ca | 180 | } |
kosukesuzuki | 0:bf86efb237ca | 181 | } |