Manual
do
Maker
.
com
A bussola HMC5883L nada mais é do que um magnetômetro. Esse módulo se chama GY-273, contendo o magnetômetro HMC5883L no circuito para cumprir o papel de bússola. Existem algumas bibliotecas para Arduino (claro que haveria de ter) e dentre elas escolhi a desse link. É obviamente bastante simples de utilizar, bastando 3 linhas de código. Nesse artigo vamos ver como utilizá-la e fazer uma pequena brincadeira.
Esse magnetômetro HMC5883L de três eixos está a um preço bastante acessível no Eletrogate (clique para visitar o site). Gostei desse módulo principalmente pelo fato de ser I2C, o que facilita um bocado o wiring e sua manipulação. Outra vantagem desse módulo é que os sensores magnéticos da Honeywell estão entre os mais confiáveis da indústria, podendo ser tranquilamente utilizado em projetos profissionais.
Existe uma modificação que simplifica a utilização dessa bússola, por isso escolhi essa biblioteca para esse módulo. O link do github é esse, e o processo para a instalação também é o mais simples possível.
Você pode (ou talvez até deva) baixar a biblioteca através desse link. Vá ao menu Sketch->Import Library->Add Library e opte por fazer a instalação a partir do arquivo recém baixado. Depois de adicionado, você poderá abrir um exemplo a partir do menu File -> Examples -> HMC5883L_Simple -> Compass.
Para pegar seu posicionamento, utilize esse link. No meu caso (São Paulo - SP), o resultado para minha inclinação magnética é "-21,16,W":
Daí basta você fazer isso no código:
HMC5883L_Simple Compass;
Compass.SetDeclination(-21, 16, 'W');
float heading = Compass.GetHeadingDegrees();
É extremamente simples. O módulo opera em 3V3, portanto você pode utilizá-lo em qualquer MCU/CPU com níveis lógicos entre 3V3 e 5V. Ainda que alimentando-o com 5V, seu nível lógico será 3V3. Conecte também o ground, SCL ao SCL e SDA ao SDA.
O posicionamento padrão do módulo é deixado na horizontal e deve dar um valor de 0 graus quando a seta indicando o eixo X estiver apontando para o Norte. Agora já podemos brincar com a bússola.
No Arduino UNO você deve utilizar o pino A4 para SDA e A5 para SCL. Como não tenho mais Arduino UNO aqui, vou utilizar o Arduino Leonardo, mas só diferirá nos pinos do I2C, que no Leonardo são os pinos D2 para SDA e D3 para SCL. alimente o módulo ligando-o ao 5V e GND.
Outra opção no Arduino Leonardo é colocá-lo aos pinos SDA e SCL impressos no canto de uma das barras de GPIO.
Depois desses testes, resolvi fazer também no Arduino Mega. O wiring fica assim:
Vamos utilizar o sketch de exemplo. Tirei os comentários pra dar uma visão clara do quão simples é o código:
#include <Arduino.h>
#include <Wire.h>
#include <HMC5883L_Simple.h>
HMC5883L_Simple Compass;
void setup()
{
Serial.begin(9600);
Wire.begin();
Compass.SetDeclination(-21, 16, 'W');
Compass.SetSamplingMode(COMPASS_SINGLE);
Compass.SetScale(COMPASS_SCALE_130);
Compass.SetOrientation(COMPASS_HORIZONTAL_X_NORTH);
}
void loop()
{
float heading = Compass.GetHeadingDegrees();
Serial.print("Heading: ");
Serial.println( heading );
delay(1000);
}
Se por alguma razão você não queira utilizar a biblioteca acima ou se por acaso não funcionar com você, ainda tem uma alternativa, instalando uma biblioteca da Adafruit diretamente pelo Library Manager. Para tal, siga o menu sketch -> Include Library -> Manage Libraries e procure por HMC5883. Aparecerá uma biblioteca da Adafruit, então clique em Install. Depois abra o exemplo através do menu File -> Examples -> Adafruit HMC5883 Unified. o processo é bastante parecido com a da biblioteca anterior, mas você terá um pouco mais de trabalho, leia o código do exemplo para entender.
Se por acaso não compilar, entre no diretório Arduino/libraries e clone o repositório como a seguir:
cd ~/Arduino/libraries && git clone https://github.com/adafruit/Adafruit_Sensor.git
Uma terceira possibilidade é ler diretamente do dispositivo. Para tal, use esse código:
#include <Wire.h> //I2C Arduino Library
#define addr 0x1E //I2C Address for The HMC5883
void setup(){
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(addr); //start talking
Wire.write(0x02); // Set the Register
Wire.write(0x00); // Tell the HMC5883 to Continuously Measure
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(0x03); //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()<<8; //MSB x
x |= Wire.read(); //LSB x
z = Wire.read()<<8; //MSB z
z |= Wire.read(); //LSB z
y = Wire.read()<<8; //MSB y
y |= Wire.read(); //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);
}
Eu utilizei a primeira opção por ser a mais simples e assim pude escrever rapidamente o artigo. Seja lá qual foi sua opção, suba o sketch em seu Arduino e abra o monitor serial, depois movimente o sensor para perceber a diferença.
Para um próximo artigo relacionado, pretendo fazer uma Rosa dos Ventos com LEDs, vai ficar legal, sugiro que já adquira o seu, considerando o baixo valor e a grande diversão.
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.