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:
Wed Sep 12 15:54:13 2012 +0000
Revision:
4:7a90125eedcf
Parent:
3:69f24a492b69
Child:
5:a83508250db7
Changed internal i2c_ object from a pointer to embedded object.; In this way you don't need to manage heap memory manually and can avoid overheads of memory management.

Who changed what in which revision?

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