Hardware | Digital Compass - HMC5883L 사용기 - 2

|

이 글은 전편이 있습니다.


* Hardware | Digitial Compass - HMC5883L 사용기 - 1

http://chocoball.tistory.com/entry/Hardware-Digital-Compass-HMC5883L-1


위의 포스트에서는 HMC5883L 의 중국 버전인 QMC5883L 을 사용하는 분투기(?) 였고,

이번 글은 AliExpress 에서 정식 HMC5883L 을 파는 업자를 찾아서 구입후 사용해 보는 포스트 입니다.





1. 구매


그냥 저가의 HMC5883L 을 구입하면 아마도 QMC5883L 이 배달될 껍니다.

QMC5883L 은 대략 2 USD 언더로 구입할 수 있고, 정식 HMC5883L 은 3.5 USD 정도 합니다.


중국 판매자들도 조금의 양심은 있는지, 완전 짝퉁을 정식 부품과 동일하게 올려받지는 않는것 같아요.

이번에 구입한 판매 링크는 다음과 같습니다.


* GY-273 3V-5V HMC5883L Triple Axis Compass Magnetometer Sensor Module For Arduino Three Axis Magnetic Field Module

https://www.aliexpress.com/item/GY-273-3V-5V-HMC5883L-Triple-Axis-Compass-Magnetometer-Sensor-Module-For-Arduino-Three-Axis-Magnetic/32786802981.html



문제 없이 잘 도착했습니다.

두둥!!! 정말 이번에는 정품 chip 일까. 바로 확인해 봅니다.



오~!!! L883 이 찍혀 있군요. 정품 chip 입니다.



AliExpress 어플에서 보면 배송업자에게 구매자들이 질문하는 QnA 가 있는데, 그 질문들을 참고했습니다.

꽤나 많은 사람들이 진짜 "L883" 인지 문의하는 글들이 보입니다.



자세한 샷으로 확실하게 찍어 봅니다.



역시 pin header 는 스스로 납땜하라는 배려를 보여 줍니다.

이 취미는 이 맛에 하는거죠.



이 얼마나 고민하고 기다린 제품인지 모릅니다. 그래서 도착하자 마자 여러장 찍어 봤어요.





2. 회로


저번 QMC5883L 에서 했던 회로 구성과 완벽하게 같습니다.


  HMC5883L  | Arduino Nano
---------------------------
    VCC     |     3.3V
    GND     |     GND
    SCL     |     A5
    SDA     |     A4
---------------------------


저번 그림을 동일하게 사용해 주구요.



실제로 연결해 줍니다. 이것으로 준비는 끝.

I2C 로만 연결되니 다른 센서나 부품들 보다 확연히 단순합니다. 요즘 놀고있는 ESP8266 하려면 정말...


I2C detector 로 문제 없이 인식되는지 확인도 해봅니다.


#include "Wire.h"
#include "i2cdetect.h"
 
void setup() {
    Wire.begin();
    Serial.begin(9600);
    Serial.println("i2cdetect example\n");
    Serial.print("Scanning address range 0x03-0x77\n\n");
}
 
void loop() {
    i2cdetect(); // default range from 0x03 to 0x77
    delay(2000);
}


정식 chip 이라 전혀 문제 없이 인식 됩니다.

역시 돈이 최고인건가요... 싼거 쫒다가 힘들었던 저번 기억이 새록새록 생각납니다.



연결된 모습은 정말 간단하쥬?






3. sketch


저번 QMC5883L 에서 했던 회로 구성과 완벽하게 같습니다.

Arduino IDE 에서 가장 간단한 HMC5883L_compass 를 사용해 봅니다.


/*
  HMC5883L Triple Axis Digital Compass. Compass Example.
  Read more: http://www.jarzebski.pl/arduino/czujniki-i-sensory/3-osiowy-magnetometr-hmc5883l.html
  GIT: https://github.com/jarzebski/Arduino-HMC5883L
  Web: http://www.jarzebski.pl
  (c) 2014 by Korneliusz Jarzebski
*/

#include "Wire.h"
#include "HMC5883L.h"

HMC5883L compass;

void setup() {
	Serial.begin(9600);
	
	// Initialize Initialize HMC5883L
	Serial.println("Initialize HMC5883L");
	while (!compass.begin()) {
		Serial.println("Could not find a valid HMC5883L sensor, check wiring!");
		delay(500);
	}
	
	// Set measurement range
	compass.setRange(HMC5883L_RANGE_1_3GA);
	
	// Set measurement mode
	compass.setMeasurementMode(HMC5883L_CONTINOUS);
	
	// Set data rate
	compass.setDataRate(HMC5883L_DATARATE_30HZ);
	
	// Set number of samples averaged
	compass.setSamples(HMC5883L_SAMPLES_8);
	
	// Set calibration offset. See HMC5883L_calibration.ino
	compass.setOffset(0, 0);
}

