Un magnetómetro es un sensor que mide la intensidad del campo magnético terrestre para determinar los puntos cardinales. En los dispositivos móviles, funciona como una brújula digital, proporcionando una precisión de hasta 1–2 grados con una calibración adecuada. Según Bosch Sensortec Application Note, 2024, los MEMS-magnetómetros modernos consumen solo 0.5–2 mA y caben en un encapsulado de 1.5×1.5×0.7 mm.
Puntos clave
El magnetómetro en un dispositivo móvil es un sensor de campo magnético de tres ejes basado en el efecto Hall. Mide las proyecciones del vector de inducción magnética en los ejes X, Y y Z. Combinado con un acelerómetro, el magnetómetro determina el azimut — el ángulo entre la dirección norte y el eje del teléfono.
Los smartphones modernos utilizan MEMS-magnetómetros basados en el efecto magnetorresistivo anisótropo (AMR) y el efecto Hall. Los sensores AMR (serie AKM de Asahi Kasei Microdevices) proporcionan una sensibilidad de 0.15 µT/LSB y un rango de ±1200 µT — suficiente para medir el campo terrestre (25–65 µT).
| Parámetro | Valor |
|---|---|
| Tecnología | AMR / Efecto Hall |
| Rango | ±1200 — ±1300 µT |
| Consumo | 0.5–2 mA |
| Tamaño | 1.5×1.5×0.7 mm |
| Sensibilidad | 0.15 µT/LSB |
Sin una brújula digital, las aplicaciones de navegación no pueden determinar la dirección del movimiento. Google Maps utiliza el magnetómetro para mostrar la orientación del mapa con respecto a la dirección de la mirada del usuario. Cuando el sensor falla, la aplicación solo muestra la ubicación en el mapa sin la flecha azul de dirección.
El efecto Hall es un fenómeno físico de aparición de una diferencia de potencial en los bordes de una placa conductora cuando se expone a un campo magnético. Los MEMS-magnetómetros utilizan estructuras de película delgada de permalloy (NiFe), cuya resistencia cambia bajo la influencia de un campo magnético externo (efecto AMR).
Cada uno de los tres canales (X, Y, Z) consta de cuatro magnetorresistencias conectadas en un puente de Wheatstone. El campo magnético cambia la resistencia de las resistencias en un 2–3%, que se convierte en voltaje mediante un amplificador diferencial. Un ADC integrado de 16 bits digitaliza la señal a una frecuencia de hasta 100 Hz.
Para medir la componente vertical del campo, se utiliza un concentrador magnético integrado (IMC — Integrated Magnetic Concentrator). Se trata de una estructura de película delgada de NiFe que desvía el campo horizontal hacia el plano vertical, permitiendo que un único puente AMR mida los tres ejes.
El magnetómetro determina la orientación con respecto al campo magnético terrestre (referencia absoluta), mientras que un giroscopio solo mide el cambio angular (datos relativos). El giroscopio proporciona datos precisos en intervalos cortos pero acumula error de deriva. El magnetómetro no deriva, pero es susceptible a interferencias magnéticas.
Android combina datos de tres sensores a través de SensorManager.getRotationMatrix. El magnetómetro se utiliza para corregir la deriva del giroscopio en intervalos largos. Sin magnetómetro, el giroscopio acumula un error de 10–20 grados en 5 minutos. Según Google ARCore (2024), el algoritmo de fusión alcanza una precisión de 1–3 grados con magnetómetro.
val accelerometerReading = FloatArray(3)
val magnetometerReading = FloatArray(3)
val rotationMatrix = FloatArray(9)
val orientationAngles = FloatArray(3)
SensorManager.getRotationMatrix(
rotationMatrix, null,
accelerometerReading,
magnetometerReading
)
SensorManager.getOrientation(
rotationMatrix, orientationAngles
)
// orientationAngles[0] — azimuth en radianes
Hard Iron — un campo magnético permanente creado por materiales ferromagnéticos dentro del teléfono: imanes de altavoces, motor de vibración, marco metálico. La distorsión Hard Iron se manifiesta como un desplazamiento constante (bias) en cada eje. Soft Iron — un cambio en la dirección del campo causado por materiales magnéticamente permeables que distorsionan las líneas de campo.
El procedimiento estándar de calibración del magnetómetro consiste en rotar el teléfono en forma de ocho (figure-8 pattern). Durante el proceso, el sensor registra puntos en el espacio tridimensional. Sin distorsiones, los puntos se encuentran en una esfera de radio 25–65 µT. Hard Iron desplaza el centro de la esfera, Soft Iron la convierte en un elipsoide. El algoritmo de calibración calcula los parámetros de desplazamiento y escalado.
data class CalibrationParams(
val biasX: Float,
val biasY: Float,
val biasZ: Float,
val scaleX: Float,
val scaleY: Float,
val scaleZ: Float
)
fun applySoftIronCorrection(
raw: FloatArray, p: CalibrationParams
): FloatArray {
return floatArrayOf(
(raw[0] - p.biasX) * p.scaleX,
(raw[1] - p.biasY) * p.scaleY,
(raw[2] - p.biasZ) * p.scaleZ
)
}
El desarrollador puede implementar su propia calibración del magnetómetro recopilando datos mientras el dispositivo se mueve. El algoritmo de ajuste elipsoidal (ellipsoid fitting) encuentra los parámetros de Hard Iron y Soft Iron minimizando la suma de los cuadrados de las desviaciones de la esfera. La biblioteca Apache Commons Math proporciona una implementación de mínimos cuadrados no lineales (Levenberg-Marquardt) para esta tarea — la precisión tras la calibración por software alcanza 0.5 grados.
Para minimizar Hard Iron, los fabricantes colocan el magnetómetro en la parte superior del teléfono, lejos del altavoz y el motor de vibración. Los ingenieros de Apple en el iPhone 16 Pro Max (2024) aplicaron un blindaje de lámina de permalloy para el magnetómetro, reduciendo la influencia del altavoz en 4 veces. El Samsung Galaxy S24 Ultra utiliza un circuito de compensación adicional que mide la corriente del altavoz en tiempo real para restar el campo inducido. Las fundas con soportes magnéticos (por ejemplo, en soportes para coche) crean fuertes distorsiones — después de usarlas, el magnetómetro puede mostrar la dirección incorrecta hasta una nueva calibración.
Android proporciona dos sensores: TYPE_MAGNETIC_FIELD (datos calibrados en µT) y TYPE_MAGNETIC_FIELD_UNCALIBRATED (datos brutos con estimación de distorsión). Para aplicaciones de navegación, se recomienda usar el sensor calibrado — el sistema aplica automáticamente la calibración integrada basada en el último movimiento en forma de ocho.
SENSOR_DELAY_NORMAL (200 ms) es suficiente para una brújula, SENSOR_DELAY_FASTEST (0 ms) — solo para aplicaciones de investigación especializadas. Después de recibir los valores, se pueden convertir en azimut mediante getRotationMatrix + getOrientation. Es importante verificar la precisión del sensor a través de event.accuracy — SENSOR_STATUS_UNRELIABLE significa que se necesita calibración.
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type == Sensor.TYPE_MAGNETIC_FIELD) {
val accuracy = event.accuracy
if (accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) {
showCalibrationHint()
return
}
System.arraycopy(event.values, 0,
magnetometerReading, 0, 3)
}
}
El magnetómetro no solo se usa para la brújula. Las aplicaciones AR, incluido Pokemon GO, utilizan el magnetómetro para determinar la orientación de la cámara con respecto al mundo real. Sin magnetómetro, ARCore cambia al modo Screen Axis — la orientación se determina solo con el giroscopio, lo que reduce la precisión.
En los sistemas de navegación automotriz basados en Android Auto, el magnetómetro se utiliza para determinar la dirección del movimiento cuando se pierde la señal GPS en túneles y zonas urbanas densas. En combinación con datos de odometría de las ruedas del automóvil (obtenidos a través de OBD-II), el magnetómetro permite continuar la navegación hasta 5 minutos sin GPS con una precisión de posicionamiento de 10–20 metros. Según Google Maps Engineering Blog (2024), el algoritmo híbrido reduce la pérdida de ruta en cañones urbanos en un 40%.
Las aplicaciones de navegación utilizan el magnetómetro para determinar el azimut de movimiento — el ángulo entre el norte y el rumbo actual del usuario. En Google Maps, los datos del magnetómetro se combinan con el seguimiento GPS y el historial de movimientos para mostrar la flecha azul de dirección. Cuando se pierde la señal GPS (en túneles, pasos subterráneos), el magnetómetro sigue siendo la única fuente de información de orientación.
La nueva generación de magnetómetros de 3 ejes con ASIC integrado (BMM350 de Bosch, 2024) consume solo 0.35 mA y admite una frecuencia de hasta 200 Hz. El desarrollo de magnetómetros cuánticos y centros NV en diamante para dispositivos móviles aún no ha salido de la etapa de laboratorio. Se espera que para 2028, la precisión de los magnetómetros móviles alcance 0.01 µT.
Preguntas frecuentes
Dibuje un ocho con el teléfono en el aire — este es el gesto estándar para calibrar la brújula digital. Si la brújula sigue mostrando incorrectamente, revise la funda: los soportes magnéticos y los elementos metálicos crean fuertes distorsiones Hard Iron.
Principales causas: interferencias magnéticas de los altavoces y el motor de vibración del teléfono, falta de calibración después de cambiar la funda, influencia de objetos metálicos cercanos. En interiores con estructuras de hormigón armado, el campo magnético se distorsiona especialmente.
Sí, las aplicaciones detectoras de metales utilizan el magnetómetro integrado para detectar anomalías del campo magnético. Sin embargo, la profundidad de detección no supera los 10–20 cm y el dispositivo no distingue tipos de metales — es más una herramienta educativa.
TYPE_MAGNETIC_FIELD devuelve datos después de la calibración aplicada por el sistema. TYPE_MAGNETIC_FIELD_UNCALIBRATED proporciona valores brutos más una estimación de desplazamiento (bias), lo que permite al desarrollador aplicar su propia calibración.
Use SensorManager.getRotationMatrix con los datos del acelerómetro y el magnetómetro, luego getOrientation — el primer elemento del array (azimut) estará en radianes. Para mostrar la brújula, convierta a grados: Math.toDegrees(azimuth).
Resumen
Desarrollaremos una aplicación móvil llave en mano
IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.
Lea también