maedalab / Mbed 2 deprecated MPU9250_AHRS

Dependencies:   MPU9250_SPI mbed

Committer:
uribotail
Date:
Tue Jun 28 13:41:15 2016 +0000
Revision:
19:3fc0ecfc723a
Parent:
18:a4d18f4eb968
Child:
20:01bba4071ffc
????????

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
mfurukawa 11:3f0b35a0855c 46 void init(void)
mfurukawa 11:3f0b35a0855c 47 {
uribotail 19:3fc0ecfc723a 48 pc.baud(115200); //921600
mfurukawa 11:3f0b35a0855c 49
mfurukawa 6:ea0804dc7cae 50 imu[0] = new mpu9250_spi(spi, p8);
mfurukawa 6:ea0804dc7cae 51 imu[1] = new mpu9250_spi(spi, p9);
mfurukawa 11:3f0b35a0855c 52
mfurukawa 12:5638ddcd8477 53 ahrs[0] = new MadgwickAHRS();
mfurukawa 12:5638ddcd8477 54 ahrs[1] = new MadgwickAHRS();
mfurukawa 11:3f0b35a0855c 55
mfurukawa 8:03f9b5289083 56 for(int i=0; i<2; i++) {
mfurukawa 11:3f0b35a0855c 57
mfurukawa 7:758a94e02aa7 58 imu[0]->deselect();
mfurukawa 7:758a94e02aa7 59 imu[1]->deselect();
mfurukawa 7:758a94e02aa7 60 imu[i]->select();
mfurukawa 8:03f9b5289083 61
mfurukawa 8:03f9b5289083 62 if(imu[i]->init(1,BITS_DLPF_CFG_188HZ)) { //INIT the mpu9250
mfurukawa 12:5638ddcd8477 63 printf("\nCH %d\n\nCouldn't initialize MPU9250 via SPI!", i);
mfurukawa 10:28fa811afbfb 64 wait(90);
mfurukawa 8:03f9b5289083 65 }
mfurukawa 17:7a9459ac7469 66 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
mfurukawa 17:7a9459ac7469 67 printf("Gyro_scale=%u\n",imu[i]->set_gyro_scale(BITS_FS_500DPS)); //Set 500DPS scale range for gyros
mfurukawa 17:7a9459ac7469 68 printf("Acc_scale=%u\n",imu[i]->set_acc_scale(BITS_FS_4G)); //Set 4G scale range for accs
mfurukawa 6:ea0804dc7cae 69 printf("AK8963 WHIAM=0x%2x\n",imu[i]->AK8963_whoami());
mfurukawa 6:ea0804dc7cae 70 imu[i]->AK8963_calib_Magnetometer();
mfurukawa 8:03f9b5289083 71 wait(0.1);
mfurukawa 7:758a94e02aa7 72 }
mfurukawa 10:28fa811afbfb 73 }
mfurukawa 8:03f9b5289083 74
uribotail 19:3fc0ecfc723a 75 // Wada June 17, 2016
uribotail 19:3fc0ecfc723a 76 void float2byte(float gq, float k)//k = gyro_divider 32.8 or q_divider 32800
uribotail 19:3fc0ecfc723a 77 {
uribotail 19:3fc0ecfc723a 78 float omegaF = gq * k;
uribotail 19:3fc0ecfc723a 79 int16_t omegaI = (int16_t)omegaF;
uribotail 19:3fc0ecfc723a 80 if(omegaI < 0){//1の補数
uribotail 19:3fc0ecfc723a 81 omegaI = 0xFFFF + omegaI;
uribotail 19:3fc0ecfc723a 82 }
uribotail 19:3fc0ecfc723a 83 for(i=0;i<4;i++){
uribotail 19:3fc0ecfc723a 84 tmp = (0xF & (omegaI >> (i*4)));
uribotail 19:3fc0ecfc723a 85 #ifdef DEBUG_putc
uribotail 19:3fc0ecfc723a 86 pc.putc(tmp);
uribotail 19:3fc0ecfc723a 87 #endif
uribotail 19:3fc0ecfc723a 88 }
uribotail 19:3fc0ecfc723a 89 }//float2byte
uribotail 19:3fc0ecfc723a 90
uribotail 19:3fc0ecfc723a 91
mfurukawa 10:28fa811afbfb 92 void eventFunc(void)
mfurukawa 17:7a9459ac7469 93 {
mfurukawa 12:5638ddcd8477 94 for(int i=0; i<2; i++) {
mfurukawa 10:28fa811afbfb 95 imu[0]->deselect();
mfurukawa 10:28fa811afbfb 96 imu[1]->deselect();
mfurukawa 11:3f0b35a0855c 97
mfurukawa 10:28fa811afbfb 98 imu[i]->select();
mfurukawa 10:28fa811afbfb 99 imu[i]->read_all();
mfurukawa 12:5638ddcd8477 100 }
mfurukawa 17:7a9459ac7469 101
mfurukawa 17:7a9459ac7469 102 // update filters
mfurukawa 17:7a9459ac7469 103 for(int i=0; i<2; i++)
mfurukawa 17:7a9459ac7469 104 ahrs[i]->update(
mfurukawa 17:7a9459ac7469 105 imu[i]->gyroscope_data[0]*DEGREE2RAD,
mfurukawa 17:7a9459ac7469 106 imu[i]->gyroscope_data[1]*DEGREE2RAD,
mfurukawa 17:7a9459ac7469 107 imu[i]->gyroscope_data[2]*DEGREE2RAD,
mfurukawa 17:7a9459ac7469 108 imu[i]->accelerometer_data[0],
mfurukawa 17:7a9459ac7469 109 imu[i]->accelerometer_data[1],
mfurukawa 17:7a9459ac7469 110 imu[i]->accelerometer_data[2],
mfurukawa 17:7a9459ac7469 111 imu[i]->Magnetometer[0],
mfurukawa 17:7a9459ac7469 112 imu[i]->Magnetometer[1],
mfurukawa 17:7a9459ac7469 113 imu[i]->Magnetometer[2]
mfurukawa 10:28fa811afbfb 114 );
uribotail 19:3fc0ecfc723a 115 #ifdef DEBUG_putc
uribotail 19:3fc0ecfc723a 116 pc.putc(0x34); //STX
uribotail 19:3fc0ecfc723a 117 #endif
uribotail 19:3fc0ecfc723a 118 for(int i=0; i<2; i++) {
uribotail 18:a4d18f4eb968 119 /*
uribotail 18:a4d18f4eb968 120 printf("%+1.3f,%+1.3f,%+1.3f,",
uribotail 18:a4d18f4eb968 121 imu[i]->accelerometer_data[0],
uribotail 18:a4d18f4eb968 122 imu[i]->accelerometer_data[1],
uribotail 18:a4d18f4eb968 123 imu[i]->accelerometer_data[2]);
uribotail 18:a4d18f4eb968 124 */
uribotail 19:3fc0ecfc723a 125 /*
uribotail 18:a4d18f4eb968 126 printf("%+0.3f,%+0.3f,%+0.3f,%+0.3f,%+0.3f,%+0.3f,%+0.3f,",
mfurukawa 17:7a9459ac7469 127 imu[i]->gyroscope_data[0]*DEGREE2RAD,
mfurukawa 17:7a9459ac7469 128 imu[i]->gyroscope_data[1]*DEGREE2RAD,
mfurukawa 17:7a9459ac7469 129 imu[i]->gyroscope_data[2]*DEGREE2RAD,
mfurukawa 14:e795854eab64 130 ahrs[i]->q0,
mfurukawa 14:e795854eab64 131 ahrs[i]->q1,
mfurukawa 14:e795854eab64 132 ahrs[i]->q2,
mfurukawa 14:e795854eab64 133 ahrs[i]->q3);
uribotail 19:3fc0ecfc723a 134 */
uribotail 19:3fc0ecfc723a 135 float2byte(imu[i]->gyroscope_data[0],32.8);
uribotail 19:3fc0ecfc723a 136 float2byte(imu[i]->gyroscope_data[1],32.8);
uribotail 19:3fc0ecfc723a 137 float2byte(imu[i]->gyroscope_data[2],32.8);
uribotail 19:3fc0ecfc723a 138 float2byte(ahrs[i]->q0,32800);
uribotail 19:3fc0ecfc723a 139 float2byte(ahrs[i]->q1,32800);
uribotail 19:3fc0ecfc723a 140 float2byte(ahrs[i]->q2,32800);
uribotail 19:3fc0ecfc723a 141 float2byte(ahrs[i]->q3,32800);
uribotail 19:3fc0ecfc723a 142 }
uribotail 19:3fc0ecfc723a 143 #ifdef DEBUG_putc
uribotail 19:3fc0ecfc723a 144 pc.putc(0x12); //ETX
uribotail 19:3fc0ecfc723a 145 #endif
uribotail 19:3fc0ecfc723a 146 //printf("\n");
mfurukawa 10:28fa811afbfb 147 }
mfurukawa 10:28fa811afbfb 148
mfurukawa 10:28fa811afbfb 149 int main()
mfurukawa 10:28fa811afbfb 150 {
mfurukawa 17:7a9459ac7469 151 // make instances and check sensors
mfurukawa 10:28fa811afbfb 152 init();
mfurukawa 11:3f0b35a0855c 153
mfurukawa 17:7a9459ac7469 154 // define callback event
mfurukawa 11:3f0b35a0855c 155 ticker.attach_us(eventFunc, 1000000.0f/sampleFreq);
mfurukawa 11:3f0b35a0855c 156
mfurukawa 10:28fa811afbfb 157 while(1) {
mfurukawa 11:3f0b35a0855c 158
mfurukawa 11:3f0b35a0855c 159 if(pc.readable())
mfurukawa 11:3f0b35a0855c 160 if(pc.getc() == 'r') {
mfurukawa 11:3f0b35a0855c 161 ticker.detach();
mfurukawa 17:7a9459ac7469 162 // write something event here
mfurukawa 11:3f0b35a0855c 163 ticker.attach_us(eventFunc, 1000000.0f/sampleFreq);
mfurukawa 11:3f0b35a0855c 164 }
mfurukawa 11:3f0b35a0855c 165 /*
mfurukawa 11:3f0b35a0855c 166 imu[i]->read_all();
mfurukawa 11:3f0b35a0855c 167 printf("%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f ",
mfurukawa 11:3f0b35a0855c 168 imu[i]->Temperature,
mfurukawa 11:3f0b35a0855c 169 imu[i]->gyroscope_data[0],
mfurukawa 11:3f0b35a0855c 170 imu[i]->gyroscope_data[1],
mfurukawa 11:3f0b35a0855c 171 imu[i]->gyroscope_data[2],
mfurukawa 11:3f0b35a0855c 172 imu[i]->accelerometer_data[0],
mfurukawa 11:3f0b35a0855c 173 imu[i]->accelerometer_data[1],
mfurukawa 11:3f0b35a0855c 174 imu[i]->accelerometer_data[2],
mfurukawa 11:3f0b35a0855c 175 imu[i]->Magnetometer[0],
mfurukawa 11:3f0b35a0855c 176 imu[i]->Magnetometer[1],
mfurukawa 11:3f0b35a0855c 177 imu[i]->Magnetometer[2]
mfurukawa 11:3f0b35a0855c 178 );*/
mfurukawa 11:3f0b35a0855c 179 //myled = 0;
mfurukawa 11:3f0b35a0855c 180 //wait(0.5);
adisuciu 0:83fda1bfaffe 181 }
adisuciu 0:83fda1bfaffe 182 }