En este tutorial aprenderás a usar el magnetómetro de 3 ejes AK8975 con un Arduino. El AK8975 es esencialmente una brújula electrónica que te permite medir la intensidad del campo magnético terrestre (y otras fuentes magnéticas) a lo largo de tres ejes.
El AK8975 utiliza sensores Hall de alta sensibilidad y está diseñado para navegación peatonal en ciudad en teléfonos móviles y otras aplicaciones portátiles.
Partes necesarias
Obviamente, necesitarás un sensor AK8975. Normalmente no se compra el sensor en crudo, sino una placa breakout que incluye algunos componentes adicionales que facilitan la conexión del sensor.
Además, necesitarás un microcontrolador. Usé un Arduino Uno para este proyecto, pero cualquier otro Arduino o cualquier ESP32/ESP8266 servirá.

Magnetómetro AK8975 de 3 ejes

Arduino Uno

Cable USB para Arduino UNO

Juego de cables Dupont

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 AK8975
El AK8975 es un magnetómetro de 3 ejes adecuado para aplicaciones de brújula. Tiene una sensibilidad típica de 0.3 µT / LSB con una resolución de 13 bits y cuenta con una fuente magnética incorporada para auto-pruebas. El sensor ofrece interfaces de comunicación I2C y SPI de 4 hilos. Funciona con 3-5V y tiene un consumo típico de corriente de 350 µA. La siguiente imagen muestra el diagrama de bloques interno del AK8975:

Puedes identificar fácilmente el sensor Hall de 3 ejes para detectar campos magnéticos, el multiplexor (MUX) para cambiar entre los 3 ejes, la fuente magnética incorporada para auto-pruebas, el convertidor analógico-digital (ADC) y la interfaz de comunicación.
Los pines del AK8975 son los siguientes: VSS es tierra, VDD es la alimentación analógica y VID es la alimentación para la interfaz digital.
CAD0 y CAD1 permiten seleccionar la dirección I2C del AK8975 (0x0C–0x0F). CSB habilita la interfaz I2C o SPI. Para habilitar la interfaz I2C conecta este pin a VID. SO es un pin de salida serial si la interfaz SPI está habilitada.
SCL/SK y SDA/SI son los pines de comunicación de datos para I2C o SPI, respectivamente. DRDY es el pin de datos listos. Alto indica que una medición de datos está completa.
Finalmente, TST1, TST2 y TST6 son puntos de prueba para fabricación y RSF es un pin reservado. Para más información consulta la hoja de datos del AK8975 enlazada abajo:
Placa breakout para AK8975
Normalmente no se compra el chip AK8975 solo, sino una placa breakout que facilita mucho la conexión del chip a un Arduino y que también incluye los componentes electrónicos adicionales necesarios. La imagen siguiente muestra una placa breakout típica para el AK8975:

La asignación de pines sigue esencialmente los pines descritos en el diagrama de bloques del AK8975. VCC es la alimentación positiva y GND es tierra. SCL y SDA son los pines de comunicación de datos para la interfaz I2C. SO es salida serial, siempre que uses la interfaz SPI. CSB habilita la interfaz I2C o SPI. DRDY es el pin de datos listos. Y finalmente CAD0 y CAD1 se usan para seleccionar la dirección I2C del AK8975. La siguiente tabla muestra qué configuraciones de CAD0 y CAD1 corresponden a qué direcciones I2C:

Ten en cuenta que existen varias placas breakout para el AK8975 donde el pin CAD1 está etiquetado incorrectamente como CADY. Mira el ejemplo a continuación:

Pero no te preocupes, normalmente funcionan bien y solo es una etiqueta incorrecta en la serigrafía.
Conectando el AK8975 al Arduino
En esta sección te muestro cómo conectar el AK8975 a un Arduino. Primero, conecta los pines SCL y SDA de la placa breakout del AK8975 a los pines correspondientes del Arduino como se muestra abajo. Luego, conecta tierra a GND y 3.3V (o 5V) a VCC del AK8975.
Para habilitar la interfaz I2C, ahora necesitamos conectar CSB a 3.3V. Y finalmente, seleccionamos la dirección I2C 0x0C conectando CAD1 y CAD0 a tierra.

