Skip to Content

HSCDTD008A Magnetómetro con Arduino

HSCDTD008A Magnetómetro con Arduino

En este tutorial aprenderás a usar el magnetómetro de 3 ejes HSCDTD008A con un Arduino. El HSCDTD008A es esencialmente una brújula electrónica o digital que te permite medir la intensidad del campo magnético terrestre (y otras fuentes magnéticas) a lo largo de tres ejes.

Los magnetómetros pueden usarse en muchas aplicaciones diferentes. Ayudan a los sistemas de navegación a encontrar dirección y orientación. En robótica, mejoran la conciencia espacial y mantienen a los robots en ruta. Los smartphones los usan para funciones de brújula y realidad aumentada. Los drones los emplean para estabilización y navegación. Dispositivos wearables como pulseras de actividad y relojes inteligentes también usan magnetómetros para seguimiento de actividades y navegación.

Piezas necesarias

Necesitarás un sensor magnético HSCDTD008A y un microcontrolador para este proyecto. Yo usé un Arduino Uno, pero cualquier otro Arduino o placa ESP32/ESP8266 también funcionará.

Magnetómetro de 3 ejes HSCDTD008A

Arduino

Arduino Uno

USB Data Sync cable Arduino

Cable USB para Arduino UNO

Dupont wire set

Juego de cables Dupont

Half_breadboard56a

Protoboard

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Características del HSCDTD008A

El HSCDTD008A es un sensor diminuto (1.6×1.6×0.65mm) que puede medir la intensidad de campos magnéticos a lo largo de tres ejes con una precisión de 0.15μT / LSB (T= Tesla). La imagen a continuación muestra el IC real, un pequeño bloque cuadrado.

HSCDTD008A IC
IC HSCDTD008A

Los tres ejes del sensor están orientados como se muestra abajo y el valor de salida de cada eje es positivo cuando apunta hacia el norte magnético.

Ejes del HSCDTD008A (source)

Dependiendo de la orientación del IC respecto a un campo magnético (por ejemplo, el campo magnético terrestre), el valor de salida de cada eje cambiará. Esto te permite, por ejemplo, navegar ya que puedes determinar la orientación del sensor en el espacio.

Diagrama de bloques interno del HSCDTD008A

La siguiente imagen muestra el diagrama de bloques interno del HSCDTD008A. Puedes identificar fácilmente el sensor magnético de 3 ejes, el multiplexor (MUX) usado para leer los 3 ejes, el convertidor analógico-digital (AD) para el sensor de temperatura y la interfaz I2C.

Internal Block Diagram of HSCDTD008A
Diagrama de bloques interno del HSCDTD008A

El sensor de temperatura es necesario porque la tensión de salida de un sensor magnético puede cambiar significativamente con la temperatura, por lo que el HSCDTD008A incluye un sensor de temperatura integrado para compensar cambios en la temperatura ambiente.

Los pines IO del HSCDTD008A son los siguientes: AVDD es la tensión de alimentación analógica, DVDD es la tensión de alimentación digital, VSS es tierra, SDA y SCL son las líneas de la interfaz I2C, DRDY es un pin de interrupción que indica que los datos están listos, y TEST1 y TEST2 son puntos de prueba internos durante la producción del chip.

Para más detalles consulta la hoja de datos del HSCDTD008A que está enlazada abajo:

Placa breakout para el HSCDTD008A

El HSCDTD008A es demasiado pequeño para conectarlo directamente a un Arduino y además no funciona con 5V. Por eso, normalmente necesitas una placa breakout como la que se muestra abajo. El pequeño chip cuadrado en el centro es el HSCDTD008A. La placa también tiene un regulador de voltaje, para que puedas conectar la placa a microcontroladores de 5V o 3.3V.

Breakout board for HSCDTD008A
Placa breakout para HSCDTD008A

Aparte de la alimentación, los pines son esencialmente los mismos que se discutieron para el diagrama de bloques interno. VCC es la tensión de alimentación, GND es tierra, SDA y SCL son las líneas de la interfaz I2C, DRY es el pin de datos listos, y T0 y T1 son puntos de prueba que no necesitarás.

El consumo de corriente del módulo es típicamente 60μA cuando está activo y solo 3μA en modo de espera. Como se mencionó antes, la tensión de alimentación es de +3.3V a +5V y el nivel de comunicación es 3.3V.

Conectando el HSCDTD008A al Arduino

Gracias a la interfaz I2C del HSCDTD008A, conectarlo a un Arduino es sencillo. Primero, conecta los pines SCL y SDA de la placa breakout del HSCDTD008A a los pines correspondientes del Arduino como se muestra abajo. Luego, conecta tierra a GND y 3.3V (o 5V) a VCC del HSCDTD008A y listo.

Connecting HSCDTD008A to Arduino
Conectando el HSCDTD008A al Arduino

Ahora, vamos a escribir algo de código para probar el funcionamiento del sensor HSCDTD008A.

Código para medir campo magnético con HSCDTD008A

