Sensor reporting over USB CDC

Dependencies:   MAG3110 MMA8451Q SLCD- TSI USBDevice mbed

Committer:
wue
Date:
Wed Apr 16 12:20:12 2014 +0000
Revision:
0:7b58cdacf811
Sensor reporting over USB CDC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wue 0:7b58cdacf811 1
wue 0:7b58cdacf811 2 #include "MAG3110.h"
wue 0:7b58cdacf811 3 #include "mbed.h"
wue 0:7b58cdacf811 4
wue 0:7b58cdacf811 5 /******************************************************************************
wue 0:7b58cdacf811 6 * Constructors
wue 0:7b58cdacf811 7 ******************************************************************************/
wue 0:7b58cdacf811 8 MAG3110::MAG3110(PinName sda, PinName scl): _i2c(sda, scl),
wue 0:7b58cdacf811 9 _i2c_address(0x1D), _pc(NULL), _debug(false)
wue 0:7b58cdacf811 10 {
wue 0:7b58cdacf811 11 begin();
wue 0:7b58cdacf811 12 }
wue 0:7b58cdacf811 13
wue 0:7b58cdacf811 14 MAG3110::MAG3110(PinName sda, PinName scl, Serial *pc): _i2c(sda, scl),
wue 0:7b58cdacf811 15 _i2c_address(0x1D), _pc(pc), _debug(true)
wue 0:7b58cdacf811 16 {
wue 0:7b58cdacf811 17 begin();
wue 0:7b58cdacf811 18 }
wue 0:7b58cdacf811 19
wue 0:7b58cdacf811 20 void MAG3110::begin()
wue 0:7b58cdacf811 21 {
wue 0:7b58cdacf811 22 char cmd[2];
wue 0:7b58cdacf811 23
wue 0:7b58cdacf811 24 cmd[0] = MAG_CTRL_REG2;
wue 0:7b58cdacf811 25 cmd[1] = 0x80;
wue 0:7b58cdacf811 26 _i2c.write(_i2c_address, cmd, 2);
wue 0:7b58cdacf811 27
wue 0:7b58cdacf811 28 cmd[0] = MAG_CTRL_REG1;
wue 0:7b58cdacf811 29 cmd[1] = MAG_3110_SAMPLE80+MAG_3110_OVERSAMPLE2+MAG_3110_ACTIVE;
wue 0:7b58cdacf811 30 _i2c.write(_i2c_address, cmd, 2);
wue 0:7b58cdacf811 31
wue 0:7b58cdacf811 32 // No adjustment initially
wue 0:7b58cdacf811 33 _avgX = 0;
wue 0:7b58cdacf811 34 _avgY = 0;
wue 0:7b58cdacf811 35 }
wue 0:7b58cdacf811 36
wue 0:7b58cdacf811 37 // Read a single byte form 8 bit register, return as int
wue 0:7b58cdacf811 38 int MAG3110::readReg(char regAddr)
wue 0:7b58cdacf811 39 {
wue 0:7b58cdacf811 40 char cmd[1];
wue 0:7b58cdacf811 41
wue 0:7b58cdacf811 42 cmd[0] = regAddr;
wue 0:7b58cdacf811 43 _i2c.write(_i2c_address, cmd, 1);
wue 0:7b58cdacf811 44
wue 0:7b58cdacf811 45 cmd[0] = 0x00;
wue 0:7b58cdacf811 46 _i2c.read(_i2c_address, cmd, 1);
wue 0:7b58cdacf811 47 return (int)( cmd[0]);
wue 0:7b58cdacf811 48 }
wue 0:7b58cdacf811 49
wue 0:7b58cdacf811 50
wue 0:7b58cdacf811 51 // read a register per, pass first reg value, reading 2 bytes increments register
wue 0:7b58cdacf811 52 // Reads MSB first then LSB
wue 0:7b58cdacf811 53 int MAG3110::readVal(char regAddr)
wue 0:7b58cdacf811 54 {
wue 0:7b58cdacf811 55 char cmd[2];
wue 0:7b58cdacf811 56
wue 0:7b58cdacf811 57 cmd[0] = regAddr;
wue 0:7b58cdacf811 58 _i2c.write(_i2c_address, cmd, 1);
wue 0:7b58cdacf811 59
wue 0:7b58cdacf811 60 cmd[0] = 0x00;
wue 0:7b58cdacf811 61 cmd[1] = 0x00;
wue 0:7b58cdacf811 62 _i2c.read(_i2c_address, cmd, 2);
wue 0:7b58cdacf811 63 return (int)( (cmd[1]|(cmd[0] << 8))); //concatenate the MSB and LSB
wue 0:7b58cdacf811 64 }
wue 0:7b58cdacf811 65
wue 0:7b58cdacf811 66
wue 0:7b58cdacf811 67 float MAG3110::getHeading()
wue 0:7b58cdacf811 68 {
wue 0:7b58cdacf811 69 int xVal = readVal(MAG_OUT_X_MSB);
wue 0:7b58cdacf811 70 int yVal = readVal(MAG_OUT_Y_MSB);
wue 0:7b58cdacf811 71 return (atan2((double)(yVal - _avgY),(double)(xVal - _avgX)))*180/PI;
wue 0:7b58cdacf811 72 }
wue 0:7b58cdacf811 73
wue 0:7b58cdacf811 74 void MAG3110::getValues(int *xVal, int *yVal, int *zVal)
wue 0:7b58cdacf811 75 {
wue 0:7b58cdacf811 76 *xVal = readVal(MAG_OUT_X_MSB);
wue 0:7b58cdacf811 77 *yVal = readVal(MAG_OUT_Y_MSB);
wue 0:7b58cdacf811 78 *zVal = readVal(MAG_OUT_Z_MSB);
wue 0:7b58cdacf811 79 }
wue 0:7b58cdacf811 80
wue 0:7b58cdacf811 81
wue 0:7b58cdacf811 82 void MAG3110::setCalibration(int minX, int maxX, int minY, int maxY )
wue 0:7b58cdacf811 83 {
wue 0:7b58cdacf811 84 _avgX=(maxX+minX)/2;
wue 0:7b58cdacf811 85 _avgY=(maxY+minY)/2;
wue 0:7b58cdacf811 86 }
wue 0:7b58cdacf811 87
wue 0:7b58cdacf811 88
wue 0:7b58cdacf811 89
wue 0:7b58cdacf811 90
wue 0:7b58cdacf811 91