コウスケ スズキ
/
MPU9250class
classにしてみたけど, 値がなぞ
main.cpp@0:f6e2eff23d2d, 21 months ago (annotated)
- Committer:
- kosukesuzuki
- Date:
- Sun Dec 25 17:15:39 2022 +0000
- Revision:
- 0:f6e2eff23d2d
class
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kosukesuzuki | 0:f6e2eff23d2d | 1 | //level 2 |
kosukesuzuki | 0:f6e2eff23d2d | 2 | #include "mbed.h" |
kosukesuzuki | 0:f6e2eff23d2d | 3 | I2C mpu9250(p9,p10); |
kosukesuzuki | 0:f6e2eff23d2d | 4 | |
kosukesuzuki | 0:f6e2eff23d2d | 5 | uint8_t addrAG = 0b1101001<<1;//AD0=H(VDDIOにした)/7bitであるため. 右にズラして,左に0を追加することで, 8bitにする。 加速度ジャイロのスレーブアドレス |
kosukesuzuki | 0:f6e2eff23d2d | 6 | uint8_t addrM = 0b0001100<<1;//磁気センサのスレーブアドレス |
kosukesuzuki | 0:f6e2eff23d2d | 7 | double G = 9.80665;//重力加速度 |
kosukesuzuki | 0:f6e2eff23d2d | 8 | |
kosukesuzuki | 0:f6e2eff23d2d | 9 | class mpu{//クラス宣言 |
kosukesuzuki | 0:f6e2eff23d2d | 10 | //メンバの宣言 |
kosukesuzuki | 0:f6e2eff23d2d | 11 | private: //外部から操作不可 |
kosukesuzuki | 0:f6e2eff23d2d | 12 | |
kosukesuzuki | 0:f6e2eff23d2d | 13 | public: //操作可能 |
kosukesuzuki | 0:f6e2eff23d2d | 14 | char addr; |
kosukesuzuki | 0:f6e2eff23d2d | 15 | int ac[3];//単位mV |
kosukesuzuki | 0:f6e2eff23d2d | 16 | int gy[3];//単位mV |
kosukesuzuki | 0:f6e2eff23d2d | 17 | int mg[3];//単位mV |
kosukesuzuki | 0:f6e2eff23d2d | 18 | |
kosukesuzuki | 0:f6e2eff23d2d | 19 | void ready(); |
kosukesuzuki | 0:f6e2eff23d2d | 20 | void who(); |
kosukesuzuki | 0:f6e2eff23d2d | 21 | void accel(int *ac); |
kosukesuzuki | 0:f6e2eff23d2d | 22 | void gyro(int *gy); |
kosukesuzuki | 0:f6e2eff23d2d | 23 | void magnet(int *mg); |
kosukesuzuki | 0:f6e2eff23d2d | 24 | }; |
kosukesuzuki | 0:f6e2eff23d2d | 25 | |
kosukesuzuki | 0:f6e2eff23d2d | 26 | void mpu::ready(){ |
kosukesuzuki | 0:f6e2eff23d2d | 27 | char data[7]; |
kosukesuzuki | 0:f6e2eff23d2d | 28 | data[0]=0x00; |
kosukesuzuki | 0:f6e2eff23d2d | 29 | addr = 0x6b; |
kosukesuzuki | 0:f6e2eff23d2d | 30 | mpu9250.write(addr,data,1);//0x6bに0x00を書き込む |
kosukesuzuki | 0:f6e2eff23d2d | 31 | data[0]=0x02; |
kosukesuzuki | 0:f6e2eff23d2d | 32 | addr = 0x37; |
kosukesuzuki | 0:f6e2eff23d2d | 33 | } |
kosukesuzuki | 0:f6e2eff23d2d | 34 | |
kosukesuzuki | 0:f6e2eff23d2d | 35 | void mpu::who(){ |
kosukesuzuki | 0:f6e2eff23d2d | 36 | char data[7]; |
kosukesuzuki | 0:f6e2eff23d2d | 37 | int i; |
kosukesuzuki | 0:f6e2eff23d2d | 38 | addr = addrAG; |
kosukesuzuki | 0:f6e2eff23d2d | 39 | for(i=0;i<2;i++){ |
kosukesuzuki | 0:f6e2eff23d2d | 40 | data[0] = 0x75; //こいつを読んで, 0x71がかえってくる。 |
kosukesuzuki | 0:f6e2eff23d2d | 41 | mpu9250.write( addr, data, 1,1);//内部レジスタを指定(1=1byte) |
kosukesuzuki | 0:f6e2eff23d2d | 42 | mpu9250.read( addr,data, 1,0);//レジスタの読み取り |
kosukesuzuki | 0:f6e2eff23d2d | 43 | uint8_t WHO = data[0]; |
kosukesuzuki | 0:f6e2eff23d2d | 44 | if(WHO == 0x71){ |
kosukesuzuki | 0:f6e2eff23d2d | 45 | printf("0x%x/WHO_I_AM is Yes\r\n",addr>>1); |
kosukesuzuki | 0:f6e2eff23d2d | 46 | }else{ |
kosukesuzuki | 0:f6e2eff23d2d | 47 | printf("0x%x/WHO_I_AM is NO\r\n",addr>>1); |
kosukesuzuki | 0:f6e2eff23d2d | 48 | } |
kosukesuzuki | 0:f6e2eff23d2d | 49 | addr = addrM; |
kosukesuzuki | 0:f6e2eff23d2d | 50 | } |
kosukesuzuki | 0:f6e2eff23d2d | 51 | } |
kosukesuzuki | 0:f6e2eff23d2d | 52 | |
kosukesuzuki | 0:f6e2eff23d2d | 53 | void mpu::accel(int *ac){ //加速度//スコープ解決演算子 |
kosukesuzuki | 0:f6e2eff23d2d | 54 | char data[7]; |
kosukesuzuki | 0:f6e2eff23d2d | 55 | //int ac[3];//単位mV |
kosukesuzuki | 0:f6e2eff23d2d | 56 | data[0] = 0x3b; |
kosukesuzuki | 0:f6e2eff23d2d | 57 | mpu9250.write(addrAG,data,1,1); |
kosukesuzuki | 0:f6e2eff23d2d | 58 | mpu9250.read(addrAG,data,7,0); |
kosukesuzuki | 0:f6e2eff23d2d | 59 | |
kosukesuzuki | 0:f6e2eff23d2d | 60 | ac[0]=(short)data[0]<<8|(short)data[1]; |
kosukesuzuki | 0:f6e2eff23d2d | 61 | ac[1]=(short)data[2]<<8|(short)data[3]; |
kosukesuzuki | 0:f6e2eff23d2d | 62 | ac[2]=(short)data[4]<<8|(short)data[5]; |
kosukesuzuki | 0:f6e2eff23d2d | 63 | } |
kosukesuzuki | 0:f6e2eff23d2d | 64 | |
kosukesuzuki | 0:f6e2eff23d2d | 65 | void mpu::gyro(int *gy){ //角速度//スコープ解決演算子 |
kosukesuzuki | 0:f6e2eff23d2d | 66 | char data[7]; |
kosukesuzuki | 0:f6e2eff23d2d | 67 | //int gy[3];//単位mV |
kosukesuzuki | 0:f6e2eff23d2d | 68 | data[0] = 0x43; |
kosukesuzuki | 0:f6e2eff23d2d | 69 | mpu9250.write(addrAG,data,1,1); |
kosukesuzuki | 0:f6e2eff23d2d | 70 | mpu9250.read(addrAG,data,7,0); |
kosukesuzuki | 0:f6e2eff23d2d | 71 | |
kosukesuzuki | 0:f6e2eff23d2d | 72 | gy[0]=(short)data[0]<<8|(short)data[1]; |
kosukesuzuki | 0:f6e2eff23d2d | 73 | gy[1]=(short)data[2]<<8|(short)data[3]; |
kosukesuzuki | 0:f6e2eff23d2d | 74 | gy[2]=(short)data[4]<<8|(short)data[5]; |
kosukesuzuki | 0:f6e2eff23d2d | 75 | } |
kosukesuzuki | 0:f6e2eff23d2d | 76 | |
kosukesuzuki | 0:f6e2eff23d2d | 77 | void mpu::magnet(int *mg){ //地磁気//スコープ解決演算子 |
kosukesuzuki | 0:f6e2eff23d2d | 78 | char data[7]; |
kosukesuzuki | 0:f6e2eff23d2d | 79 | //int mg[3];//単位mV |
kosukesuzuki | 0:f6e2eff23d2d | 80 | data[0]=0x12; |
kosukesuzuki | 0:f6e2eff23d2d | 81 | addr=0x0A; |
kosukesuzuki | 0:f6e2eff23d2d | 82 | mpu9250.write(addr,data,1);//AD変換(8Hz)を行う。 |
kosukesuzuki | 0:f6e2eff23d2d | 83 | data[0]=0x03; |
kosukesuzuki | 0:f6e2eff23d2d | 84 | mpu9250.write(addrM,data,1,1); |
kosukesuzuki | 0:f6e2eff23d2d | 85 | mpu9250.read(addrM,data,7,0); |
kosukesuzuki | 0:f6e2eff23d2d | 86 | |
kosukesuzuki | 0:f6e2eff23d2d | 87 | mg[0]=((short)data[1]<<8|(short)data[0]); |
kosukesuzuki | 0:f6e2eff23d2d | 88 | mg[1]=((short)data[3]<<8|(short)data[2]); |
kosukesuzuki | 0:f6e2eff23d2d | 89 | mg[2]=((short)data[5]<<8|(short)data[4]); |
kosukesuzuki | 0:f6e2eff23d2d | 90 | } |
kosukesuzuki | 0:f6e2eff23d2d | 91 | |
kosukesuzuki | 0:f6e2eff23d2d | 92 | Serial pc(USBTX,USBRX); |
kosukesuzuki | 0:f6e2eff23d2d | 93 | |
kosukesuzuki | 0:f6e2eff23d2d | 94 | int main(){ |
kosukesuzuki | 0:f6e2eff23d2d | 95 | mpu mpu; |
kosukesuzuki | 0:f6e2eff23d2d | 96 | float AX,AY,AZ; |
kosukesuzuki | 0:f6e2eff23d2d | 97 | float GX,GY,GZ; |
kosukesuzuki | 0:f6e2eff23d2d | 98 | float MX,MY,MZ; |
kosukesuzuki | 0:f6e2eff23d2d | 99 | |
kosukesuzuki | 0:f6e2eff23d2d | 100 | mpu.ready(); |
kosukesuzuki | 0:f6e2eff23d2d | 101 | mpu.who(); |
kosukesuzuki | 0:f6e2eff23d2d | 102 | |
kosukesuzuki | 0:f6e2eff23d2d | 103 | int ac[3];//単位mV |
kosukesuzuki | 0:f6e2eff23d2d | 104 | int gy[3];//単位mV |
kosukesuzuki | 0:f6e2eff23d2d | 105 | int mg[3];//単位mV |
kosukesuzuki | 0:f6e2eff23d2d | 106 | |
kosukesuzuki | 0:f6e2eff23d2d | 107 | while(1){ |
kosukesuzuki | 0:f6e2eff23d2d | 108 | mpu.accel(ac); |
kosukesuzuki | 0:f6e2eff23d2d | 109 | AX=(float)ac[0]; |
kosukesuzuki | 0:f6e2eff23d2d | 110 | AY=(float)ac[1]; |
kosukesuzuki | 0:f6e2eff23d2d | 111 | AZ=(float)ac[2]; |
kosukesuzuki | 0:f6e2eff23d2d | 112 | |
kosukesuzuki | 0:f6e2eff23d2d | 113 | mpu.gyro(gy); |
kosukesuzuki | 0:f6e2eff23d2d | 114 | GX=(float)gy[0]; |
kosukesuzuki | 0:f6e2eff23d2d | 115 | GY=(float)gy[1]; |
kosukesuzuki | 0:f6e2eff23d2d | 116 | GZ=(float)gy[2]; |
kosukesuzuki | 0:f6e2eff23d2d | 117 | |
kosukesuzuki | 0:f6e2eff23d2d | 118 | mpu.magnet(mg); |
kosukesuzuki | 0:f6e2eff23d2d | 119 | MX=(float)mg[0]; |
kosukesuzuki | 0:f6e2eff23d2d | 120 | MY=(float)mg[1]; |
kosukesuzuki | 0:f6e2eff23d2d | 121 | MZ=(float)mg[2]; |
kosukesuzuki | 0:f6e2eff23d2d | 122 | |
kosukesuzuki | 0:f6e2eff23d2d | 123 | printf("x%.3f ,y%.3f ,z%.3f ",AX,AY,AZ); |
kosukesuzuki | 0:f6e2eff23d2d | 124 | printf("x%.3f ,y%.3f ,z%.3f ",GX,GY,GZ); |
kosukesuzuki | 0:f6e2eff23d2d | 125 | printf("x%.3f ,y%.3f ,z%.3f\r\n",MX,MY,MZ); |
kosukesuzuki | 0:f6e2eff23d2d | 126 | |
kosukesuzuki | 0:f6e2eff23d2d | 127 | wait(0.01); |
kosukesuzuki | 0:f6e2eff23d2d | 128 | } |
kosukesuzuki | 0:f6e2eff23d2d | 129 | |
kosukesuzuki | 0:f6e2eff23d2d | 130 | } |