├── DFRobot_QMC5883.cpp ├── DFRobot_QMC5883.h ├── LICENSE ├── README.md ├── README_CN.md ├── examples └── getCompassdata │ └── getCompassdata.ino ├── keywords.txt ├── library.properties └── resources └── images └── SEN0140.png /DFRobot_QMC5883.cpp: -------------------------------------------------------------------------------- 1 | /*! 2 | * @file DFRobot_QMC5883.cpp 3 | * @brief Compatible with QMC5883 HMC5883 and QMC5883 4 | * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) 5 | * @license The MIT License (MIT) 6 | * @author PengKaixing(kaixing.peng@dfrobot.com) 7 | * @version V1.0.0 8 | * @date 2022-2-23 9 | * @url https://github.com/DFRobot/DFRobot_QMC5883 10 | */ 11 | #include "DFRobot_QMC5883.h" 12 | 13 | DFRobot_QMC5883::DFRobot_QMC5883(TwoWire *pWire, uint8_t I2C_addr) 14 | { 15 | isHMC_ = false; 16 | isQMC_ = false; 17 | minX = 0; 18 | maxX = 0; 19 | minY = 0; 20 | maxY = 0; 21 | minZ = 0; 22 | maxZ = 0; 23 | firstRun = true; 24 | this->_pWire = pWire; 25 | this->_I2C_addr = I2C_addr; 26 | } 27 | 28 | bool DFRobot_QMC5883::begin(void) 29 | { 30 | bool ret = false; 31 | if(ICType == IC_NONE) 32 | { 33 | for(uint8_t i = 0; i < 5; i++) 34 | { 35 | _pWire->begin(); 36 | _pWire->beginTransmission(HMC5883L_ADDRESS); 37 | if(_pWire->endTransmission() == 0) 38 | { 39 | ICType = IC_HMC5883L; 40 | break; 41 | } 42 | } 43 | } 44 | if(ICType == IC_NONE) 45 | { 46 | for(uint8_t i = 0; i < 5; i++) 47 | { 48 | _pWire->begin(); 49 | _pWire->beginTransmission(QMC5883_ADDRESS); 50 | if(_pWire->endTransmission() == 0) 51 | { 52 | ICType = IC_QMC5883; 53 | break; 54 | } 55 | } 56 | } 57 | if(ICType == IC_NONE) 58 | { 59 | for(uint8_t i = 0; i < 5; i++) 60 | { 61 | _pWire->begin(); 62 | _pWire->beginTransmission(VCM5883L_ADDRESS); 63 | if(_pWire->endTransmission() == 0) 64 | { 65 | ICType = IC_VCM5883L; 66 | break; 67 | } 68 | } 69 | } 70 | switch(ICType) 71 | { 72 | case IC_NONE: 73 | ret = false; 74 | break; 75 | case IC_HMC5883L: 76 | if ((fastRegister8(HMC5883L_REG_IDENT_A) != 0x48)|| (fastRegister8(HMC5883L_REG_IDENT_B) != 0x34) || (fastRegister8(HMC5883L_REG_IDENT_C) != 0x33)) 77 | { 78 | return false; 79 | } 80 | setRange(HMC5883L_RANGE_1_3GA); 81 | setMeasurementMode(HMC5883L_CONTINOUS); 82 | setDataRate(HMC5883L_DATARATE_15HZ); 83 | setSamples(HMC5883L_SAMPLES_1); 84 | mgPerDigit = 0.92f; 85 | ret = true; 86 | break; 87 | case IC_QMC5883: 88 | writeRegister8(QMC5883_REG_IDENT_B,0X01); 89 | writeRegister8(QMC5883_REG_IDENT_C,0X40); 90 | writeRegister8(QMC5883_REG_IDENT_D,0X01); 91 | writeRegister8(QMC5883_REG_CONFIG_1,0X1D); 92 | if ((fastRegister8(QMC5883_REG_IDENT_B) != 0x01)|| (fastRegister8(QMC5883_REG_IDENT_C) != 0x40)|| (fastRegister8(QMC5883_REG_IDENT_D) != 0x01)) 93 | { 94 | return false; 95 | } 96 | setRange(QMC5883_RANGE_8GA); 97 | setMeasurementMode(QMC5883_CONTINOUS); 98 | setDataRate(QMC5883_DATARATE_50HZ); 99 | setSamples(QMC5883_SAMPLES_8); 100 | mgPerDigit = 4.35f; 101 | ret = true; 102 | break; 103 | case IC_VCM5883L: 104 | writeRegister8(VCM5883L_CTR_REG1,0X00); 105 | writeRegister8(VCM5883L_CTR_REG2,0X4D); 106 | ret = true; 107 | break; 108 | default: 109 | ret = false; 110 | break; 111 | } 112 | return ret; 113 | } 114 | 115 | sVector_t DFRobot_QMC5883::readRaw(void) 116 | { 117 | if(ICType == IC_HMC5883L) 118 | { 119 | v.XAxis = readRegister16(HMC5883L_REG_OUT_X_M); 120 | v.YAxis = readRegister16(HMC5883L_REG_OUT_Y_M); 121 | v.ZAxis = readRegister16(HMC5883L_REG_OUT_Z_M); 122 | } 123 | else if(ICType == IC_QMC5883) 124 | { 125 | v.XAxis = readRegister16(QMC5883_REG_OUT_X_L); 126 | v.YAxis = readRegister16(QMC5883_REG_OUT_Y_L); 127 | v.ZAxis = readRegister16(QMC5883_REG_OUT_Z_L); 128 | } 129 | else if(ICType == IC_VCM5883L) 130 | { 131 | v.XAxis = -readRegister16(VCM5883L_REG_OUT_X_L); 132 | v.YAxis = -readRegister16(VCM5883L_REG_OUT_Y_L); 133 | v.ZAxis = -readRegister16(VCM5883L_REG_OUT_Z_L); 134 | } 135 | v.AngleXY = (atan2((double)v.YAxis,(double)v.XAxis) * (180 / 3.14159265) + 180); 136 | v.AngleXZ = (atan2((double)v.ZAxis,(double)v.XAxis) * (180 / 3.14159265) + 180); 137 | v.AngleYZ = (atan2((double)v.ZAxis,(double)v.YAxis) * (180 / 3.14159265) + 180); 138 | return v; 139 | } 140 | 141 | void DFRobot_QMC5883::setRange(eRange_t range) 142 | { 143 | if(ICType == IC_HMC5883L) 144 | { 145 | switch(range) 146 | { 147 | case HMC5883L_RANGE_0_88GA: 148 | Gauss_LSB_XY = 1370.0; 149 | break; 150 | case HMC5883L_RANGE_1_3GA: 151 | Gauss_LSB_XY = 1090.0; 152 | break; 153 | case HMC5883L_RANGE_1_9GA: 154 | Gauss_LSB_XY = 820.0; 155 | break; 156 | case HMC5883L_RANGE_2_5GA: 157 | Gauss_LSB_XY = 660.0; 158 | break; 159 | case HMC5883L_RANGE_4GA: 160 | Gauss_LSB_XY = 440.0; 161 | break; 162 | case HMC5883L_RANGE_4_7GA: 163 | Gauss_LSB_XY = 390.0; 164 | break; 165 | case HMC5883L_RANGE_5_6GA: 166 | Gauss_LSB_XY = 330.0; 167 | break; 168 | case HMC5883L_RANGE_8_1GA: 169 | Gauss_LSB_XY = 230.0; 170 | break; 171 | default: 172 | break; 173 | } 174 | writeRegister8(HMC5883L_REG_CONFIG_B, range << 5); 175 | } 176 | else if(ICType == IC_QMC5883) 177 | { 178 | switch(range) 179 | { 180 | case QMC5883_RANGE_2GA: 181 | mgPerDigit = 1.22f; 182 | break; 183 | case QMC5883_RANGE_8GA: 184 | mgPerDigit = 4.35f; 185 | break; 186 | default: 187 | break; 188 | } 189 | writeRegister8(QMC5883_REG_CONFIG_2, range << 4); 190 | } 191 | else if(ICType == IC_VCM5883L) 192 | { 193 | //default 8G 194 | } 195 | } 196 | 197 | eRange_t DFRobot_QMC5883::getRange(void) 198 | { 199 | eRange_t ret; 200 | switch(ICType){ 201 | case IC_HMC5883L: 202 | ret = (eRange_t)((readRegister8(HMC5883L_REG_CONFIG_B) >> 5)); 203 | break; 204 | case IC_QMC5883: 205 | ret = (eRange_t)((readRegister8(QMC5883_REG_CONFIG_2) >> 4)); 206 | break; 207 | case IC_VCM5883L: 208 | ret = QMC5883_RANGE_8GA; 209 | break; 210 | default: 211 | ret = QMC5883_RANGE_8GA; 212 | break; 213 | } 214 | return ret; 215 | } 216 | 217 | void DFRobot_QMC5883::setMeasurementMode(eMode_t mode) 218 | { 219 | uint8_t value; 220 | switch(ICType) 221 | { 222 | case IC_HMC5883L: 223 | value = readRegister8(HMC5883L_REG_MODE); 224 | value &= 0b11111100; 225 | value |= mode; 226 | writeRegister8(HMC5883L_REG_MODE, value); 227 | break; 228 | case IC_QMC5883: 229 | value = readRegister8(QMC5883_REG_CONFIG_1); 230 | value &= 0xfc; 231 | value |= mode; 232 | writeRegister8(QMC5883_REG_CONFIG_1, value); 233 | break; 234 | case IC_VCM5883L: 235 | value = readRegister8(VCM5883L_CTR_REG2); 236 | value &= 0xFE; 237 | value |= mode; 238 | writeRegister8(VCM5883L_CTR_REG2, value); 239 | break; 240 | default: 241 | break; 242 | } 243 | } 244 | 245 | eMode_t DFRobot_QMC5883::getMeasurementMode(void) 246 | { 247 | uint8_t value=0; 248 | switch(ICType) 249 | { 250 | case IC_HMC5883L: 251 | value = readRegister8(HMC5883L_REG_MODE); 252 | value &= 0b00000011; 253 | break; 254 | case IC_QMC5883: 255 | value = readRegister8(QMC5883_REG_CONFIG_1); 256 | value &= 0b00000011; 257 | break; 258 | case IC_VCM5883L: 259 | value = readRegister8(VCM5883L_CTR_REG2); 260 | value &= 0b00000001; 261 | break; 262 | default: 263 | break; 264 | } 265 | return (eMode_t)value; 266 | } 267 | 268 | void DFRobot_QMC5883::setDataRate(eDataRate_t dataRate) 269 | { 270 | uint8_t value; 271 | switch(ICType) 272 | { 273 | case IC_HMC5883L: 274 | value = readRegister8(HMC5883L_REG_CONFIG_A); 275 | value &= 0b11100011; 276 | value |= (dataRate << 2); 277 | writeRegister8(HMC5883L_REG_CONFIG_A, value); 278 | break; 279 | case IC_QMC5883: 280 | value = readRegister8(QMC5883_REG_CONFIG_1); 281 | value &= 0xf3; 282 | value |= (dataRate << 2); 283 | writeRegister8(QMC5883_REG_CONFIG_1, value); 284 | break; 285 | case IC_VCM5883L: 286 | value = readRegister8(VCM5883L_CTR_REG2); 287 | value &= 0xf3; 288 | value |= (dataRate << 2); 289 | writeRegister8(VCM5883L_CTR_REG2, value); 290 | break; 291 | default: 292 | break; 293 | } 294 | } 295 | 296 | eDataRate_t DFRobot_QMC5883::getDataRate(void) 297 | { 298 | uint8_t value=0; 299 | switch(ICType) 300 | { 301 | case IC_HMC5883L: 302 | value = readRegister8(HMC5883L_REG_CONFIG_A); 303 | value &= 0b00011100; 304 | value >>= 2; 305 | break; 306 | case IC_QMC5883: 307 | value = readRegister8(QMC5883_REG_CONFIG_1); 308 | value &= 0b00001100; 309 | value >>= 2; 310 | break; 311 | case IC_VCM5883L: 312 | value = readRegister8(VCM5883L_CTR_REG2); 313 | value &= 0b00001100; 314 | value >>= 2; 315 | break; 316 | default: 317 | break; 318 | } 319 | return (eDataRate_t)value; 320 | } 321 | 322 | void DFRobot_QMC5883::setSamples(eSamples_t samples) 323 | { 324 | uint8_t value; 325 | switch(ICType) 326 | { 327 | case IC_HMC5883L: 328 | value = readRegister8(HMC5883L_REG_CONFIG_A); 329 | value &= 0b10011111; 330 | value |= (samples << 5); 331 | writeRegister8(HMC5883L_REG_CONFIG_A, value); 332 | break; 333 | case IC_QMC5883: 334 | value = readRegister8(QMC5883_REG_CONFIG_1); 335 | value &= 0x3f; 336 | value |= (samples << 6); 337 | writeRegister8(QMC5883_REG_CONFIG_1, value); 338 | break; 339 | case IC_VCM5883L: 340 | value = readRegister8(QMC5883_REG_CONFIG_1); 341 | value &= 0x3f; 342 | value |= (samples << 6); 343 | writeRegister8(QMC5883_REG_CONFIG_1, value); 344 | break; 345 | default: 346 | break; 347 | } 348 | } 349 | 350 | eSamples_t DFRobot_QMC5883::getSamples(void) 351 | { 352 | uint8_t value=0; 353 | switch(ICType) 354 | { 355 | case IC_HMC5883L: 356 | value = readRegister8(HMC5883L_REG_CONFIG_A); 357 | value &= 0b01100000; 358 | value >>= 5; 359 | break; 360 | case IC_QMC5883: 361 | value = readRegister8(QMC5883_REG_CONFIG_1); 362 | value &= 0x3f; 363 | value >>= 6; 364 | break; 365 | case IC_VCM5883L: 366 | value = readRegister8(QMC5883_REG_CONFIG_1); 367 | value &= 0x3f; 368 | value >>= 6; 369 | break; 370 | default: 371 | break; 372 | } 373 | return (eSamples_t)value; 374 | } 375 | 376 | void DFRobot_QMC5883::setDeclinationAngle(float declinationAngle) 377 | { 378 | this->ICdeclinationAngle = declinationAngle; 379 | } 380 | 381 | void DFRobot_QMC5883::getHeadingDegrees(void) 382 | { 383 | float heading = atan2(v.YAxis ,v.XAxis); 384 | heading += this->ICdeclinationAngle; 385 | if(heading < 0) 386 | heading += 2*PI; 387 | if(heading > 2*PI) 388 | heading -= 2*PI; 389 | v.HeadingDegress = heading * 180/PI; 390 | } 391 | 392 | int DFRobot_QMC5883::getICType(void) 393 | { 394 | return ICType; 395 | } 396 | 397 | void DFRobot_QMC5883::writeRegister8(uint8_t reg, uint8_t value) 398 | { 399 | _pWire->beginTransmission(this->_I2C_addr); 400 | #if ARDUINO >= 100 401 | _pWire->write(reg); 402 | _pWire->write(value); 403 | #else 404 | _pWire->send(reg); 405 | _pWire->send(value); 406 | #endif 407 | _pWire->endTransmission(); 408 | } 409 | 410 | uint8_t DFRobot_QMC5883::fastRegister8(uint8_t reg) 411 | { 412 | uint8_t value=0; 413 | _pWire->beginTransmission(this->_I2C_addr); 414 | #if ARDUINO >= 100 415 | _pWire->write(reg); 416 | #else 417 | _pWire->send(reg); 418 | #endif 419 | _pWire->endTransmission(); 420 | _pWire->requestFrom((uint8_t)this->_I2C_addr, (uint8_t)1); 421 | #if ARDUINO >= 100 422 | value = _pWire->read(); 423 | #else 424 | value = _pWire->receive(); 425 | #endif 426 | _pWire->endTransmission(); 427 | return value; 428 | } 429 | 430 | 431 | uint8_t DFRobot_QMC5883::readRegister8(uint8_t reg) 432 | { 433 | uint8_t value=0; 434 | _pWire->beginTransmission(this->_I2C_addr); 435 | #if ARDUINO >= 100 436 | _pWire->write(reg); 437 | #else 438 | _pWire->send(reg); 439 | #endif 440 | _pWire->endTransmission(); 441 | _pWire->requestFrom((uint8_t)this->_I2C_addr, (uint8_t)1); 442 | while(!_pWire->available()) {}; 443 | #if ARDUINO >= 100 444 | value = _pWire->read(); 445 | #else 446 | value = _pWire->receive(); 447 | #endif 448 | return value; 449 | } 450 | 451 | int16_t DFRobot_QMC5883::readRegister16(uint8_t reg) 452 | { 453 | int16_t value=0; 454 | uint8_t vha,vla; 455 | _pWire->beginTransmission(this->_I2C_addr); 456 | #if ARDUINO >= 100 457 | _pWire->write(reg); 458 | #else 459 | _pWire->send(reg); 460 | #endif 461 | _pWire->endTransmission(); 462 | _pWire->requestFrom((uint8_t)this->_I2C_addr, (uint8_t)2); 463 | while(!_pWire->available()) {}; 464 | if(ICType == IC_HMC5883L){ 465 | #if ARDUINO >= 100 466 | vha = _pWire->read(); 467 | vla = _pWire->read(); 468 | #else 469 | vha = _pWire->receive(); 470 | vla = _pWire->receive(); 471 | #endif 472 | }else{ 473 | #if ARDUINO >= 100 474 | vla = _pWire->read(); 475 | vha = _pWire->read(); 476 | #else 477 | vla = _pWire->receive(); 478 | vha = _pWire->receive(); 479 | #endif 480 | } 481 | value = vha << 8 | vla; 482 | return value; 483 | } 484 | -------------------------------------------------------------------------------- /DFRobot_QMC5883.h: -------------------------------------------------------------------------------- 1 | /*! 2 | * @file DFRobot_QMC5883.h 3 | * @brief Compatible with QMC5883 HMC5883 and VMC5883 4 | * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) 5 | * @license The MIT License (MIT) 6 | * @author PengKaixing(kaixing.peng@dfrobot.com) 7 | * @version V1.0.0 8 | * @date 2022-2-23 9 | * @url https://github.com/DFRobot/DFRobot_QMC5883 10 | */ 11 | 12 | #ifndef DFROBOT_QMC5883_H 13 | #define DFROBOT_QMC5883_H 14 | 15 | #if ARDUINO >= 100 16 | #include "Arduino.h" 17 | #else 18 | #include "WProgram.h" 19 | #endif 20 | #include 21 | 22 | #define HMC5883L_ADDRESS (0x1E) 23 | #define QMC5883_ADDRESS (0x0D) 24 | #define VCM5883L_ADDRESS (0x0C) 25 | 26 | #define IC_NONE 0 27 | #define IC_HMC5883L 1 28 | #define IC_QMC5883 2 29 | #define IC_VCM5883L 3 30 | #define IC_ERROR 4 31 | 32 | #define HMC5883L_REG_CONFIG_A (0x00) 33 | #define HMC5883L_REG_CONFIG_B (0x01) 34 | #define HMC5883L_REG_MODE (0x02) 35 | #define HMC5883L_REG_OUT_X_M (0x03) 36 | #define HMC5883L_REG_OUT_X_L (0x04) 37 | #define HMC5883L_REG_OUT_Z_M (0x05) 38 | #define HMC5883L_REG_OUT_Z_L (0x06) 39 | #define HMC5883L_REG_OUT_Y_M (0x07) 40 | #define HMC5883L_REG_OUT_Y_L (0x08) 41 | #define HMC5883L_REG_STATUS (0x09) 42 | #define HMC5883L_REG_IDENT_A (0x0A) 43 | #define HMC5883L_REG_IDENT_B (0x0B) 44 | #define HMC5883L_REG_IDENT_C (0x0C) 45 | 46 | #define QMC5883_REG_OUT_X_M (0x01) 47 | #define QMC5883_REG_OUT_X_L (0x00) 48 | #define QMC5883_REG_OUT_Z_M (0x05) 49 | #define QMC5883_REG_OUT_Z_L (0x04) 50 | #define QMC5883_REG_OUT_Y_M (0x03) 51 | #define QMC5883_REG_OUT_Y_L (0x02) 52 | #define QMC5883_REG_STATUS (0x06) 53 | #define QMC5883_REG_CONFIG_1 (0x09) 54 | #define QMC5883_REG_CONFIG_2 (0x0A) 55 | #define QMC5883_REG_IDENT_B (0x0B) 56 | #define QMC5883_REG_IDENT_C (0x20) 57 | #define QMC5883_REG_IDENT_D (0x21) 58 | 59 | #define VCM5883L_REG_OUT_X_L (0x00) 60 | #define VCM5883L_REG_OUT_X_H (0x01) 61 | #define VCM5883L_REG_OUT_Y_L (0x02) 62 | #define VCM5883L_REG_OUT_Y_H (0x03) 63 | #define VCM5883L_REG_OUT_Z_L (0x04) 64 | #define VCM5883L_REG_OUT_Z_H (0x05) 65 | #define VCM5883L_CTR_REG1 (0x0B) 66 | #define VCM5883L_CTR_REG2 (0x0A) 67 | 68 | typedef enum 69 | { 70 | HMC5883L_SAMPLES_8 = 0b11, 71 | HMC5883L_SAMPLES_4 = 0b10, 72 | HMC5883L_SAMPLES_2 = 0b01, 73 | HMC5883L_SAMPLES_1 = 0b00, 74 | QMC5883_SAMPLES_8 = 0b11, 75 | QMC5883_SAMPLES_4 = 0b10, 76 | QMC5883_SAMPLES_2 = 0b01, 77 | QMC5883_SAMPLES_1 = 0b00 78 | } eSamples_t; 79 | 80 | typedef enum 81 | { 82 | HMC5883L_DATARATE_75HZ = 0b110, 83 | HMC5883L_DATARATE_30HZ = 0b101, 84 | HMC5883L_DATARATE_15HZ = 0b100, 85 | HMC5883L_DATARATE_7_5HZ = 0b011, 86 | HMC5883L_DATARATE_3HZ = 0b010, 87 | HMC5883L_DATARATE_1_5HZ = 0b001, 88 | HMC5883L_DATARATE_0_75_HZ = 0b000, 89 | QMC5883_DATARATE_10HZ = 0b00, 90 | QMC5883_DATARATE_50HZ = 0b01, 91 | QMC5883_DATARATE_100HZ = 0b10, 92 | QMC5883_DATARATE_200HZ = 0b11, 93 | VCM5883L_DATARATE_200HZ = 0b00, 94 | VCM5883L_DATARATE_100HZ = 0b01, 95 | VCM5883L_DATARATE_50HZ = 0b10, 96 | VCM5883L_DATARATE_10HZ = 0b11 97 | } eDataRate_t; 98 | 99 | typedef enum 100 | { 101 | HMC5883L_RANGE_8_1GA = 0b111, 102 | HMC5883L_RANGE_5_6GA = 0b110, 103 | HMC5883L_RANGE_4_7GA = 0b101, 104 | HMC5883L_RANGE_4GA = 0b100, 105 | HMC5883L_RANGE_2_5GA = 0b011, 106 | HMC5883L_RANGE_1_9GA = 0b010, 107 | HMC5883L_RANGE_1_3GA = 0b001, 108 | HMC5883L_RANGE_0_88GA = 0b000, 109 | QMC5883_RANGE_2GA = 0b00, 110 | QMC5883_RANGE_8GA = 0b01, 111 | VCM5883L_RANGE_8GA = 0b01, 112 | } eRange_t; 113 | 114 | typedef enum 115 | { 116 | HMC5883L_IDLE = 0b10, 117 | HMC5883_SINGLE = 0b01, 118 | HMC5883L_CONTINOUS = 0b00, 119 | QMC5883_SINGLE = 0b00, 120 | QMC5883_CONTINOUS = 0b01, 121 | VCM5883L_SINGLE = 0b0, 122 | VCM5883L_CONTINOUS = 0b1, 123 | } eMode_t; 124 | 125 | #ifndef VECTOR_STRUCT_H 126 | #define VECTOR_STRUCT_H 127 | typedef struct 128 | { 129 | int16_t XAxis; 130 | int16_t YAxis; 131 | int16_t ZAxis; 132 | float AngleXY; 133 | float AngleXZ; 134 | float AngleYZ; 135 | float HeadingDegress; 136 | } sVector_t; 137 | #endif 138 | 139 | class DFRobot_QMC5883 140 | { 141 | public: 142 | DFRobot_QMC5883(TwoWire*pWire = &Wire, uint8_t I2C_addr = 0x0C); 143 | /** 144 | * @fn begin 145 | * @brief Sensor init 146 | * @return bool init status 147 | * @retval true init succeeded 148 | * @retval false init failed 149 | */ 150 | bool begin(void); 151 | 152 | /** 153 | * @fn readRaw 154 | * @brief Get the data collected by the sensor 155 | * @return sVector_t The data collected by the sensor 156 | */ 157 | sVector_t readRaw(void); 158 | 159 | /** 160 | * @fn setRange 161 | * @brief Set sensor signal gain range 162 | * @param range 163 | * @n HMC5883L_RANGE_8_1GA 164 | * @n HMC5883L_RANGE_5_6GA 165 | * @n HMC5883L_RANGE_4_7GA 166 | * @n HMC5883L_RANGE_4GA 167 | * @n HMC5883L_RANGE_2_5GA 168 | * @n HMC5883L_RANGE_1_9GA 169 | * @n HMC5883L_RANGE_1_3GA //default 170 | * @n HMC5883L_RANGE_0_88GA 171 | * @n QMC5883_RANGE_2GA 172 | * @n QMC5883_RANGE_8GA 173 | * @n VCM5883L_RANGE_8GA 174 | */ 175 | void setRange(eRange_t range); 176 | 177 | /** 178 | * @fn getRange 179 | * @brief Get sensor signal gain range 180 | * @return eRange_t 181 | */ 182 | eRange_t getRange(void); 183 | 184 | /** 185 | * @fn setMeasurementMode 186 | * @brief Set measurement mode 187 | * @param mode 188 | * @n HMC5883L_IDLE 189 | * @n HMC5883_SINGLE 190 | * @n HMC5883L_CONTINOUS 191 | * @n QMC5883_SINGLE 192 | * @n QMC5883_CONTINOUS 193 | * @n VCM5883L_SINGLE 194 | * @n VCM5883L_CONTINOUS 195 | */ 196 | void setMeasurementMode(eMode_t mode); 197 | 198 | /** 199 | * @fn getMeasurementMode 200 | * @brief Get measurement mode 201 | * @return eMode_t 202 | */ 203 | eMode_t getMeasurementMode(void); 204 | 205 | /** 206 | * @fn setDataRate 207 | * @brief Set the data collection rate of the sensor 208 | * @param dataRate 209 | * @n HMC5883L_DATARATE_75HZ 210 | * @n HMC5883L_DATARATE_30HZ 211 | * @n HMC5883L_DATARATE_15HZ 212 | * @n HMC5883L_DATARATE_7_5HZ 213 | * @n HMC5883L_DATARATE_3HZ 214 | * @n HMC5883L_DATARATE_1_5HZ 215 | * @n HMC5883L_DATARATE_0_75_HZ 216 | * @n QMC5883_DATARATE_10HZ 217 | * @n QMC5883_DATARATE_50HZ 218 | * @n QMC5883_DATARATE_100HZ 219 | * @n QMC5883_DATARATE_200HZ 220 | * @n VCM5883L_DATARATE_200HZ 221 | * @n VCM5883L_DATARATE_100HZ 222 | * @n VCM5883L_DATARATE_50HZ 223 | * @n VCM5883L_DATARATE_10HZ 224 | */ 225 | void setDataRate(eDataRate_t dataRate); 226 | 227 | /** 228 | * @fn getDataRate 229 | * @brief Get the data collection rate of the sensor 230 | * @return eDataRate_t 231 | */ 232 | eDataRate_t getDataRate(void); 233 | 234 | /** 235 | * @fn setSamples 236 | * @brief Set sensor status 237 | * @param samples 238 | * @n HMC5883L_SAMPLES_8 239 | * @n HMC5883L_SAMPLES_4 240 | * @n HMC5883L_SAMPLES_2 241 | * @n HMC5883L_SAMPLES_1 242 | * @n QMC5883_SAMPLES_8 243 | * @n QMC5883_SAMPLES_4 244 | * @n QMC5883_SAMPLES_2 245 | * @n QMC5883_SAMPLES_1 246 | */ 247 | void setSamples(eSamples_t samples); 248 | 249 | /** 250 | * @fn getSamples 251 | * @brief Get sensor status 252 | * @return eSamples_t 253 | */ 254 | eSamples_t getSamples(void); 255 | 256 | /** 257 | * @fn setDeclinationAngle 258 | * @brief Set sensor declination angle 259 | * @param declinationAngle 260 | */ 261 | void setDeclinationAngle(float declinationAngle); 262 | 263 | /** 264 | * @fn getHeadingDegrees 265 | * @brief Set the sensor range 266 | */ 267 | void getHeadingDegrees(void); 268 | 269 | /** 270 | * @fn getICType 271 | * @brief Get sensor type 272 | * @return int 273 | */ 274 | int getICType(void); 275 | 276 | /** 277 | * @fn isHMC 278 | * @brief Determine if the sensor type is HMC5883 279 | * @return bool 280 | * @retval ture it is 281 | * @retval false it isn't 282 | */ 283 | bool isHMC(void){if(ICType == IC_HMC5883L ){return true;}return false;} 284 | 285 | /** 286 | * @fn isQMC 287 | * @brief Determine if the sensor type is QMC5883 288 | * @return bool 289 | * @retval ture it is 290 | * @retval false it isn't 291 | */ 292 | bool isQMC(void){if(ICType == IC_QMC5883 ){return true;}return false;} 293 | 294 | /** 295 | * @fn isVCM 296 | * @brief Determine if the sensor type is VMC5883 297 | * @return bool 298 | * @retval ture it is 299 | * @retval false it isn't 300 | */ 301 | bool isVCM(void){if(ICType == IC_VCM5883L ){return true;}return false;} 302 | private: 303 | void writeRegister8(uint8_t reg, uint8_t value); 304 | uint8_t readRegister8(uint8_t reg); 305 | uint8_t fastRegister8(uint8_t reg); 306 | int16_t readRegister16(uint8_t reg); 307 | TwoWire *_pWire; 308 | uint8_t _I2C_addr; 309 | float ICdeclinationAngle; 310 | int ICType = IC_NONE; 311 | bool isHMC_; 312 | bool isQMC_; 313 | float mgPerDigit; 314 | float Gauss_LSB_XY = 1090.0; 315 | sVector_t v; 316 | float minX, maxX; 317 | float minY, maxY; 318 | float minZ, maxZ; 319 | bool firstRun; 320 | }; 321 | 322 | #endif 323 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2010 DFRobot Co.Ltd 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DFRobot_QMC5883 2 | - [中文版](./README_CN.md) 3 | 4 | This low-cost 10 DOF (degrees of the freedom) sensor from dfrobot is highly integrated with the ADXL345 accelerometer, QMC5883L magnetometer, ITG3205 gyroscope and BMP280 air pressure sensor and temperature sensor. It embeds a low noise LDO regulator for supplying a wide range of power input, working with a 3V-5V power supply. Certainly, the 10 DOF IMU is directly compatible with Arduino boards. 5 | 6 | ![正反面svg效果图](./resources/images/SEN0140.png) 7 | 8 | ## Product Link (https://www.dfrobot.com/product-818.html) 9 | 10 | SKU: SEN0140 11 | 12 | ## Table of Contents 13 | 14 | * [Summary](#summary) 15 | * [Installation](#installation) 16 | * [Methods](#methods) 17 | * [Compatibility](#compatibility) 18 | * [History](#history) 19 | * [Credits](#credits) 20 | 21 | ## Summary 22 | This library provides drivers for the QMC5883, HMC5883 and VMC5883. 23 | 24 | ## Installation 25 | 26 | To use this library, first download the library file, paste it into the \Arduino\libraries directory, then open the examples folder and run the demo in the folder. 27 | 28 | ## Methods 29 | 30 | ```C++ 31 | DFRobot_QMC5883(TwoWire*pWire = &Wire, uint8_t I2C_addr = 0x0C); 32 | /** 33 | * @fn begin 34 | * @brief Sensor init 35 | * @return bool init status 36 | * @retval true init succeeded 37 | * @retval false init failed 38 | */ 39 | bool begin(void); 40 | 41 | /** 42 | * @fn readRaw 43 | * @brief Get the data collected by the sensor 44 | * @return sVector_t The data collected by the sensor 45 | */ 46 | sVector_t readRaw(void); 47 | 48 | /** 49 | * @fn setRange 50 | * @brief Set sensor signal gain range 51 | * @param range 52 | * @n HMC5883L_RANGE_8_1GA 53 | * @n HMC5883L_RANGE_5_6GA 54 | * @n HMC5883L_RANGE_4_7GA 55 | * @n HMC5883L_RANGE_4GA 56 | * @n HMC5883L_RANGE_2_5GA 57 | * @n HMC5883L_RANGE_1_9GA 58 | * @n HMC5883L_RANGE_1_3GA //default 59 | * @n HMC5883L_RANGE_0_88GA 60 | * @n QMC5883_RANGE_2GA 61 | * @n QMC5883_RANGE_8GA 62 | * @n VCM5883L_RANGE_8GA 63 | */ 64 | void setRange(eRange_t range); 65 | 66 | /** 67 | * @fn getRange 68 | * @brief Get sensor signal gain range 69 | * @return eRange_t 70 | */ 71 | eRange_t getRange(void); 72 | 73 | /** 74 | * @fn setMeasurementMode 75 | * @brief Set measurement mode 76 | * @param mode 77 | * @n HMC5883L_IDLE 78 | * @n HMC5883_SINGLE 79 | * @n HMC5883L_CONTINOUS 80 | * @n QMC5883_SINGLE 81 | * @n QMC5883_CONTINOUS 82 | * @n VCM5883L_SINGLE 83 | * @n VCM5883L_CONTINOUS 84 | */ 85 | void setMeasurementMode(eMode_t mode); 86 | 87 | /** 88 | * @fn getMeasurementMode 89 | * @brief Get measurement mode 90 | * @return eMode_t 91 | */ 92 | eMode_t getMeasurementMode(void); 93 | 94 | /** 95 | * @fn setDataRate 96 | * @brief Set the data collection rate of the sensor 97 | * @param dataRate 98 | * @n HMC5883L_DATARATE_75HZ 99 | * @n HMC5883L_DATARATE_30HZ 100 | * @n HMC5883L_DATARATE_15HZ 101 | * @n HMC5883L_DATARATE_7_5HZ 102 | * @n HMC5883L_DATARATE_3HZ 103 | * @n HMC5883L_DATARATE_1_5HZ 104 | * @n HMC5883L_DATARATE_0_75_HZ 105 | * @n QMC5883_DATARATE_10HZ 106 | * @n QMC5883_DATARATE_50HZ 107 | * @n QMC5883_DATARATE_100HZ 108 | * @n QMC5883_DATARATE_200HZ 109 | * @n VCM5883L_DATARATE_200HZ 110 | * @n VCM5883L_DATARATE_100HZ 111 | * @n VCM5883L_DATARATE_50HZ 112 | * @n VCM5883L_DATARATE_10HZ 113 | */ 114 | void setDataRate(eDataRate_t dataRate); 115 | 116 | /** 117 | * @fn getDataRate 118 | * @brief Get the data collection rate of the sensor 119 | * @return eDataRate_t 120 | */ 121 | eDataRate_t getDataRate(void); 122 | 123 | /** 124 | * @fn setSamples 125 | * @brief Set sensor status 126 | * @param samples 127 | * @n HMC5883L_SAMPLES_8 128 | * @n HMC5883L_SAMPLES_4 129 | * @n HMC5883L_SAMPLES_2 130 | * @n HMC5883L_SAMPLES_1 131 | * @n QMC5883_SAMPLES_8 132 | * @n QMC5883_SAMPLES_4 133 | * @n QMC5883_SAMPLES_2 134 | * @n QMC5883_SAMPLES_1 135 | */ 136 | void setSamples(eSamples_t samples); 137 | 138 | /** 139 | * @fn getSamples 140 | * @brief Get sensor status 141 | * @return eSamples_t 142 | */ 143 | eSamples_t getSamples(void); 144 | 145 | /** 146 | * @fn setDeclinationAngle 147 | * @brief Set sensor declination angle 148 | * @param declinationAngle 149 | */ 150 | void setDeclinationAngle(float declinationAngle); 151 | 152 | /** 153 | * @fn getHeadingDegrees 154 | * @brief Set the sensor range 155 | */ 156 | void getHeadingDegrees(void); 157 | 158 | /** 159 | * @fn getICType 160 | * @brief Get sensor type 161 | * @return int 162 | */ 163 | int getICType(void); 164 | 165 | /** 166 | * @fn isHMC 167 | * @brief Determine if the sensor type is HMC5883 168 | * @return bool 169 | * @retval ture it is 170 | * @retval false it isn't 171 | */ 172 | bool isHMC(void){if(ICType == IC_HMC5883L ){return true;}return false;} 173 | 174 | /** 175 | * @fn isQMC 176 | * @brief Determine if the sensor type is QMC5883 177 | * @return bool 178 | * @retval ture it is 179 | * @retval false it isn't 180 | */ 181 | bool isQMC(void){if(ICType == IC_QMC5883 ){return true;}return false;} 182 | 183 | /** 184 | * @fn isVCM 185 | * @brief Determine if the sensor type is VMC5883 186 | * @return bool 187 | * @retval ture it is 188 | * @retval false it isn't 189 | */ 190 | bool isVCM(void){if(ICType == IC_VCM5883L ){return true;}return false;} 191 | ``` 192 | 193 | ## Compatibility 194 | 195 | MCU | Work Well | Work Wrong | Untested | Remarks 196 | ------------------ | :----------: | :----------: | :---------: | ----- 197 | Arduino uno | √ | | | 198 | Mega2560 | √ | | | 199 | Leonardo | √ | | | 200 | ESP32 | √ | | | 201 | ESP8266 | √ | | | 202 | micro:bit | √ | | | 203 | 204 | ## History 205 | 206 | - 2022/2/23 - Version 1.0.0 released. 207 | 208 | ## Credits 209 | 210 | Written by PengKaixing(kaixing.peng@dfrobot.com), 2019. (Welcome to our [website](https://www.dfrobot.com/)) 211 | -------------------------------------------------------------------------------- /README_CN.md: -------------------------------------------------------------------------------- 1 | # DFRobot_QMC5883 2 | - [English Version](./README.md) 3 | 4 | DFrobot的高集成度低成本的10自由度传感器,集合了ADXL345加速度计、QMC5883L磁罗盘、ITG3205陀螺仪以及BMP280气压传感器和温度传感器。内置了低噪声的低压线性稳压器,还扩展了电源电压输入范围,支持3V-5V电源电压。同时,10自由度IMU也可以直接和Arduino控制板兼容。 5 | 6 | ![正反面svg效果图](./resources/images/SEN0140.png) 7 | 8 | ## 产品链接 (https://www.dfrobot.com.cn/goods-640.html) 9 | 10 | SKU: SEN0140 11 | 12 | ## 目录 13 | 14 | * [概述](#概述) 15 | * [库安装](#库安装) 16 | * [方法](#方法) 17 | * [兼容性](#兼容性y) 18 | * [历史](#历史) 19 | * [创作者](#创作者) 20 | 21 | ## 概述 22 | 23 | 这个库提供了QMC5883,HMC5883 和 VMC5883的驱动程序 24 | 25 | ## 库安装 26 | 27 | 使用此库前,请首先下载库文件,将其粘贴到\Arduino\libraries目录中,然后打开examples文件夹并在该文件夹中运行演示。 28 | 29 | ## 方法 30 | 31 | ```C++ 32 | 33 | /** 34 | * @fn begin 35 | * @brief 传感器初始化 36 | * @return bool 初始化状态 37 | * @retval true 初始化成功 38 | * @retval false 初始化失败 39 | */ 40 | bool begin(void); 41 | 42 | /** 43 | * @fn readRaw 44 | * @brief 获取传感器采集的数据 45 | * @return sVector_t 电子罗盘采集数据信息 46 | */ 47 | sVector_t readRaw(void); 48 | 49 | /** 50 | * @fn setRange 51 | * @brief 设置传感器信号增益范围 52 | * @param range 53 | * @n HMC5883L_RANGE_8_1GA 54 | * @n HMC5883L_RANGE_5_6GA 55 | * @n HMC5883L_RANGE_4_7GA 56 | * @n HMC5883L_RANGE_4GA 57 | * @n HMC5883L_RANGE_2_5GA 58 | * @n HMC5883L_RANGE_1_9GA 59 | * @n HMC5883L_RANGE_1_3GA //default 60 | * @n HMC5883L_RANGE_0_88GA 61 | * @n QMC5883_RANGE_2GA 62 | * @n QMC5883_RANGE_8GA 63 | * @n VCM5883L_RANGE_8GA 64 | */ 65 | void setRange(eRange_t range); 66 | 67 | /** 68 | * @fn getRange 69 | * @brief 获取传感器信号增益范围 70 | * @return eRange_t 71 | */ 72 | eRange_t getRange(void); 73 | 74 | /** 75 | * @fn setMeasurementMode 76 | * @brief 设置测量模式 77 | * @param mode 78 | * @n HMC5883L_IDLE 79 | * @n HMC5883_SINGLE 80 | * @n HMC5883L_CONTINOUS 81 | * @n QMC5883_SINGLE 82 | * @n QMC5883_CONTINOUS 83 | * @n VCM5883L_SINGLE 84 | * @n VCM5883L_CONTINOUS 85 | */ 86 | void setMeasurementMode(eMode_t mode); 87 | 88 | /** 89 | * @fn getMeasurementMode 90 | * @brief 获取测量模式 91 | * @return eMode_t 92 | */ 93 | eMode_t getMeasurementMode(void); 94 | 95 | /** 96 | * @fn setDataRate 97 | * @brief 设置传感器采集数据的频率 98 | * @param dataRate 99 | * @n HMC5883L_DATARATE_75HZ 100 | * @n HMC5883L_DATARATE_30HZ 101 | * @n HMC5883L_DATARATE_15HZ 102 | * @n HMC5883L_DATARATE_7_5HZ 103 | * @n HMC5883L_DATARATE_3HZ 104 | * @n HMC5883L_DATARATE_1_5HZ 105 | * @n HMC5883L_DATARATE_0_75_HZ 106 | * @n QMC5883_DATARATE_10HZ 107 | * @n QMC5883_DATARATE_50HZ 108 | * @n QMC5883_DATARATE_100HZ 109 | * @n QMC5883_DATARATE_200HZ 110 | * @n VCM5883L_DATARATE_200HZ 111 | * @n VCM5883L_DATARATE_100HZ 112 | * @n VCM5883L_DATARATE_50HZ 113 | * @n VCM5883L_DATARATE_10HZ 114 | */ 115 | void setDataRate(eDataRate_t dataRate); 116 | 117 | /** 118 | * @fn getDataRate 119 | * @brief 获取传感器采集数据的频率 120 | * @return eDataRate_t 121 | */ 122 | eDataRate_t getDataRate(void); 123 | 124 | /** 125 | * @fn setSamples 126 | * @brief 设置传感器状态 127 | * @param samples 128 | * @n HMC5883L_SAMPLES_8 129 | * @n HMC5883L_SAMPLES_4 130 | * @n HMC5883L_SAMPLES_2 131 | * @n HMC5883L_SAMPLES_1 132 | * @n QMC5883_SAMPLES_8 133 | * @n QMC5883_SAMPLES_4 134 | * @n QMC5883_SAMPLES_2 135 | * @n QMC5883_SAMPLES_1 136 | */ 137 | void setSamples(eSamples_t samples); 138 | 139 | /** 140 | * @fn getSamples 141 | * @brief 获取传感器状态 142 | * @return eSamples_t 143 | */ 144 | eSamples_t getSamples(void); 145 | 146 | /** 147 | * @fn setDeclinationAngle 148 | * @brief 设置传感器偏转角 149 | * @param declinationAngle 150 | */ 151 | void setDeclinationAngle(float declinationAngle); 152 | 153 | /** 154 | * @fn getHeadingDegrees 155 | * @brief 设置传感器量程 156 | */ 157 | void getHeadingDegrees(void); 158 | 159 | /** 160 | * @fn getICType 161 | * @brief 获取传感器型号 162 | * @return int 163 | */ 164 | int getICType(void); 165 | 166 | /** 167 | * @fn isHMC 168 | * @brief 判断传感器型号是否是HMC5883 169 | * @return bool 170 | * @retval ture 是 171 | * @retval false 不是 172 | */ 173 | bool isHMC(void){if(ICType == IC_HMC5883L ){return true;}return false;} 174 | 175 | /** 176 | * @fn isQMC 177 | * @brief 判断传感器型号是否是QMC5883 178 | * @return bool 179 | * @retval ture 是 180 | * @retval false 不是 181 | */ 182 | bool isQMC(void){if(ICType == IC_QMC5883 ){return true;}return false;} 183 | 184 | /** 185 | * @fn isVCM 186 | * @brief 判断传感器型号是否是VMC5883 187 | * @return bool 188 | * @retval ture 是 189 | * @retval false 不是 190 | */ 191 | bool isVCM(void){if(ICType == IC_VCM5883L ){return true;}return false;} 192 | ``` 193 | 194 | ## 兼容性 195 | 196 | 主板 | 通过 | 未通过 | 未测试 | 备注 197 | ------------------ | :----------: | :----------: | :---------: | ----- 198 | Arduino uno | √ | | | 199 | Mega2560 | √ | | | 200 | Leonardo | √ | | | 201 | ESP32 | √ | | | 202 | ESP8266 | √ | | | 203 | micro:bit | √ | | | 204 | 205 | 206 | ## 历史 207 | 208 | - 2022/2/23 - 1.0.0 版本 209 | 210 | ## 创作者 211 | 212 | Written by PengKaixing(kaixing.peng@dfrobot.com), 2019. (Welcome to our [website](https://www.dfrobot.com/)) -------------------------------------------------------------------------------- /examples/getCompassdata/getCompassdata.ino: -------------------------------------------------------------------------------- 1 | /*! 2 | * @file getCompassdata.ino 3 | * @brief Output the compass data 4 | * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) 5 | * @license The MIT License (MIT) 6 | * @author [dexian.huang](952838602@qq.com) 7 | * @version V1.0 8 | * @date 2017-7-3 9 | * @url https://github.com/DFRobot/DFRobot_QMC5883 10 | */ 11 | #include 12 | 13 | DFRobot_QMC5883 compass(&Wire, /*I2C addr*/VCM5883L_ADDRESS); 14 | 15 | void setup() 16 | { 17 | Serial.begin(9600); 18 | while (!compass.begin()) 19 | { 20 | Serial.println("Could not find a valid 5883 sensor, check wiring!"); 21 | delay(500); 22 | } 23 | 24 | if(compass.isHMC()) 25 | { 26 | Serial.println("Initialize HMC5883"); 27 | 28 | //Set/get the compass signal gain range, default to be 1.3 Ga 29 | // compass.setRange(HMC5883L_RANGE_1_3GA); 30 | // Serial.print("compass range is:"); 31 | // Serial.println(compass.getRange()); 32 | 33 | //Set/get measurement mode 34 | // compass.setMeasurementMode(HMC5883L_CONTINOUS); 35 | // Serial.print("compass measurement mode is:"); 36 | // Serial.println(compass.getMeasurementMode()); 37 | 38 | //Set/get the data collection frequency of the sensor 39 | // compass.setDataRate(HMC5883L_DATARATE_15HZ); 40 | // Serial.print("compass data rate is:"); 41 | // Serial.println(compass.getDataRate()); 42 | 43 | //Get/get sensor status 44 | // compass.setSamples(HMC5883L_SAMPLES_8); 45 | // Serial.print("compass samples is:"); 46 | // Serial.println(compass.getSamples()); 47 | } 48 | else if(compass.isQMC()) 49 | { 50 | Serial.println("Initialize QMC5883"); 51 | // compass.setRange(QMC5883_RANGE_2GA); 52 | // Serial.print("compass range is:"); 53 | // Serial.println(compass.getRange()); 54 | 55 | // compass.setMeasurementMode(QMC5883_CONTINOUS); 56 | // Serial.print("compass measurement mode is:"); 57 | // Serial.println(compass.getMeasurementMode()); 58 | 59 | // compass.setDataRate(QMC5883_DATARATE_50HZ); 60 | // Serial.print("compass data rate is:"); 61 | // Serial.println(compass.getDataRate()); 62 | 63 | // compass.setSamples(QMC5883_SAMPLES_8); 64 | // Serial.print("compass samples is:"); 65 | // Serial.println(compass.getSamples()); 66 | } 67 | else if(compass.isVCM()) 68 | { 69 | Serial.println("Initialize VCM5883L"); 70 | // compass.setMeasurementMode(VCM5883L_CONTINOUS); 71 | // Serial.print("compass measurement mode is:"); 72 | // Serial.println(compass.getMeasurementMode()); 73 | 74 | // compass.setDataRate(VCM5883L_DATARATE_200HZ); 75 | // Serial.print("compass data rate is:"); 76 | // Serial.println(compass.getDataRate()); 77 | } 78 | delay(1000); 79 | } 80 | void loop() 81 | { 82 | /** 83 | * @brief Set declination angle on your location and fix heading 84 | * @n You can find your declination on: http://magnetic-declination.com/ 85 | * @n (+) Positive or (-) for negative 86 | * @n For Bytom / Poland declination angle is 4'26E (positive) 87 | * @n Formula: (deg + (min / 60.0)) / (180 / PI); 88 | */ 89 | float declinationAngle = (4.0 + (26.0 / 60.0)) / (180 / PI); 90 | compass.setDeclinationAngle(declinationAngle); 91 | sVector_t mag = compass.readRaw(); 92 | compass.getHeadingDegrees(); 93 | Serial.print("X:"); 94 | Serial.print(mag.XAxis); 95 | Serial.print(" Y:"); 96 | Serial.print(mag.YAxis); 97 | Serial.print(" Z:"); 98 | Serial.println(mag.ZAxis); 99 | Serial.print("Degress = "); 100 | Serial.println(mag.HeadingDegress); 101 | delay(100); 102 | } 103 | -------------------------------------------------------------------------------- /keywords.txt: -------------------------------------------------------------------------------- 1 | ####################################### 2 | # Syntax Coloring Map - 3-Axis Digital Compass IC 3 | ####################################### 4 | 5 | ####################################### 6 | # Datatypes (KEYWORD1) 7 | ####################################### 8 | DFRobot_QMC5883 KEYWORD1 9 | 10 | ####################################### 11 | # Methods and Functions (KEYWORD2) 12 | ####################################### 13 | begin KEYWORD2 14 | readRaw KEYWORD2 15 | readNormalize KEYWORD2 16 | calibrate KEYWORD2 17 | setOffset KEYWORD2 18 | setRange KEYWORD2 19 | getRange KEYWORD2 20 | setMeasurementMode KEYWORD2 21 | getMeasurementMode KEYWORD2 22 | setDataRate KEYWORD2 23 | getDataRate KEYWORD2 24 | setSamples KEYWORD2 25 | getSamples KEYWORD2 26 | setDeclinationAngle KEYWORD2 27 | getHeadingDegrees KEYWORD2 28 | 29 | ####################################### 30 | # Constants (LITERAL1) 31 | ####################################### 32 | HMC5883L_SAMPLES_8 LITERAL1 33 | HMC5883L_SAMPLES_4 LITERAL1 34 | HMC5883L_SAMPLES_2 LITERAL1 35 | HMC5883L_SAMPLES_1 LITERAL1 36 | HMC5883L_DATARATE_75HZ LITERAL1 37 | HMC5883L_DATARATE_30HZ LITERAL1 38 | HMC5883L_DATARATE_15HZ LITERAL1 39 | HMC5883L_DATARATE_7_5HZ LITERAL1 40 | HMC5883L_DATARATE_3HZ LITERAL1 41 | HMC5883L_DATARATE_1_5HZ LITERAL1 42 | HMC5883L_DATARATE_0_75_HZ LITERAL1 43 | HMC5883L_RANGE_8_1GA LITERAL1 44 | HMC5883L_RANGE_5_6GA LITERAL1 45 | HMC5883L_RANGE_4_7GA LITERAL1 46 | HMC5883L_RANGE_4GA LITERAL1 47 | HMC5883L_RANGE_2_5GA LITERAL1 48 | HMC5883L_RANGE_1_9GA LITERAL1 49 | HMC5883L_RANGE_1_3GA LITERAL1 50 | HMC5883L_RANGE_0_88GA LITERAL1 51 | HMC5883L_IDLE LITERAL1 52 | HMC5883_SINGLE LITERAL1 53 | HMC5883L_CONTINOUS LITERAL1 54 | 55 | QMC5883_SAMPLES_8 LITERAL1 56 | QMC5883_SAMPLES_4 LITERAL1 57 | QMC5883_SAMPLES_2 LITERAL1 58 | QMC5883_SAMPLES_1 LITERAL1 59 | QMC5883_DATARATE_10HZ LITERAL1 60 | QMC5883_DATARATE_50HZ LITERAL1 61 | QMC5883_DATARATE_100HZ LITERAL1 62 | QMC5883_DATARATE_200HZ LITERAL1 63 | QMC5883_SAMPLES_4 LITERAL1 64 | QMC5883_SAMPLES_4 LITERAL1 65 | QMC5883_SAMPLES_4 LITERAL1 66 | QMC5883_SAMPLES_4 LITERAL1 67 | QMC5883_RANGE_2GA LITERAL1 68 | QMC5883_RANGE_8GA LITERAL1 69 | QMC5883_SINGLE LITERAL1 70 | QMC5883_CONTINOUS LITERAL1 71 | 72 | VCM5883L_DATARATE_200HZ LITERAL1 73 | VCM5883L_DATARATE_100HZ LITERAL1 74 | VCM5883L_DATARATE_50HZ LITERAL1 75 | VCM5883L_DATARATE_10HZ LITERAL1 76 | VCM5883L_RANGE_8GA LITERAL1 77 | VCM5883L_SINGLE LITERAL1 78 | VCM5883L_CONTINOUS LITERAL1 -------------------------------------------------------------------------------- /library.properties: -------------------------------------------------------------------------------- 1 | name=DFRobot_QMC5883 2 | version=1.0.0 3 | author=DFRobot 4 | maintainer=PengKaixing(kaixing.peng@dfrobot.com) 5 | sentence=Electronic compass drive library(SKU:SEN0140). 6 | paragraph=Compatible with QMC5883 HMC5883 and VMC5883. 7 | category=Sensors 8 | url=https://github.com/DFRobot/DFRobot_QMC5883 9 | architectures=* 10 | -------------------------------------------------------------------------------- /resources/images/SEN0140.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DFRobot/DFRobot_QMC5883/0787570b946f9776e0cba043b5ea1781219c3c43/resources/images/SEN0140.png --------------------------------------------------------------------------------