Forked from Jose R. Padron and Aaron Berk's library, customized for my specific application using 9DoF-Stick by Sparkfun.

Fork of HMC5843 by Jose R Padron

HMC5843 is triple axis, digital interface compass (geomagnetic sensor).

This library is forked from Jose R. Padron and Aaron Berk's work.

This library is for specific application using 9DoF-Stick.

Datasheet:

http://www.sparkfun.com/datasheets/Sensors/Magneto/HMC5843.pdf

HMC5843 は3軸のデジタルインターフェースを備えたコンパス(地磁気センサ)です。

このライブラリは 9DoF-Stick を使用した特定の企画のために保守しています。

mbed IDEが日本語をサポートするまでは英語でコメントを書いていきますが、サポートした後もきっと英語で書いていくでしょう。

Committer:
gltest26
Date:
Sun Sep 09 17:26:31 2012 +0000
Revision:
3:69f24a492b69
Parent:
2:fdab96fc6fff
Child:
4:7a90125eedcf
Fixed a bug getData() have returned incorrect negative values.

Who changed what in which revision?

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