Cómo diseñar una brújula digital usando Arduino y un magnetómetro HMC5883L

Las brújulas digitales son dispositivos electrónicos que utilizan sensores para determinar el campo magnético, mostrando numéricamente la dirección de navegación.

Estos tipos de brújulas suelen utilizar un sensor magnetómetro para medir la fuerza del campo magnético y detectar la dirección. Un magnetómetro digital de tres ejes de bajo costo es el HMC5883L. Mide el valor del campo magnético a lo largo de los ejes X, Y y Z, desde miligauss hasta ocho gausses.

El HMC5883L comparte valores de campo magnético, en resolución de 16 bits, utilizando el protocolo de comunicación serie I2C. Estos valores se pueden utilizar luego para calcular la dirección y los grados del rumbo.

El HMC5833L se puede conectar fácilmente a Arduino a través del puerto I2C.

Para este proyecto, diseñaremos una brújula digital utilizando HMC5833L y SSD1306 OLED (diodo emisor de luz orgánico). La pantalla OLED muestra los grados de rumbo y una rosa de los vientos gráfica, que cambia en tiempo real.

Componentes necesarios

1.Arduino Uno x1
2. HMC5833L x1
3. SSD1306 OLEDx1
4. Tablero de prueba
5. Cables de conexión/cables de unión

Conexiones de circuito
Para hacer esta brújula digital, primero debemos conectar el magnetómetro HCM5833L y la pantalla OLED SSD1306 al Arduino Uno.

La placa de conexiones HCM5833L tiene esta configuración de pines...

Para las conexiones del circuito, conecte los pines VCC y GND del HMC5883L con la salida de 3,3 V y el pin GND del Arduino Uno. Es importante tener en cuenta que el HMC5883L no puede tolerar una alimentación de 5 V del Arduino y puede dañarse si se conecta por error a la salida de 5 V. Por lo tanto, utilice únicamente la salida de 3,3 V.

Los pines SCL y SDA del HCM5883L deben estar conectados a los pines SCL y SDA del Arduino, respectivamente. Deje desconectado el pin DRDY en la placa de conexiones.

La pantalla OLED proporciona gráficos de brújula digital, incluidos grados de rumbo. El SSD1306 interactúa con Arduino utilizando su puerto físico SPI.

Para hacer esto, conecte los pines D0/SCK y D1/MOSI del SSD1306 OLED a los pines D13 y D11 del Arduino, respectivamente. Luego conecte los pines DC, RESET y CS del SSD1306 a los pines D9, D10 y D8 del Arduino respectivamente.

Bosquejo de Arduino

Cómo funciona el circuito
El HMC5883L genera una intensidad de campo magnético a lo largo de tres ejes a través del protocolo I2C. El chip contiene 12 registros integrados.

  • El valor del campo magnético a lo largo del eje X se almacena en los registros 0x03 y 0x04.
  • El valor del campo magnético a lo largo del eje Z se almacena en los registros 0x05 y 0x06.
  • El valor del campo magnético a lo largo del eje Y se almacena en los registros 0x07 y 0x08.
  • El magnetómetro se puede configurar programando sus registros en 0x00 y 0x01.
  • El modo de brújula se puede configurar programando el registro 0x02.

El Arduino establece los registros 0x00 y 0x01 para establecer la configuración de ganancia en +/- 1,3 Ga. La frecuencia de muestreo se mantiene en 1 por defecto.

De manera similar, la velocidad de salida de datos se establece en 15 por defecto, seleccionando la configuración de medición normal predeterminada. El registro de modo 0x03 está configurado para medición continua.

Arduino lee los valores de los registros 0x03~0x08 y recupera la intensidad del campo magnético a lo largo de los tres ejes como números de 16 bits. Los valores logarítmicos obtenidos están en complemento a 2. Estos valores brutos se convierten en valores escalados según la calibración de la brújula. Luego, los valores escalados se promedian para calcular el ángulo de acimut o la dirección de la brújula.

El Arduino también interactúa con el SSD1306 OLED como una pantalla de brújula gráfica. La pantalla muestra una rosa de los vientos con una flecha en la dirección. La dirección obtenida del HMC5883L se muestra en la mitad izquierda de la pantalla OLED y la flecha indica los mismos grados en la mitad derecha de la pantalla.

Código
El boceto comienza importando las bibliotecas Adafruit_GFX.h y Adafruit_SSD1306.h para trabajar con la pantalla OLED. Las bibliotecas Wire.h y HMC5883L.h también deben importarse para funcionar con la brújula HMC5883L. La biblioteca HMC5883L se puede descargar desde la página de Github.

Se crea una instancia de un objeto de clase HMC5883L y se define una variable para almacenar el error de la brújula. Se crea una instancia de un objeto de la clase MagnetometerScaled para calcular el desplazamiento a lo largo de los tres ejes.

Luego se configuran algunas variables para indicar las conexiones de pines del SSD1306 OLED. Se crea una instancia de un objeto de clase Adafruit_SSD1306, especificando el protocolo SPI para una comunicación adecuada con la pantalla. Se definen variables adicionales para colocar la rosa de los vientos y la flecha de dirección dentro de la pantalla.

La función CompassCalibrate está definida para la calibración manual de la brújula HMC5883L. Aunque la llamada a esta función esté comentada en la función de configuración, la brújula seguirá funcionando con los valores predeterminados para las compensaciones. Esta función se utiliza para calcular manualmente los valores de desplazamiento con la ayuda de Serial Monitor.

En la función de configuración, la velocidad en baudios para la comunicación serie se establece en 9600 bps. La comunicación serie se utiliza para calibrar la brújula con el monitor serie. El puerto I2C se inicializa llamando al método Wire.begin.

La ganancia de la brújula se establece en +/-1,3 llamando al método setScale en el objeto de la brújula. El modo de medición se establece en una medición continua llamando al método setMeasurementMode en el objeto de la brújula. Los valores de compensación para los tres ejes se calculan calibrando la brújula, lo que se realiza llamando a la función compassCalibrate. La pantalla OLED se inicializa y se establece la posición de la rosa de los vientos en la pantalla.

La función Draw_Compass está definida para dibujar la rosa de los vientos en la pantalla OLED. La función display_direction está definida para imprimir direcciones en la rosa de los vientos. La función draw_arrow está definida para mostrar la flecha de dirección dentro de la rosa de los vientos.

En la función de bucle, los valores brutos de la fuerza magnética a lo largo de los ejes X, Y y Z se obtienen llamando al método compass.readRawAxis. Los valores escalados se obtienen llamando al método compass.readScaledAxis.

Los valores escalados se corrigen mediante las compensaciones obtenidas durante la calibración de la brújula. Luego se calcula la tangente a lo largo de los planos YX y ZX. El grado de dirección en radianes es igual a la tangente del campo magnético a lo largo del plano YX. El grado de dirección se ajusta mediante el ángulo de declinación de la ubicación actual.

Puede encontrar el ángulo de declinación para su ubicación en magnetic-declination.com . Para mi ubicación, el ángulo de declinación es 1˚,2′. Cuando se convierte a radianes, este valor es 0,01803.

El rumbo medido se establece en un valor entre 0˚ y 360˚. El valor del rumbo está en radianes, que se convierte a grados. Luego se borra la pantalla OLED y los grados de rumbo obtenidos se pasan a la variable "ángulo". Este ángulo se muestra en la mitad izquierda de la pantalla OLED como grados de rumbo. Se utiliza el mismo ángulo para cambiar la posición de la flecha de dirección, y la rosa de los vientos y la flecha de dirección se muestran en la mitad derecha de la pantalla OLED.

El resultado

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.