Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: MPU9250_SPI mbed
main.cpp
- Committer:
- mfurukawa
- Date:
- 2016-06-22
- Revision:
- 17:7a9459ac7469
- Parent:
- 14:e795854eab64
- Child:
- 18:a4d18f4eb968
File content as of revision 17:7a9459ac7469:
/** * Masahiro FURUKAWA - m.furukawa@ist.osaka-u.ac.jp * * June 17, 2016 * * MPU9250 9DoF Sensor (Extended to Ch1 ~ Ch2) * **/ #include "mbed.h" #include "MPU9250.h" #include "MadgwickAHRS.h" /* MPU9250 Library * * https://developer.mbed.org/users/kylongmu/code/MPU9250_SPI_Test/file/5839d1b118bc/main.cpp * * MOSI (Master Out Slave In) p5 * MISO (Master In Slave Out p6 * SCK (Serial Clock) p7 * ~CS (Chip Select) p8 */ /* Madgwick AHRS Library * * AHRS algorithm is one of hte sensor fusion algorism. * http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/AHRS algorithm is one of hte sensor fusion algorism. * http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/ */ //define the mpu9250 object mpu9250_spi *imu[2]; // define AHRS filters MadgwickAHRS *ahrs[2]; // define serial objects Serial pc(USBTX, USBRX); // define SPI object for imu objects SPI spi(p5, p6, p7); Ticker ticker; void init(void) { pc.baud(921600); imu[0] = new mpu9250_spi(spi, p8); imu[1] = new mpu9250_spi(spi, p9); ahrs[0] = new MadgwickAHRS(); ahrs[1] = new MadgwickAHRS(); for(int i=0; i<2; i++) { imu[0]->deselect(); imu[1]->deselect(); imu[i]->select(); if(imu[i]->init(1,BITS_DLPF_CFG_188HZ)) { //INIT the mpu9250 printf("\nCH %d\n\nCouldn't initialize MPU9250 via SPI!", i); wait(90); } 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 printf("Gyro_scale=%u\n",imu[i]->set_gyro_scale(BITS_FS_500DPS)); //Set 500DPS scale range for gyros printf("Acc_scale=%u\n",imu[i]->set_acc_scale(BITS_FS_4G)); //Set 4G scale range for accs printf("AK8963 WHIAM=0x%2x\n",imu[i]->AK8963_whoami()); imu[i]->AK8963_calib_Magnetometer(); wait(0.1); } } void eventFunc(void) { for(int i=0; i<2; i++) { imu[0]->deselect(); imu[1]->deselect(); imu[i]->select(); imu[i]->read_all(); } // update filters for(int i=0; i<2; i++) ahrs[i]->update( imu[i]->gyroscope_data[0]*DEGREE2RAD, imu[i]->gyroscope_data[1]*DEGREE2RAD, imu[i]->gyroscope_data[2]*DEGREE2RAD, imu[i]->accelerometer_data[0], imu[i]->accelerometer_data[1], imu[i]->accelerometer_data[2], imu[i]->Magnetometer[0], imu[i]->Magnetometer[1], imu[i]->Magnetometer[2] ); for(int i=0; i<2; i++) printf("%+0.3f,%+0.3f,%+0.3f,%+0.3f,%+0.3f,%+0.3f,%+0.3f,", imu[i]->gyroscope_data[0]*DEGREE2RAD, imu[i]->gyroscope_data[1]*DEGREE2RAD, imu[i]->gyroscope_data[2]*DEGREE2RAD, ahrs[i]->q0, ahrs[i]->q1, ahrs[i]->q2, ahrs[i]->q3); printf("\n"); } int main() { // make instances and check sensors init(); // define callback event ticker.attach_us(eventFunc, 1000000.0f/sampleFreq); while(1) { if(pc.readable()) if(pc.getc() == 'r') { ticker.detach(); // write something event here ticker.attach_us(eventFunc, 1000000.0f/sampleFreq); } /* imu[i]->read_all(); printf("%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f,%10.3f ", imu[i]->Temperature, imu[i]->gyroscope_data[0], imu[i]->gyroscope_data[1], imu[i]->gyroscope_data[2], imu[i]->accelerometer_data[0], imu[i]->accelerometer_data[1], imu[i]->accelerometer_data[2], imu[i]->Magnetometer[0], imu[i]->Magnetometer[1], imu[i]->Magnetometer[2] );*/ //myled = 0; //wait(0.5); } }