Como descobrir o endereço do Módulo Bússola Digital / Magnetômetro Três Eixos – GY-273

Neste tutorial descobriremos como achar o endereço de do módulo bússola digital com arduino, mais especificamente do módulo Bússola Digital / Magnetômetro Três Eixos – GY-273.

kit robotica educacional com Arduino ESP ou Microbit

O  que é o módulo Bússola Digital / Magnetômetro Três Eixos – GY-273?

O Módulo Bússola Eletrônica 3 Eixos Campo Magnético HMC5883L é um dispositivo de Bússola e Magnetômetro equipado com o chip HMC5883L.

– Funcionamento

Precipuamente o Magnetômetro consegue detectar onde fica o norte geográfico magnético da Terra através de um sensor magnético de 3 eixos, fornecendo na saída informações sobre os eixos X, Y e Z. Não obstante, utiliza o protocolo de comunicação I2C. Ademais, para mais informações sobre o chip HMC5883L e o sensor acesse o (datasheet) e visualize a sua composição.

– Circuito integrado

O chip HMC5883L é um circuito integrado é por isso é responsável por realizar tarefa complexas que não poderiam ser executadas por apenas um componente.

Circuitos Integrados

– Campo magnético

O sensor Magnetômetro utiliza do campo magnético da terra para o seu funcionamento com o fim de identificar a sua posição em relação aos eixos X, Y e Z e em relação ao norte da terra onde a bússola como já sabemos sempre aponta. Além disso, o campo magnético faz com que à terra funcione como um ímã gigante já que possui um norte e um sul e as linhas do campo vão de um para o outro. Aliás, o Polo norte é na verdade o sul magnético e o polo sul o norte magnético.

– Os terminais deste sensor são:

  • VCC(+) – Tensão de entrada, entre 3,3 a 5 volts
  • GND(-) – O pino de O V do módulo, conectado ao GND do Arduino ou fonte
  • Pino SCL – I2C Serial Clock
  • Pino SDA – I2C Serial Data

Módulo Bússola Digital / Magnetômetro

Mãos à obra — Configurando uma Bússola Digital

Componentes Necessários

– Montando o projeto:

Primeiramente conecte o VCC do módulo no 3.3V do arduino e logo após conecte o GND do módulo no GND do arduino. Depois disso conecte o SCL do módulo no pino A5 e o SDA no pino A4 do arduino desta forma temos como mostra o diagrama abaixo:

Diagrama de montagem do Módulo Bússola Digital / Magnetômetro

– Biblioteca  <wire.h>:

A biblioteca que utilizaremos será a Wire.h. Após o download do arquivo zip, abra a IDE e adicione a biblioteca em forma zip ao seu programa. Não obstante, caso não entenda nada de biblioteca ou como prosseguir, veja o tutorial  COMO INSTALAR UMA BIBLIOTECA NO ARDUINO IDE” no portal vida de silício.

– Programando o Arduino:

Antes de mais nada vamos conectar o arduino no computador e abrir a IDE arduino.  Escreva o programa abaixo na IDE e compile o programa para o seu arduino.

Antes de carregar o programa, você precisa selecionar qual porta você deseja usar para fazer o carregamento do seu programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.

#include <Wire.h>
 
void setup()
{
  Wire.begin();//Inicie a biblioteca Wire
  Serial.begin(9600);//Inicie a Comunicação Serial
  while (!Serial);             //Espera pelo serial monitor
  Serial.println("\nI2C Scanner");
}
 
