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

1x Arduino UNO

1x Adaptador 9V Jack Barrel

1x Bateria 9V

8x LED 3mm

8x Resistor 330Ω

Alguns Jumpers

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

http://robolivre.org/conteudo/bussola-com-arduino

Exibições: 25919

Comentar

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)

Comentário de mateus matte em 8 dezembro 2014 às 15:50

Como definir o declinationAngle?

Comentário de Carlos Ribeiro em 13 novembro 2014 às 15:07

Olá. Preciso de programa parecido para acionar um servo motor no lugar dos leds. Alguém pode me ajudar?

Comentário de Julio Cesar Bianor dos Passos em 24 outubro 2014 às 23:07

estou recebendo a mensagem '"HMC5883L.h' does not name a type". alguém sabe como corrigir?

Comentário de Gustavo Suim em 15 outubro 2014 às 16:17

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.

Comentário de Glauco Poltronieri em 7 março 2014 às 10:26

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

Comentário de Marlon Tiedt em 3 março 2014 às 8:03

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.

Comentário de Glauco Poltronieri em 2 março 2014 às 21:30

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.

Comentário de Laboratório de Garagem em 28 janeiro 2014 às 8:03

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.

Comentário de Renato em 28 janeiro 2014 às 2:24

uhm entendi, sera q isso tem para GPS tambem?

Comentário de Marlon Tiedt em 27 janeiro 2014 às 21:31

Não é padrão...Cada ponto da terra tem um valor...Mas achei como calcular...

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço