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

main.cpp

Committer:
tyftyftyf
Date:
2018-03-28
Revision:
4:145d1eb8a15d
Parent:
3:cc1415081d36
Child:
5:d21e84d6f5a1

File content as of revision 4:145d1eb8a15d:

#include "mbed.h"
#include "rtos.h"
#include "FreeIMU.h"

Serial pc(USBTX, USBRX); // tx, rx

typedef struct {
    float q[4];
} imu_t;

FreeIMU imu;
Mail<imu_t, 8> imu_queue;
int i = 0;

void getIMUdata(void const *n)
{
    i++;
    if (i%4==0) {
        float *q = (float *)imu_queue.alloc();
        imu.getQ(q);
        imu_queue.put((imu_t*)q);
    } else {
        imu.getQ(NULL);
    }
}

// thanks to Francesco Ferrara and the Simplo project for the following code!
void writeVar(void * val, uint8_t type_bytes)
{
    char * addr=(char *)(val);
    for(uint8_t i=0; i<type_bytes; i++) {
        //Serial1.write(addr[i]);
        pc.putc(addr[i]);
    }
}

void writeArr(void * varr, uint8_t arr_length, uint8_t type_bytes)
{
    char * arr = (char*) varr;
    for(uint8_t i=0; i<arr_length; i++) {
        writeVar(&arr[i * type_bytes], type_bytes);
    }
}

void serialFloatPrint(float f)
{
    char * b = (char *) &f;
    for(int i=0; i<4; i++) {

        char b1 = (b[i] >> 4) & 0x0f;
        char b2 = (b[i] & 0x0f);

        char c1 = (b1 < 10) ? ('0' + b1) : 'A' + b1 - 10;
        char c2 = (b2 < 10) ? ('0' + b2) : 'A' + b2 - 10;

        pc.putc(c1);
        pc.putc(c2);
    }
}

void serialPrintFloatArr(float * arr, int length)
{
    for(int i=0; i<length; i++) {
        serialFloatPrint(arr[i]);
        pc.putc(',');
    }
}

//if the Processing program cannot accept serial inputs, uncomment this to send quaternion information automatically
// #define AUTO_OUTPUT

int main()
{
    RtosTimer IMUTimer(getIMUdata, osTimerPeriodic, (void *)0);
    pc.baud(115200);
    // pc.printf("123456789012345678901234567890123456789012345678901234567890\r\n");
    imu.init(true);
    // pc.printf("fresfgsdgfsgdfgsdg123456789012345fdsgsdgd678901234567890123456789012345678901234567890\r\n");
    pc.baud(115200);
    
    // start data collection
    IMUTimer.start(5);

    while(true) {
        int16_t raw_values[9];

        Thread::wait(5);
        char cmd = 'q';
#ifndef AUTO_OUTPUT
        cmd = pc.getc();
#endif

        if(cmd=='v') {
            char str[256];
            sprintf(str, "FreeIMU library by %s, FREQ:%s, LIB_VERSION: %s, IMU: %s", FREEIMU_DEVELOPER, 0x10000000, FREEIMU_LIB_VERSION, 0);
            pc.printf("%s", str);
            pc.printf("\r\n");
        }

        if (cmd=='q') {
            uint8_t count = 32;
#ifndef AUTO_OUTPUT
            count = pc.getc();
#endif
            for(uint8_t i=0; i<count; i++) {
                osEvent evt = imu_queue.get();
                if (evt.status == osEventMail) {
                    imu_t *obj = (imu_t*)evt.value.p;
                    serialPrintFloatArr(obj->q, 4);
                    imu_queue.free(obj);
                    pc.printf("\r\n");
                }
                Thread::yield();
            }
        }
        
        if(cmd=='o') {
            uint8_t count = pc.getc();
            float raw_valuesf[9];
            for(uint8_t i=0; i<count; i++) {

                imu.getValues(raw_valuesf);

                pc.printf("%f, %f, %f", raw_valuesf[3], raw_valuesf[4], raw_valuesf[5]);

                pc.printf("\r\n");
                Thread::wait(4);
            }
        }

        if(cmd=='b') {
            uint8_t count = pc.getc();
            for(uint8_t i=0; i<count; i++) {

                imu.accgyro->getMotion6(&raw_values[0], &raw_values[1], &raw_values[2], &raw_values[3], &raw_values[4], &raw_values[5]);

                writeArr(raw_values, 6, sizeof(int16_t)); // writes accelerometer and gyro values

                imu.magn->getValues(&raw_values[0], &raw_values[1], &raw_values[2]);
                writeArr(raw_values, 3, sizeof(int16_t)); // write magnetometer values

                pc.printf("\r\n");
                Thread::wait(4);
            }
        }
    }

}