ECE 4180 Project

Dependencies:   Camera_LS_Y201 SDFileSystem mbed

Fork of 4180_Final_Project by Paul Wilson

Committer:
lzzcd001
Date:
Thu Apr 30 19:01:22 2015 +0000
Revision:
1:dcd6c9be9e4b
ECE 4180 Project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lzzcd001 1:dcd6c9be9e4b 1 /**
lzzcd001 1:dcd6c9be9e4b 2 * @author Aaron Berk
lzzcd001 1:dcd6c9be9e4b 3 *
lzzcd001 1:dcd6c9be9e4b 4 * @section LICENSE
lzzcd001 1:dcd6c9be9e4b 5 *
lzzcd001 1:dcd6c9be9e4b 6 * Copyright (c) 2010 ARM Limited
lzzcd001 1:dcd6c9be9e4b 7 *
lzzcd001 1:dcd6c9be9e4b 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
lzzcd001 1:dcd6c9be9e4b 9 * of this software and associated documentation files (the "Software"), to deal
lzzcd001 1:dcd6c9be9e4b 10 * in the Software without restriction, including without limitation the rights
lzzcd001 1:dcd6c9be9e4b 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
lzzcd001 1:dcd6c9be9e4b 12 * copies of the Software, and to permit persons to whom the Software is
lzzcd001 1:dcd6c9be9e4b 13 * furnished to do so, subject to the following conditions:
lzzcd001 1:dcd6c9be9e4b 14 *
lzzcd001 1:dcd6c9be9e4b 15 * The above copyright notice and this permission notice shall be included in
lzzcd001 1:dcd6c9be9e4b 16 * all copies or substantial portions of the Software.
lzzcd001 1:dcd6c9be9e4b 17 *
lzzcd001 1:dcd6c9be9e4b 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
lzzcd001 1:dcd6c9be9e4b 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
lzzcd001 1:dcd6c9be9e4b 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
lzzcd001 1:dcd6c9be9e4b 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
lzzcd001 1:dcd6c9be9e4b 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
lzzcd001 1:dcd6c9be9e4b 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
lzzcd001 1:dcd6c9be9e4b 24 * THE SOFTWARE.
lzzcd001 1:dcd6c9be9e4b 25 *
lzzcd001 1:dcd6c9be9e4b 26 * @section DESCRIPTION
lzzcd001 1:dcd6c9be9e4b 27 *
lzzcd001 1:dcd6c9be9e4b 28 * Honeywell HMC6352 digital compass.
lzzcd001 1:dcd6c9be9e4b 29 *
lzzcd001 1:dcd6c9be9e4b 30 * Datasheet:
lzzcd001 1:dcd6c9be9e4b 31 *
lzzcd001 1:dcd6c9be9e4b 32 * http://www.ssec.honeywell.com/magnetic/datasheets/HMC6352.pdf
lzzcd001 1:dcd6c9be9e4b 33 */
lzzcd001 1:dcd6c9be9e4b 34
lzzcd001 1:dcd6c9be9e4b 35 #ifndef HMC6352_H
lzzcd001 1:dcd6c9be9e4b 36 #define HMC6352_H
lzzcd001 1:dcd6c9be9e4b 37
lzzcd001 1:dcd6c9be9e4b 38 /**
lzzcd001 1:dcd6c9be9e4b 39 * Includes
lzzcd001 1:dcd6c9be9e4b 40 */
lzzcd001 1:dcd6c9be9e4b 41 #include "mbed.h"
lzzcd001 1:dcd6c9be9e4b 42
lzzcd001 1:dcd6c9be9e4b 43 /**
lzzcd001 1:dcd6c9be9e4b 44 * Defines
lzzcd001 1:dcd6c9be9e4b 45 */
lzzcd001 1:dcd6c9be9e4b 46 #define HMC6352_I2C_ADDRESS 0x21 //7-bit address. 0x43 write, 0x42 read.
lzzcd001 1:dcd6c9be9e4b 47
lzzcd001 1:dcd6c9be9e4b 48 //Commands.
lzzcd001 1:dcd6c9be9e4b 49 #define HMC6352_EEPROM_WRITE 0x77
lzzcd001 1:dcd6c9be9e4b 50 #define HMC6352_EEPROM_READ 0x72
lzzcd001 1:dcd6c9be9e4b 51 #define HMC6352_RAM_WRITE 0x47
lzzcd001 1:dcd6c9be9e4b 52 #define HMC6352_RAM_READ 0x67
lzzcd001 1:dcd6c9be9e4b 53 #define HMC6352_ENTER_SLEEP 0x53
lzzcd001 1:dcd6c9be9e4b 54 #define HMC6352_EXIT_SLEEP 0x57
lzzcd001 1:dcd6c9be9e4b 55 #define HMC6352_SET_RESET 0x4F
lzzcd001 1:dcd6c9be9e4b 56 #define HMC6352_ENTER_CALIB 0x43
lzzcd001 1:dcd6c9be9e4b 57 #define HMC6352_EXIT_CALIB 0x45
lzzcd001 1:dcd6c9be9e4b 58 #define HMC6352_SAVE_OPMODE 0x4C
lzzcd001 1:dcd6c9be9e4b 59 #define HMC6352_GET_DATA 0x41
lzzcd001 1:dcd6c9be9e4b 60
lzzcd001 1:dcd6c9be9e4b 61 //EEPROM locations.
lzzcd001 1:dcd6c9be9e4b 62 #define HMC6352_SLAVE_ADDR 0x00
lzzcd001 1:dcd6c9be9e4b 63 #define HMC6352_MX_OFF_MSB 0x01
lzzcd001 1:dcd6c9be9e4b 64 #define HMC6352_MX_OFF_LSB 0x02
lzzcd001 1:dcd6c9be9e4b 65 #define HMC6352_MY_OFF_MSB 0x03
lzzcd001 1:dcd6c9be9e4b 66 #define HMC6352_MY_OFF_LSB 0x04
lzzcd001 1:dcd6c9be9e4b 67 #define HMC6352_TIME_DELAY 0x05
lzzcd001 1:dcd6c9be9e4b 68 #define HMC6352_SUMMED 0x06
lzzcd001 1:dcd6c9be9e4b 69 #define HMC6352_SOFT_VER 0x07
lzzcd001 1:dcd6c9be9e4b 70 #define HMC6352_OPMODE 0x08
lzzcd001 1:dcd6c9be9e4b 71
lzzcd001 1:dcd6c9be9e4b 72 //RAM registers.
lzzcd001 1:dcd6c9be9e4b 73 #define HMC6352_RAM_OPMODE 0x74
lzzcd001 1:dcd6c9be9e4b 74 #define HMC6352_RAM_OUTPUT 0x4E
lzzcd001 1:dcd6c9be9e4b 75
lzzcd001 1:dcd6c9be9e4b 76 #define HMC6352_MX_OFFSET 0x00
lzzcd001 1:dcd6c9be9e4b 77 #define HMC6352_MY_OFFSET 0x01
lzzcd001 1:dcd6c9be9e4b 78
lzzcd001 1:dcd6c9be9e4b 79 #define HMC6352_HEADING_MODE 0x00
lzzcd001 1:dcd6c9be9e4b 80 #define HMC6352_RAWMAGX_MODE 0x01
lzzcd001 1:dcd6c9be9e4b 81 #define HMC6352_RAWMAGY_MODE 0x02
lzzcd001 1:dcd6c9be9e4b 82 #define HMC6352_MAGX_MODE 0x03
lzzcd001 1:dcd6c9be9e4b 83 #define HMC6352_MAGY_MODE 0x04
lzzcd001 1:dcd6c9be9e4b 84
lzzcd001 1:dcd6c9be9e4b 85 //Operational mode register masks.
lzzcd001 1:dcd6c9be9e4b 86 #define HMC6352_CM_MR_1HZ 0x00
lzzcd001 1:dcd6c9be9e4b 87 #define HMC6352_CM_MR_5HZ 0x20
lzzcd001 1:dcd6c9be9e4b 88 #define HMC6352_CM_MR_10HZ 0x40
lzzcd001 1:dcd6c9be9e4b 89 #define HMC6352_CM_MR_20HZ 0x60
lzzcd001 1:dcd6c9be9e4b 90
lzzcd001 1:dcd6c9be9e4b 91 #define HMC6352_PERIODIC_SR 0x10
lzzcd001 1:dcd6c9be9e4b 92
lzzcd001 1:dcd6c9be9e4b 93 #define HMC6352_STANDBY 0x00
lzzcd001 1:dcd6c9be9e4b 94 #define HMC6352_QUERY 0x01
lzzcd001 1:dcd6c9be9e4b 95 #define HMC6352_CONTINUOUS 0x02
lzzcd001 1:dcd6c9be9e4b 96
lzzcd001 1:dcd6c9be9e4b 97 /**
lzzcd001 1:dcd6c9be9e4b 98 * Honeywell HMC6352 digital compass.
lzzcd001 1:dcd6c9be9e4b 99 */
lzzcd001 1:dcd6c9be9e4b 100 class HMC6352 {
lzzcd001 1:dcd6c9be9e4b 101
lzzcd001 1:dcd6c9be9e4b 102 public:
lzzcd001 1:dcd6c9be9e4b 103
lzzcd001 1:dcd6c9be9e4b 104 /**
lzzcd001 1:dcd6c9be9e4b 105 * Constructor.
lzzcd001 1:dcd6c9be9e4b 106 *
lzzcd001 1:dcd6c9be9e4b 107 * @param sda mbed pin to use for SDA line of I2C interface.
lzzcd001 1:dcd6c9be9e4b 108 * @param scl mbed pin to use for SCL line of I2C interface.
lzzcd001 1:dcd6c9be9e4b 109 */
lzzcd001 1:dcd6c9be9e4b 110 HMC6352(PinName sda, PinName scl);
lzzcd001 1:dcd6c9be9e4b 111
lzzcd001 1:dcd6c9be9e4b 112 /**
lzzcd001 1:dcd6c9be9e4b 113 * Sample the device and return the result.
lzzcd001 1:dcd6c9be9e4b 114 *
lzzcd001 1:dcd6c9be9e4b 115 * @return In heading output mode, the current heading as a number between
lzzcd001 1:dcd6c9be9e4b 116 * 0-3599, representing 0-359.9 degrees.
lzzcd001 1:dcd6c9be9e4b 117 * In raw magnetometer X output mode, the raw output of the X-axis
lzzcd001 1:dcd6c9be9e4b 118 * magnetometer.
lzzcd001 1:dcd6c9be9e4b 119 * In raw magnetometer Y mode, the raw output of the Y-axis
lzzcd001 1:dcd6c9be9e4b 120 * magnetometer.
lzzcd001 1:dcd6c9be9e4b 121 * In magnetometer X mode, the corrected output of the X-axis
lzzcd001 1:dcd6c9be9e4b 122 * magnetometer.
lzzcd001 1:dcd6c9be9e4b 123 * In magnetometer Y mode, the corrected output of the Y-axis
lzzcd001 1:dcd6c9be9e4b 124 * magnetometer.
lzzcd001 1:dcd6c9be9e4b 125 */
lzzcd001 1:dcd6c9be9e4b 126 int sample(void);
lzzcd001 1:dcd6c9be9e4b 127
lzzcd001 1:dcd6c9be9e4b 128 /**
lzzcd001 1:dcd6c9be9e4b 129 * Enter into or exit from sleep mode.
lzzcd001 1:dcd6c9be9e4b 130 *
lzzcd001 1:dcd6c9be9e4b 131 * @param enterOrExit 0x57 -> Exit sleep mode
lzzcd001 1:dcd6c9be9e4b 132 * 0x53 -> Enter
lzzcd001 1:dcd6c9be9e4b 133 */
lzzcd001 1:dcd6c9be9e4b 134 void setSleepMode(int enterOrExit);
lzzcd001 1:dcd6c9be9e4b 135
lzzcd001 1:dcd6c9be9e4b 136 /**
lzzcd001 1:dcd6c9be9e4b 137 * Update bridge offsets.
lzzcd001 1:dcd6c9be9e4b 138 *
lzzcd001 1:dcd6c9be9e4b 139 * Performs a set/reset immediately.
lzzcd001 1:dcd6c9be9e4b 140 */
lzzcd001 1:dcd6c9be9e4b 141 void setReset(void);
lzzcd001 1:dcd6c9be9e4b 142
lzzcd001 1:dcd6c9be9e4b 143 /**
lzzcd001 1:dcd6c9be9e4b 144 * Enter into or exit from calibration mode.
lzzcd001 1:dcd6c9be9e4b 145 *
lzzcd001 1:dcd6c9be9e4b 146 * @param enterOrExit 0x45 -> Exit
lzzcd001 1:dcd6c9be9e4b 147 * 0x43 -> Enter
lzzcd001 1:dcd6c9be9e4b 148 */
lzzcd001 1:dcd6c9be9e4b 149 void setCalibrationMode(int enterOrExit);
lzzcd001 1:dcd6c9be9e4b 150
lzzcd001 1:dcd6c9be9e4b 151 /**
lzzcd001 1:dcd6c9be9e4b 152 * Save the current operation mode byte to EEPROM.
lzzcd001 1:dcd6c9be9e4b 153 */
lzzcd001 1:dcd6c9be9e4b 154 void saveOpMode(void);
lzzcd001 1:dcd6c9be9e4b 155
lzzcd001 1:dcd6c9be9e4b 156 /**
lzzcd001 1:dcd6c9be9e4b 157 * Read the memory location on the device which contains the slave address.
lzzcd001 1:dcd6c9be9e4b 158 *
lzzcd001 1:dcd6c9be9e4b 159 * @return The slave address of the device.
lzzcd001 1:dcd6c9be9e4b 160 */
lzzcd001 1:dcd6c9be9e4b 161 int getSlaveAddress(void);
lzzcd001 1:dcd6c9be9e4b 162
lzzcd001 1:dcd6c9be9e4b 163 /**
lzzcd001 1:dcd6c9be9e4b 164 * Read the current offset for X or Y axis magnetometer.
lzzcd001 1:dcd6c9be9e4b 165 *
lzzcd001 1:dcd6c9be9e4b 166 * @param axis 0x00 -> X-axis
lzzcd001 1:dcd6c9be9e4b 167 * 0x01 -> Y-axis
lzzcd001 1:dcd6c9be9e4b 168 * @return The current offset for the axis as a 16-bit number.
lzzcd001 1:dcd6c9be9e4b 169 */
lzzcd001 1:dcd6c9be9e4b 170 int getOffset(int axis);
lzzcd001 1:dcd6c9be9e4b 171
lzzcd001 1:dcd6c9be9e4b 172 /**
lzzcd001 1:dcd6c9be9e4b 173 * Set the offset for X or Y axis magnetometer.
lzzcd001 1:dcd6c9be9e4b 174 *
lzzcd001 1:dcd6c9be9e4b 175 * @param axis 0x00 -> X-axis
lzzcd001 1:dcd6c9be9e4b 176 * 0x01 -> Y-axis
lzzcd001 1:dcd6c9be9e4b 177 * @param offset The offset to set for the axis (set to a 16-bit number).
lzzcd001 1:dcd6c9be9e4b 178 */
lzzcd001 1:dcd6c9be9e4b 179 void setOffset(int axis, int offset);
lzzcd001 1:dcd6c9be9e4b 180
lzzcd001 1:dcd6c9be9e4b 181 /**
lzzcd001 1:dcd6c9be9e4b 182 * Get the current time delay.
lzzcd001 1:dcd6c9be9e4b 183 *
lzzcd001 1:dcd6c9be9e4b 184 * @return The time delay in milliseconds.
lzzcd001 1:dcd6c9be9e4b 185 */
lzzcd001 1:dcd6c9be9e4b 186 int getTimeDelay(void);
lzzcd001 1:dcd6c9be9e4b 187
lzzcd001 1:dcd6c9be9e4b 188 /**
lzzcd001 1:dcd6c9be9e4b 189 * Set the time delay of the device.
lzzcd001 1:dcd6c9be9e4b 190 *
lzzcd001 1:dcd6c9be9e4b 191 * @param delay The time delay to set in milliseconds (between 0-255);
lzzcd001 1:dcd6c9be9e4b 192 */
lzzcd001 1:dcd6c9be9e4b 193 void setTimeDelay(int delay);
lzzcd001 1:dcd6c9be9e4b 194
lzzcd001 1:dcd6c9be9e4b 195 /**
lzzcd001 1:dcd6c9be9e4b 196 * Get the number of measurements being summed each sample.
lzzcd001 1:dcd6c9be9e4b 197 *
lzzcd001 1:dcd6c9be9e4b 198 * @return The number of summed measurement.
lzzcd001 1:dcd6c9be9e4b 199 */
lzzcd001 1:dcd6c9be9e4b 200 int getSumNumber(void);
lzzcd001 1:dcd6c9be9e4b 201
lzzcd001 1:dcd6c9be9e4b 202 /**
lzzcd001 1:dcd6c9be9e4b 203 * Set the number of measurements being summed each sample.
lzzcd001 1:dcd6c9be9e4b 204 *
lzzcd001 1:dcd6c9be9e4b 205 * @param sum The number of measurements to be summed (between 0-16);
lzzcd001 1:dcd6c9be9e4b 206 */
lzzcd001 1:dcd6c9be9e4b 207 void setSumNumber(int sum);
lzzcd001 1:dcd6c9be9e4b 208
lzzcd001 1:dcd6c9be9e4b 209 /**
lzzcd001 1:dcd6c9be9e4b 210 * Get the software version on the device.
lzzcd001 1:dcd6c9be9e4b 211 *
lzzcd001 1:dcd6c9be9e4b 212 * @return The software version number.
lzzcd001 1:dcd6c9be9e4b 213 */
lzzcd001 1:dcd6c9be9e4b 214 int getSoftwareVersion(void);
lzzcd001 1:dcd6c9be9e4b 215
lzzcd001 1:dcd6c9be9e4b 216 /**
lzzcd001 1:dcd6c9be9e4b 217 * Get the current operation mode.
lzzcd001 1:dcd6c9be9e4b 218 *
lzzcd001 1:dcd6c9be9e4b 219 * @return 0x00 -> Standby mode
lzzcd001 1:dcd6c9be9e4b 220 * 0x01 -> Query mode
lzzcd001 1:dcd6c9be9e4b 221 * 0x02 -> Continuous mode
lzzcd001 1:dcd6c9be9e4b 222 */
lzzcd001 1:dcd6c9be9e4b 223 int getOpMode(void);
lzzcd001 1:dcd6c9be9e4b 224
lzzcd001 1:dcd6c9be9e4b 225 /**
lzzcd001 1:dcd6c9be9e4b 226 * Set the operation mode.
lzzcd001 1:dcd6c9be9e4b 227 *
lzzcd001 1:dcd6c9be9e4b 228 * @param mode 0x00 -> Standby mode
lzzcd001 1:dcd6c9be9e4b 229 * 0x01 -> Query mode
lzzcd001 1:dcd6c9be9e4b 230 * 0x02 -> Continuous mode
lzzcd001 1:dcd6c9be9e4b 231 * @param periodicSetReset 0x00 -> No periodic set/reset
lzzcd001 1:dcd6c9be9e4b 232 * 0x01 -> Periodic set/reset
lzzcd001 1:dcd6c9be9e4b 233 * @measurementRate Measurement rate in Hz for continuous rate.
lzzcd001 1:dcd6c9be9e4b 234 * Possible rates: {1, 5, 10, 20}Hz.
lzzcd001 1:dcd6c9be9e4b 235 */
lzzcd001 1:dcd6c9be9e4b 236 void setOpMode(int mode, int periodicSetReset, int measurementRate = 0);
lzzcd001 1:dcd6c9be9e4b 237
lzzcd001 1:dcd6c9be9e4b 238 /**
lzzcd001 1:dcd6c9be9e4b 239 * Get the current output mode of the device.
lzzcd001 1:dcd6c9be9e4b 240 *
lzzcd001 1:dcd6c9be9e4b 241 * @return The current output mode.
lzzcd001 1:dcd6c9be9e4b 242 */
lzzcd001 1:dcd6c9be9e4b 243 int getOutputMode(void);
lzzcd001 1:dcd6c9be9e4b 244
lzzcd001 1:dcd6c9be9e4b 245 /**
lzzcd001 1:dcd6c9be9e4b 246 * Set the output mode of the device.
lzzcd001 1:dcd6c9be9e4b 247 *
lzzcd001 1:dcd6c9be9e4b 248 * @param mode 0x00 -> Heading mode
lzzcd001 1:dcd6c9be9e4b 249 * 0x01 -> Raw magnetometer X mode
lzzcd001 1:dcd6c9be9e4b 250 * 0x02 -> Raw magnetometer Y mode
lzzcd001 1:dcd6c9be9e4b 251 * 0x03 -> Magnetometer X mode
lzzcd001 1:dcd6c9be9e4b 252 * 0x04 -> Magnetometer Y mode
lzzcd001 1:dcd6c9be9e4b 253 */
lzzcd001 1:dcd6c9be9e4b 254 void setOutputMode(int mode);
lzzcd001 1:dcd6c9be9e4b 255
lzzcd001 1:dcd6c9be9e4b 256 private:
lzzcd001 1:dcd6c9be9e4b 257
lzzcd001 1:dcd6c9be9e4b 258 I2C* i2c_;
lzzcd001 1:dcd6c9be9e4b 259 int operationMode_;
lzzcd001 1:dcd6c9be9e4b 260
lzzcd001 1:dcd6c9be9e4b 261 /**
lzzcd001 1:dcd6c9be9e4b 262 * Write to EEPROM or RAM on the device.
lzzcd001 1:dcd6c9be9e4b 263 *
lzzcd001 1:dcd6c9be9e4b 264 * @param EepromOrRam 0x77 -> Writing to EEPROM
lzzcd001 1:dcd6c9be9e4b 265 * 0x47 -> Writing to RAM
lzzcd001 1:dcd6c9be9e4b 266 * @param address Address to write to.
lzzcd001 1:dcd6c9be9e4b 267 * @param data Data to write.
lzzcd001 1:dcd6c9be9e4b 268 */
lzzcd001 1:dcd6c9be9e4b 269 void write(int EepromOrRam, int address, int data);
lzzcd001 1:dcd6c9be9e4b 270
lzzcd001 1:dcd6c9be9e4b 271 /**
lzzcd001 1:dcd6c9be9e4b 272 * Read EEPROM or RAM on the device.
lzzcd001 1:dcd6c9be9e4b 273 *
lzzcd001 1:dcd6c9be9e4b 274 * @param EepromOrRam 0x72 -> Reading from EEPROM
lzzcd001 1:dcd6c9be9e4b 275 * 0x67 -> Reading from RAM
lzzcd001 1:dcd6c9be9e4b 276 * @param address Address to read from.
lzzcd001 1:dcd6c9be9e4b 277 * @return The contents of the memory address.
lzzcd001 1:dcd6c9be9e4b 278 */
lzzcd001 1:dcd6c9be9e4b 279 int read(int EepromOrRam, int address);
lzzcd001 1:dcd6c9be9e4b 280
lzzcd001 1:dcd6c9be9e4b 281 };
lzzcd001 1:dcd6c9be9e4b 282
lzzcd001 1:dcd6c9be9e4b 283 #endif /* HMC6352_H */