Manual

do

Maker

.

com

magnetômetro HMC5883L com Arduino (bússola)

magnetômetro HMC5883L com Arduino (bússola)

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.

Onde comprar a bússola digital (ou, magnetômetro HMC5883L)

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.

Baixar a biblioteca para o magnetômetro HMC5883L

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.

Download, instalação e exemplo

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.

Como pegar sua inclinação magnética

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":

declination.webp

Daí basta você fazer isso no código:

HMC5883L_Simple Compass;
Compass.SetDeclination(-21, 16, 'W');  
float heading = Compass.GetHeadingDegrees();

Wiring

É 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.

Arduino UNO e Arduino Leonardo

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.

gy-273-wiring.webp

Depois desses testes, resolvi fazer também no Arduino Mega. O wiring fica assim:

mega-bussola.webp

Código de exemplo

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);
}

Alternativa

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);
}

Teste

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.

Projeto

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.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.