KL46 Accelerometer + Magnetometer, with 3-axis calibration. Readout through OpenSDA CDC.

Dependencies:   MAG3110 MMA8451Q USBDevice mbed

main.cpp

Committer:
wue
Date:
2014-04-10
Revision:
0:c569d820861b

File content as of revision 0:c569d820861b:

#include "mbed.h"
//#include "USBSerial.h"
#include "MAG3110.h"
#include "MMA8451Q.h"

#include "magnetic.h"

#define MMA8451_I2C_ADDRESS (0x1d<<1)
MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS);
MAG3110 mag(PTE25, PTE24);
Serial usb_cdc(USBTX, USBRX);

DigitalOut gLED(LED_GREEN); //PTD5
DigitalOut rLED(LED_RED);       //PTE29


struct MagneticBuffer mbuf;
struct MagCalibration mcal;

typedef struct tagV3i {
    int x;
    int y;
    int z;   
} v3i, *pv3i;

typedef struct tagV3f {
    float x;
    float y;
    float z;   
} v3f, *pv3f;

int main(void) {
    
    int i;
    v3i mv;
    v3f av;

    wait(0.2);
    usb_cdc.baud(115200);
    
    //printf("Started.\r\n");
    
    gLED = 1;
    rLED = 1;
    wait(0.2);
    
    //usb_cdc.printf("Reading %d mag vectors... ", MAGBUFFSIZE);
    gLED = 0;
    
    // sample MAGBUFFSIZE vectors for cal.
    for(i=0; i<MAGBUFFSIZE; i++) {
        mag.getValues(&mv.x, &mv.y, &mv.z);
        mbuf.iBx[i] = mv.x;
        mbuf.iBy[i] = mv.y;
        mbuf.iBz[i] = mv.z;
        wait(0.04);
    };
    
    gLED = 1;
    //usb_cdc.printf("done\r\n");
    wait(0.2);
    
    rLED = 0;
    
    //usb_cdc.printf("Calibrating... ");
    ResetMagCalibration(&mcal);
    magUpdateCalibration(&mcal, &mbuf);
    //usb_cdc.printf("done\r\n");
    rLED = 1;
    //printf("cal. result: % 3.2f % 3.2f % 3.2f\r\n", mcal.ftrVx, mcal.ftrVy, mcal.ftrVz);
    
    while(1) {
        mag.getValues(&(mv.x), &(mv.y), &(mv.z));
        if(mv.x>=32768) mv.x |= 0xFFFF0000;
        if(mv.y>=32768) mv.y |= 0xFFFF0000;
        if(mv.z>=32768) mv.z |= 0xFFFF0000;
        
        av.x = acc.getAccX();
        av.y = acc.getAccY();
        av.z = acc.getAccZ();
        printf("% 3.3f % 3.3f % 3.3f % 3.3f % 3.3f % 3.3f\r\n", 
            mv.x*FUTPERCOUNT-mcal.ftrVx, 
            mv.y*FUTPERCOUNT-mcal.ftrVy, 
            mv.z*FUTPERCOUNT-mcal.ftrVz, 
            av.x, 
            av.y, 
            av.z);
        wait(0.02);
        
    };
}