Si tienes otros dispositivos conectados al bus I2C (por ejemplo, una pantalla) y tienen direcciones I2C en conflicto, puedes cambiar fácilmente la dirección I2C del AK8975 cableando CAD1 y CAD0 de forma diferente. Para referencia, consulta la tabla mostrada antes.
Para verificar qué dirección I2C está seleccionada puedes ejecutar el siguiente I2C scanner código. Debería imprimir la dirección I2C 0x0C. Si no, algo está mal con tu cableado.
#include "I2CScanner.h"
I2CScanner scanner;
void setup() {
Serial.begin(9600);
scanner.Init();
}
void loop() {
scanner.Scan();
delay(5000);
}
Código para medir campo magnético con AK8975
En esta sección te muestro un código de ejemplo para realizar mediciones con el AK8975. Voy a usar la AK8975 Library de Jeff Rowberg. Puedes descargar la biblioteca como archivo ZIP desde allí e instalarla. Pero la biblioteca es bastante grande y soporta muchos más sensores, que no necesitas y que pueden entrar en conflicto con otras bibliotecas.
Por eso extraje los archivos necesarios y creé una biblioteca más pequeña que contiene solo el código requerido para el sensor AK8975. Puedes descargar la ZIP file de esta biblioteca. Para instalar esta biblioteca ZIP sigue los pasos habituales. Haz clic en Sketch -> Add .ZIP Library, y luego selecciona el archivo AK8975_lib.zip que acabas de descargar.

Con la biblioteca instalada, probemos el sensor. El siguiente código lee la intensidad del campo magnético terrestre a lo largo de los tres ejes (X, Y y Z) y los imprime en el monitor serie cada medio segundo.
#include "Wire.h"
#include "AK8975.h"
AK8975 mag(0x0C);
void setup() {
Wire.begin();
Serial.begin(9600);
mag.initialize();
if (!mag.testConnection()) {
Serial.println("AK8975 connection failed!");
}
}
void loop() {
int16_t mx, my, mz;
mag.getHeading(&mx, &my, &mz);
Serial.print("X:");
Serial.println(mx);
Serial.print("Y:");
Serial.println(my);
Serial.print("Z:");
Serial.println(mz);
delay(500);
}
Vamos a desglosar el código en sus componentes para entenderlo mejor.
Inclusión de bibliotecas
Primero incluimos la biblioteca Wire y la biblioteca necesaria para el magnetómetro AK8975. Esta biblioteca contiene las funciones y definiciones necesarias para comunicarse con el sensor.
#include "Wire.h" #include "AK8975.h"
Creación de una instancia
Luego, creamos una instancia de la clase AK8975 llamada mag. Esta instancia nos permitirá acceder a las funciones definidas en la biblioteca para interactuar con el magnetómetro. Ten en cuenta que aquí se especifica la dirección I2C 0x0C.
AK8975 mag(0x0C);
Función setup
En la función setup(), primero inicializamos la biblioteca Wire. Serial.begin(9600) inicializa la comunicación serie a una velocidad de 9600 baudios. Esto nos permite enviar datos al Monitor Serie para depuración y monitoreo.
Wire.begin(); Serial.begin(9600);
Luego, llamamos al método initialize() en la instancia mag para inicializar el magnetómetro. Después, comprobamos la conexión con el magnetómetro usando el método testConnection(). Si no podemos conectar, imprimimos un mensaje de error en el Monitor Serie.
mag.initialize();
if (!mag.testConnection()) {
Serial.println("AK8975 connection failed!");
}
Función loop
En la función loop(), iniciamos una medición llamando al método getHeading(), que rellena los valores del campo magnético mx, my, mz para los 3 ejes.
int16_t mx, my, mz; mag.getHeading(&mx, &my, &mz);
Luego imprimimos los valores del campo magnético para los ejes X, Y y Z en el Monitor Serie.
Serial.print("X:");
Serial.println(mx);
Serial.print("Y:");
Serial.println(my);
Serial.print("Z:");
Serial.println(mz);
Finalmente, introducimos un retardo de 500 milisegundos antes de que comience el siguiente ciclo de medición, permitiendo una salida legible en el Monitor Serie.
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 siguientes, apareciendo en el Monitor Serie:

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

¡Y eso es todo! Este tutorial debería darte un buen comienzo con el AK8975.
Conclusiones
En este tutorial aprendiste a usar el magnetómetro de 3 ejes AK8975 con un Arduino.
El AK8975 es muy similar al magnetómetro HSCDTD008A, aunque el HSCDTD008A tiene una resolución de 0.15μT/LSB mientras que la resolución del AK8975 es solo de 0.3μT/LSB. Por otro lado, el AK8975 tiene cuatro direcciones I2C diferentes para elegir, mientras que el HSCDTD008A tiene una dirección I2C fija y única.
El HSCDTD008A es el chip más pequeño, pero en una placa breakout eso realmente no importa. Sin embargo, debido a su dirección I2C fija, el HSCDTD008A también es un poco más fácil de conectar. Ambos magnetómetros serán igualmente adecuados para la mayoría de las aplicaciones.
Si tienes preguntas o comentarios, no dudes en dejarlos en la sección de comentarios.
¡Feliz bricolaje ; )

