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 Jose R. Padron
shimniok 0:826c6171fc1b 3 * @author Used HMC6352 library developed by Aaron Berk as template
shimniok 0:826c6171fc1b 4 * @section LICENSE
shimniok 0:826c6171fc1b 5 *
shimniok 0:826c6171fc1b 6 * Copyright (c) 2010 ARM Limited
shimniok 0:826c6171fc1b 7 *
shimniok 0:826c6171fc1b 8 * Permission is hereby granted, free of charge, to any person obtaining a copy
shimniok 0:826c6171fc1b 9 * of this software and associated documentation files (the "Software"), to deal
shimniok 0:826c6171fc1b 10 * in the Software without restriction, including without limitation the rights
shimniok 0:826c6171fc1b 11 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
shimniok 0:826c6171fc1b 12 * copies of the Software, and to permit persons to whom the Software is
shimniok 0:826c6171fc1b 13 * furnished to do so, subject to the following conditions:
shimniok 0:826c6171fc1b 14 *
shimniok 0:826c6171fc1b 15 * The above copyright notice and this permission notice shall be included in
shimniok 0:826c6171fc1b 16 * all copies or substantial portions of the Software.
shimniok 0:826c6171fc1b 17 *
shimniok 0:826c6171fc1b 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
shimniok 0:826c6171fc1b 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
shimniok 0:826c6171fc1b 20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
shimniok 0:826c6171fc1b 21 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
shimniok 0:826c6171fc1b 22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
shimniok 0:826c6171fc1b 23 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
shimniok 0:826c6171fc1b 24 * THE SOFTWARE.
shimniok 0:826c6171fc1b 25 *
shimniok 0:826c6171fc1b 26 * @section DESCRIPTION
shimniok 0:826c6171fc1b 27 *
shimniok 0:826c6171fc1b 28 * Honeywell HMC5843digital compass.
shimniok 0:826c6171fc1b 29 *
shimniok 0:826c6171fc1b 30 * Datasheet:
shimniok 0:826c6171fc1b 31 *
shimniok 0:826c6171fc1b 32 * http://www.ssec.honeywell.com/magnetic/datasheets/HMC5843.pdf
shimniok 0:826c6171fc1b 33 */
shimniok 0:826c6171fc1b 34
shimniok 0:826c6171fc1b 35 /**
shimniok 0:826c6171fc1b 36 * Includes
shimniok 0:826c6171fc1b 37 */
shimniok 0:826c6171fc1b 38 #include "HMC5843.h"
shimniok 0:826c6171fc1b 39
shimniok 0:826c6171fc1b 40 HMC5843::HMC5843(PinName sda, PinName scl)
shimniok 0:826c6171fc1b 41 {
shimniok 0:826c6171fc1b 42 i2c_ = new I2C(sda, scl);
shimniok 0:826c6171fc1b 43 //100KHz, as specified by the datasheet.
shimniok 0:826c6171fc1b 44 i2c_->frequency(100000);
shimniok 0:826c6171fc1b 45 setOpMode(HMC5843_CONTINUOUS, HMC5843_10HZ_NORMAL, HMC5843_1_0GA);
shimniok 0:826c6171fc1b 46
shimniok 0:826c6171fc1b 47 return;
shimniok 0:826c6171fc1b 48 }
shimniok 0:826c6171fc1b 49
shimniok 0:826c6171fc1b 50
shimniok 0:826c6171fc1b 51 void HMC5843::setOffset(float x, float y, float z)
shimniok 0:826c6171fc1b 52 {
shimniok 0:826c6171fc1b 53 return;
shimniok 0:826c6171fc1b 54 }
shimniok 0:826c6171fc1b 55
shimniok 0:826c6171fc1b 56
shimniok 0:826c6171fc1b 57 void HMC5843::setScale(float x, float y, float z)
shimniok 0:826c6171fc1b 58 {
shimniok 0:826c6171fc1b 59 return;
shimniok 0:826c6171fc1b 60 }
shimniok 0:826c6171fc1b 61
shimniok 0:826c6171fc1b 62
shimniok 0:826c6171fc1b 63 void HMC5843::setSleepMode()
shimniok 0:826c6171fc1b 64 {
shimniok 0:826c6171fc1b 65 write(HMC5843_MODE, HMC5843_SLEEP);
shimniok 0:826c6171fc1b 66
shimniok 0:826c6171fc1b 67 return;
shimniok 0:826c6171fc1b 68 }
shimniok 0:826c6171fc1b 69
shimniok 0:826c6171fc1b 70
shimniok 0:826c6171fc1b 71 void HMC5843::setDefault(void)
shimniok 0:826c6171fc1b 72 {
shimniok 0:826c6171fc1b 73 write(HMC5843_CONFIG_A,HMC5843_10HZ_NORMAL);
shimniok 0:826c6171fc1b 74 write(HMC5843_CONFIG_B,HMC5843_1_0GA);
shimniok 0:826c6171fc1b 75 write(HMC5843_MODE,HMC5843_CONTINUOUS);
shimniok 0:826c6171fc1b 76 wait_ms(100);
shimniok 0:826c6171fc1b 77
shimniok 0:826c6171fc1b 78 return;
shimniok 0:826c6171fc1b 79 }
shimniok 0:826c6171fc1b 80
shimniok 0:826c6171fc1b 81
shimniok 0:826c6171fc1b 82 void HMC5843::setOpMode(int mode, int ConfigA, int ConfigB)
shimniok 0:826c6171fc1b 83 {
shimniok 0:826c6171fc1b 84 write(HMC5843_CONFIG_A,ConfigA);
shimniok 0:826c6171fc1b 85 write(HMC5843_CONFIG_B,ConfigB);
shimniok 0:826c6171fc1b 86 write(HMC5843_MODE,mode);
shimniok 0:826c6171fc1b 87
shimniok 0:826c6171fc1b 88 return;
shimniok 0:826c6171fc1b 89 }
shimniok 0:826c6171fc1b 90
shimniok 0:826c6171fc1b 91
shimniok 0:826c6171fc1b 92 void HMC5843::write(int address, int data)
shimniok 0:826c6171fc1b 93 {
shimniok 0:826c6171fc1b 94 char tx[2];
shimniok 0:826c6171fc1b 95
shimniok 0:826c6171fc1b 96 tx[0]=address;
shimniok 0:826c6171fc1b 97 tx[1]=data;
shimniok 0:826c6171fc1b 98
shimniok 0:826c6171fc1b 99 i2c_->write(HMC5843_I2C_WRITE,tx,2);
shimniok 0:826c6171fc1b 100
shimniok 0:826c6171fc1b 101 wait_ms(100);
shimniok 0:826c6171fc1b 102
shimniok 0:826c6171fc1b 103 return;
shimniok 0:826c6171fc1b 104 }
shimniok 0:826c6171fc1b 105
shimniok 0:826c6171fc1b 106
shimniok 0:826c6171fc1b 107 void HMC5843::read(int m[3])
shimniok 0:826c6171fc1b 108 {
shimniok 0:826c6171fc1b 109 readData(m);
shimniok 0:826c6171fc1b 110
shimniok 0:826c6171fc1b 111 return;
shimniok 0:826c6171fc1b 112 }
shimniok 0:826c6171fc1b 113
shimniok 0:826c6171fc1b 114 void HMC5843::readMag(int m[3])
shimniok 0:826c6171fc1b 115 {
shimniok 0:826c6171fc1b 116 readData(m);
shimniok 0:826c6171fc1b 117
shimniok 0:826c6171fc1b 118 return;
shimniok 0:826c6171fc1b 119 }
shimniok 0:826c6171fc1b 120
shimniok 0:826c6171fc1b 121 void HMC5843::readData(int readings[3])
shimniok 0:826c6171fc1b 122 {
shimniok 0:826c6171fc1b 123 char tx[1];
shimniok 0:826c6171fc1b 124 char rx[2];
shimniok 0:826c6171fc1b 125
shimniok 0:826c6171fc1b 126
shimniok 0:826c6171fc1b 127 tx[0]=HMC5843_X_MSB;
shimniok 0:826c6171fc1b 128 i2c_->write(HMC5843_I2C_READ,tx,1);
shimniok 0:826c6171fc1b 129 i2c_->read(HMC5843_I2C_READ,rx,2);
shimniok 0:826c6171fc1b 130 readings[0]= (short)(rx[0]<<8|rx[1]);
shimniok 0:826c6171fc1b 131
shimniok 0:826c6171fc1b 132
shimniok 0:826c6171fc1b 133 tx[0]=HMC5843_Y_MSB;
shimniok 0:826c6171fc1b 134 i2c_->write(HMC5843_I2C_READ,tx,1);
shimniok 0:826c6171fc1b 135 i2c_->read(HMC5843_I2C_READ,rx,2);
shimniok 0:826c6171fc1b 136 readings[1]= (short) (rx[0]<<8|rx[1]);
shimniok 0:826c6171fc1b 137
shimniok 0:826c6171fc1b 138 tx[0]=HMC5843_Z_MSB;
shimniok 0:826c6171fc1b 139 i2c_->write(HMC5843_I2C_READ,tx,1);
shimniok 0:826c6171fc1b 140 i2c_->read(HMC5843_I2C_READ,rx,2);
shimniok 0:826c6171fc1b 141 readings[2]= (short) (rx[0]<<8|rx[1]);
shimniok 0:826c6171fc1b 142
shimniok 0:826c6171fc1b 143 return;
shimniok 0:826c6171fc1b 144 }
shimniok 0:826c6171fc1b 145
shimniok 0:826c6171fc1b 146 int HMC5843::getMx()
shimniok 0:826c6171fc1b 147 {
shimniok 0:826c6171fc1b 148 char tx[1];
shimniok 0:826c6171fc1b 149 char rx[2];
shimniok 0:826c6171fc1b 150
shimniok 0:826c6171fc1b 151
shimniok 0:826c6171fc1b 152 tx[0]=HMC5843_X_MSB;
shimniok 0:826c6171fc1b 153 i2c_->write(HMC5843_I2C_READ,tx,1);
shimniok 0:826c6171fc1b 154 i2c_->read(HMC5843_I2C_READ,rx,2);
shimniok 0:826c6171fc1b 155
shimniok 0:826c6171fc1b 156 return (short) rx[0]<<8|rx[1];
shimniok 0:826c6171fc1b 157 }
shimniok 0:826c6171fc1b 158
shimniok 0:826c6171fc1b 159 int HMC5843::getMy()
shimniok 0:826c6171fc1b 160 {
shimniok 0:826c6171fc1b 161 char tx[1];
shimniok 0:826c6171fc1b 162 char rx[2];
shimniok 0:826c6171fc1b 163
shimniok 0:826c6171fc1b 164
shimniok 0:826c6171fc1b 165 tx[0]=HMC5843_Y_MSB;
shimniok 0:826c6171fc1b 166 i2c_->write(HMC5843_I2C_READ,tx,1);
shimniok 0:826c6171fc1b 167 i2c_->read(HMC5843_I2C_READ,rx,2);
shimniok 0:826c6171fc1b 168
shimniok 0:826c6171fc1b 169 return (short) rx[0]<<8|rx[1];
shimniok 0:826c6171fc1b 170 }
shimniok 0:826c6171fc1b 171
shimniok 0:826c6171fc1b 172
shimniok 0:826c6171fc1b 173 int HMC5843::getMz(){
shimniok 0:826c6171fc1b 174
shimniok 0:826c6171fc1b 175 char tx[1];
shimniok 0:826c6171fc1b 176 char rx[2];
shimniok 0:826c6171fc1b 177
shimniok 0:826c6171fc1b 178
shimniok 0:826c6171fc1b 179 tx[0]=HMC5843_Z_MSB;
shimniok 0:826c6171fc1b 180 i2c_->write(HMC5843_I2C_READ,tx,1);
shimniok 0:826c6171fc1b 181 i2c_->read(HMC5843_I2C_READ,rx,2);
shimniok 0:826c6171fc1b 182
shimniok 0:826c6171fc1b 183 return (short) rx[0]<<8|rx[1];
shimniok 0:826c6171fc1b 184 }
shimniok 0:826c6171fc1b 185
shimniok 0:826c6171fc1b 186
shimniok 0:826c6171fc1b 187 int HMC5843::getStatus(void)
shimniok 0:826c6171fc1b 188 {
shimniok 0:826c6171fc1b 189 return 0;
shimniok 0:826c6171fc1b 190 }
shimniok 0:826c6171fc1b 191
shimniok 0:826c6171fc1b 192
shimniok 0:826c6171fc1b 193 void HMC5843::getAddress(char *buffer)
shimniok 0:826c6171fc1b 194 {
shimniok 0:826c6171fc1b 195 char rx[3];
shimniok 0:826c6171fc1b 196 char tx[1];
shimniok 0:826c6171fc1b 197 tx[0]=HMC5843_IDENT_A;
shimniok 0:826c6171fc1b 198
shimniok 0:826c6171fc1b 199
shimniok 0:826c6171fc1b 200 i2c_->write(HMC5843_I2C_WRITE, tx,1);
shimniok 0:826c6171fc1b 201
shimniok 0:826c6171fc1b 202 wait_ms(1);
shimniok 0:826c6171fc1b 203
shimniok 0:826c6171fc1b 204 i2c_->read(HMC5843_I2C_READ,rx,3);
shimniok 0:826c6171fc1b 205
shimniok 0:826c6171fc1b 206 buffer[0]=rx[0];
shimniok 0:826c6171fc1b 207 buffer[1]=rx[1];
shimniok 0:826c6171fc1b 208 buffer[2]=rx[2];
shimniok 0:826c6171fc1b 209
shimniok 0:826c6171fc1b 210 return;
shimniok 0:826c6171fc1b 211 }
shimniok 0:826c6171fc1b 212
shimniok 0:826c6171fc1b 213
shimniok 0:826c6171fc1b 214 void HMC5843::frequency(int hz)
shimniok 0:826c6171fc1b 215 {
shimniok 0:826c6171fc1b 216 if (hz == 100000)
shimniok 0:826c6171fc1b 217 i2c_->frequency(100000);
shimniok 0:826c6171fc1b 218 else if (hz == 400000)
shimniok 0:826c6171fc1b 219 i2c_->frequency(400000);
shimniok 0:826c6171fc1b 220
shimniok 0:826c6171fc1b 221 return;
shimniok 0:826c6171fc1b 222 }