Library to interface mbed with ArduIMU

Dependents:   ArduIMUHelloWorld

Committer:
ifwui
Date:
Mon Mar 24 20:26:15 2014 +0000
Revision:
0:d0d40a6fe11c
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ifwui 0:d0d40a6fe11c 1 #include "Arduimu.h"
ifwui 0:d0d40a6fe11c 2 #include <cstring>
ifwui 0:d0d40a6fe11c 3
ifwui 0:d0d40a6fe11c 4 #define preamble "DIYd"
ifwui 0:d0d40a6fe11c 5
ifwui 0:d0d40a6fe11c 6 typedef union {
ifwui 0:d0d40a6fe11c 7 int16_t integerVal;
ifwui 0:d0d40a6fe11c 8 char bytes[2];
ifwui 0:d0d40a6fe11c 9 } value_t;
ifwui 0:d0d40a6fe11c 10
ifwui 0:d0d40a6fe11c 11
ifwui 0:d0d40a6fe11c 12 Arduimu::Arduimu(PinName tx, PinName rx):imu(tx,rx)
ifwui 0:d0d40a6fe11c 13 {
ifwui 0:d0d40a6fe11c 14 imu.baud(38400);
ifwui 0:d0d40a6fe11c 15 imu.attach(this,&Arduimu::receive);
ifwui 0:d0d40a6fe11c 16 }
ifwui 0:d0d40a6fe11c 17
ifwui 0:d0d40a6fe11c 18 float Arduimu::getRoll()
ifwui 0:d0d40a6fe11c 19 {
ifwui 0:d0d40a6fe11c 20 return roll;
ifwui 0:d0d40a6fe11c 21 }
ifwui 0:d0d40a6fe11c 22 float Arduimu::getPitch()
ifwui 0:d0d40a6fe11c 23 {
ifwui 0:d0d40a6fe11c 24 return pitch;
ifwui 0:d0d40a6fe11c 25 }
ifwui 0:d0d40a6fe11c 26 float Arduimu::getYaw()
ifwui 0:d0d40a6fe11c 27 {
ifwui 0:d0d40a6fe11c 28 return yaw;
ifwui 0:d0d40a6fe11c 29 }
ifwui 0:d0d40a6fe11c 30 void Arduimu::getOrientation(float& roll, float& pitch, float& yaw)
ifwui 0:d0d40a6fe11c 31 {
ifwui 0:d0d40a6fe11c 32 roll = this->roll;
ifwui 0:d0d40a6fe11c 33 pitch = this->pitch;
ifwui 0:d0d40a6fe11c 34 yaw = this->yaw;
ifwui 0:d0d40a6fe11c 35 }
ifwui 0:d0d40a6fe11c 36
ifwui 0:d0d40a6fe11c 37 void Arduimu::receive()
ifwui 0:d0d40a6fe11c 38 {
ifwui 0:d0d40a6fe11c 39 char chk_a = 0;
ifwui 0:d0d40a6fe11c 40 char chk_b = 0;
ifwui 0:d0d40a6fe11c 41 value_t temp;
ifwui 0:d0d40a6fe11c 42 temp.integerVal = 0;
ifwui 0:d0d40a6fe11c 43 //The message is 14 bytes with a preamble of 'DIYd' + 0x06 + 0x02
ifwui 0:d0d40a6fe11c 44 char msgBuf[14];
ifwui 0:d0d40a6fe11c 45 //Wait for next message
ifwui 0:d0d40a6fe11c 46 while(imu.getc() != 'D');
ifwui 0:d0d40a6fe11c 47 __disable_irq(); // Disable Interrupts so we dont loose data
ifwui 0:d0d40a6fe11c 48 msgBuf[0] = 'D';
ifwui 0:d0d40a6fe11c 49 msgBuf[1] = imu.getc(); //I
ifwui 0:d0d40a6fe11c 50 msgBuf[2] = imu.getc(); //Y
ifwui 0:d0d40a6fe11c 51 msgBuf[3] = imu.getc(); //d
ifwui 0:d0d40a6fe11c 52 msgBuf[4] = imu.getc(); //0x06
ifwui 0:d0d40a6fe11c 53 msgBuf[5] = imu.getc(); //0x02
ifwui 0:d0d40a6fe11c 54
ifwui 0:d0d40a6fe11c 55 if(strcmp(msgBuf,preamble) && msgBuf[4] == 0x06 && msgBuf[5] == 0x02) {
ifwui 0:d0d40a6fe11c 56 //we have a valid message
ifwui 0:d0d40a6fe11c 57 //Fill in the rest of the values
ifwui 0:d0d40a6fe11c 58 for(int i = 6; i < 14; i++) {
ifwui 0:d0d40a6fe11c 59 msgBuf[i] = imu.getc();
ifwui 0:d0d40a6fe11c 60 }
ifwui 0:d0d40a6fe11c 61 __enable_irq(); // Enable Interrupts
ifwui 0:d0d40a6fe11c 62 for(int i = 6; i < 12; i++) {
ifwui 0:d0d40a6fe11c 63 chk_a+=msgBuf[i];
ifwui 0:d0d40a6fe11c 64 chk_b+=chk_a;
ifwui 0:d0d40a6fe11c 65 }
ifwui 0:d0d40a6fe11c 66
ifwui 0:d0d40a6fe11c 67 temp.bytes[0] = msgBuf[6];
ifwui 0:d0d40a6fe11c 68 temp.bytes[1] = msgBuf[7];
ifwui 0:d0d40a6fe11c 69 roll = (float) temp.integerVal / 100.0;
ifwui 0:d0d40a6fe11c 70
ifwui 0:d0d40a6fe11c 71 temp.bytes[0] = msgBuf[8];
ifwui 0:d0d40a6fe11c 72 temp.bytes[1] = msgBuf[9];
ifwui 0:d0d40a6fe11c 73 pitch = (float) temp.integerVal / 100.0;
ifwui 0:d0d40a6fe11c 74
ifwui 0:d0d40a6fe11c 75 temp.bytes[0] = msgBuf[10];
ifwui 0:d0d40a6fe11c 76 temp.bytes[1] = msgBuf[11];
ifwui 0:d0d40a6fe11c 77 yaw = (float) temp.integerVal / 100.0;
ifwui 0:d0d40a6fe11c 78 } else
ifwui 0:d0d40a6fe11c 79 __enable_irq(); // Enable Interrupts
ifwui 0:d0d40a6fe11c 80 }
ifwui 0:d0d40a6fe11c 81
ifwui 0:d0d40a6fe11c 82 void Arduimu::putc(char c)
ifwui 0:d0d40a6fe11c 83 {
ifwui 0:d0d40a6fe11c 84 imu.putc(c);
ifwui 0:d0d40a6fe11c 85 }