void loop() {
	Vector norm = compass.readNormalize();
	
	// Calculate heading
	float heading = atan2(norm.YAxis, norm.XAxis);
	
	// Set declination angle on your location and fix heading
	// You can find your declination on: http://magnetic-declination.com/
	// (+) Positive or (-) for negative
	// For Bytom / Poland declination angle is 4'26E (positive)
	// Formula: (deg + (min / 60.0)) / (180 / M_PI);
	
	float declinationAngle = (4.0 + (26.0 / 60.0)) / (180 / M_PI);
	heading += declinationAngle;
	
	// Correct for heading < 0deg and heading > 360deg
	if (heading < 0) {
		heading += 2 * PI;
	}
	
	if (heading > 2 * PI) {
		heading -= 2 * PI;
	}
	
	// Convert to degrees
	float headingDegrees = heading * 180/M_PI; 
	
	// Output
	Serial.print(" Heading = ");
	Serial.print(heading);
	Serial.print(" Degress = ");
	Serial.print(headingDegrees);
	Serial.println();
	
	delay(100);
}


예전에 삽질한게 무엇? 이라고 말하듯 바로 실행됩니다.







4. Processing


Processing 이라는 어플은 센서로부터 오는 신호를 시각적으로 실시간 표현해 주는 어플 입니다.


* Processing



이 Processing 을 이용하여 실시간으로 공간 데이터를 시각적으로 표현하고자 합니다.

순서는 다음과 같습니다.


- Arduino 에 Processing 과 연동하기 위한 sketch 를 업로드 한다

- Processing 을 띄워, Arduino 와 연동용으로 만든 Processing sketch 를 실행한다


고맙게도 processing 과 연동해주는 소스를 jarzebski 라는 분이 만들었습니다.


* jarzebski/Arduino-HMC5883L

https://github.com/jarzebski/Arduino-HMC5883L

Arduino-HMC5883L-master.zip


위 zip 파일을 풀어서 "Arduino > libraries" 에 풀어줍니다.

그러면 아래와 같이 HMC5883L_processing 이라는 sketch 를 찾을 수 있습니다. Arduino 에 업로드 해 줍니다.


File > Examples > HMC5883L > HMC5883L_processing



이제 Processing을 실행시켜서, 아까 다운로드 받은 소스 안에 Processing 이라는 폴더를 찾아 봅니다.

그 안에 "HMC5883L_processing.pde" 파일이 아래 경로에 있습니다.


Arduino > libraries > HMC5883L > Processing > HMC5883L_processing > HMC5883L_processing.pde


Processing 에서 위의 파일을 로드해 줍니다.



그냥 실행시키면 그냥 까만 화면이 나옵니다.

소스에서 Serial.list 부분과 baud rate 를 바꿔줘야 합니다.


우선 Serial.list 는 Arduino IDE 에서 봤을 때, 위에서부터 몇번째 COM port 를 선택했냐에 따라서 바꿔 주면 됩니다.

저의 PC 는 COM6 에 연결되어 있으니, Serial.list 의 두번째가 됩니다.

Array 로 표현되어 있으니, 대괄호 안이 0 --> 1 으로 바뀌어야 하겠습니다. Serial.list()[1] 처럼요.



추가로 baud rate 를 115200 으로 맞춥니다.

이는 아래 그림처럼 arduino 에 올린 sketch 에서도 바꿔서 맞춰줘야 합니다.



요즘은 ESP8266 도 그렇고, Arduino Nano 의 세로운 Bootloader 도 그렇고, 기본 baud rate 를 115200 으로 통일되는 것 같아요.

이 Processing 과 Arduino sketch 도 baud rate 부분은 모두 115200 으로 통일해 줍니다.


여기까지 무사히 왔다면 문제 없이 Processing 에서 구동될 것입니다.



짜잔~~!!! 잘 연동되어서 digital compass 역할을 실시간으로 보여주고 있습니다.

동영상 갑니다.






FIN


좀 멀리 돌아온 감이 있지만, 마무리가 잘 되어 기분이 좋네요.

2019년 1월 1일 이른 아침부터 준비하여 글 올리는 것도 나름 뿌듯합니다.


이 HMC5883L 이라는 물건이 calibration - 영점 조정 을 하지 않으면 쓸수 있는 물건이 아니라고 합니다.

언제가 될 지 모르겠지만, 다음에는 HMC5883L 의 calibration 에 대해서 다뤄보겠습니다.


And