Compass sensor library
Dependents: compassDemo weather_station_proj weather_station_project weather_station_proj_v1_2
HMC5983.h@1:fb6804e865fd, 2018-07-05 (annotated)
- 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?
User | Revision | Line number | New 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 |