Compass sensor library

Dependents:   compassDemo weather_station_proj weather_station_project weather_station_proj_v1_2

Committer:
acracan
Date:
Thu Jul 05 15:43:14 2018 +0000
Revision:
1:fb6804e865fd
Parent:
0:cffff4c45a14
Child:
2:4debef04091d
Add function to read the heading vector (X, Y, Z components)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
acracan 0:cffff4c45a14 1 /*
acracan 0:cffff4c45a14 2 * HMC5983.cpp - library header
acracan 0:cffff4c45a14 3 *
acracan 0:cffff4c45a14 4 * simple library for the HMC5983 sensor from Honeywell
acracan 0:cffff4c45a14 5 * adaptation form MBED from the Arduino library
acracan 0:cffff4c45a14 6 *
acracan 0:cffff4c45a14 7 * (c) 2014 Korneliusz Jarzebski, www.jarzebski.pl
acracan 0:cffff4c45a14 8 * (c) 2014 David Cuartielles, Arduino LLC
acracan 0:cffff4c45a14 9 * (c) 2016 Abel Romero, www.abelromero.com
acracan 0:cffff4c45a14 10 * (c) 2018 Arcadie Cracan
acracan 0:cffff4c45a14 11 */
acracan 0:cffff4c45a14 12
acracan 0:cffff4c45a14 13 #ifndef HMC5983_h
acracan 0:cffff4c45a14 14 #define HMC5983_h
acracan 0:cffff4c45a14 15
acracan 0:cffff4c45a14 16 #include "mbed.h"
acracan 0:cffff4c45a14 17
acracan 0:cffff4c45a14 18 #ifndef M_PI
acracan 1:fb6804e865fd 19 #define M_PI 3.14159265358979323846f
acracan 0:cffff4c45a14 20 #endif
acracan 0:cffff4c45a14 21
acracan 0:cffff4c45a14 22 // I2C ADDRESS
acracan 0:cffff4c45a14 23 #define HMC5983_ADDRESS 0x3C
acracan 0:cffff4c45a14 24
acracan 0:cffff4c45a14 25 // MEMORY MAPPING
acracan 0:cffff4c45a14 26 /*
acracan 0:cffff4c45a14 27 Address Location Name Access
acracan 0:cffff4c45a14 28 ---------------------------------------------------
acracan 0:cffff4c45a14 29 0x00 Configuration Register A Read/Write
acracan 0:cffff4c45a14 30 0x01 Configuration Register B Read/Write
acracan 0:cffff4c45a14 31 0x02 Mode Register Read/Write
acracan 0:cffff4c45a14 32 0x03 Data Output X MSB Register Read
acracan 0:cffff4c45a14 33 0x04 Data Output X LSB Register Read
acracan 0:cffff4c45a14 34 0x05 Data Output Z MSB Register Read
acracan 0:cffff4c45a14 35 0x06 Data Output Z LSB Register Read
acracan 0:cffff4c45a14 36 0x07 Data Output Y MSB Register Read
acracan 0:cffff4c45a14 37 0x08 Data Output Y LSB Register Read
acracan 0:cffff4c45a14 38 0x09 Status Register Read
acracan 0:cffff4c45a14 39 0x0A Identification Register A Read
acracan 0:cffff4c45a14 40 0x0B Identification Register B Read
acracan 0:cffff4c45a14 41 0x0C Identification Register C Read
acracan 0:cffff4c45a14 42 0x31 Temperature Output MSB Register Read
acracan 0:cffff4c45a14 43 0x32 Temperature Output LSB Register Read
acracan 0:cffff4c45a14 44 */
acracan 0:cffff4c45a14 45
acracan 0:cffff4c45a14 46 #define HMC5983_REG_CONFIG_A (0x00)
acracan 0:cffff4c45a14 47 #define HMC5983_REG_CONFIG_B (0x01)
acracan 0:cffff4c45a14 48 #define HMC5983_REG_MODE (0x02)
acracan 0:cffff4c45a14 49
acracan 0:cffff4c45a14 50 #define HMC5983_OUT_X_MSB (0x03)
acracan 0:cffff4c45a14 51 #define HMC5983_OUT_X_LSB (0x04)
acracan 0:cffff4c45a14 52 #define HMC5983_OUT_Z_MSB (0x05)
acracan 0:cffff4c45a14 53 #define HMC5983_OUT_Z_LSB (0x06)
acracan 0:cffff4c45a14 54 #define HMC5983_OUT_Y_MSB (0x07)
acracan 0:cffff4c45a14 55 #define HMC5983_OUT_Y_LSB (0x08)
acracan 0:cffff4c45a14 56
acracan 0:cffff4c45a14 57 #define HMC5983_STATUS (0x09)
acracan 0:cffff4c45a14 58
acracan 0:cffff4c45a14 59 #define HMC5983_TEMP_OUT_MSB (0x31)
acracan 0:cffff4c45a14 60 #define HMC5983_TEMP_OUT_LSB (0x32)
acracan 0:cffff4c45a14 61
acracan 0:cffff4c45a14 62 #define HMC5983_REG_OUT_X_M (0x03)
acracan 0:cffff4c45a14 63 #define HMC5983_REG_OUT_X_L (0x04)
acracan 0:cffff4c45a14 64 #define HMC5983_REG_OUT_Z_M (0x05)
acracan 0:cffff4c45a14 65 #define HMC5983_REG_OUT_Z_L (0x06)
acracan 0:cffff4c45a14 66 #define HMC5983_REG_OUT_Y_M (0x07)
acracan 0:cffff4c45a14 67 #define HMC5983_REG_OUT_Y_L (0x08)
acracan 0:cffff4c45a14 68
acracan 0:cffff4c45a14 69 #define HMC5983_REG_IDENT_A (0x0A)
acracan 0:cffff4c45a14 70 #define HMC5983_REG_IDENT_B (0x0B)
acracan 0:cffff4c45a14 71 #define HMC5983_REG_IDENT_C (0x0C)
acracan 0:cffff4c45a14 72
acracan 0:cffff4c45a14 73 typedef enum {
acracan 0:cffff4c45a14 74 HMC5983_DATARATE_220HZ = 0b111,
acracan 0:cffff4c45a14 75 HMC5983_DATARATE_75HZ = 0b110,
acracan 0:cffff4c45a14 76 HMC5983_DATARATE_30HZ = 0b101,
acracan 0:cffff4c45a14 77 HMC5983_DATARATE_15HZ = 0b100,
acracan 0:cffff4c45a14 78 HMC5983_DATARATE_7_5HZ = 0b011,
acracan 0:cffff4c45a14 79 HMC5983_DATARATE_3HZ = 0b010,
acracan 0:cffff4c45a14 80 HMC5983_DATARATE_1_5HZ = 0b001,
acracan 0:cffff4c45a14 81 HMC5983_DATARATE_0_75HZ = 0b000
acracan 0:cffff4c45a14 82 } hmc5983_dataRate_t;
acracan 0:cffff4c45a14 83
acracan 0:cffff4c45a14 84 typedef enum {
acracan 0:cffff4c45a14 85 HMC5983_SAMPLEAVERAGE_8 = 0b11,
acracan 0:cffff4c45a14 86 HMC5983_SAMPLEAVERAGE_4 = 0b10,
acracan 0:cffff4c45a14 87 HMC5983_SAMPLEAVERAGE_2 = 0b01,
acracan 0:cffff4c45a14 88 HMC5983_SAMPLEAVERAGE_1 = 0b00
acracan 0:cffff4c45a14 89 } hmc5983_sampleAverages_t;
acracan 0:cffff4c45a14 90
acracan 0:cffff4c45a14 91 typedef enum {
acracan 0:cffff4c45a14 92 HMC5983_RANGE_8_1GA = 0b111,
acracan 0:cffff4c45a14 93 HMC5983_RANGE_5_6GA = 0b110,
acracan 0:cffff4c45a14 94 HMC5983_RANGE_4_7GA = 0b101,
acracan 0:cffff4c45a14 95 HMC5983_RANGE_4GA = 0b100,
acracan 0:cffff4c45a14 96 HMC5983_RANGE_2_5GA = 0b011,
acracan 0:cffff4c45a14 97 HMC5983_RANGE_1_9GA = 0b010,
acracan 0:cffff4c45a14 98 HMC5983_RANGE_1_3GA = 0b001,
acracan 0:cffff4c45a14 99 HMC5983_RANGE_0_88GA = 0b000
acracan 0:cffff4c45a14 100 } hmc5983_range_t;
acracan 0:cffff4c45a14 101
acracan 0:cffff4c45a14 102 typedef enum {
acracan 0:cffff4c45a14 103 HMC5983_IDLE1 = 0b11,
acracan 0:cffff4c45a14 104 HMC5983_IDLE2 = 0b10,
acracan 0:cffff4c45a14 105 HMC5983_SINGLE = 0b01,
acracan 0:cffff4c45a14 106 HMC5983_CONTINOUS = 0b00
acracan 0:cffff4c45a14 107 } hmc5983_mode_t;
acracan 0:cffff4c45a14 108
acracan 0:cffff4c45a14 109 class HMC5983 {
acracan 0:cffff4c45a14 110 public:
acracan 0:cffff4c45a14 111 HMC5983(PinName sda, PinName scl);
acracan 0:cffff4c45a14 112 HMC5983(I2C &i2c);
acracan 0:cffff4c45a14 113
acracan 0:cffff4c45a14 114 bool init();
acracan 0:cffff4c45a14 115 void setRange(hmc5983_range_t range);
acracan 0:cffff4c45a14 116 hmc5983_range_t getRange(void);
acracan 0:cffff4c45a14 117 void setMeasurementMode(hmc5983_mode_t mode);
acracan 0:cffff4c45a14 118 hmc5983_mode_t getMeasurementMode(void);
acracan 0:cffff4c45a14 119 void setDataRate(hmc5983_dataRate_t dataRate);
acracan 0:cffff4c45a14 120 hmc5983_dataRate_t getDataRate(void);
acracan 0:cffff4c45a14 121 void setSampleAverages(hmc5983_sampleAverages_t sampleAverages);
acracan 0:cffff4c45a14 122 hmc5983_sampleAverages_t getSampleAverages(void);
acracan 0:cffff4c45a14 123
acracan 1:fb6804e865fd 124 float readHeading();
acracan 1:fb6804e865fd 125 void readHeadingVector(int16_t *v);
acracan 0:cffff4c45a14 126
acracan 0:cffff4c45a14 127 private:
acracan 0:cffff4c45a14 128 I2C &i2c_;
acracan 0:cffff4c45a14 129 char i2cRaw[sizeof(I2C)];
acracan 1:fb6804e865fd 130 int16_t HX;
acracan 1:fb6804e865fd 131 int16_t HZ;
acracan 1:fb6804e865fd 132 int16_t HY;
acracan 1:fb6804e865fd 133
acracan 1:fb6804e865fd 134
acracan 1:fb6804e865fd 135 void getHeadingRegs();
acracan 0:cffff4c45a14 136 void writeRegister8(uint8_t reg, uint8_t value);
acracan 0:cffff4c45a14 137 uint8_t readRegister8(uint8_t reg);
acracan 0:cffff4c45a14 138 uint8_t fastRegister8(uint8_t reg);
acracan 0:cffff4c45a14 139 int16_t readRegister16(uint8_t reg);
acracan 0:cffff4c45a14 140 };
acracan 0:cffff4c45a14 141
acracan 0:cffff4c45a14 142 #endif