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

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 Renato em 27 janeiro 2014 às 14:57

isso ja vem de tabela,deve ter na internet. Deve ser padrao

Comentário de Marlon Tiedt em 26 janeiro 2014 às 22:02

Como você chegou a este valor:
float declinationAngle = 0.3339; //Compensação dos polos (São Paulo)

?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço