classにしてみたけど, 値がなぞ

Dependencies:   mbed

Committer:
kosukesuzuki
Date:
Sun Dec 25 17:15:39 2022 +0000
Revision:
0:f6e2eff23d2d
class

Who changed what in which revision?

UserRevisionLine numberNew 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 }