Bússolas digitais são dispositivos eletrônicos que utilizam sensores para determinar o campo magnético, exibindo numericamente a direção de navegação.
Esses tipos de bússolas normalmente usam um sensor magnetômetro para medir a força do campo magnético para detectar a direção. Um magnetômetro digital de três eixos de baixo custo é o HMC5883L. Ele mede o valor do campo magnético ao longo dos eixos X, Y e Z, variando de miligauss a oito gausses.
O HMC5883L compartilha os valores do campo magnético, em resolução de 16 bits, utilizando o protocolo de comunicação serial I2C. Esses valores podem então ser usados para calcular a direção e os graus do rumo.
O HMC5833L pode ser facilmente conectado ao Arduino através da porta I2C.
Para este projeto, projetaremos uma bússola digital usando o HMC5833L e o SSD1306 OLED (diodo orgânico emissor de luz). O display OLED mostra os graus de direção e uma rosa dos ventos gráfica, que muda em tempo real.
Componentes necessários
1. Arduino Uno x1
2. HMC5833L x1
3. SSD1306 OLED x1
4. Tábua de ensaio
5. Fios de conexão/fios de ligação
Conexões de circuito
Para fazer esta bússola digital, primeiro precisamos conectar o magnetômetro HCM5833L e o display OLED SSD1306 ao Arduino Uno.
A placa de breakout HCM5833L tem esta configuração de pinos…
Para as conexões do circuito, conecte os pinos VCC e GND do HMC5883L com a saída de 3,3 V e o pino GND do Arduino Uno. É importante observar que o HMC5883L não pode toleram a alimentação de 5 V do Arduino e podem ser danificados se conectados por engano à saída de 5 V. Então, use apenas a saída de 3,3 V.
Os pinos SCL e SDA do HCM5883L devem ser conectados aos pinos SCL e SDA do Arduino, respectivamente. Deixe o pino DRDY da placa de breakout desconectado.
O display OLED fornece os gráficos digitais da bússola, incluindo os graus de direção. O SSD1306 faz interface com o Arduino usando sua porta física SPI.
Para fazer isso, conecte os pinos D0/SCK e D1/MOSI do SSD1306 OLED aos pinos D13 e D11 do Arduino, respectivamente. Em seguida, conecte os pinos DC, RESET e CS do SSD1306 aos pinos D9, D10 e D8 do Arduino, respectivamente.
Esboço do Arduino
Como funciona o circuito
O HMC5883L emite a intensidade do campo magnético ao longo de três eixos sobre o protocolo I2C. O chip contém 12 registradores integrados.
- O valor do campo magnético ao longo do eixo X é armazenado nos registradores 0x03 e 0x04.
- O valor do campo magnético ao longo do eixo Z é armazenado nos registros 0x05 e 0x06.
- O valor do campo magnético ao longo do eixo Y é armazenado nos registros 0x07 e 0x08.
- O magnetômetro pode ser configurado programando seus registros para 0x00 e 0x01.
- O modo da bússola pode ser definido programando o registro 0x02.
O Arduino configura os registros 0x00 e 0x01 para definir as configurações de ganho para +/- 1,3 Ga. A taxa de amostragem é mantida no padrão 1.
Da mesma forma, a taxa de saída de dados é configurada para o padrão 15, selecionando a configuração de medição normal padrão. O registro de modo 0x03 está configurado para medição contínua.
O Arduino lê os valores dos registradores 0x03~0x08 e recupera as intensidades do campo magnético ao longo dos três eixos como números de 16 bits. Os valores dos registros obtidos estão em complemento de 2. Esses valores brutos são convertidos em valores escalonados com base na calibração da bússola. Os valores escalonados são então calculados para calcular o ângulo de azimute ou a direção da bússola.
O Arduino também tem interface com o SSD1306 OLED como display gráfico da bússola. A tela mostra uma rosa dos ventos com uma seta na direção. A direção obtida do HMC5883L é exibida na metade esquerda da tela OLED e a seta indica os mesmos graus na metade direita da tela.
O código
O esboço começa importando as bibliotecas Adafruit_GFX.h e Adafruit_SSD1306.h para trabalhar com o display OLED. As bibliotecas Wire.h e HMC5883L.h também devem ser importadas para funcionar com a bússola HMC5883L. A biblioteca HMC5883L pode ser baixada na página do Github.
Um objeto da classe HMC5883L é instanciado e uma variável definida para armazenar o erro da bússola. Um objeto da classe MagnetometerScaled é instanciado para calcular o deslocamento ao longo dos três eixos.
Em seguida, algumas variáveis são definidas para indicar as conexões de pinos do SSD1306 OLED. Um objeto da classe Adafruit_SSD1306 é instanciado, especificando o protocolo SPI para comunicação adequada com o display. Variáveis adicionais são definidas para posicionar a rosa dos ventos e a seta de direção dentro da tela do display.
A função compassCalibrate é definida para a calibração manual da bússola HMC5883L. Mesmo que a chamada para esta função seja comentada na função setup , a bússola ainda funcionará com valores padrão para os deslocamentos. Esta função é usada para calcular manualmente os valores de deslocamento com a ajuda do Monitor Serial.
Na função setup , a taxa de transmissão para comunicação serial é definida como 9600 bps. A comunicação serial é usada para calibrar a bússola com o Serial Monitor. A porta I2C é inicializada chamando o método Wire.begin .
O ganho da bússola é definido como +/-1,3 chamando o método setScale no objeto bússola. O modo de medição é definido para uma medição contínua chamando o método setMeasurementMode no objeto bússola. Os valores de deslocamento para os três eixos são calculados calibrando a bússola, o que é feito chamando a função compassCalibrate . O display OLED é inicializado e a posição da rosa dos ventos na tela é definida.
A função Draw_Compass é definida para desenhar a rosa dos ventos no display OLED. A função display_direction é definida para imprimir as direções na rosa dos ventos. A função draw_arrow é definida para exibir a seta de direção dentro da rosa dos ventos.
Na função loop , os valores brutos da força magnética ao longo dos eixos X, Y e Z são obtidos chamando o método compass.readRawAxis . Os valores escalonados são obtidos chamando o método compass.readScaledAxis .
Os valores escalonados são corrigidos pelos offsets obtidos na calibração da bússola. A tangente ao longo dos planos YX e ZX é então calculada. O grau de direção em radianos é igual à tangente do campo magnético ao longo do plano YX. O grau de direção é ajustado pelo ângulo de declinação da localização atual.
Você pode encontrar o ângulo de declinação para sua localização em magnetic-declination.com. Para minha localização, o ângulo de declinação é 1˚,2′. Quando convertido em radianos, esse valor é 0,01803.
O rumo medido é ajustado para um valor entre 0˚ e 360˚. O valor do rumo está em radianos, que é convertido em graus. O display OLED é então limpo, e os graus de rumo obtidos são passados para a variável “ângulo”. Este ângulo é exibido na metade esquerda da tela OLED como os graus de rumo. O mesmo ângulo é usado para alterar a seta de direção da posição e a rosa dos ventos e a seta de direção são exibidas na metade direita da tela OLED.
O resultado