Code for autonomous ground vehicle, Data Bus, 3rd place winner in 2012 Sparkfun AVC.

Dependencies:   Watchdog mbed Schedule SimpleFilter LSM303DLM PinDetect DebounceIn Servo

Committer:
shimniok
Date:
Wed Jun 20 14:57:48 2012 +0000
Revision:
0:826c6171fc1b
Updated documentation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shimniok 0:826c6171fc1b 1 /**
shimniok 0:826c6171fc1b 2 * @author Uwe Gartmann
shimniok 0:826c6171fc1b 3 * @author Used HMC5843 library developed by Jose R. Padron and Aaron Berk as template
shimniok 0:826c6171fc1b 4 *
shimniok 0:826c6171fc1b 5 * @section LICENSE
shimniok 0:826c6171fc1b 6 *
shimniok 0:826c6171fc1b 7 * Copyright (c) 2010 ARM Limited
shimniok 0:826c6171fc1b 8 *
shimniok 0:826c6171fc1b 9 * Permission is hereby granted, free of charge, to any person obtaining a copy
shimniok 0:826c6171fc1b 10 * of this software and associated documentation files (the "Software"), to deal
shimniok 0:826c6171fc1b 11 * in the Software without restriction, including without limitation the rights
shimniok 0:826c6171fc1b 12 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
shimniok 0:826c6171fc1b 13 * copies of the Software, and to permit persons to whom the Software is
shimniok 0:826c6171fc1b 14 * furnished to do so, subject to the following conditions:
shimniok 0:826c6171fc1b 15 *
shimniok 0:826c6171fc1b 16 * The above copyright notice and this permission notice shall be included in
shimniok 0:826c6171fc1b 17 * all copies or substantial portions of the Software.
shimniok 0:826c6171fc1b 18 *
shimniok 0:826c6171fc1b 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
shimniok 0:826c6171fc1b 20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
shimniok 0:826c6171fc1b 21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
shimniok 0:826c6171fc1b 22 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
shimniok 0:826c6171fc1b 23 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
shimniok 0:826c6171fc1b 24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
shimniok 0:826c6171fc1b 25 * THE SOFTWARE.
shimniok 0:826c6171fc1b 26 *
shimniok 0:826c6171fc1b 27 * @section DESCRIPTION
shimniok 0:826c6171fc1b 28 *
shimniok 0:826c6171fc1b 29 * Honeywell HMC5843 digital compass.
shimniok 0:826c6171fc1b 30 *
shimniok 0:826c6171fc1b 31 * Datasheet:
shimniok 0:826c6171fc1b 32 *
shimniok 0:826c6171fc1b 33 * http://www.ssec.honeywell.com/magnetic/datasheets/HMC5843.pdf
shimniok 0:826c6171fc1b 34 */
shimniok 0:826c6171fc1b 35
shimniok 0:826c6171fc1b 36 #ifndef HMC5843_H
shimniok 0:826c6171fc1b 37 #define HMC5843_H
shimniok 0:826c6171fc1b 38
shimniok 0:826c6171fc1b 39 #include "mbed.h"
shimniok 0:826c6171fc1b 40
shimniok 0:826c6171fc1b 41 #define HMC5843_I2C_ADDRESS 0x1E //7-bit address. 0x3C write, 0x3D read.
shimniok 0:826c6171fc1b 42 #define HMC5843_I2C_WRITE 0x3C
shimniok 0:826c6171fc1b 43 #define HMC5843_I2C_READ 0x3D
shimniok 0:826c6171fc1b 44
shimniok 0:826c6171fc1b 45 //Values Config A
shimniok 0:826c6171fc1b 46 #define HMC5843_0_5HZ_NORMAL 0x00
shimniok 0:826c6171fc1b 47 #define HMC5843_0_5HZ_POSITIVE 0x01
shimniok 0:826c6171fc1b 48 #define HMC5843_0_5HZ_NEGATIVE 0x02
shimniok 0:826c6171fc1b 49
shimniok 0:826c6171fc1b 50 #define HMC5843_1HZ_NORMAL 0x04
shimniok 0:826c6171fc1b 51 #define HMC5843_1HZ_POSITIVE 0x05
shimniok 0:826c6171fc1b 52 #define HMC5843_1HZ_NEGATIVE 0x06
shimniok 0:826c6171fc1b 53
shimniok 0:826c6171fc1b 54 #define HMC5843_2HZ_NORMAL 0x08
shimniok 0:826c6171fc1b 55 #define HMC5843_2HZ_POSITIVE 0x09
shimniok 0:826c6171fc1b 56 #define HMC5843_2HZ_NEGATIVE 0x0A
shimniok 0:826c6171fc1b 57
shimniok 0:826c6171fc1b 58 #define HMC5843_5HZ_NORMAL 0x0C
shimniok 0:826c6171fc1b 59 #define HMC5843_5HZ_POSITIVE 0x0D
shimniok 0:826c6171fc1b 60 #define HMC5843_5HZ_NEGATIVE 0x0E
shimniok 0:826c6171fc1b 61
shimniok 0:826c6171fc1b 62 #define HMC5843_10HZ_NORMAL 0x10
shimniok 0:826c6171fc1b 63 #define HMC5843_10HZ_POSITIVE 0x11
shimniok 0:826c6171fc1b 64 #define HMC5843_10HZ_NEGATIVE 0x12
shimniok 0:826c6171fc1b 65
shimniok 0:826c6171fc1b 66 #define HMC5843_20HZ_NORMAL 0x14
shimniok 0:826c6171fc1b 67 #define HMC5843_20HZ_POSITIVE 0x15
shimniok 0:826c6171fc1b 68 #define HMC5843_20HZ_NEGATIVE 0x16
shimniok 0:826c6171fc1b 69
shimniok 0:826c6171fc1b 70 #define HMC5843_50HZ_NORMAL 0x18
shimniok 0:826c6171fc1b 71 #define HMC5843_50HZ_POSITIVE 0x19
shimniok 0:826c6171fc1b 72 #define HMC5843_50HZ_NEGATIVE 0x1A
shimniok 0:826c6171fc1b 73
shimniok 0:826c6171fc1b 74 //Values Config B
shimniok 0:826c6171fc1b 75 #define HMC5843_0_7GA 0x00
shimniok 0:826c6171fc1b 76 #define HMC5843_1_0GA 0x20
shimniok 0:826c6171fc1b 77 #define HMC5843_1_5GA 0x40
shimniok 0:826c6171fc1b 78 #define HMC5843_2_0GA 0x60
shimniok 0:826c6171fc1b 79 #define HMC5843_3_2GA 0x80
shimniok 0:826c6171fc1b 80 #define HMC5843_3_8GA 0xA0
shimniok 0:826c6171fc1b 81 #define HMC5843_4_5GA 0xC0
shimniok 0:826c6171fc1b 82 #define HMC5843_6_5GA 0xE0
shimniok 0:826c6171fc1b 83
shimniok 0:826c6171fc1b 84 //Values MODE
shimniok 0:826c6171fc1b 85 #define HMC5843_CONTINUOUS 0x00
shimniok 0:826c6171fc1b 86 #define HMC5843_SINGLE 0x01
shimniok 0:826c6171fc1b 87 #define HMC5843_IDLE 0x02
shimniok 0:826c6171fc1b 88 #define HMC5843_SLEEP 0x03
shimniok 0:826c6171fc1b 89
shimniok 0:826c6171fc1b 90
shimniok 0:826c6171fc1b 91
shimniok 0:826c6171fc1b 92 #define HMC5843_CONFIG_A 0x00
shimniok 0:826c6171fc1b 93 #define HMC5843_CONFIG_B 0x01
shimniok 0:826c6171fc1b 94 #define HMC5843_MODE 0x02
shimniok 0:826c6171fc1b 95 #define HMC5843_X_MSB 0x03
shimniok 0:826c6171fc1b 96 #define HMC5843_X_LSB 0x04
shimniok 0:826c6171fc1b 97 #define HMC5843_Y_MSB 0x05
shimniok 0:826c6171fc1b 98 #define HMC5843_Y_LSB 0x06
shimniok 0:826c6171fc1b 99 #define HMC5843_Z_MSB 0x07
shimniok 0:826c6171fc1b 100 #define HMC5843_Z_LSB 0x08
shimniok 0:826c6171fc1b 101 #define HMC5843_STATUS 0x09
shimniok 0:826c6171fc1b 102 #define HMC5843_IDENT_A 0x0A
shimniok 0:826c6171fc1b 103 #define HMC5843_IDENT_B 0x0B
shimniok 0:826c6171fc1b 104 #define HMC5843_IDENT_C 0x0C
shimniok 0:826c6171fc1b 105
shimniok 0:826c6171fc1b 106
shimniok 0:826c6171fc1b 107
shimniok 0:826c6171fc1b 108 /**
shimniok 0:826c6171fc1b 109 * Interface library for the Honeywell HMC5843 digital compass.
shimniok 0:826c6171fc1b 110 * @author Michael Shimniok http://www.bot-thoughts.com/
shimniok 0:826c6171fc1b 111 * @author Based on library by Uwe Gartmann
shimniok 0:826c6171fc1b 112 * @author In turn based on HMC5843 library developed by Jose R. Padron and Aaron Berk as template
shimniok 0:826c6171fc1b 113 *
shimniok 0:826c6171fc1b 114 * This version is modified to follow the same member functions of my LSM303DLH library. The intent
shimniok 0:826c6171fc1b 115 * is to make it drop in compatible with my other magnetometer libraries. For now, setScale() and
shimniok 0:826c6171fc1b 116 * setOffset() have no effect at this time.
shimniok 0:826c6171fc1b 117 *
shimniok 0:826c6171fc1b 118 * @code
shimniok 0:826c6171fc1b 119 * #include "mbed.h"
shimniok 0:826c6171fc1b 120 * #include "HMC5843.h"
shimniok 0:826c6171fc1b 121 *
shimniok 0:826c6171fc1b 122 * HMC5843 compass(p28, p27);
shimniok 0:826c6171fc1b 123 * ...
shimniok 0:826c6171fc1b 124 * int m[3];
shimniok 0:826c6171fc1b 125 * ...
shimniok 0:826c6171fc1b 126 * compass.readMag(m);
shimniok 0:826c6171fc1b 127 *
shimniok 0:826c6171fc1b 128 * @endcode
shimniok 0:826c6171fc1b 129 */
shimniok 0:826c6171fc1b 130 class HMC5843 {
shimniok 0:826c6171fc1b 131
shimniok 0:826c6171fc1b 132 public:
shimniok 0:826c6171fc1b 133
shimniok 0:826c6171fc1b 134 /**
shimniok 0:826c6171fc1b 135 * Create a new interface for an HMC5843.
shimniok 0:826c6171fc1b 136 *
shimniok 0:826c6171fc1b 137 * @param sda mbed pin to use for SDA line of I2C interface.
shimniok 0:826c6171fc1b 138 * @param scl mbed pin to use for SCL line of I2C interface.
shimniok 0:826c6171fc1b 139 */
shimniok 0:826c6171fc1b 140 HMC5843(PinName sda, PinName scl);
shimniok 0:826c6171fc1b 141
shimniok 0:826c6171fc1b 142
shimniok 0:826c6171fc1b 143 /** sets the x, y, and z offset corrections for hard iron calibration
shimniok 0:826c6171fc1b 144 *
shimniok 0:826c6171fc1b 145 * Calibration details here:
shimniok 0:826c6171fc1b 146 * http://mbed.org/users/shimniok/notebook/quick-and-dirty-3d-compass-calibration/
shimniok 0:826c6171fc1b 147 *
shimniok 0:826c6171fc1b 148 * If you gather raw magnetometer data and find, for example, x is offset
shimniok 0:826c6171fc1b 149 * by hard iron by -20 then pass +20 to this member function to correct
shimniok 0:826c6171fc1b 150 * for hard iron.
shimniok 0:826c6171fc1b 151 *
shimniok 0:826c6171fc1b 152 * @param x is the offset correction for the x axis
shimniok 0:826c6171fc1b 153 * @param y is the offset correction for the y axis
shimniok 0:826c6171fc1b 154 * @param z is the offset correction for the z axis
shimniok 0:826c6171fc1b 155 */
shimniok 0:826c6171fc1b 156 void setOffset(float x, float y, float z);
shimniok 0:826c6171fc1b 157
shimniok 0:826c6171fc1b 158
shimniok 0:826c6171fc1b 159 /** sets the scale factor for the x, y, and z axes
shimniok 0:826c6171fc1b 160 *
shimniok 0:826c6171fc1b 161 * Calibratio details here:
shimniok 0:826c6171fc1b 162 * http://mbed.org/users/shimniok/notebook/quick-and-dirty-3d-compass-calibration/
shimniok 0:826c6171fc1b 163 *
shimniok 0:826c6171fc1b 164 * Sensitivity of the three axes is never perfectly identical and this
shimniok 0:826c6171fc1b 165 * function can help to correct differences in sensitivity. You're
shimniok 0:826c6171fc1b 166 * supplying a multipler such that x, y and z will be normalized to the
shimniok 0:826c6171fc1b 167 * same max/min values
shimniok 0:826c6171fc1b 168 */
shimniok 0:826c6171fc1b 169 void setScale(float x, float y, float z);
shimniok 0:826c6171fc1b 170
shimniok 0:826c6171fc1b 171
shimniok 0:826c6171fc1b 172 /**
shimniok 0:826c6171fc1b 173 * Enter into sleep mode.
shimniok 0:826c6171fc1b 174 */
shimniok 0:826c6171fc1b 175 void setSleepMode();
shimniok 0:826c6171fc1b 176
shimniok 0:826c6171fc1b 177
shimniok 0:826c6171fc1b 178 /**
shimniok 0:826c6171fc1b 179 * Set Device in Default Mode.
shimniok 0:826c6171fc1b 180 * HMC5843_CONTINUOUS, HMC5843_10HZ_NORMAL HMC5843_1_0GA
shimniok 0:826c6171fc1b 181 */
shimniok 0:826c6171fc1b 182 void setDefault();
shimniok 0:826c6171fc1b 183
shimniok 0:826c6171fc1b 184
shimniok 0:826c6171fc1b 185 /**
shimniok 0:826c6171fc1b 186 * Set the operation mode.
shimniok 0:826c6171fc1b 187 *
shimniok 0:826c6171fc1b 188 * @param mode 0x00 -> Continuous
shimniok 0:826c6171fc1b 189 * 0x01 -> Single
shimniok 0:826c6171fc1b 190 * 0x02 -> Idle
shimniok 0:826c6171fc1b 191 * @param ConfigA values
shimniok 0:826c6171fc1b 192 * @param ConfigB values
shimniok 0:826c6171fc1b 193 */
shimniok 0:826c6171fc1b 194 void setOpMode(int mode, int ConfigA, int ConfigB);
shimniok 0:826c6171fc1b 195
shimniok 0:826c6171fc1b 196
shimniok 0:826c6171fc1b 197 /**
shimniok 0:826c6171fc1b 198 * Write to a register on the device.
shimniok 0:826c6171fc1b 199 *
shimniok 0:826c6171fc1b 200 * @param address is the register address to be written.
shimniok 0:826c6171fc1b 201 * @param data is the data to write.
shimniok 0:826c6171fc1b 202 */
shimniok 0:826c6171fc1b 203 void write(int address, int data);
shimniok 0:826c6171fc1b 204
shimniok 0:826c6171fc1b 205
shimniok 0:826c6171fc1b 206 /** read the calibrated accelerometer and magnetometer values
shimniok 0:826c6171fc1b 207 *
shimniok 0:826c6171fc1b 208 * @param m is the magnetometer 3d vector, written by the function
shimniok 0:826c6171fc1b 209 */
shimniok 0:826c6171fc1b 210 void read(int m[3]);
shimniok 0:826c6171fc1b 211
shimniok 0:826c6171fc1b 212
shimniok 0:826c6171fc1b 213 /** read the calibrated magnetometer values
shimniok 0:826c6171fc1b 214 *
shimniok 0:826c6171fc1b 215 * @param m is the magnetometer 3d vector, written by the function
shimniok 0:826c6171fc1b 216 */
shimniok 0:826c6171fc1b 217 void readMag(int m[3]);
shimniok 0:826c6171fc1b 218
shimniok 0:826c6171fc1b 219
shimniok 0:826c6171fc1b 220 /**
shimniok 0:826c6171fc1b 221 * Get the output of all three axes.
shimniok 0:826c6171fc1b 222 *
shimniok 0:826c6171fc1b 223 * @param Pointer to a buffer to hold the magnetics value for the
shimniok 0:826c6171fc1b 224 * x-axis, y-axis and z-axis [in that order].
shimniok 0:826c6171fc1b 225 */
shimniok 0:826c6171fc1b 226 void readData(int* readings);
shimniok 0:826c6171fc1b 227
shimniok 0:826c6171fc1b 228
shimniok 0:826c6171fc1b 229 /**
shimniok 0:826c6171fc1b 230 * Get the output of X axis.
shimniok 0:826c6171fc1b 231 *
shimniok 0:826c6171fc1b 232 * @return x-axis magnetic value
shimniok 0:826c6171fc1b 233 */
shimniok 0:826c6171fc1b 234 int getMx();
shimniok 0:826c6171fc1b 235
shimniok 0:826c6171fc1b 236
shimniok 0:826c6171fc1b 237 /**
shimniok 0:826c6171fc1b 238 * Get the output of Y axis.
shimniok 0:826c6171fc1b 239 *
shimniok 0:826c6171fc1b 240 * @return y-axis magnetic value
shimniok 0:826c6171fc1b 241 */
shimniok 0:826c6171fc1b 242 int getMy();
shimniok 0:826c6171fc1b 243
shimniok 0:826c6171fc1b 244
shimniok 0:826c6171fc1b 245 /**
shimniok 0:826c6171fc1b 246 * Get the output of Z axis.
shimniok 0:826c6171fc1b 247 *
shimniok 0:826c6171fc1b 248 * @return z-axis magnetic value
shimniok 0:826c6171fc1b 249 */
shimniok 0:826c6171fc1b 250 int getMz();
shimniok 0:826c6171fc1b 251
shimniok 0:826c6171fc1b 252 /**
shimniok 0:826c6171fc1b 253 * Get the current operation mode.
shimniok 0:826c6171fc1b 254 *
shimniok 0:826c6171fc1b 255 * @return Status register values
shimniok 0:826c6171fc1b 256 */
shimniok 0:826c6171fc1b 257 int getStatus(void);
shimniok 0:826c6171fc1b 258
shimniok 0:826c6171fc1b 259
shimniok 0:826c6171fc1b 260 /**
shimniok 0:826c6171fc1b 261 * Read the memory location on the device which contains the address.
shimniok 0:826c6171fc1b 262 *
shimniok 0:826c6171fc1b 263 * @param Pointer to a buffer to hold the address value
shimniok 0:826c6171fc1b 264 * Expected H, 4 and 3.
shimniok 0:826c6171fc1b 265 */
shimniok 0:826c6171fc1b 266 void getAddress(char * address);
shimniok 0:826c6171fc1b 267
shimniok 0:826c6171fc1b 268
shimniok 0:826c6171fc1b 269 /** sets the I2C bus frequency
shimniok 0:826c6171fc1b 270 *
shimniok 0:826c6171fc1b 271 * @param frequency is the I2C bus/clock frequency, either standard (100000) or fast (400000)
shimniok 0:826c6171fc1b 272 */
shimniok 0:826c6171fc1b 273 void frequency(int hz);
shimniok 0:826c6171fc1b 274
shimniok 0:826c6171fc1b 275 private:
shimniok 0:826c6171fc1b 276 I2C* i2c_;
shimniok 0:826c6171fc1b 277
shimniok 0:826c6171fc1b 278 };
shimniok 0:826c6171fc1b 279
shimniok 0:826c6171fc1b 280 #endif /* HMC5843_H */