kyunsat / Mbed 2 deprecated MAG3110test

Dependencies:   MotionSensor SDFileSystem mbed

Fork of TanecCon by hswell and nike

Committer:
Nike3221
Date:
Fri Feb 10 08:39:51 2017 +0000
Revision:
0:029ef267b1bc
tanekon

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nike3221 0:029ef267b1bc 1
Nike3221 0:029ef267b1bc 2 #include "MAG3110.h"
Nike3221 0:029ef267b1bc 3 #include "mbed.h"
Nike3221 0:029ef267b1bc 4 #include "MotionSensor.h"
Nike3221 0:029ef267b1bc 5
Nike3221 0:029ef267b1bc 6 /******************************************************************************
Nike3221 0:029ef267b1bc 7 * Constructors
Nike3221 0:029ef267b1bc 8 ******************************************************************************/
Nike3221 0:029ef267b1bc 9 MAG3110::MAG3110(PinName sda, PinName scl): m_i2c(sda, scl),
Nike3221 0:029ef267b1bc 10 m_addr(0x1d)
Nike3221 0:029ef267b1bc 11 {
Nike3221 0:029ef267b1bc 12 char cmd[2];
Nike3221 0:029ef267b1bc 13
Nike3221 0:029ef267b1bc 14 cmd[0] = MAG_CTRL_REG2;
Nike3221 0:029ef267b1bc 15 cmd[1] = 0x80;
Nike3221 0:029ef267b1bc 16 m_i2c.write(m_addr, cmd, 2);
Nike3221 0:029ef267b1bc 17
Nike3221 0:029ef267b1bc 18 }
Nike3221 0:029ef267b1bc 19
Nike3221 0:029ef267b1bc 20 void MAG3110::enable(void) {
Nike3221 0:029ef267b1bc 21 uint8_t data[2];
Nike3221 0:029ef267b1bc 22 readRegs( MAG_CTRL_REG1, &data[1], 1);
Nike3221 0:029ef267b1bc 23 data[1] |= 0x01;
Nike3221 0:029ef267b1bc 24 data[0] = MAG_CTRL_REG1;
Nike3221 0:029ef267b1bc 25 writeRegs(data, 2);
Nike3221 0:029ef267b1bc 26 }
Nike3221 0:029ef267b1bc 27
Nike3221 0:029ef267b1bc 28
Nike3221 0:029ef267b1bc 29 void MAG3110::disable(void) {
Nike3221 0:029ef267b1bc 30 uint8_t data[2];
Nike3221 0:029ef267b1bc 31 readRegs( MAG_CTRL_REG1, &data[1], 1);
Nike3221 0:029ef267b1bc 32 data[1] &= 0xFE;
Nike3221 0:029ef267b1bc 33 data[0] = MAG_CTRL_REG1;
Nike3221 0:029ef267b1bc 34 writeRegs(data, 2);
Nike3221 0:029ef267b1bc 35 }
Nike3221 0:029ef267b1bc 36
Nike3221 0:029ef267b1bc 37
Nike3221 0:029ef267b1bc 38 void MAG3110::readRegs(int addr, uint8_t * data, int len)
Nike3221 0:029ef267b1bc 39 {
Nike3221 0:029ef267b1bc 40 char cmd[1];
Nike3221 0:029ef267b1bc 41
Nike3221 0:029ef267b1bc 42 cmd[0] = addr;
Nike3221 0:029ef267b1bc 43 m_i2c.write( m_addr, cmd, 1, true);
Nike3221 0:029ef267b1bc 44 m_i2c.read( m_addr, (char *) data, len);
Nike3221 0:029ef267b1bc 45 return;
Nike3221 0:029ef267b1bc 46 }
Nike3221 0:029ef267b1bc 47
Nike3221 0:029ef267b1bc 48
Nike3221 0:029ef267b1bc 49 void MAG3110::writeRegs(uint8_t * data, int len) {
Nike3221 0:029ef267b1bc 50 m_i2c.write(m_addr, (char *)data, len);
Nike3221 0:029ef267b1bc 51 }
Nike3221 0:029ef267b1bc 52
Nike3221 0:029ef267b1bc 53
Nike3221 0:029ef267b1bc 54 uint32_t MAG3110::whoAmI() {
Nike3221 0:029ef267b1bc 55 uint8_t who_am_i = 0;
Nike3221 0:029ef267b1bc 56 readRegs(MAG_WHOAMI, &who_am_i, 1);
Nike3221 0:029ef267b1bc 57 return (uint32_t) who_am_i;
Nike3221 0:029ef267b1bc 58 }
Nike3221 0:029ef267b1bc 59
Nike3221 0:029ef267b1bc 60 uint32_t MAG3110::dataReady(void) {
Nike3221 0:029ef267b1bc 61 uint8_t stat = 0;
Nike3221 0:029ef267b1bc 62 readRegs(MAG_DR_STATUS, &stat, 1);
Nike3221 0:029ef267b1bc 63 return (uint32_t) stat;
Nike3221 0:029ef267b1bc 64 }
Nike3221 0:029ef267b1bc 65
Nike3221 0:029ef267b1bc 66 uint32_t MAG3110::sampleRate(uint32_t f) {
Nike3221 0:029ef267b1bc 67 return(50); // for now sample rate is fixed at 50Hz
Nike3221 0:029ef267b1bc 68 }
Nike3221 0:029ef267b1bc 69
Nike3221 0:029ef267b1bc 70
Nike3221 0:029ef267b1bc 71 void MAG3110::getX(float * x) {
Nike3221 0:029ef267b1bc 72 *x = (float(getMagAxis(MAG_OUT_X_MSB)) * 0.1f);
Nike3221 0:029ef267b1bc 73 }
Nike3221 0:029ef267b1bc 74
Nike3221 0:029ef267b1bc 75 void MAG3110::getY(float * y) {
Nike3221 0:029ef267b1bc 76 *y = (float(getMagAxis(MAG_OUT_Y_MSB)) * 0.1f);
Nike3221 0:029ef267b1bc 77 }
Nike3221 0:029ef267b1bc 78
Nike3221 0:029ef267b1bc 79 void MAG3110::getZ(float * z) {
Nike3221 0:029ef267b1bc 80 *z = (float(getMagAxis(MAG_OUT_Z_MSB)) * 0.1f);
Nike3221 0:029ef267b1bc 81 }
Nike3221 0:029ef267b1bc 82
Nike3221 0:029ef267b1bc 83 void MAG3110::getX(int16_t * d) {
Nike3221 0:029ef267b1bc 84 *d = getMagAxis(MAG_OUT_X_MSB);
Nike3221 0:029ef267b1bc 85 }
Nike3221 0:029ef267b1bc 86
Nike3221 0:029ef267b1bc 87 void MAG3110::getY(int16_t * d) {
Nike3221 0:029ef267b1bc 88 *d = getMagAxis(MAG_OUT_Y_MSB);
Nike3221 0:029ef267b1bc 89 }
Nike3221 0:029ef267b1bc 90
Nike3221 0:029ef267b1bc 91 void MAG3110::getZ(int16_t * d) {
Nike3221 0:029ef267b1bc 92 *d = getMagAxis(MAG_OUT_Z_MSB);
Nike3221 0:029ef267b1bc 93 }
Nike3221 0:029ef267b1bc 94
Nike3221 0:029ef267b1bc 95 int16_t MAG3110::getMagAxis(uint8_t addr) {
Nike3221 0:029ef267b1bc 96 int16_t acc;
Nike3221 0:029ef267b1bc 97 uint8_t res[2];
Nike3221 0:029ef267b1bc 98 readRegs(addr, res, 2);
Nike3221 0:029ef267b1bc 99
Nike3221 0:029ef267b1bc 100 acc = (res[0] << 8) | res[1];
Nike3221 0:029ef267b1bc 101
Nike3221 0:029ef267b1bc 102 return acc;
Nike3221 0:029ef267b1bc 103 }
Nike3221 0:029ef267b1bc 104
Nike3221 0:029ef267b1bc 105
Nike3221 0:029ef267b1bc 106 void MAG3110::getAxis(MotionSensorDataUnits &data) {
Nike3221 0:029ef267b1bc 107 int16_t t[3];
Nike3221 0:029ef267b1bc 108 uint8_t res[6];
Nike3221 0:029ef267b1bc 109
Nike3221 0:029ef267b1bc 110 readRegs(MAG_OUT_X_MSB, res, 6);
Nike3221 0:029ef267b1bc 111 t[0] = (res[0] << 8) | res[1];
Nike3221 0:029ef267b1bc 112 t[1] = (res[2] << 8) | res[3];
Nike3221 0:029ef267b1bc 113 t[2] = (res[4] << 8) | res[5];
Nike3221 0:029ef267b1bc 114 data.x = ((float) t[0]) * 0.1f;
Nike3221 0:029ef267b1bc 115 data.y = ((float) t[1]) * 0.1f;
Nike3221 0:029ef267b1bc 116 data.z = ((float) t[2]) * 0.1f;
Nike3221 0:029ef267b1bc 117 }
Nike3221 0:029ef267b1bc 118
Nike3221 0:029ef267b1bc 119
Nike3221 0:029ef267b1bc 120 void MAG3110::getAxis(MotionSensorDataCounts &data) {
Nike3221 0:029ef267b1bc 121
Nike3221 0:029ef267b1bc 122 uint8_t res[6];
Nike3221 0:029ef267b1bc 123 readRegs(MAG_OUT_X_MSB, res, 6);
Nike3221 0:029ef267b1bc 124
Nike3221 0:029ef267b1bc 125 data.x = (res[0] << 8) | res[1];
Nike3221 0:029ef267b1bc 126 data.y = (res[2] << 8) | res[3];
Nike3221 0:029ef267b1bc 127 data.z = (res[4] << 8) | res[5];
Nike3221 0:029ef267b1bc 128 }
Nike3221 0:029ef267b1bc 129 /*
Nike3221 0:029ef267b1bc 130
Nike3221 0:029ef267b1bc 131 // read a register per, pass first reg value, reading 2 bytes increments register
Nike3221 0:029ef267b1bc 132 // Reads MSB first then LSB
Nike3221 0:029ef267b1bc 133 int MAG3110::readVal(char regAddr)
Nike3221 0:029ef267b1bc 134 {
Nike3221 0:029ef267b1bc 135 char cmd[2];
Nike3221 0:029ef267b1bc 136 int16_t t;
Nike3221 0:029ef267b1bc 137 cmd[0] = regAddr;
Nike3221 0:029ef267b1bc 138 if(_i2c.write(m_addr, cmd, 1)) {
Nike3221 0:029ef267b1bc 139 printf("MAG3110 write error\r\n");
Nike3221 0:029ef267b1bc 140 _i2c.stop();
Nike3221 0:029ef267b1bc 141 _i2c.start();
Nike3221 0:029ef267b1bc 142 }
Nike3221 0:029ef267b1bc 143
Nike3221 0:029ef267b1bc 144 cmd[0] = 0x00;
Nike3221 0:029ef267b1bc 145 cmd[1] = 0x00;
Nike3221 0:029ef267b1bc 146 _i2c.read(m_addr, cmd, 2);
Nike3221 0:029ef267b1bc 147 t = (cmd[0] * 256) + (unsigned short) cmd[1];
Nike3221 0:029ef267b1bc 148 return ((int) t); //concatenate the MSB and LSB
Nike3221 0:029ef267b1bc 149 }
Nike3221 0:029ef267b1bc 150
Nike3221 0:029ef267b1bc 151
Nike3221 0:029ef267b1bc 152 float MAG3110::getHeading()
Nike3221 0:029ef267b1bc 153 {
Nike3221 0:029ef267b1bc 154 int xVal = readVal(MAG_OUT_X_MSB);
Nike3221 0:029ef267b1bc 155 int yVal = readVal(MAG_OUT_Y_MSB);
Nike3221 0:029ef267b1bc 156 return (atan2((double)(yVal - _avgY),(double)(xVal - _avgX)))*180/PI;
Nike3221 0:029ef267b1bc 157 }
Nike3221 0:029ef267b1bc 158
Nike3221 0:029ef267b1bc 159 void MAG3110::getValues(int *xVal, int *yVal, int *zVal)
Nike3221 0:029ef267b1bc 160 {
Nike3221 0:029ef267b1bc 161 *xVal = readVal(MAG_OUT_X_MSB);
Nike3221 0:029ef267b1bc 162 *yVal = readVal(MAG_OUT_Y_MSB);
Nike3221 0:029ef267b1bc 163 *zVal = readVal(MAG_OUT_Z_MSB);
Nike3221 0:029ef267b1bc 164 }
Nike3221 0:029ef267b1bc 165
Nike3221 0:029ef267b1bc 166 void MAG3110::ReadXYZ(float * mag)
Nike3221 0:029ef267b1bc 167 {
Nike3221 0:029ef267b1bc 168 int x, y, z;
Nike3221 0:029ef267b1bc 169 x = readVal(MAG_OUT_X_MSB);
Nike3221 0:029ef267b1bc 170 y = readVal(MAG_OUT_Y_MSB);
Nike3221 0:029ef267b1bc 171 z = readVal(MAG_OUT_Z_MSB);
Nike3221 0:029ef267b1bc 172 mag[0] = (float) x / 10.0;
Nike3221 0:029ef267b1bc 173 mag[1] = (float) y / 10.0;
Nike3221 0:029ef267b1bc 174 mag[2] = (float) z / 10.0;
Nike3221 0:029ef267b1bc 175
Nike3221 0:029ef267b1bc 176 }
Nike3221 0:029ef267b1bc 177
Nike3221 0:029ef267b1bc 178 void MAG3110::ReadXYZraw(int16_t * mag_raw)
Nike3221 0:029ef267b1bc 179 {
Nike3221 0:029ef267b1bc 180 mag_raw[0] = readVal(MAG_OUT_X_MSB);
Nike3221 0:029ef267b1bc 181 mag_raw[1] = readVal(MAG_OUT_Y_MSB);
Nike3221 0:029ef267b1bc 182 mag_raw[2] = readVal(MAG_OUT_Z_MSB);
Nike3221 0:029ef267b1bc 183 }
Nike3221 0:029ef267b1bc 184
Nike3221 0:029ef267b1bc 185 void MAG3110::setCalibration(int minX, int maxX, int minY, int maxY )
Nike3221 0:029ef267b1bc 186 {
Nike3221 0:029ef267b1bc 187 _avgX=(maxX+minX)/2;
Nike3221 0:029ef267b1bc 188 _avgY=(maxY+minY)/2;
Nike3221 0:029ef267b1bc 189 }
Nike3221 0:029ef267b1bc 190 */
Nike3221 0:029ef267b1bc 191
Nike3221 0:029ef267b1bc 192
Nike3221 0:029ef267b1bc 193
Nike3221 0:029ef267b1bc 194