void loop()
{
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

Se as conexões estiverem corretas, ao abrir o serial monitor você terá a seguinte tela, mostrando o endereço do dispositivo detectado.

Imagem do serial monitor

O I2C Scanner é um programa que serve não apenas para este módulo, mas também para qualquer outro dispositivo I2C conectado ao barramento. Tenha este programa sempre à mão para descobrir o endereço do dispositivo ou simplesmente para verificar se ele está se comunicando com o Arduino, podemos ver isto no tutorial do Sensor de Movimento de cabeça, onde é utilizamos o mesmo programa.

Imagem do circuito da Bússola Digital

Entendendo a fundo:

Software

– Definições e variáveis utilizadas no projeto do módulo bússola digital com arduino

A instrução #include<> serve para incluir bibliotecas no algoritmo.

#include <Wire.h>

– Função Setup – Definindo pinos do módulo bússola digital com arduino

A função setup é aquela que ira rodar apenas uma vez quando nosso programa for iniciado. Ela é do tipo void, ou seja, não tem retorno e também não tem parâmetros de entrada. A função “Wire.begin()” Inicializa a biblioteca Wire. Semelhantemente a função Serial.begin inicia a comunicação serial e define uma velocidade para ela. A função “while (!Serial)” Espera pelo serial monitor e a função “Serial.println” imprime no serial monitor o texto “I2C Scanner”.

void setup() { 
 Wire.begin();//Inicie a biblioteca Wire
 Serial.begin(9600);//Inicie a Comunicação Serial
 while (!Serial); //Espera pelo serial monitor
 Serial.println("\nI2C Scanner");
 }

– Função Loop – Leitura do nossa módulo bússola digital com arduino e Estruturas de decisão

Em primeira instância a função loop ao contrário da setup roda tudo que estiver dentro dela varias vezes em um loop constante até que seja reiniciado ou parado o programa. Temos primeiro a declaração das variáveis do tipo byte “error” e “address” e a variável do tipo int “nDevices”. Logo depois imprime no serial monitor o texto “Scanning…” e atribui a variável nDevices o valor 0.

void loop() { 
 byte error, address;
 int nDevices;
 Serial.println("Scanning...");
 nDevices = 0;

Posteriormente temos a estrutura de repetição for onde atribui a variável “address” o valor 1, depois coloca a condição”address < 127″ de que enquanto a variável “address” for menor que 127 tudo que estiver entre os colchetes será executado e a seguir a cada ciclo irá ser adicionado +1 a variável “address” no comando “address++”. Lodo depois, dentro do for temos de incio por assim dizer o comando” Wire.beginTransmission(address)” que inicia a comunicação com START e referência o dispositivo escravo address. Já o comando “error = Wire.endTransmission()” atribua a variável error um valor recebido pela função.

for(address = 1; address < 127; address++ ) {
 Wire.beginTransmission(address);
 error = Wire.endTransmission();

– IF’s e Else’s do nossa módulo bússola digital com arduino

Similarmente dentro do for temos a estrutura de decisão if que será executada caso a condição de a variável error for igual a 0 ser verdadeira. Assim sendo, temos a função Serial.print que executará dentro do if e imprimirá o texto “I2C device found at address 0x” no serial monitor. Logo após temos outra estrutura de decisão dentro da anterior, onde caso a condição da variável address ser menor que 16 for verdadeira será executada e em seguida imprimira no serial monitor o texto “0”, depois o endereço hexadecimal da bússola e depois o texto ” !” e adicionará a variável nDevice +1.

if (error == 0) {
 Serial.print("I2C device found at address 0x");
 if (address<16) Serial.print("0");
 Serial.print(address,HEX);
 Serial.println(" !");
 nDevices++;
 }

Se a variável error for igual a 4 a estrutura else if será executada e não a if anterior, assim sendo a variável nDevices não receberá +1 e será escrito no monitor serial o texto “Unknow error at address 0x”. Em contrapartida, semelhantemente ao if anterior caso a variável address for menor que 16  será impresso no serial monitor o texto “0” e logo depois o endereço hexadecimal do módulo.

else if (error==4) {
 Serial.print("Unknow error at address 0x");
 if (address<16){
  Serial.print("0");
  Serial.println(address,HEX);
   }
 }

Na estrutura if abaixo se a variável nDevices for igual a 0 será impresso no monitor serial o texto “No I2C devices found”. Entretando, caso o nDevices não for igual a 0 o else será executado, então será impresso no serial monitor o texto “done” e esperará 5000 milissegundos para executar a próxima linha.

 
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);           // wait 5 seconds for next scan
}

Considerações finais:

Neste tutorial mostramos como funciona e como ver o endereço do Módulo Bússola Eletrônica 3 Eixos Campo Magnético HMC5883L. Esperamos que você continue nos acompanhando e sinta-se à vontade para nos dar sugestões, críticas ou elogios. Lembre-se de deixar suas dúvidas nos comentários abaixo.