Em diversos tipos de sistemas de navegação de robôs, pessoas e astronomia, necessitamos determinar a orientação do movimento. Desse modo, necessitamos da bússola a fim de determinar essas orientações. Portanto, por meio dela temos a capacidade de detectar a direção da partícula em movimento. Nesse artigo Magnetômetro Arduino HMC5883L em um Projeto Prático com Display, apresentaremos o processo de construção da bússola com Arduino e o sensor GY 273.
De acordo com o problema, utilizaremos o sensor GY 273, para coleta de dados das informações de direção e apresentaremos no LCD 16×2 com o Arduino.
A seguir, apresentaremos a estrutura de desenvolvimento do projeto.
Desenvolvimento do Magnetômetro Arduino HMC5883L
Primeiramente, o dispositivo desenvolvido é apresentado na Figura 1. Por meio dele, podemos utilizá-lo na orientação de pessoas, robôs e astronomia, por exemplo.
Portanto, esse circuito tem a finalidade de determinar a orientação por meio do sensor GY 273. Em seguida, os dados coletados serão utilizados para calcular e apresentar a direção cardeal do objeto no LCD 16×2.
Em seguida, apresentamos a lista completa dos componentes utilizados nesse projeto.
Lista de Componentes para o Projeto Magnetômetro Arduino
- 1 x Arduino Nano;
- 1 x Sensor GY 273;
- 1 x Display LCD 16 x 2;
- 1 x Resistor 1kR;
- 1 x Trimpot 1kR;
- 1 x Kit Jumpers Rígidos;
- 1 x Protoboard 830 furos.
A seguir, iniciaremos a apresentação do desenvolvimento da lógica para construção da bússola com o Arduino.
Programação da Bússola com Arduino
A princípio, utilizaremos o módulo GY-273, que possui o sensor HMC5883L. Por meio desse sensor, desenvolvemos a lógica para detectarmos a direção de todos os pontos de Norte a Sul e, em seguida, apresentamos as direções no LCD. A seguir, apresentamos a lógica completa para a criação da bússola digital com Arduino.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
#include <Wire.h> //Biblioteca de Comunicacao I2C #include <MechaQMC5883.h> //Biblioteca do Sensor QMC5883 - Modulo GY-273 #include <LiquidCrystal_I2C.h> //Biblioteca I2C do LCD 16x2 LiquidCrystal_I2C lcd(0x27,20,4); // Configurando o endereco do LCD 16x2 para 0x27 MechaQMC5883 bussola; //Criacao do objeto para o sensor int x = 0, y = 0, z = 0; int angulo = 0; void setup() { Wire.begin(); //Inicializacao da Comunicacao I2C Serial.begin(9600); //Inicializacao da comunicacao Serial bussola.init(); //Inicializando o Sensor QMC5883 lcd.init(); //Inicializacao do LCD lcd.backlight(); lcd.setCursor(0,0); lcd.print("Direcao:"); } void loop() { bussola.read(&x,&y,&z); //Obter o valor dos eixos X, Y e Z do Sensor angulo = atan2(x, y)/0.0174532925; //Calculo do angulo usando os eixos X e Y atraves da formula lcd.clear(); //Ajuste do angulo entre 0 e 360 graus if(angulo < 0) angulo+=360; angulo = 360-angulo; lcd.setCursor(0,0); lcd.print("Direcao:"); lcd.setCursor(0,1); Serial.println(angulo); //Imprime o valor do angulo na Serial do Arduino //Apresentando o sentido com base no angulo encontrado if (angulo > 338 || angulo < 22) { Serial.println("Norte"); lcd.print("Norte"); } if (angulo > 22 && angulo < 68) { Serial.println("Nordeste"); lcd.print("Nordeste"); } if (angulo > 68 && angulo < 113) { Serial.println("Leste"); lcd.print("Leste"); } if (angulo > 113 && angulo < 158) { Serial.println("Suldeste"); lcd.print("Suldeste"); } if (angulo > 158 && angulo < 203) { Serial.println("Sul"); lcd.print("Sul"); } if (angulo > 203 && angulo < 248) { Serial.println("Suldoste"); lcd.print("Suldoeste"); } if (angulo > 248 && angulo < 293) { Serial.println("Oeste"); lcd.print("Oeste"); } if (angulo > 293 && angulo < 338) { Serial.println("Noroeste"); lcd.print("Noroeste"); } delay(500); //Delay de 500 ms entre novas leituras } |
Agora, apresentaremos a discussão passo a passo do código desenvolvido.
Inicialmente, implementamos as bibliotecas e, em seguida, inicializamos o uso da comunicação com o sensor e o LCD na função setup. O código é apresentado a seguir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <Wire.h> //Biblioteca de Comunicacao I2C #include <MechaQMC5883.h> //Biblioteca do Sensor QMC5883 - Modulo GY-273 #include <LiquidCrystal_I2C.h> //Biblioteca I2C do LCD 16x2 LiquidCrystal_I2C lcd(0x27,20,4); // Configurando o endereco do LCD 16x2 para 0x27 MechaQMC5883 bussola; //Criacao do objeto para o sensor int x = 0, y = 0, z = 0; int angulo = 0; void setup() { Wire.begin(); //Inicializacao da Comunicacao I2C Serial.begin(9600); //Inicializacao da comunicacao Serial bussola.init(); //Inicializando o Sensor QMC5883 lcd.init(); //Inicializacao do LCD lcd.backlight(); lcd.setCursor(0,0); lcd.print("Direcao:"); } |
Ao final da função, apresentamos a mensagem Direção na linha 0 e coluna 0. Em seguida, o fluxo de execução entrará na função loop. Após isto, iniciará o processo de cálculo do ângulo de orientação do sensor em graus, conforme apresentado abaixo.
1 2 |
bussola.read(&x,&y,&z); //Obter o valor dos eixos X, Y e Z do Sensor angulo = atan2(x, y)/0.0174532925; //Calculo do angulo usando os eixos X e Y atraves da formula |
Logo após, o sistema ajustará o ângulo entre 0º e 360º, caso o ângulo seja negativo, conforme apresentado a seguir.
1 2 3 4 5 |
//Ajuste do angulo entre 0 e 360 graus if(angulo < 0) angulo+=360; angulo = 360-angulo; |
Finalmente, após o angulo ser ajustado entre 0º e 360º, serão executadas 8 condições. Desse modo, cada condição possui uma faixa de valores de ângulos, que representam uma direção específica. A seguir, são apresentadas as 8 condições para cada faixa de ângulo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
//Apresentando o sentido com base no angulo encontrado if (angulo > 338 || angulo < 22) { Serial.println("Norte"); lcd.print("Norte"); } if (angulo > 22 && angulo < 68) { Serial.println("Nordeste"); lcd.print("Nordeste"); } if (angulo > 68 && angulo < 113) { Serial.println("Leste"); lcd.print("Leste"); } if (angulo > 113 && angulo < 158) { Serial.println("Suldeste"); lcd.print("Suldeste"); } if (angulo > 158 && angulo < 203) { Serial.println("Sul"); lcd.print("Sul"); } if (angulo > 203 && angulo < 248) { Serial.println("Suldoste"); lcd.print("Suldoeste"); } if (angulo > 248 && angulo < 293) { Serial.println("Oeste"); lcd.print("Oeste"); } if (angulo > 293 && angulo < 338) { Serial.println("Noroeste"); lcd.print("Noroeste"); } delay(500); //Delay de 500 ms entre novas leituras |
Logo, baseado nas condições apresentadas acima, o sistema apresentará a orientação do dispositivo. Isto pode ser visto na Figura 2.
Portanto, de acordo com a alteração na posição do ângulo do sensor HMC5883, o sistema apresentará uma nova orientação na tela do LCD. A seguir, apresentaremos algumas sugestões de aplicações e projetos futuros com o sensor HMC5883.
Conclusão
De acordo com o sistema apresentado, o sensor apresentou estabilidade nas medições das orientações com Arduino. Portanto, por meio dele, é possível aplicá-lo em sistemas que necessitam de cálculo e indicação de orientação na robótica e em outros dispositivos.
Além disso, esse dispositivo sensor é bastante utilizado por observadores da área de astronomia. Dessa forma, é possível realizar cálculos e posicionar os dispositivos de observação para análise dos astros.
Por fim, agradecemos sua leitura e convidamos a deixar suas dúvidas sobre o funcionamento ou discutir novos projetos utilizando esse sensor.
Arquivos de Projeto
A seguir, disponibilizamos a lista de arquivos para download e execução do seu projeto.
Biblioteca de comunicação I2C com o LCD
Bom dia
Gostaria saber para que servem as duas resistencias de 1K?
Obrigado.
Olá Riguel! Pelo que pude observar no projeto, o resistor seria utilizado caso utilizasse um display sem adaptador I2C, mas no esquema apresentado, a principio não é necessário o uso deste componente.