maedalab / Mbed 2 deprecated MPU9250_AHRS

Dependencies:   MPU9250_SPI mbed

Committer:
uribotail
Date:
Wed Jul 06 06:05:48 2016 +0000
Revision:
25:f8fd336981cb
Parent:
23:2e1ee10d4ee0
Child:
26:0ffbe34a4953
scale change 16G and 2000dps

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mfurukawa 3:07aa20aa678d 1 /**
mfurukawa 3:07aa20aa678d 2 * Masahiro FURUKAWA - m.furukawa@ist.osaka-u.ac.jp
mfurukawa 8:03f9b5289083 3 *
mfurukawa 6:ea0804dc7cae 4 * June 17, 2016
mfurukawa 3:07aa20aa678d 5 *
mfurukawa 6:ea0804dc7cae 6 * MPU9250 9DoF Sensor (Extended to Ch1 ~ Ch2)
mfurukawa 3:07aa20aa678d 7 *
mfurukawa 3:07aa20aa678d 8 **/
mfurukawa 3:07aa20aa678d 9
adisuciu 0:83fda1bfaffe 10 #include "mbed.h"
mfurukawa 6:ea0804dc7cae 11 #include "MPU9250.h"
mfurukawa 17:7a9459ac7469 12 #include "MadgwickAHRS.h"
uribotail 19:3fc0ecfc723a 13 #define DEBUG_putc //Wada
mfurukawa 12:5638ddcd8477 14
mfurukawa 12:5638ddcd8477 15 /* MPU9250 Library
mfurukawa 12:5638ddcd8477 16 *
mfurukawa 12:5638ddcd8477 17 * https://developer.mbed.org/users/kylongmu/code/MPU9250_SPI_Test/file/5839d1b118bc/main.cpp
mfurukawa 17:7a9459ac7469 18 *
mfurukawa 17:7a9459ac7469 19 * MOSI (Master Out Slave In) p5
mfurukawa 17:7a9459ac7469 20 * MISO (Master In Slave Out p6
mfurukawa 17:7a9459ac7469 21 * SCK (Serial Clock) p7
mfurukawa 17:7a9459ac7469 22 * ~CS (Chip Select) p8
mfurukawa 12:5638ddcd8477 23 */
mfurukawa 10:28fa811afbfb 24
mfurukawa 17:7a9459ac7469 25 /* Madgwick AHRS Library
mfurukawa 12:5638ddcd8477 26 *
mfurukawa 12:5638ddcd8477 27 * AHRS algorithm is one of hte sensor fusion algorism.
mfurukawa 12:5638ddcd8477 28 * http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/AHRS algorithm is one of hte sensor fusion algorism.
mfurukawa 12:5638ddcd8477 29 * http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/
mfurukawa 12:5638ddcd8477 30 */
mfurukawa 12:5638ddcd8477 31
mfurukawa 10:28fa811afbfb 32 //define the mpu9250 object
mfurukawa 10:28fa811afbfb 33 mpu9250_spi *imu[2];
mfurukawa 17:7a9459ac7469 34
mfurukawa 17:7a9459ac7469 35 // define AHRS filters
mfurukawa 12:5638ddcd8477 36 MadgwickAHRS *ahrs[2];
mfurukawa 11:3f0b35a0855c 37
mfurukawa 17:7a9459ac7469 38 // define serial objects
mfurukawa 17:7a9459ac7469 39 Serial pc(USBTX, USBRX);
mfurukawa 11:3f0b35a0855c 40
mfurukawa 17:7a9459ac7469 41 // define SPI object for imu objects
mfurukawa 17:7a9459ac7469 42 SPI spi(p5, p6, p7);
mfurukawa 11:3f0b35a0855c 43
mfurukawa 17:7a9459ac7469 44 Ticker ticker;
mfurukawa 11:3f0b35a0855c 45
uribotail 22:10de7ce8fee3 46 float putg[3] = {0};
uribotail 22:10de7ce8fee3 47 float putq[4] = {0};
uribotail 23:2e1ee10d4ee0 48 int waittime = 80;
uribotail 22:10de7ce8fee3 49
mfurukawa 11:3f0b35a0855c 50 void init(void)
mfurukawa 11:3f0b35a0855c 51 {
uribotail 19:3fc0ecfc723a 52 pc.baud(115200); //921600
mfurukawa 11:3f0b35a0855c 53
mfurukawa 6:ea0804dc7cae 54 imu[0] = new mpu9250_spi(spi, p8);
mfurukawa 6:ea0804dc7cae 55 imu[1] = new mpu9250_spi(spi, p9);
mfurukawa 11:3f0b35a0855c 56
mfurukawa 12:5638ddcd8477 57 ahrs[0] = new MadgwickAHRS();
mfurukawa 12:5638ddcd8477 58 ahrs[1] = new MadgwickAHRS();
mfurukawa 11:3f0b35a0855c 59
mfurukawa 8:03f9b5289083 60 for(int i=0; i<2; i++) {
mfurukawa 11:3f0b35a0855c 61
mfurukawa 7:758a94e02aa7 62 imu[0]->deselect();
mfurukawa 7:758a94e02aa7 63 imu[1]->deselect();
mfurukawa 7:758a94e02aa7 64 imu[i]->select();
mfurukawa 8:03f9b5289083 65
mfurukawa 8:03f9b5289083 66 if(imu[i]->init(1,BITS_DLPF_CFG_188HZ)) { //INIT the mpu9250
mfurukawa 12:5638ddcd8477 67 printf("\nCH %d\n\nCouldn't initialize MPU9250 via SPI!", i);
mfurukawa 10:28fa811afbfb 68 wait(90);
mfurukawa 8:03f9b5289083 69 }
mfurukawa 17:7a9459ac7469 70 printf("\nCH %d\nWHOAMI=0x%2x\n",i, imu[i]->whoami()); //output the I2C address to know if SPI is working, it should be 104
uribotail 25:f8fd336981cb 71 printf("Gyro_scale=%u\n",imu[i]->set_gyro_scale(BITS_FS_2000DPS)); //Set 500DPS scale range for gyros //0706 wada 500to2000
uribotail 25:f8fd336981cb 72 printf("Acc_scale=%u\n",imu[i]->set_acc_scale(BITS_FS_16G)); //Set 4G scale range for accs //0706 wada 4to16
mfurukawa 6:ea0804dc7cae 73 printf("AK8963 WHIAM=0x%2x\n",imu[i]->AK8963_whoami());
mfurukawa 6:ea0804dc7cae 74 imu[i]->AK8963_calib_Magnetometer();
mfurukawa 8:03f9b5289083 75 wait(0.1);
mfurukawa 7:758a94e02aa7 76 }
mfurukawa 10:28fa811afbfb 77 }
mfurukawa 8:03f9b5289083 78
uribotail 19:3fc0ecfc723a 79 // Wada June 17, 2016
uribotail 19:3fc0ecfc723a 80 void float2byte(float gq, float k)//k = gyro_divider 32.8 or q_divider 32800
uribotail 19:3fc0ecfc723a 81 {
uribotail 20:01bba4071ffc 82 int tmp;
uribotail 19:3fc0ecfc723a 83 float omegaF = gq * k;
uribotail 19:3fc0ecfc723a 84 int16_t omegaI = (int16_t)omegaF;
uribotail 19:3fc0ecfc723a 85 if(omegaI < 0){//1の補数
uribotail 19:3fc0ecfc723a 86 omegaI = 0xFFFF + omegaI;
uribotail 19:3fc0ecfc723a 87 }
uribotail 20:01bba4071ffc 88 for(int i=0;i<4;i++){
uribotail 19:3fc0ecfc723a 89 tmp = (0xF & (omegaI >> (i*4)));
uribotail 19:3fc0ecfc723a 90 #ifdef DEBUG_putc
uribotail 19:3fc0ecfc723a 91 pc.putc(tmp);
uribotail 19:3fc0ecfc723a 92 #endif
uribotail 23:2e1ee10d4ee0 93 wait_us(waittime);
uribotail 19:3fc0ecfc723a 94 }
uribotail 19:3fc0ecfc723a 95 }//float2byte
uribotail 19:3fc0ecfc723a 96
uribotail 19:3fc0ecfc723a 97
mfurukawa 10:28fa811afbfb 98 void eventFunc(void)
mfurukawa 17:7a9459ac7469 99 {
mfurukawa 12:5638ddcd8477 100 for(int i=0; i<2; i++) {
mfurukawa 10:28fa811afbfb 101 imu[0]->deselect();
mfurukawa 10:28fa811afbfb 102 imu[1]->deselect();
mfurukawa 11:3f0b35a0855c 103
mfurukawa 10:28fa811afbfb 104 imu[i]->select();
mfurukawa 10:28fa811afbfb 105 imu[i]->read_all();
mfurukawa 12:5638ddcd8477 106 }
mfurukawa 17:7a9459ac7469 107
mfurukawa 17:7a9459ac7469 108 // update filters
mfurukawa 17:7a9459ac7469 109 for(int i=0; i<2; i++)
mfurukawa 17:7a9459ac7469 110 ahrs[i]->update(
mfurukawa 17:7a9459ac7469 111 imu[i]->gyroscope_data[0]*DEGREE2RAD,
mfurukawa 17:7a9459ac7469 112 imu[i]->gyroscope_data[1]*DEGREE2RAD,
mfurukawa 17:7a9459ac7469 113 imu[i]->gyroscope_data[2]*DEGREE2RAD,
mfurukawa 17:7a9459ac7469 114 imu[i]->accelerometer_data[0],
mfurukawa 17:7a9459ac7469 115 imu[i]->accelerometer_data[1],
mfurukawa 17:7a9459ac7469 116 imu[i]->accelerometer_data[2],
mfurukawa 17:7a9459ac7469 117 imu[i]->Magnetometer[0],
mfurukawa 17:7a9459ac7469 118 imu[i]->Magnetometer[1],
mfurukawa 17:7a9459ac7469 119 imu[i]->Magnetometer[2]
mfurukawa 10:28fa811afbfb 120 );
uribotail 19:3fc0ecfc723a 121 #ifdef DEBUG_putc
uribotail 19:3fc0ecfc723a 122 pc.putc(0x34); //STX
uribotail 20:01bba4071ffc 123 #endif
uribotail 23:2e1ee10d4ee0 124 wait_us(waittime);
uribotail 19:3fc0ecfc723a 125 for(int i=0; i<2; i++) {
uribotail 22:10de7ce8fee3 126 putg[0] = imu[i]->gyroscope_data[0];
uribotail 22:10de7ce8fee3 127 putg[1] = imu[i]->gyroscope_data[1];
uribotail 22:10de7ce8fee3 128 putg[2] = imu[i]->gyroscope_data[2];
uribotail 22:10de7ce8fee3 129 putq[0] = ahrs[i]->q0;
uribotail 22:10de7ce8fee3 130 putq[1] = ahrs[i]->q1;
uribotail 22:10de7ce8fee3 131 putq[2] = ahrs[i]->q2;
uribotail 22:10de7ce8fee3 132 putq[3] = ahrs[i]->q3;
uribotail 22:10de7ce8fee3 133
uribotail 19:3fc0ecfc723a 134 /*
uribotail 18:a4d18f4eb968 135 printf("%+0.3f,%+0.3f,%+0.3f,%+0.3f,%+0.3f,%+0.3f,%+0.3f,",
uribotail 22:10de7ce8fee3 136 putg[0]*DEGREE2RAD,
uribotail 22:10de7ce8fee3 137 putg[1]*DEGREE2RAD,
uribotail 22:10de7ce8fee3 138 putg[2]*DEGREE2RAD,
uribotail 22:10de7ce8fee3 139 putq[0],
uribotail 22:10de7ce8fee3 140 putq[1],
uribotail 22:10de7ce8fee3 141 putq[2],
uribotail 22:10de7ce8fee3 142 putq[3]);
uribotail 19:3fc0ecfc723a 143 */
uribotail 22:10de7ce8fee3 144
uribotail 22:10de7ce8fee3 145 float2byte(putg[0],32.8);
uribotail 22:10de7ce8fee3 146 float2byte(putg[1],32.8);
uribotail 22:10de7ce8fee3 147 float2byte(putg[2],32.8);
uribotail 22:10de7ce8fee3 148 float2byte(putq[0],32800);
uribotail 22:10de7ce8fee3 149 float2byte(putq[1],32800);
uribotail 22:10de7ce8fee3 150 float2byte(putq[2],32800);
uribotail 22:10de7ce8fee3 151 float2byte(putq[3],32800);
uribotail 22:10de7ce8fee3 152
uribotail 21:06a9547359dc 153 /*
uribotail 21:06a9547359dc 154 //test signal 29,June wada
uribotail 21:06a9547359dc 155 float2byte(-200,32.8);
uribotail 21:06a9547359dc 156 float2byte( 0,32.8);
uribotail 21:06a9547359dc 157 float2byte( 200,32.8);
uribotail 21:06a9547359dc 158 float2byte(-0.2,32800);
uribotail 21:06a9547359dc 159 float2byte( 0,32800);
uribotail 21:06a9547359dc 160 float2byte( 0.4,32800);
uribotail 21:06a9547359dc 161 float2byte( 0.8,32800);
uribotail 21:06a9547359dc 162 */
uribotail 22:10de7ce8fee3 163
uribotail 19:3fc0ecfc723a 164 }
uribotail 19:3fc0ecfc723a 165 #ifdef DEBUG_putc
uribotail 19:3fc0ecfc723a 166 pc.putc(0x12); //ETX
uribotail 19:3fc0ecfc723a 167 #endif
uribotail 23:2e1ee10d4ee0 168 //printf("\n");
mfurukawa 10:28fa811afbfb 169 }
mfurukawa 10:28fa811afbfb 170
mfurukawa 10:28fa811afbfb 171 int main()
mfurukawa 10:28fa811afbfb 172 {
mfurukawa 17:7a9459ac7469 173 // make instances and check sensors
mfurukawa 10:28fa811afbfb 174 init();
mfurukawa 11:3f0b35a0855c 175
mfurukawa 17:7a9459ac7469 176 // define callback event
mfurukawa 11:3f0b35a0855c 177 ticker.attach_us(eventFunc, 1000000.0f/sampleFreq);
mfurukawa 11:3f0b35a0855c 178
mfurukawa 10:28fa811afbfb 179 while(1) {
mfurukawa 11:3f0b35a0855c 180
mfurukawa 11:3f0b35a0855c 181 if(pc.readable())
mfurukawa 11:3f0b35a0855c 182 if(pc.getc() == 'r') {
mfurukawa 11:3f0b35a0855c 183 ticker.detach();
mfurukawa 17:7a9459ac7469 184 // write something event here
mfurukawa 11:3f0b35a0855c 185 ticker.attach_us(eventFunc, 1000000.0f/sampleFreq);
mfurukawa 11:3f0b35a0855c 186 }
mfurukawa 11:3f0b35a0855c 187 /*
mfurukawa 11:3f0b35a0855c 188 imu[i]->read_all();
mfurukawa 11:3f0b35a0855c 189 printf("%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f ",
mfurukawa 11:3f0b35a0855c 190 imu[i]->Temperature,
mfurukawa 11:3f0b35a0855c 191 imu[i]->gyroscope_data[0],
mfurukawa 11:3f0b35a0855c 192 imu[i]->gyroscope_data[1],
mfurukawa 11:3f0b35a0855c 193 imu[i]->gyroscope_data[2],
mfurukawa 11:3f0b35a0855c 194 imu[i]->accelerometer_data[0],
mfurukawa 11:3f0b35a0855c 195 imu[i]->accelerometer_data[1],
mfurukawa 11:3f0b35a0855c 196 imu[i]->accelerometer_data[2],
mfurukawa 11:3f0b35a0855c 197 imu[i]->Magnetometer[0],
mfurukawa 11:3f0b35a0855c 198 imu[i]->Magnetometer[1],
mfurukawa 11:3f0b35a0855c 199 imu[i]->Magnetometer[2]
mfurukawa 11:3f0b35a0855c 200 );*/
mfurukawa 11:3f0b35a0855c 201 //myled = 0;
mfurukawa 11:3f0b35a0855c 202 //wait(0.5);
adisuciu 0:83fda1bfaffe 203 }
adisuciu 0:83fda1bfaffe 204 }