QMC5883 사용법 알아보기!

용용죽겠지 2017-05-11 (목) 15:55 1년전 1647  



안녕하세요 메카솔루션입니다.


이번에는 QMC5883 센서의 사용법을 알아보고자 합니다.


pick_manager-16 


HMC5883L 은 아는데 QMC5883은 처음 들어볼 수 있을 것입니다.


사실 여기서 약간 슬픈 소식을 전해 드려야 하는데 


 


HMC5883L 의 은퇴 소식입니다.


pick_manager-31 


그동안 아두이노 나침반 센서라면 HMC5883L이 대표적이었는데 이제는 생산도 멈추고 남아있는 재고도 점점 줄기 때문에 앞으로는 더더욱 HMC5883L 을 보기 힘들 것입니다. 


그래서 이를 대체하기 위해 QMC5883이 나왔고 저희도 HMC5883L모듈 중 일부가 섞여서 판매되고 있었습니다.


pick_manager-4 


그런데 문제가 하나 있습니다.


회로는 호환이 되는데


소스 코드가 호환이 안됩니다.


이거 참... 곤란하게 생겼습니다.


QMC5883이 나온 지 얼마 안되기도 하여서 아두이노 예제 코드나 라이브러리가 없어서 섞여 들어온 QMC5883을 받은 고객님 들은 사용할 수 가 없었거든요


그래서 재빠르게 라이브러리와 예제 코드를 만들었습니다.


pick_manager-36


 

https://github.com/mechasolution/Mecha_QMC5883


위 링크에서 초록 버튼을 눌러 라이브러리를 다운로드 할 수 있습니다.


회로도는 기존 HMC5883L 과 같습니다.



소스코드는 라이브러리를 설치하는 코드와 라이브러리가 필요 없는 코드 모두 올리도록 하겠습니다.


라이브러리가 필요한 코드


#include <Wire.h>
#include <MechaQMC5883.h>

MechaQMC5883 qmc;

void setup() {
  Wire.begin();
  Serial.begin(9600);
  qmc.init();
  //qmc.setMode(Mode_Continuous,ODR_200Hz,RNG_2G,OSR_256);
}

void loop() {
  int x,y,z;
  qmc.read(&x,&y,&z);

  Serial.print("x: ");
  Serial.print(x);
  Serial.print(" y: ");
  Serial.print(y);
  Serial.print(" z: ");
  Serial.print(z);
  Serial.println();
  delay(100);
}


라이브러리가 필요 없는 코드


#include <Wire.h> //I2C Arduino Library
#define addr 0x0D //I2C Address for The HMC5883

void setup() {
  Serial.begin(9600);
  Wire.begin();

  Wire.beginTransmission(addr); //start talking
  Wire.write(0x0B); // Tell the HMC5883 to Continuously Measure
  Wire.write(0x01); // Set the Register
  Wire.endTransmission();
  Wire.beginTransmission(addr); //start talking
  Wire.write(0x09); // Tell the HMC5883 to Continuously Measure
  Wire.write(0x1D); // Set the Register
  Wire.endTransmission();
}

void loop() {

  int x, y, z; //triple axis data

  //Tell the HMC what regist to begin writing data into


  Wire.beginTransmission(addr);
  Wire.write(0x00); //start with register 3.
  Wire.endTransmission();

  //Read the data.. 2 bytes for each axis.. 6 total bytes
  Wire.requestFrom(addr, 6);
  if (6 <= Wire.available()) {
    x = Wire.read(); //MSB  x
    x |= Wire.read() << 8; //LSB  x
    z = Wire.read(); //MSB  z
    z |= Wire.read() << 8; //LSB z
    y = Wire.read(); //MSB y
    y |= Wire.read() << 8; //LSB y
  }

  // Show Values
  Serial.print("X Value: ");
  Serial.println(x);
  Serial.print("Y Value: ");
  Serial.println(y);
  Serial.print("Z Value: ");
  Serial.println(z);
  Serial.println();

  delay(500);
}


감사합니다.


담당자: yevgeny


모바일 버전으로 보기