Antes de poder medir campos magnéticos con el sensor HSCDTD008A, tendrás que instalar una librería. A continuación usaremos la HSCDTD008A Library de Bob Veringa. Para instalarla, solo busca HSCDTD008A en el Library Manager, encuentra la de Bob Veringa y pulsa «INSTALL». La imagen abajo muestra cómo se ve:


Installing HSCDTD008A Library by Bob Veringa via Library Manager
Instalando la librería HSCDTD008A de Bob Veringa vía Library Manager

Con la librería instalada, probemos el sensor. El siguiente código lee la intensidad del campo magnético a lo largo de los tres ejes (X, Y y Z) y los imprime en el monitor serial cada medio segundo.

#include "hscdtd008a.h"

HSCDTD008A geomag;

void setup() {
  Serial.begin(9600);
  geomag.begin();
  hscdtd_status_t status = geomag.initialize();
  if (status != HSCDTD_STAT_OK) {
    Serial.println("Can't initialize sensor!");
  }
  geomag.temperatureCompensation();
}

void loop() {
  hscdtd_status_t status = geomag.startMeasurement();
  if (status == HSCDTD_STAT_OK) {
    Serial.print("X:");
    Serial.println(geomag.mag.mag_x);  
    Serial.print("Y:");
    Serial.println(geomag.mag.mag_y);
    Serial.print("Z:");
    Serial.println(geomag.mag.mag_z);
  } 
  delay(500);
}

Vamos a desglosar el código en sus componentes para entenderlo mejor.

Inclusión de la librería

La primera línea incluye la librería necesaria para el magnetómetro HSCDTD008A. Esta librería contiene las funciones y definiciones necesarias para comunicarse con el sensor.

#include "hscdtd008a.h"

Creación de una instancia

Aquí, creamos una instancia de la clase HSCDTD008A llamada geomag. Esta instancia nos permitirá acceder a las funciones definidas en la librería para interactuar con el magnetómetro.

HSCDTD008A geomag;

Función setup

En la función setup(), inicializamos la comunicación serial a una velocidad de 9600 baudios. Esto nos permite enviar datos al Monitor Serial para depuración y monitoreo.

Serial.begin(9600);

Luego, llamamos al método begin() en la instancia geomag para inicializar el magnetómetro. Después verificamos el estado de la inicialización usando el método initialize(). Si el estado no es HSCDTD_STAT_OK, imprimimos un mensaje de error en el Monitor Serial.

geomag.begin();
hscdtd_status_t status = geomag.initialize();
if (status != HSCDTD_STAT_OK) {
  Serial.println("Can't initialize sensor!");
}

Finalmente, llamamos al método temperatureCompensation() para asegurar que las lecturas del sensor se ajusten según la temperatura ambiente, que puede afectar las mediciones magnéticas.

geomag.temperatureCompensation();

Función loop

En la función loop(), iniciamos una medición llamando al método startMeasurement(). Nuevamente verificamos el estado de esta operación. Si el estado es HSCDTD_STAT_OK, procedemos a leer los valores del campo magnético.

hscdtd_status_t status = geomag.startMeasurement();
if (status == HSCDTD_STAT_OK) {

Luego imprimimos los valores del campo magnético para los ejes X, Y y Z en el Monitor Serial. Los valores se acceden a través de la propiedad mag de la instancia geomag y están en micro Tesla (µT):

Serial.print("X:");
Serial.println(geomag.mag.mag_x);  
Serial.print("Y:");
Serial.println(geomag.mag.mag_y);
Serial.print("Z:");
Serial.println(geomag.mag.mag_z);

Finalmente, introducimos un retardo de 500 milisegundos antes de que comience el siguiente ciclo de medición, permitiendo una salida legible en el Monitor Serial.

 delay(500);

Ejecutando el código

Si subes y ejecutas el código, deberías empezar a ver mediciones del campo magnético, similares a las que aparecen abajo, en el Monitor Serial:

Output of HSCDTD008A on Serial Monitor
Salida del HSCDTD008A en el Monitor Serial

Si ahora inclinas y giras el sensor, puedes monitorear los valores cambiantes de las mediciones del campo magnético para los tres ejes en el Serial Plotter:

Output of HSCDTD008A on Serial Plotter
Salida del HSCDTD008A en el Serial Plotter

¡Y eso es todo! Este tutorial debería darte un buen punto de partida para tus propias aplicaciones.

Conclusiones

En este tutorial aprendiste a usar el magnetómetro de 3 ejes HSCDTD008A con un Arduino. Las aplicaciones comunes para un magnetómetro son como brújula digital y para mejorar la precisión en la navegación de robots o drones.

Ten en cuenta que, aunque los magnetómetros son similares a los sensores de efecto Hall, generalmente no son adecuados para las mismas aplicaciones, como medir corriente o mediciones de velocidad sin contacto de objetos giratorios. Consulta nuestro tutorial Read Fan Speed Signal with Arduino y ACS712 Current Sensor And Arduino si quieres aprender más sobre eso.

¡Feliz bricolaje ; )