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 /* Copyright (c) 2010-2011 mbed.org, MIT License
xmnan 0:2b49a387e831 2 *
xmnan 0:2b49a387e831 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
xmnan 0:2b49a387e831 4 * and associated documentation files (the "Software"), to deal in the Software without
xmnan 0:2b49a387e831 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
xmnan 0:2b49a387e831 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
xmnan 0:2b49a387e831 7 * Software is furnished to do so, subject to the following conditions:
xmnan 0:2b49a387e831 8 *
xmnan 0:2b49a387e831 9 * The above copyright notice and this permission notice shall be included in all copies or
xmnan 0:2b49a387e831 10 * substantial portions of the Software.
xmnan 0:2b49a387e831 11 *
xmnan 0:2b49a387e831 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
xmnan 0:2b49a387e831 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
xmnan 0:2b49a387e831 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
xmnan 0:2b49a387e831 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
xmnan 0:2b49a387e831 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
xmnan 0:2b49a387e831 17 */
xmnan 0:2b49a387e831 18
xmnan 0:2b49a387e831 19 #include "MMA8451Q.h"
xmnan 0:2b49a387e831 20
xmnan 0:2b49a387e831 21 #define INT_SOURCE 0x0C
xmnan 0:2b49a387e831 22 #define REG_WHO_AM_I 0x0D
xmnan 0:2b49a387e831 23 #define HP_FILTER_CUTOFF 0x0F
xmnan 0:2b49a387e831 24 #define PULSE_CFG 0x21
xmnan 0:2b49a387e831 25 #define PULSE_SRC 0x22
xmnan 0:2b49a387e831 26 #define PULSE_THSX 0x23
xmnan 0:2b49a387e831 27 #define PULSE_THSY 0x24
xmnan 0:2b49a387e831 28 #define PULSE_THSZ 0x25
xmnan 0:2b49a387e831 29 #define PULSE_TMLT 0x26
xmnan 0:2b49a387e831 30 #define PULSE_LTCY 0x27
xmnan 0:2b49a387e831 31 #define PULSE_WIND 0x28
xmnan 0:2b49a387e831 32 #define REG_CTRL_REG_1 0x2A
xmnan 0:2b49a387e831 33 #define CTRL_REG2 0x2B
xmnan 0:2b49a387e831 34 #define CTRL_REG4 0x2D
xmnan 0:2b49a387e831 35 #define CTRL_REG5 0x2E
xmnan 0:2b49a387e831 36 #define REG_OUT_X_MSB 0x01
xmnan 0:2b49a387e831 37 #define REG_OUT_Y_MSB 0x03
xmnan 0:2b49a387e831 38 #define REG_OUT_Z_MSB 0x05
xmnan 0:2b49a387e831 39
xmnan 0:2b49a387e831 40 #define UINT14_MAX 16383
xmnan 0:2b49a387e831 41
xmnan 0:2b49a387e831 42 MMA8451Q::MMA8451Q(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr),dr(MMA8415Q_SAMPLE400) {
xmnan 0:2b49a387e831 43 // activate the peripheral
xmnan 0:2b49a387e831 44 uint8_t data[2] = {REG_CTRL_REG_1, 0x01};
xmnan 0:2b49a387e831 45 writeRegs(data, 2);
xmnan 0:2b49a387e831 46 }
xmnan 0:2b49a387e831 47
xmnan 0:2b49a387e831 48 MMA8451Q::~MMA8451Q() { }
xmnan 0:2b49a387e831 49
xmnan 0:2b49a387e831 50 uint8_t MMA8451Q::getWhoAmI() {
xmnan 0:2b49a387e831 51 uint8_t who_am_i = 0;
xmnan 0:2b49a387e831 52 readRegs(REG_WHO_AM_I, &who_am_i, 1);
xmnan 0:2b49a387e831 53 return who_am_i;
xmnan 0:2b49a387e831 54 }
xmnan 0:2b49a387e831 55
xmnan 0:2b49a387e831 56 float MMA8451Q::getAccX() {
xmnan 0:2b49a387e831 57 //divide by 4096 b/c MMA output is 4096 counts per g so this f outputs accelorometer value formatted to g (gravity)
xmnan 0:2b49a387e831 58 return (float(getAccAxis(REG_OUT_X_MSB))/4096.0);
xmnan 0:2b49a387e831 59 }
xmnan 0:2b49a387e831 60
xmnan 0:2b49a387e831 61 float MMA8451Q::getAccY() {
xmnan 0:2b49a387e831 62 return (float(getAccAxis(REG_OUT_Y_MSB))/4096.0);
xmnan 0:2b49a387e831 63 }
xmnan 0:2b49a387e831 64
xmnan 0:2b49a387e831 65 float MMA8451Q::getAccZ() {
xmnan 0:2b49a387e831 66 return (float(getAccAxis(REG_OUT_Z_MSB))/4096.0);
xmnan 0:2b49a387e831 67 }
xmnan 0:2b49a387e831 68
xmnan 0:2b49a387e831 69 void MMA8451Q::getAccAllAxis(float * res) {
xmnan 0:2b49a387e831 70 res[0] = getAccX();
xmnan 0:2b49a387e831 71 res[1] = getAccY();
xmnan 0:2b49a387e831 72 res[2] = getAccZ();
xmnan 0:2b49a387e831 73 }
xmnan 0:2b49a387e831 74
xmnan 0:2b49a387e831 75 int16_t MMA8451Q::getAccAxis(uint8_t addr) {
xmnan 0:2b49a387e831 76 int16_t acc;
xmnan 0:2b49a387e831 77 uint8_t res[2];
xmnan 0:2b49a387e831 78 readRegs(addr, res, 2);
xmnan 0:2b49a387e831 79
xmnan 0:2b49a387e831 80 acc = (res[0] << 6) | (res[1] >> 2);
xmnan 0:2b49a387e831 81 if (acc > UINT14_MAX/2)
xmnan 0:2b49a387e831 82 acc -= UINT14_MAX;
xmnan 0:2b49a387e831 83
xmnan 0:2b49a387e831 84 return acc;
xmnan 0:2b49a387e831 85 }
xmnan 0:2b49a387e831 86
xmnan 0:2b49a387e831 87 void MMA8451Q::setDoubleTap(void){
xmnan 0:2b49a387e831 88 //Implemented directly from Freescale's AN4072
xmnan 0:2b49a387e831 89 //Added to MMA8451Q lib
xmnan 0:2b49a387e831 90
xmnan 0:2b49a387e831 91 uint8_t CTRL_REG1_Data;
xmnan 0:2b49a387e831 92 // int adds;
xmnan 0:2b49a387e831 93 uint8_t data[2] = {REG_CTRL_REG_1, dr}; //Sample Rate
xmnan 0:2b49a387e831 94
xmnan 0:2b49a387e831 95 //400 Hz, Standby Mode
xmnan 0:2b49a387e831 96 writeRegs(data,2);
xmnan 0:2b49a387e831 97
xmnan 0:2b49a387e831 98 //Enable X, Y and Z Double Pulse with DPA = 0 no double pulse abort
xmnan 0:2b49a387e831 99 data[0]=PULSE_CFG;data[1]=0x2A;
xmnan 0:2b49a387e831 100 writeRegs(data,2);
xmnan 0:2b49a387e831 101
xmnan 0:2b49a387e831 102 //SetThreshold 3g on X and Y and 5g on Z
xmnan 0:2b49a387e831 103 //Note: Every step is 0.063g
xmnan 0:2b49a387e831 104 //3 g/0.063g = 48 counts
xmnan 0:2b49a387e831 105 //5g/0.063g = 79 counts
xmnan 0:2b49a387e831 106 data[0]=PULSE_THSX;data[1]=0x30;
xmnan 0:2b49a387e831 107 writeRegs(data,2);//Set X Threshold to 3g
xmnan 0:2b49a387e831 108 data[0]=PULSE_THSY;data[1]=0x30;
xmnan 0:2b49a387e831 109 writeRegs(data,2);//Set Y Threshold to 3g
xmnan 0:2b49a387e831 110 data[0]=PULSE_THSZ;data[1]=0x4F;
xmnan 0:2b49a387e831 111 writeRegs(data,2);//Set Z Threshold to 5g
xmnan 0:2b49a387e831 112
xmnan 0:2b49a387e831 113 //Set Time Limit for Tap Detection to 60 ms LP Mode
xmnan 0:2b49a387e831 114 //Note: 400 Hz ODR, Time step is 1.25 ms per step
xmnan 0:2b49a387e831 115 //60 ms/1.25 ms = 48 counts
xmnan 0:2b49a387e831 116 data[0]=PULSE_TMLT;data[1]=0x30;
xmnan 0:2b49a387e831 117 writeRegs(data,2);//60 ms
xmnan 0:2b49a387e831 118
xmnan 0:2b49a387e831 119 //Set Latency Time to 200 ms
xmnan 0:2b49a387e831 120 //Note: 400 Hz ODR LPMode, Time step is 2.5 ms per step 00 ms/2.5 ms = 80 counts
xmnan 0:2b49a387e831 121 data[0]=PULSE_LTCY;data[1]=0x50;
xmnan 0:2b49a387e831 122 writeRegs(data,2);//200 ms
xmnan 0:2b49a387e831 123
xmnan 0:2b49a387e831 124 //Set Time Window for second tap to 300 ms
xmnan 0:2b49a387e831 125 //Note: 400 Hz ODR LP Mode, Time step is 2.5 ms per step
xmnan 0:2b49a387e831 126 //300 ms/2.5 ms = 120 counts
xmnan 0:2b49a387e831 127 data[0]=PULSE_WIND;data[1]=0x78;
xmnan 0:2b49a387e831 128 writeRegs(data,2);//300 ms
xmnan 0:2b49a387e831 129
xmnan 0:2b49a387e831 130 //Route INT1 to System Interrupt
xmnan 0:2b49a387e831 131 data[0]=CTRL_REG4;data[1]=0x08;
xmnan 0:2b49a387e831 132 writeRegs(data,2);//Enable Pulse Interrupt in System CTRL_REG4
xmnan 0:2b49a387e831 133 data[0]=CTRL_REG5;data[1]=0x08;
xmnan 0:2b49a387e831 134 writeRegs(data,2);//Route Pulse Interrupt to INT1 hardware Pin CTRL_REG5
xmnan 0:2b49a387e831 135
xmnan 0:2b49a387e831 136 //Set the device to Active Mode
xmnan 0:2b49a387e831 137 readRegs(0x2A,&CTRL_REG1_Data,1);//Read out the contents of the register
xmnan 0:2b49a387e831 138 CTRL_REG1_Data |= 0x01; //Change the value in the register to Active Mode.
xmnan 0:2b49a387e831 139 data[0]=REG_CTRL_REG_1;
xmnan 0:2b49a387e831 140 data[1]=CTRL_REG1_Data;
xmnan 0:2b49a387e831 141 writeRegs(data,2);//Write in the updated value to put the device in Active Mode
xmnan 0:2b49a387e831 142 }
xmnan 0:2b49a387e831 143
xmnan 0:2b49a387e831 144
xmnan 0:2b49a387e831 145 void MMA8451Q::readRegs(int addr, uint8_t * data, int len) {
xmnan 0:2b49a387e831 146 char t[1] = {addr};
xmnan 0:2b49a387e831 147 m_i2c.write(m_addr, t, 1, true);
xmnan 0:2b49a387e831 148 m_i2c.read(m_addr, (char *)data, len);
xmnan 0:2b49a387e831 149 }
xmnan 0:2b49a387e831 150
xmnan 0:2b49a387e831 151
xmnan 0:2b49a387e831 152
xmnan 0:2b49a387e831 153 void MMA8451Q::writeRegs(uint8_t * data, int len) {
xmnan 0:2b49a387e831 154 m_i2c.write(m_addr, (char *)data, len);
xmnan 0:2b49a387e831 155 }
xmnan 0:2b49a387e831 156
xmnan 0:2b49a387e831 157 void MMA8451Q::Setdr(float dateRate)
xmnan 0:2b49a387e831 158 {
xmnan 0:2b49a387e831 159 if (dateRate==800)
xmnan 0:2b49a387e831 160 dr=MMA8415Q_SAMPLE800;
xmnan 0:2b49a387e831 161 else if(dateRate==400)
xmnan 0:2b49a387e831 162 dr=MMA8415Q_SAMPLE400;
xmnan 0:2b49a387e831 163 else if(dateRate==200)
xmnan 0:2b49a387e831 164 dr=MMA8415Q_SAMPLE200;
xmnan 0:2b49a387e831 165 else if(dateRate==100)
xmnan 0:2b49a387e831 166 dr=MMA8415Q_SAMPLE100;
xmnan 0:2b49a387e831 167 else if(dateRate==50)
xmnan 0:2b49a387e831 168 dr=MMA8415Q_SAMPLE50;
xmnan 0:2b49a387e831 169 else if(dateRate==12.5)
xmnan 0:2b49a387e831 170 dr=MMA8415Q_SAMPLE12_5;
xmnan 0:2b49a387e831 171 else if(dateRate==6.25)
xmnan 0:2b49a387e831 172 dr=MMA8415Q_SAMPLE6_25;
xmnan 0:2b49a387e831 173 else if(dateRate==1.56)
xmnan 0:2b49a387e831 174 dr=MMA8415Q_SAMPLE1_56;
xmnan 0:2b49a387e831 175 }
xmnan 0:2b49a387e831 176
xmnan 0:2b49a387e831 177 void MMA8451Q::Overwrite_dr(float dateRate)
xmnan 0:2b49a387e831 178 {
xmnan 0:2b49a387e831 179 Setdr(dateRate);
xmnan 0:2b49a387e831 180 // uint8_t data[2] = {REG_CTRL_REG_1, dr}; //Sample Rate
xmnan 0:2b49a387e831 181
xmnan 0:2b49a387e831 182 //400 Hz, Standby Mode
xmnan 0:2b49a387e831 183 // writeRegs(data,2);
xmnan 0:2b49a387e831 184 setDoubleTap();
xmnan 0:2b49a387e831 185 }