Adquira estes componentes na Loja do Lab de Garagem
Olá Garagistas! No tutorial de hoje mostraremos como você pode facilmente utilizar a Bússola Digital (Magnetômetro) utilizando o Arduino. Como demonstração faremos com o auxílio de LEDs, uma bússola eletrônica, fazendo o dispositivo nos indicar para qual direção está o polo norte geográfico da terra.
Material Utilizado:
1x Bússola Digital (Magnetómetro) - HMC5883L
1. Bússola Digital (Magnetômetro) - HCM5883L
Imagem 1 - Breakout HMC5883L
Este breakout faz com que seja mais fácil de usar o Honeywell HMC5883L, uma bússola digital de 3 eixos (X, Y, Z). A comunicação com o HMC5883L é simples e tudo feito através de uma interface I2C. Não há nenhum regulador on-board, podendo trabalhar com tensões de 2,16 até 3,6VDC.
Uma das leitura que é possível se fazer com o Magnetômetro, é identificar para qual direção está o polo norte magnético. Em nossa demonstração vamos utilizar 8 LEDs que nos apontará para qual direção esta o polo norte geográfico da Terra, fazendo assim uma bússola eletrônica.
2. Biblioteca HMC5883L.h
Neste tutorial utilizamos a biblioteca HMC5883L.h, ela facilita a aplicação e utilização desse Magnetômetro. É uma biblioteca bastante útil e simples de se utilizar e com ela você consegue pegar todas as informações que a Bússola Digital fornece, facilitando assim a programação. O download da versão que foi utilizada para esse tutorial, pode ser feito clicando aqui.
3. Sketch
#define led1 2 //Define led1 como 2
#define led2 3 //Define led2 como 3
#define led3 4 //Define led3 como 4
#define led4 5 //Define led4 como 5
#define led5 6 //Define led5 como 6
#define led6 7 //Define led6 como 7
#define led7 8 //Define led7 como 8
#define led8 9 //Define led8 como 9
#include <Wire.h> //Include a biblioteca Wire.h
#include <HMC5883L.h> //Include a biblioteca HMC5883L.h
HMC5883L bussola; //Instância a biblioteca para a bússola
int i; //Variável para contagem
float graus; //Variável para armazenar o valor aferido
float precisao; //Variável parar o melhorar a precisao do valor aferido
void setup()
{
pinMode(led1, OUTPUT); //Define o pino 2 como saída
pinMode(led2, OUTPUT); //Define o pino 3 como saída
pinMode(led3, OUTPUT); //Define o pino 4 como saída
pinMode(led4, OUTPUT); //Define o pino 5 como saída
pinMode(led5, OUTPUT); //Define o pino 6 como saída
pinMode(led6, OUTPUT); //Define o pino 7 como saída
pinMode(led7, OUTPUT); //Define o pino 8 como saída
pinMode(led8, OUTPUT); //Define o pino 9 como saída
Wire.begin(); //Inicia a comunicação o I2C
//Configura a bússola
bussola = HMC5883L();
bussola.SetScale(1.3);
bussola.SetMeasurementMode(Measurement_Continuous);
//===================
}
void loop()
{
precisao = 0; //Zera a variável para uma nova leitura
for(i=0;i<100;i++) //Faz a leitura 100 e armazenar a somatória
{
//Pega os dados necessários para o cálculo da bússola digital
MagnetometerScaled scaled = bussola.ReadScaledAxis();
int MilliGauss_OnThe_XAxis = scaled.XAxis;
float heading = atan2(scaled.YAxis, scaled.XAxis);
float declinationAngle = 0.3339; //Compensação dos polos (São Paulo)
heading += declinationAngle;
//===========================================================
//Converte o valor aferido para angulo
if(heading < 0)
{
heading += 2*PI;
}
if(heading > 2*PI)
{
heading -= 2*PI;
}
graus = heading * 180/M_PI;
//===================================
precisao = precisao + graus;
delay(1);
}
graus = precisao/100; //Pega a somatória e tira a média dos valores aferidos
//Se o angulo for menor que 45º
//Acende somente o led3
if (graus < 45 && graus > 0)
{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, HIGH);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
}
//==============================
//Senão se o angulo for menor que 90º
//Acende somente o led2
else if (graus < 90 && graus > 45)
{
digitalWrite(led1, LOW);
digitalWrite(led2, HIGH);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
}
//==============================
//Senão se o angulo for menor que 135º
//Acende somente o led1
else if (graus < 135 && graus > 90)
{
digitalWrite(led1, HIGH);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
}
//==============================
//Senão se o angulo for menor que 180º
//Acende somente o led8
else if (graus < 180 && graus > 135)
{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, HIGH);
}
//==============================
//Senão se o angulo for menor que 225º
//Acende somente o led7
else if (graus < 225 && graus > 180)
{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, HIGH);
digitalWrite(led8, LOW);
}
//==============================
//Senão se o angulo for menor que 270º
//Acende somente o led6
else if (graus < 270 && graus > 225)
{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, LOW);
digitalWrite(led6, HIGH);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
}
//==============================
//Senão se o angulo for menor que 315º
//Acende somente o led5
else if (graus < 315 && graus > 270)
{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, LOW);
digitalWrite(led5, HIGH);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
}
//==============================
//Senão se o angulo for menor que 360º
//Acende somente o led4
else if (graus < 360 && graus > 315)
{
digitalWrite(led1, LOW);
digitalWrite(led2, LOW);
digitalWrite(led3, LOW);
digitalWrite(led4, HIGH);
digitalWrite(led5, LOW);
digitalWrite(led6, LOW);
digitalWrite(led7, LOW);
digitalWrite(led8, LOW);
}
//==============================
}
4. Montagem
Figura 1 - Montagem da demonstração
Referências:
http://www.loveelectronics.co.uk/Tutorials/8/hmc5883l-tutorial-and-arduino-library
Comentar
Como definir o declinationAngle?
Olá. Preciso de programa parecido para acionar um servo motor no lugar dos leds. Alguém pode me ajudar?
estou recebendo a mensagem '"HMC5883L.h' does not name a type". alguém sabe como corrigir?
Olá.
Esta bussola corrige o erro de "YAW drift"?
Este erro é aquele que incrementa a rodação no eixo Z mesmo com o CI parado.
obrigado.
Marlon,
Muitissimo Obrigado, vou dar uma olhada, desculpe a demora para retornar, estou de mudança de residência e esta tudo na correria......
Abraços
Glauco
Olá, na verdade os pinos azul e verde que autor colocou, são os pinos do I2C. Procura no datascheet quais são os respectivos pinos para seu Arduino. No Arduino UNO são: A4 or SDA pin and A5 or SCL pin. A versão da imagem deve ser de um Arduino mais antigo.
Boa Noite,
Estava tentando montar essa bussola com arduino, porem ao ir fazer as ligações dos jumpers percebi que meu arduino não tem aqueles 2 pinos onde estão ligados a saída de dados do sensor HMC5883, se vc olhar no projeto após o terminal AREF, possuem mais dois terminais onde estão ligados os jumper do sensor HMC5883, estou usando um Arduino Duemilanove, onde posso ligar o HMC5883 ????
Tenho tb um arduino uno e também não possue estes 2 respectivos terminais após o AREF.
Marlon, esse valor foi obtido através do site: http://magnetic-declination.com/
Ele entrega a compensação em graus, e esse valor de 0.3339 é o valor da compensação em graus convertido em radianos.
Abraço.
uhm entendi, sera q isso tem para GPS tambem?
Não é padrão...Cada ponto da terra tem um valor...Mas achei como calcular...
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!
Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)