A class to receive data from the SparkFun 9DOF Razor IMU. It can be easily adapted to work with IMUs with different data formats.

Dependencies:   mbed

main.cpp

Committer:
avbotz
Date:
2011-10-16
Revision:
0:a260d84e07fc
Child:
1:fdfa313b9cc3

File content as of revision 0:a260d84e07fc:

/* 
 * Demo to relay I/O between a computer and the IMU. Make sure to connect the GND wire on the IMU to pin 1 (GND) on the mbed so there's a return current
 * Updated to use interrupts - this will help when we intergrate this code into AVNavControl
 * 9dof razor from sparkfun
 */
 
#define GYRO_SCALE 14.375  // ticks per degree, http://www.sparkfun.com/datasheets/Sensors/Gyro/PS-ITG-3200-00-01.4.pdf 

#include "mbed.h"
#include <string>
#include <sstream>

Serial IMU(p9, p10);   // tx, rx
Serial PC(USBTX, USBRX);

DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);

bool IMUreadable = false;
bool PCreadable = false;
bool parseNow = false;

bool debugMode = false;

string buffer;

void readIMU();
void readPC();

void parse(string);

int accX, accY, accZ, gyrX, gyrY, gyrZ, magX, magY, magZ;

int main() {
    IMU.format(8, Serial::None, 1);
    PC.format(8, Serial::None, 1);
    IMU.baud(57600);
    PC.baud(115200);
    
    PC.printf("----------------------------\n\r");
    PC.printf("debug: device reset\n\r");
    PC.printf("debug: gotta have my bowl; gotta have serial. serial is up.\n\r");
    
    PC.attach(&readPC);
    IMU.attach(&readIMU);
    
    //__disable_irq();
    PC.printf("debug: attached interrupts.\n\r");
        
    if (!debugMode) IMU.putc('4');  //tell the imu to start sending data, if it's not sending data already
    PC.printf("debug: told the IMU to start sending data\n\r");
    
    //The main loop 
    while (1) {
        __enable_irq();
        if (IMUreadable) {
            myled2 = 1;
            if (debugMode){
                while (IMU.readable()) PC.putc(IMU.getc());
            }
            else {
                while (IMU.readable()){
                    buffer.push_back(IMU.getc());
                    parseNow = (buffer.at(buffer.length() - 1) == '#');
                }
            }
            
            IMUreadable = false;
            myled2 = 0;
        }
        if (PCreadable) {
            myled1 = 1;
            while (PC.readable()) IMU.putc(PC.getc());
            PCreadable = false;
            myled1 = 0;
        }
        if (parseNow) {
            parse(buffer);
            buffer.clear();
            parseNow = false;
        }
    }
}

//Interrupt called when there is a character to be read from the PC
//To avoid a livelock, we disable interrupts at the end of the interrupt.
//Then, in the main loop, we read everything from the buffer
void readPC(){
    PCreadable = true;
    __disable_irq();
}

//Interrupt called when there is a character to be read from the IMU
void readIMU(){   
    IMUreadable = true;
    __disable_irq();
}

//Checks data integrity, then stores the IMU values into variables
void parse(string buf){
    if (buf.find('$') != buf.npos && buf.find('#') != buf.npos){
        for (int i = 0; i < buf.length(); i++) if (buf[i] == '$' || buf[i] == ',' || buf[i] == '#') buf[i] = ' ';
        stringstream ss(buf);
        ss >> accX >> accY >> accZ >> gyrX >> gyrY >> gyrZ >> magX >> magY >> magZ;

        PC.printf("%d, %d, %d, %d, %d, %d, %d, %d, %d\n\r", accX, accY, accZ, gyrX, gyrY, gyrZ, magX, magY, magZ);
    }
    else PC.printf("Bad parse!\n\r");
}