User | Revision | Line number | New contents of line |
ssozonoff |
0:5b09476278da
|
1
|
/**
|
ssozonoff |
1:bdf678f27614
|
2
|
* @author Serge Sozonoff
|
ssozonoff |
0:5b09476278da
|
3
|
* @author Aaron Berk
|
ssozonoff |
1:bdf678f27614
|
4
|
* Partially based on the work of Aaron Berk for the HMC6352
|
ssozonoff |
0:5b09476278da
|
5
|
*
|
ssozonoff |
0:5b09476278da
|
6
|
* @section LICENSE
|
ssozonoff |
0:5b09476278da
|
7
|
*
|
ssozonoff |
0:5b09476278da
|
8
|
* Copyright (c) 2010 ARM Limited
|
ssozonoff |
0:5b09476278da
|
9
|
*
|
ssozonoff |
0:5b09476278da
|
10
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
ssozonoff |
0:5b09476278da
|
11
|
* of this software and associated documentation files (the "Software"), to deal
|
ssozonoff |
0:5b09476278da
|
12
|
* in the Software without restriction, including without limitation the rights
|
ssozonoff |
0:5b09476278da
|
13
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
ssozonoff |
0:5b09476278da
|
14
|
* copies of the Software, and to permit persons to whom the Software is
|
ssozonoff |
0:5b09476278da
|
15
|
* furnished to do so, subject to the following conditions:
|
ssozonoff |
0:5b09476278da
|
16
|
*
|
ssozonoff |
0:5b09476278da
|
17
|
* The above copyright notice and this permission notice shall be included in
|
ssozonoff |
0:5b09476278da
|
18
|
* all copies or substantial portions of the Software.
|
ssozonoff |
0:5b09476278da
|
19
|
*
|
ssozonoff |
0:5b09476278da
|
20
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
ssozonoff |
0:5b09476278da
|
21
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
ssozonoff |
0:5b09476278da
|
22
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
ssozonoff |
0:5b09476278da
|
23
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
ssozonoff |
0:5b09476278da
|
24
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
ssozonoff |
0:5b09476278da
|
25
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
ssozonoff |
0:5b09476278da
|
26
|
* THE SOFTWARE.
|
ssozonoff |
0:5b09476278da
|
27
|
*
|
ssozonoff |
0:5b09476278da
|
28
|
* @section DESCRIPTION
|
ssozonoff |
0:5b09476278da
|
29
|
*
|
ssozonoff |
0:5b09476278da
|
30
|
* Honeywell HMC6343 digital compass.
|
ssozonoff |
0:5b09476278da
|
31
|
*
|
ssozonoff |
0:5b09476278da
|
32
|
* Datasheet:
|
ssozonoff |
0:5b09476278da
|
33
|
*
|
ssozonoff |
0:5b09476278da
|
34
|
* http://www.ssec.honeywell.com/magnetic/datasheets/HMC6343.pdf
|
ssozonoff |
0:5b09476278da
|
35
|
*/
|
ssozonoff |
0:5b09476278da
|
36
|
|
ssozonoff |
0:5b09476278da
|
37
|
#ifndef HMC6343_H
|
ssozonoff |
0:5b09476278da
|
38
|
#define HMC6343_H
|
ssozonoff |
0:5b09476278da
|
39
|
|
ssozonoff |
0:5b09476278da
|
40
|
/**
|
ssozonoff |
0:5b09476278da
|
41
|
* Includes
|
ssozonoff |
0:5b09476278da
|
42
|
*/
|
ssozonoff |
0:5b09476278da
|
43
|
#include "mbed.h"
|
ssozonoff |
0:5b09476278da
|
44
|
|
ssozonoff |
0:5b09476278da
|
45
|
/**
|
ssozonoff |
0:5b09476278da
|
46
|
* Defines
|
ssozonoff |
0:5b09476278da
|
47
|
*/
|
ssozonoff |
0:5b09476278da
|
48
|
#define HMC6343_I2C_ADDRESS 0x32 >> 1 //7-bit address
|
ssozonoff |
0:5b09476278da
|
49
|
|
ssozonoff |
0:5b09476278da
|
50
|
//Commands.
|
ssozonoff |
0:5b09476278da
|
51
|
#define HMC6343_EEPROM_WRITE 0xF1
|
ssozonoff |
0:5b09476278da
|
52
|
#define HMC6343_EEPROM_READ 0xE1
|
ssozonoff |
0:5b09476278da
|
53
|
#define HMC6343_ENTER_SLEEP 0x83
|
ssozonoff |
0:5b09476278da
|
54
|
#define HMC6343_EXIT_SLEEP 0x84
|
ssozonoff |
0:5b09476278da
|
55
|
#define HMC6343_ENTER_STANDBY 0x76
|
ssozonoff |
0:5b09476278da
|
56
|
#define HMC6343_ENTER_RUN 0x75
|
ssozonoff |
0:5b09476278da
|
57
|
#define HMC6343_RESET 0x82
|
ssozonoff |
0:5b09476278da
|
58
|
#define HMC6343_ENTER_CALIB 0x71
|
ssozonoff |
0:5b09476278da
|
59
|
#define HMC6343_EXIT_CALIB 0x7E
|
ssozonoff |
0:5b09476278da
|
60
|
#define HMC6343_GET_ACCEL_DATA 0x40
|
ssozonoff |
0:5b09476278da
|
61
|
#define HMC6343_GET_MAG_DATA 0x45
|
ssozonoff |
0:5b09476278da
|
62
|
#define HMC6343_GET_HEADING_DATA 0x50
|
ssozonoff |
0:5b09476278da
|
63
|
#define HMC6343_GET_TILT_DATA 0x55
|
ssozonoff |
0:5b09476278da
|
64
|
#define HMC6343_GET_HEADING_DATA 0x50
|
ssozonoff |
0:5b09476278da
|
65
|
#define HMC6343_SET_XFWD_PLS_ZUP 0x72
|
ssozonoff |
0:5b09476278da
|
66
|
#define HMC6343_SET_XFWD_YUP 0x73
|
ssozonoff |
0:5b09476278da
|
67
|
#define HMC6343_SET_ZFWD_NEG_XUP 0x74
|
ssozonoff |
0:5b09476278da
|
68
|
#define HMC6343_GET_OPMODE 0x65
|
ssozonoff |
0:5b09476278da
|
69
|
|
ssozonoff |
0:5b09476278da
|
70
|
//EEPROM locations.
|
ssozonoff |
0:5b09476278da
|
71
|
#define HMC6343_SLAVE_ADDR 0x00
|
ssozonoff |
0:5b09476278da
|
72
|
#define HMC6343_OPMOD_REG1 0x04
|
ssozonoff |
0:5b09476278da
|
73
|
#define HMC6343_OPMOD_REG2 0x05
|
ssozonoff |
0:5b09476278da
|
74
|
#define HMC6343_SN_LSB 0x06
|
ssozonoff |
0:5b09476278da
|
75
|
#define HMC6343_SN_MSB 0x07
|
ssozonoff |
0:5b09476278da
|
76
|
#define HMC6343_DEV_LSB 0x0A
|
ssozonoff |
0:5b09476278da
|
77
|
#define HMC6343_DEV_MSB 0x0B
|
ssozonoff |
0:5b09476278da
|
78
|
#define HMC6343_VAR_LSB 0x0C
|
ssozonoff |
0:5b09476278da
|
79
|
#define HMC6343_VAR_MSB 0x0D
|
ssozonoff |
0:5b09476278da
|
80
|
#define HMC6343_XOFFSET_LSB 0x0E
|
ssozonoff |
0:5b09476278da
|
81
|
#define HMC6343_XOFFSET_MSB 0x0F
|
ssozonoff |
0:5b09476278da
|
82
|
#define HMC6343_YOFFSET_LSB 0x10
|
ssozonoff |
0:5b09476278da
|
83
|
#define HMC6343_YOFFSET_MSB 0x11
|
ssozonoff |
0:5b09476278da
|
84
|
#define HMC6343_ZOFFSET_LSB 0x12
|
ssozonoff |
0:5b09476278da
|
85
|
#define HMC6343_ZOFFSET_MSB 0x13
|
ssozonoff |
0:5b09476278da
|
86
|
#define HMC6343_IIRF_LSB 0x14
|
ssozonoff |
0:5b09476278da
|
87
|
#define HMC6343_IIRF_MSB 0x15
|
ssozonoff |
0:5b09476278da
|
88
|
#define HMC6343_SOFT_VER 0x02
|
ssozonoff |
0:5b09476278da
|
89
|
|
ssozonoff |
0:5b09476278da
|
90
|
|
ssozonoff |
0:5b09476278da
|
91
|
#define HMC6343_X_AXIS 0x01
|
ssozonoff |
0:5b09476278da
|
92
|
#define HMC6343_Y_AXIS 0x02
|
ssozonoff |
0:5b09476278da
|
93
|
#define HMC6343_Z_AXIS 0x04
|
ssozonoff |
0:5b09476278da
|
94
|
|
ssozonoff |
0:5b09476278da
|
95
|
|
ssozonoff |
0:5b09476278da
|
96
|
// Operation mode bit masks
|
ssozonoff |
0:5b09476278da
|
97
|
// LSB
|
ssozonoff |
1:bdf678f27614
|
98
|
#define HMC6343_COMP 0x80
|
ssozonoff |
1:bdf678f27614
|
99
|
#define HMC6343_CAL 0x40
|
ssozonoff |
1:bdf678f27614
|
100
|
#define HMC6343_FILTER 0x20
|
ssozonoff |
1:bdf678f27614
|
101
|
#define HMC6343_RUN 0x10
|
ssozonoff |
0:5b09476278da
|
102
|
#define HMC6343_STDBY 0x08
|
ssozonoff |
0:5b09476278da
|
103
|
#define HMC6343_UF 0x04
|
ssozonoff |
0:5b09476278da
|
104
|
#define HMC6343_UE 0x02
|
ssozonoff |
0:5b09476278da
|
105
|
#define HMC6343_LEVEL 0x01
|
ssozonoff |
0:5b09476278da
|
106
|
|
ssozonoff |
0:5b09476278da
|
107
|
|
ssozonoff |
0:5b09476278da
|
108
|
//Operational mode register masks.
|
ssozonoff |
0:5b09476278da
|
109
|
#define HMC6343_CM_MR_1HZ 0x00
|
ssozonoff |
1:bdf678f27614
|
110
|
#define HMC6343_CM_MR_5HZ 0x100
|
ssozonoff |
1:bdf678f27614
|
111
|
#define HMC6343_CM_MR_10HZ 0x200
|
ssozonoff |
1:bdf678f27614
|
112
|
|
ssozonoff |
0:5b09476278da
|
113
|
|
ssozonoff |
1:bdf678f27614
|
114
|
struct Heading {
|
ssozonoff |
1:bdf678f27614
|
115
|
double heading;
|
ssozonoff |
1:bdf678f27614
|
116
|
double pitch;
|
ssozonoff |
1:bdf678f27614
|
117
|
double roll;
|
ssozonoff |
1:bdf678f27614
|
118
|
};
|
ssozonoff |
0:5b09476278da
|
119
|
|
ssozonoff |
0:5b09476278da
|
120
|
/**
|
ssozonoff |
0:5b09476278da
|
121
|
* Honeywell HMC6343 digital compass.
|
ssozonoff |
0:5b09476278da
|
122
|
*/
|
ssozonoff |
0:5b09476278da
|
123
|
class HMC6343 {
|
ssozonoff |
0:5b09476278da
|
124
|
|
ssozonoff |
0:5b09476278da
|
125
|
public:
|
ssozonoff |
0:5b09476278da
|
126
|
|
ssozonoff |
0:5b09476278da
|
127
|
/**
|
ssozonoff |
0:5b09476278da
|
128
|
* Constructor.
|
ssozonoff |
0:5b09476278da
|
129
|
*
|
ssozonoff |
0:5b09476278da
|
130
|
* @param sda mbed pin to use for SDA line of I2C interface.
|
ssozonoff |
0:5b09476278da
|
131
|
* @param scl mbed pin to use for SCL line of I2C interface.
|
ssozonoff |
0:5b09476278da
|
132
|
*/
|
ssozonoff |
0:5b09476278da
|
133
|
HMC6343(PinName sda, PinName scl);
|
ssozonoff |
1:bdf678f27614
|
134
|
|
ssozonoff |
1:bdf678f27614
|
135
|
HMC6343(I2C& p_itc);
|
ssozonoff |
0:5b09476278da
|
136
|
|
ssozonoff |
0:5b09476278da
|
137
|
/**
|
ssozonoff |
0:5b09476278da
|
138
|
* Sample the device and return the result.
|
ssozonoff |
0:5b09476278da
|
139
|
*
|
ssozonoff |
0:5b09476278da
|
140
|
* @return In heading output mode, the current heading as a number between
|
ssozonoff |
0:5b09476278da
|
141
|
* 0-3599, representing 0-359.9 degrees.
|
ssozonoff |
0:5b09476278da
|
142
|
* In raw magnetometer X output mode, the raw output of the X-axis
|
ssozonoff |
0:5b09476278da
|
143
|
* magnetometer.
|
ssozonoff |
0:5b09476278da
|
144
|
* In raw magnetometer Y mode, the raw output of the Y-axis
|
ssozonoff |
0:5b09476278da
|
145
|
* magnetometer.
|
ssozonoff |
0:5b09476278da
|
146
|
* In magnetometer X mode, the corrected output of the X-axis
|
ssozonoff |
0:5b09476278da
|
147
|
* magnetometer.
|
ssozonoff |
0:5b09476278da
|
148
|
* In magnetometer Y mode, the corrected output of the Y-axis
|
ssozonoff |
0:5b09476278da
|
149
|
* magnetometer.
|
ssozonoff |
0:5b09476278da
|
150
|
*/
|
ssozonoff |
1:bdf678f27614
|
151
|
void sampleHeading(Heading* p_heading);
|
ssozonoff |
0:5b09476278da
|
152
|
|
ssozonoff |
0:5b09476278da
|
153
|
/**
|
ssozonoff |
0:5b09476278da
|
154
|
* Update bridge offsets.
|
ssozonoff |
0:5b09476278da
|
155
|
*
|
ssozonoff |
0:5b09476278da
|
156
|
* Performs a set/reset immediately.
|
ssozonoff |
0:5b09476278da
|
157
|
*/
|
ssozonoff |
0:5b09476278da
|
158
|
void setReset(void);
|
ssozonoff |
0:5b09476278da
|
159
|
|
ssozonoff |
0:5b09476278da
|
160
|
/**
|
ssozonoff |
0:5b09476278da
|
161
|
* Enter into or exit from calibration mode.
|
ssozonoff |
0:5b09476278da
|
162
|
*
|
ssozonoff |
0:5b09476278da
|
163
|
* @param enterOrExit 0x45 -> Exit
|
ssozonoff |
0:5b09476278da
|
164
|
* 0x43 -> Enter
|
ssozonoff |
0:5b09476278da
|
165
|
*/
|
ssozonoff |
0:5b09476278da
|
166
|
void setCalibrationMode(int enterOrExit);
|
ssozonoff |
0:5b09476278da
|
167
|
|
ssozonoff |
0:5b09476278da
|
168
|
/**
|
ssozonoff |
0:5b09476278da
|
169
|
* Save the current operation mode byte to EEPROM.
|
ssozonoff |
0:5b09476278da
|
170
|
*/
|
ssozonoff |
0:5b09476278da
|
171
|
void saveOpMode(void);
|
ssozonoff |
0:5b09476278da
|
172
|
|
ssozonoff |
0:5b09476278da
|
173
|
/**
|
ssozonoff |
0:5b09476278da
|
174
|
* Read the memory location on the device which contains the slave address.
|
ssozonoff |
0:5b09476278da
|
175
|
*
|
ssozonoff |
0:5b09476278da
|
176
|
* @return The slave address of the device.
|
ssozonoff |
0:5b09476278da
|
177
|
*/
|
ssozonoff |
0:5b09476278da
|
178
|
int getSlaveAddress(void);
|
ssozonoff |
0:5b09476278da
|
179
|
|
ssozonoff |
0:5b09476278da
|
180
|
/**
|
ssozonoff |
0:5b09476278da
|
181
|
* Read the current offset for X or Y axis magnetometer.
|
ssozonoff |
0:5b09476278da
|
182
|
*
|
ssozonoff |
0:5b09476278da
|
183
|
* @param axis 0x01 -> X-axis
|
ssozonoff |
0:5b09476278da
|
184
|
* 0x02 -> Y-axis
|
ssozonoff |
0:5b09476278da
|
185
|
* 0x04 -> Z-axis
|
ssozonoff |
0:5b09476278da
|
186
|
* @return The current offset for the axis as a 16-bit number.
|
ssozonoff |
0:5b09476278da
|
187
|
*/
|
ssozonoff |
0:5b09476278da
|
188
|
int getOffset(int axis);
|
ssozonoff |
0:5b09476278da
|
189
|
|
ssozonoff |
0:5b09476278da
|
190
|
|
ssozonoff |
0:5b09476278da
|
191
|
/**
|
ssozonoff |
0:5b09476278da
|
192
|
* Get the software version on the device.
|
ssozonoff |
0:5b09476278da
|
193
|
*
|
ssozonoff |
0:5b09476278da
|
194
|
* @return The software version number.
|
ssozonoff |
0:5b09476278da
|
195
|
*/
|
ssozonoff |
0:5b09476278da
|
196
|
int getSoftwareVersion(void);
|
ssozonoff |
0:5b09476278da
|
197
|
|
ssozonoff |
0:5b09476278da
|
198
|
/**
|
ssozonoff |
0:5b09476278da
|
199
|
* Get the current operation mode.
|
ssozonoff |
0:5b09476278da
|
200
|
*
|
ssozonoff |
0:5b09476278da
|
201
|
* @return 0x00 -> Standby mode
|
ssozonoff |
0:5b09476278da
|
202
|
* 0x01 -> Query mode
|
ssozonoff |
0:5b09476278da
|
203
|
* 0x02 -> Continuous mode
|
ssozonoff |
0:5b09476278da
|
204
|
*/
|
ssozonoff |
0:5b09476278da
|
205
|
int getOpMode(void);
|
ssozonoff |
0:5b09476278da
|
206
|
|
ssozonoff |
0:5b09476278da
|
207
|
/**
|
ssozonoff |
0:5b09476278da
|
208
|
* Set the operation mode.
|
ssozonoff |
0:5b09476278da
|
209
|
*
|
ssozonoff |
0:5b09476278da
|
210
|
* @param periodicSetReset 0x00 -> No periodic set/reset
|
ssozonoff |
0:5b09476278da
|
211
|
* 0x01 -> Periodic set/reset
|
ssozonoff |
0:5b09476278da
|
212
|
*/
|
ssozonoff |
1:bdf678f27614
|
213
|
void setOpMode(int opMode);
|
ssozonoff |
0:5b09476278da
|
214
|
|
ssozonoff |
0:5b09476278da
|
215
|
|
ssozonoff |
0:5b09476278da
|
216
|
void setMagneticVariation(float var);
|
ssozonoff |
0:5b09476278da
|
217
|
float getMagneticVariation();
|
ssozonoff |
0:5b09476278da
|
218
|
void setMagneticDeviation(float data);
|
ssozonoff |
0:5b09476278da
|
219
|
float getMagneticDeviation();
|
ssozonoff |
1:bdf678f27614
|
220
|
bool isOpModeFlagSet(int flag);
|
ssozonoff |
1:bdf678f27614
|
221
|
void setIIRFilter(short data);
|
ssozonoff |
1:bdf678f27614
|
222
|
short getIIRFilter();
|
ssozonoff |
1:bdf678f27614
|
223
|
void setMagOffset(int axis, int offset);
|
ssozonoff |
1:bdf678f27614
|
224
|
int getMagOffset(int axis);
|
ssozonoff |
1:bdf678f27614
|
225
|
char getMeasurementRate();
|
ssozonoff |
0:5b09476278da
|
226
|
|
ssozonoff |
0:5b09476278da
|
227
|
private:
|
ssozonoff |
0:5b09476278da
|
228
|
|
ssozonoff |
0:5b09476278da
|
229
|
I2C* i2c_;
|
ssozonoff |
0:5b09476278da
|
230
|
int operationMode_;
|
ssozonoff |
0:5b09476278da
|
231
|
|
ssozonoff |
0:5b09476278da
|
232
|
/**
|
ssozonoff |
0:5b09476278da
|
233
|
* Write to EEPROM on the device.
|
ssozonoff |
0:5b09476278da
|
234
|
*
|
ssozonoff |
0:5b09476278da
|
235
|
* @param address Address to write to.
|
ssozonoff |
0:5b09476278da
|
236
|
* @param data Data to write.
|
ssozonoff |
0:5b09476278da
|
237
|
*/
|
ssozonoff |
1:bdf678f27614
|
238
|
void writeEeprom(int address, int data);
|
ssozonoff |
0:5b09476278da
|
239
|
|
ssozonoff |
0:5b09476278da
|
240
|
/**
|
ssozonoff |
0:5b09476278da
|
241
|
* Read EEPROM on the device.
|
ssozonoff |
0:5b09476278da
|
242
|
*
|
ssozonoff |
0:5b09476278da
|
243
|
* @param address Address to read from.
|
ssozonoff |
0:5b09476278da
|
244
|
* @return The contents of the memory address.
|
ssozonoff |
0:5b09476278da
|
245
|
*/
|
ssozonoff |
1:bdf678f27614
|
246
|
int readEeprom(int address);
|
ssozonoff |
0:5b09476278da
|
247
|
|
ssozonoff |
1:bdf678f27614
|
248
|
void writeShort(int lsb_address, short data);
|
ssozonoff |
1:bdf678f27614
|
249
|
short readShort(int lsb_eprom_address);
|
ssozonoff |
0:5b09476278da
|
250
|
};
|
ssozonoff |
0:5b09476278da
|
251
|
|
ssozonoff |
0:5b09476278da
|
252
|
#endif /* HMC6343_H */
|