Calibration program for my port of FreeIMU library. Use it with the FreeIMU Cube program or the python calibration program.

Dependencies:   FreeIMU mbed-rtos mbed

Committer:
tyftyftyf
Date:
Mon Dec 23 09:18:24 2013 +0000
Revision:
1:622d7b18a1c0
Parent:
0:1b3e1eec2577
Child:
2:ba8ce2dbc778
Fix processing error

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tyftyftyf 0:1b3e1eec2577 1 #include "mbed.h"
tyftyftyf 0:1b3e1eec2577 2 #include "rtos.h"
tyftyftyf 0:1b3e1eec2577 3 #include "FreeIMU.h"
tyftyftyf 0:1b3e1eec2577 4
tyftyftyf 0:1b3e1eec2577 5 Serial pc(USBTX, USBRX); // tx, rx
tyftyftyf 0:1b3e1eec2577 6
tyftyftyf 0:1b3e1eec2577 7 typedef struct {
tyftyftyf 0:1b3e1eec2577 8 float q[4];
tyftyftyf 0:1b3e1eec2577 9 } imu_t;
tyftyftyf 0:1b3e1eec2577 10
tyftyftyf 0:1b3e1eec2577 11 FreeIMU imu;
tyftyftyf 0:1b3e1eec2577 12 Mail<imu_t, 8> imu_queue;
tyftyftyf 0:1b3e1eec2577 13 int i = 0;
tyftyftyf 0:1b3e1eec2577 14
tyftyftyf 0:1b3e1eec2577 15 void getIMUdata(void const *n)
tyftyftyf 0:1b3e1eec2577 16 {
tyftyftyf 0:1b3e1eec2577 17 i++;
tyftyftyf 0:1b3e1eec2577 18 if (i%4==0) {
tyftyftyf 0:1b3e1eec2577 19 float *q = (float *)imu_queue.alloc();
tyftyftyf 0:1b3e1eec2577 20 imu.getQ(q);
tyftyftyf 0:1b3e1eec2577 21 imu_queue.put((imu_t*)q);
tyftyftyf 0:1b3e1eec2577 22 } else {
tyftyftyf 0:1b3e1eec2577 23 imu.getQ(NULL);
tyftyftyf 0:1b3e1eec2577 24 }
tyftyftyf 0:1b3e1eec2577 25 }
tyftyftyf 0:1b3e1eec2577 26
tyftyftyf 0:1b3e1eec2577 27 // thanks to Francesco Ferrara and the Simplo project for the following code!
tyftyftyf 0:1b3e1eec2577 28 void writeVar(void * val, uint8_t type_bytes)
tyftyftyf 0:1b3e1eec2577 29 {
tyftyftyf 0:1b3e1eec2577 30 char * addr=(char *)(val);
tyftyftyf 0:1b3e1eec2577 31 for(uint8_t i=0; i<type_bytes; i++) {
tyftyftyf 0:1b3e1eec2577 32 //Serial1.write(addr[i]);
tyftyftyf 0:1b3e1eec2577 33 pc.putc(addr[i]);
tyftyftyf 0:1b3e1eec2577 34 }
tyftyftyf 0:1b3e1eec2577 35 }
tyftyftyf 0:1b3e1eec2577 36
tyftyftyf 0:1b3e1eec2577 37 void writeArr(void * varr, uint8_t arr_length, uint8_t type_bytes)
tyftyftyf 0:1b3e1eec2577 38 {
tyftyftyf 0:1b3e1eec2577 39 char * arr = (char*) varr;
tyftyftyf 0:1b3e1eec2577 40 for(uint8_t i=0; i<arr_length; i++) {
tyftyftyf 0:1b3e1eec2577 41 writeVar(&arr[i * type_bytes], type_bytes);
tyftyftyf 0:1b3e1eec2577 42 }
tyftyftyf 0:1b3e1eec2577 43 }
tyftyftyf 0:1b3e1eec2577 44
tyftyftyf 0:1b3e1eec2577 45 void serialFloatPrint(float f)
tyftyftyf 0:1b3e1eec2577 46 {
tyftyftyf 0:1b3e1eec2577 47 char * b = (char *) &f;
tyftyftyf 0:1b3e1eec2577 48 for(int i=0; i<4; i++) {
tyftyftyf 0:1b3e1eec2577 49
tyftyftyf 0:1b3e1eec2577 50 char b1 = (b[i] >> 4) & 0x0f;
tyftyftyf 0:1b3e1eec2577 51 char b2 = (b[i] & 0x0f);
tyftyftyf 0:1b3e1eec2577 52
tyftyftyf 0:1b3e1eec2577 53 char c1 = (b1 < 10) ? ('0' + b1) : 'A' + b1 - 10;
tyftyftyf 0:1b3e1eec2577 54 char c2 = (b2 < 10) ? ('0' + b2) : 'A' + b2 - 10;
tyftyftyf 0:1b3e1eec2577 55
tyftyftyf 0:1b3e1eec2577 56 pc.putc(c1);
tyftyftyf 0:1b3e1eec2577 57 pc.putc(c2);
tyftyftyf 0:1b3e1eec2577 58 }
tyftyftyf 0:1b3e1eec2577 59 }
tyftyftyf 0:1b3e1eec2577 60
tyftyftyf 0:1b3e1eec2577 61 void serialPrintFloatArr(float * arr, int length)
tyftyftyf 0:1b3e1eec2577 62 {
tyftyftyf 0:1b3e1eec2577 63 for(int i=0; i<length; i++) {
tyftyftyf 0:1b3e1eec2577 64 serialFloatPrint(arr[i]);
tyftyftyf 0:1b3e1eec2577 65 pc.putc(',');
tyftyftyf 0:1b3e1eec2577 66 }
tyftyftyf 0:1b3e1eec2577 67 }
tyftyftyf 0:1b3e1eec2577 68
tyftyftyf 1:622d7b18a1c0 69 //if the Processing program cannot accept serial inputs, uncomment this to send quaternion information automatically
tyftyftyf 1:622d7b18a1c0 70 #define AUTO_OUTPUT
tyftyftyf 1:622d7b18a1c0 71
tyftyftyf 0:1b3e1eec2577 72 int main()
tyftyftyf 0:1b3e1eec2577 73 {
tyftyftyf 0:1b3e1eec2577 74 pc.baud(115200);
tyftyftyf 0:1b3e1eec2577 75 imu.init(true);
tyftyftyf 0:1b3e1eec2577 76 pc.baud(115200);
tyftyftyf 0:1b3e1eec2577 77 RtosTimer IMUTimer(getIMUdata, osTimerPeriodic, (void *)0);
tyftyftyf 0:1b3e1eec2577 78 IMUTimer.start(5);
tyftyftyf 0:1b3e1eec2577 79
tyftyftyf 0:1b3e1eec2577 80 while(true) {
tyftyftyf 0:1b3e1eec2577 81 int16_t raw_values[9];
tyftyftyf 0:1b3e1eec2577 82
tyftyftyf 0:1b3e1eec2577 83 Thread::wait(10);
tyftyftyf 1:622d7b18a1c0 84 char cmd = 'q';
tyftyftyf 1:622d7b18a1c0 85 #ifndef AUTO_OUTPUT
tyftyftyf 1:622d7b18a1c0 86 cmd = pc.getc();
tyftyftyf 1:622d7b18a1c0 87 #endif
tyftyftyf 0:1b3e1eec2577 88
tyftyftyf 0:1b3e1eec2577 89 if(cmd=='v') {
tyftyftyf 0:1b3e1eec2577 90 char str[256];
tyftyftyf 0:1b3e1eec2577 91 sprintf(str, "FreeIMU library by %s, FREQ:%s, LIB_VERSION: %s, IMU: %s", FREEIMU_DEVELOPER, 0x10000000, FREEIMU_LIB_VERSION, 0);
tyftyftyf 0:1b3e1eec2577 92 pc.printf("%s", str);
tyftyftyf 0:1b3e1eec2577 93 pc.printf("\n");
tyftyftyf 0:1b3e1eec2577 94 }
tyftyftyf 0:1b3e1eec2577 95
tyftyftyf 0:1b3e1eec2577 96 if (cmd=='q') {
tyftyftyf 1:622d7b18a1c0 97 uint8_t count = 32;
tyftyftyf 1:622d7b18a1c0 98 #ifndef AUTO_OUTPUT
tyftyftyf 1:622d7b18a1c0 99 count = pc.getc();
tyftyftyf 1:622d7b18a1c0 100 #endif
tyftyftyf 0:1b3e1eec2577 101 for(uint8_t i=0; i<count; i++) {
tyftyftyf 0:1b3e1eec2577 102 osEvent evt = imu_queue.get();
tyftyftyf 0:1b3e1eec2577 103 if (evt.status == osEventMail) {
tyftyftyf 0:1b3e1eec2577 104 imu_t *obj = (imu_t*)evt.value.p;
tyftyftyf 0:1b3e1eec2577 105 serialPrintFloatArr(obj->q, 4);
tyftyftyf 0:1b3e1eec2577 106 imu_queue.free(obj);
tyftyftyf 0:1b3e1eec2577 107 pc.printf("\r\n");
tyftyftyf 0:1b3e1eec2577 108 }
tyftyftyf 0:1b3e1eec2577 109 Thread::yield();
tyftyftyf 0:1b3e1eec2577 110 }
tyftyftyf 0:1b3e1eec2577 111 }
tyftyftyf 0:1b3e1eec2577 112
tyftyftyf 0:1b3e1eec2577 113 if(cmd=='b') {
tyftyftyf 0:1b3e1eec2577 114 uint8_t count = pc.getc();
tyftyftyf 0:1b3e1eec2577 115 for(uint8_t i=0; i<count; i++) {
tyftyftyf 0:1b3e1eec2577 116
tyftyftyf 0:1b3e1eec2577 117 imu.accgyro.getMotion6(&raw_values[0], &raw_values[1], &raw_values[2], &raw_values[3], &raw_values[4], &raw_values[5]);
tyftyftyf 0:1b3e1eec2577 118
tyftyftyf 0:1b3e1eec2577 119 writeArr(raw_values, 6, sizeof(int16_t)); // writes accelerometer and gyro values
tyftyftyf 0:1b3e1eec2577 120
tyftyftyf 0:1b3e1eec2577 121 imu.magn.getValues(&raw_values[0], &raw_values[1], &raw_values[2]);
tyftyftyf 0:1b3e1eec2577 122 writeArr(raw_values, 3, sizeof(int16_t));
tyftyftyf 0:1b3e1eec2577 123
tyftyftyf 0:1b3e1eec2577 124 pc.printf("\r\n");
tyftyftyf 0:1b3e1eec2577 125 wait_us(4000);
tyftyftyf 0:1b3e1eec2577 126 }
tyftyftyf 0:1b3e1eec2577 127 }
tyftyftyf 0:1b3e1eec2577 128 }
tyftyftyf 0:1b3e1eec2577 129
tyftyftyf 0:1b3e1eec2577 130 }