configure sensors on FRDM KL46Z and send data through Serial port. Need host(PC) software to interact with. Sampling rate can vary by proper instruction

Dependencies:   EventFramework mbed

Committer:
xmnan
Date:
Sat Feb 15 07:52:46 2014 +0000
Revision:
0:2b49a387e831
original version.; Utilize EventFrameWork; sensors: MMA8451Q MAG3110 TSISensor lightSensor + analog input

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xmnan 0:2b49a387e831 1 /*
xmnan 0:2b49a387e831 2 * MAG3110 Sensor Library for mbed
xmnan 0:2b49a387e831 3 * TODO: Add proper header
xmnan 0:2b49a387e831 4 */
xmnan 0:2b49a387e831 5
xmnan 0:2b49a387e831 6 #ifndef MAG3110_H
xmnan 0:2b49a387e831 7 #define MAG3110_H
xmnan 0:2b49a387e831 8
xmnan 0:2b49a387e831 9 #include "mbed.h"
xmnan 0:2b49a387e831 10
xmnan 0:2b49a387e831 11 #define PI 3.14159265359
xmnan 0:2b49a387e831 12
xmnan 0:2b49a387e831 13 #define MAG_ADDR 0x1D
xmnan 0:2b49a387e831 14
xmnan 0:2b49a387e831 15 // define registers
xmnan 0:2b49a387e831 16 #define MAG_DR_STATUS 0x00
xmnan 0:2b49a387e831 17 #define MAG_OUT_X_MSB 0x01
xmnan 0:2b49a387e831 18 #define MAG_OUT_X_LSB 0x02
xmnan 0:2b49a387e831 19 #define MAG_OUT_Y_MSB 0x03
xmnan 0:2b49a387e831 20 #define MAG_OUT_Y_LSB 0x04
xmnan 0:2b49a387e831 21 #define MAG_OUT_Z_MSB 0x05
xmnan 0:2b49a387e831 22 #define MAG_OUT_Z_LSB 0x06
xmnan 0:2b49a387e831 23 #define MAG_WHO_AM_I 0x07
xmnan 0:2b49a387e831 24 #define MAG_SYSMOD 0x08
xmnan 0:2b49a387e831 25 #define MAG_OFF_X_MSB 0x09
xmnan 0:2b49a387e831 26 #define MAG_OFF_X_LSB 0x0A
xmnan 0:2b49a387e831 27 #define MAG_OFF_Y_MSB 0x0B
xmnan 0:2b49a387e831 28 #define MAG_OFF_Y_LSB 0x0C
xmnan 0:2b49a387e831 29 #define MAG_OFF_Z_MSB 0x0D
xmnan 0:2b49a387e831 30 #define MAG_OFF_Z_LSB 0x0E
xmnan 0:2b49a387e831 31 #define MAG_DIE_TEMP 0x0F
xmnan 0:2b49a387e831 32 #define MAG_CTRL_REG1 0x10
xmnan 0:2b49a387e831 33 #define MAG_CTRL_REG2 0x11
xmnan 0:2b49a387e831 34
xmnan 0:2b49a387e831 35 // what should WHO_AM_I return?
xmnan 0:2b49a387e831 36 #define MAG_3110_WHO_AM_I_VALUE 0xC4
xmnan 0:2b49a387e831 37
xmnan 0:2b49a387e831 38
xmnan 0:2b49a387e831 39 // Fields in registers
xmnan 0:2b49a387e831 40 // CTRL_REG1: dr2,dr1,dr0 os1,os0 fr tm ac
xmnan 0:2b49a387e831 41
xmnan 0:2b49a387e831 42 // Sampling rate from 80Hz down to 0.625Hz
xmnan 0:2b49a387e831 43 #define MAG_3110_SAMPLE80 0
xmnan 0:2b49a387e831 44 #define MAG_3110_SAMPLE40 0x20
xmnan 0:2b49a387e831 45 #define MAG_3110_SAMPLE20 0x40
xmnan 0:2b49a387e831 46 #define MAG_3110_SAMPLE10 0x60
xmnan 0:2b49a387e831 47 #define MAG_3110_SAMPLE5 0x80
xmnan 0:2b49a387e831 48 #define MAG_3110_SAMPLE2_5 0xA0
xmnan 0:2b49a387e831 49 #define MAG_3110_SAMPLE1_25 0xC0
xmnan 0:2b49a387e831 50 #define MAG_3110_SAMPLE0_625 0xE0
xmnan 0:2b49a387e831 51
xmnan 0:2b49a387e831 52 // How many samples to average (lowers data rate)
xmnan 0:2b49a387e831 53 #define MAG_3110_OVERSAMPLE1 0 //16
xmnan 0:2b49a387e831 54 #define MAG_3110_OVERSAMPLE2 0x08 //32, sample rate decrease to half
xmnan 0:2b49a387e831 55 #define MAG_3110_OVERSAMPLE3 0x10 //64, sample rate decrease to 1/4
xmnan 0:2b49a387e831 56 #define MAG_3110_OVERSAMPLE4 0x18 //128 sample rate decrease to 1/8
xmnan 0:2b49a387e831 57
xmnan 0:2b49a387e831 58 // read only 1 byte per axis
xmnan 0:2b49a387e831 59 #define MAG_3110_FASTREAD 0x04
xmnan 0:2b49a387e831 60 // do one measurement (even if in standby mode)
xmnan 0:2b49a387e831 61 #define MAG_3110_TRIGGER 0x02
xmnan 0:2b49a387e831 62 // put in active mode
xmnan 0:2b49a387e831 63 #define MAG_3110_ACTIVE 0x01
xmnan 0:2b49a387e831 64
xmnan 0:2b49a387e831 65 // CTRL_REG2: AUTO_MRST_EN _ RAW MAG_RST _ _ _ _ _
xmnan 0:2b49a387e831 66 // reset sensor after each reading
xmnan 0:2b49a387e831 67 #define MAG_3110_AUTO_MRST_EN 0x80
xmnan 0:2b49a387e831 68 // don't subtract user offsets
xmnan 0:2b49a387e831 69 #define MAG_3110_RAW 0x20
xmnan 0:2b49a387e831 70 // reset magnetic sensor after too-large field
xmnan 0:2b49a387e831 71 #define MAG_3110_MAG_RST 0x10
xmnan 0:2b49a387e831 72
xmnan 0:2b49a387e831 73 // DR_STATUS Register ZYXOW ZOW YOW XOW ZYXDR ZDR YDR XDR
xmnan 0:2b49a387e831 74 #define MAG_3110_ZYXDR 0x08
xmnan 0:2b49a387e831 75
xmnan 0:2b49a387e831 76 /**
xmnan 0:2b49a387e831 77 * MAG3110 Class to read X/Y/Z data from the magentometer
xmnan 0:2b49a387e831 78 *
xmnan 0:2b49a387e831 79 */
xmnan 0:2b49a387e831 80 class MAG3110
xmnan 0:2b49a387e831 81 {
xmnan 0:2b49a387e831 82 public:
xmnan 0:2b49a387e831 83 /**
xmnan 0:2b49a387e831 84 * Main constructor
xmnan 0:2b49a387e831 85 * @param sda SDA pin
xmnan 0:2b49a387e831 86 * @param sdl SCL pin
xmnan 0:2b49a387e831 87 * @param addr addr of the I2C peripheral
xmnan 0:2b49a387e831 88 */
xmnan 0:2b49a387e831 89 MAG3110(PinName sda, PinName scl);
xmnan 0:2b49a387e831 90 /**
xmnan 0:2b49a387e831 91 * Debug version of constructor
xmnan 0:2b49a387e831 92 * @param sda SDA pin
xmnan 0:2b49a387e831 93 * @param sdl SCL pin
xmnan 0:2b49a387e831 94 * @param addr Address of the I2C peripheral
xmnan 0:2b49a387e831 95 * @param pc Serial object to output debug messages
xmnan 0:2b49a387e831 96 */
xmnan 0:2b49a387e831 97 MAG3110(PinName sda, PinName scl, Serial *pc); //pass serial for debug
xmnan 0:2b49a387e831 98 /**
xmnan 0:2b49a387e831 99 * Setup the Magnetometer
xmnan 0:2b49a387e831 100 *
xmnan 0:2b49a387e831 101 */
xmnan 0:2b49a387e831 102 MAG3110(PinName sda, PinName scl,float dateRate, int overSample);
xmnan 0:2b49a387e831 103 void Overwrite_dr_osr(float dateRate,int overSample);
xmnan 0:2b49a387e831 104 void Setdr(float dateRate);
xmnan 0:2b49a387e831 105 void Setosr(int overSample);
xmnan 0:2b49a387e831 106
xmnan 0:2b49a387e831 107 void begin();
xmnan 0:2b49a387e831 108 /**
xmnan 0:2b49a387e831 109 * Read a register, return its value as int
xmnan 0:2b49a387e831 110 * @param regAddr The address to read
xmnan 0:2b49a387e831 111 * @return value in register
xmnan 0:2b49a387e831 112 */
xmnan 0:2b49a387e831 113 int readReg(char regAddr);
xmnan 0:2b49a387e831 114 /**
xmnan 0:2b49a387e831 115 * Read a value from a pair of registers, return as int
xmnan 0:2b49a387e831 116 * @param regAddr The address to read
xmnan 0:2b49a387e831 117 * @return Value from 2 consecutive registers
xmnan 0:2b49a387e831 118 */
xmnan 0:2b49a387e831 119 int readVal(char regAddr);
xmnan 0:2b49a387e831 120 /**
xmnan 0:2b49a387e831 121 * Calculate the heading
xmnan 0:2b49a387e831 122 * @return heading in degrees
xmnan 0:2b49a387e831 123 */
xmnan 0:2b49a387e831 124 float getHeading();
xmnan 0:2b49a387e831 125 /**
xmnan 0:2b49a387e831 126 * Perform a read on the X, Y and Z values.
xmnan 0:2b49a387e831 127 * @param xVal Pointer to X value
xmnan 0:2b49a387e831 128 * @param yVal Pointer to Y value
xmnan 0:2b49a387e831 129 * @param zVal Pointer to Z value
xmnan 0:2b49a387e831 130 */
xmnan 0:2b49a387e831 131 void getValues(int *xVal, int *yVal, int *zVal);
xmnan 0:2b49a387e831 132 /**
xmnan 0:2b49a387e831 133 * Set the calibration parameters if required.
xmnan 0:2b49a387e831 134 * @param minX Minimum value for X range
xmnan 0:2b49a387e831 135 * @param maxX Maximum value for X range
xmnan 0:2b49a387e831 136 * @param minY Minimum value for Y range
xmnan 0:2b49a387e831 137 * @param maxY maximum value for Y range
xmnan 0:2b49a387e831 138 */
xmnan 0:2b49a387e831 139 void setCalibration(int minX, int maxX, int minY, int maxY);
xmnan 0:2b49a387e831 140
xmnan 0:2b49a387e831 141 private:
xmnan 0:2b49a387e831 142 I2C _i2c;
xmnan 0:2b49a387e831 143 int _i2c_address;
xmnan 0:2b49a387e831 144 Serial *_pc;
xmnan 0:2b49a387e831 145 bool _debug;
xmnan 0:2b49a387e831 146 int _avgX, _avgY;
xmnan 0:2b49a387e831 147 char dr; //date rate
xmnan 0:2b49a387e831 148 char osr; //over sample rate
xmnan 0:2b49a387e831 149
xmnan 0:2b49a387e831 150 };
xmnan 0:2b49a387e831 151 #endif