Un magnetometro è un sensore che misura l'intensità del campo magnetico terrestre per determinare i punti cardinali. Nei dispositivi mobili, funziona come una bussola digitale, fornendo una precisione fino a 1–2 gradi con una calibrazione adeguata. Secondo Bosch Sensortec Application Note, 2024, i MEMS-magnetometri moderni consumano solo 0.5–2 mA e si inseriscono in un pacchetto di 1.5×1.5×0.7 mm.
Punti chiave
Il magnetometro in un dispositivo mobile è un sensore di campo magnetico a tre assi basato sull'effetto Hall. Misura le proiezioni del vettore di induzione magnetica sugli assi X, Y e Z. In combinazione con un accelerometro, il magnetometro determina l'azimut — l'angolo tra la direzione nord e l'asse del telefono.
Gli smartphone moderni utilizzano MEMS-magnetometri basati sull'effetto magnetoresistivo anisotropo (AMR) e sull'effetto Hall. I sensori AMR (serie AKM di Asahi Kasei Microdevices) forniscono una sensibilità di 0.15 µT/LSB e un intervallo di ±1200 µT — sufficiente per misurare il campo terrestre (25–65 µT).
| Parametro | Valore |
|---|---|
| Tecnologia | AMR / Effetto Hall |
| Intervallo | ±1200 — ±1300 µT |
| Consumo | 0.5–2 mA |
| Dimensioni | 1.5×1.5×0.7 mm |
| Sensibilità | 0.15 µT/LSB |
Senza una bussola digitale, le app di navigazione non possono determinare la direzione del movimento. Google Maps utilizza il magnetometro per visualizzare l'orientamento della mappa rispetto alla direzione dello sguardo dell'utente. Quando il sensore si guasta, l'app mostra solo la posizione sulla mappa senza la freccia blu di direzione.
L'effetto Hall è un fenomeno fisico di comparsa di una differenza di potenziale ai bordi di una piastra conduttrice quando esposta a un campo magnetico. I MEMS-magnetometri utilizzano strutture a film sottile in permalloy (NiFe), la cui resistenza cambia sotto l'influenza di un campo magnetico esterno (effetto AMR).
Ciascuno dei tre canali (X, Y, Z) è costituito da quattro magnetoresistenze collegate in un ponte di Wheatstone. Il campo magnetico modifica la resistenza delle resistenze del 2–3%, che viene convertita in tensione da un amplificatore differenziale. Un ADC integrato a 16 bit digitalizza il segnale a una frequenza fino a 100 Hz.
Per misurare la componente verticale del campo, viene utilizzato un concentratore magnetico integrato (IMC). Si tratta di una struttura a film sottile in NiFe che devia il campo orizzontale sul piano verticale, consentendo a un singolo ponte AMR di misurare tutti e tre gli assi.
Il magnetometro determina l'orientamento rispetto al campo magnetico terrestre (riferimento assoluto), mentre un giroscopio misura solo il cambiamento angolare (dati relativi). Il giroscopio fornisce dati accurati su brevi intervalli ma accumula errore di deriva. Il magnetometro non deriva ma è suscettibile a interferenze magnetiche.
Android combina i dati di tre sensori tramite SensorManager.getRotationMatrix. Il magnetometro viene utilizzato per correggere la deriva del giroscopio su lunghi intervalli. Senza magnetometro, il giroscopio accumula un errore di 10–20 gradi in 5 minuti. Secondo Google ARCore (2024), l'algoritmo di fusione raggiunge una precisione di 1–3 gradi con un magnetometro.
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] — azimut in radianti
Hard Iron — un campo magnetico permanente creato da materiali ferromagnetici all'interno del telefono: magneti degli altoparlanti, motore di vibrazione, telaio metallico. La distorsione Hard Iron si manifesta come un offset costante (bias) su ciascun asse. Soft Iron — un cambiamento di direzione del campo causato da materiali magneticamente permeabili che distorcono le linee di campo.
La procedura standard di calibrazione del magnetometro consiste nel ruotare il telefono a forma di otto. Durante il processo, il sensore registra punti nello spazio tridimensionale. Senza distorsioni, i punti giacciono su una sfera di raggio 25–65 µT. Hard Iron sposta il centro della sfera, Soft Iron la trasforma in un ellissoide. L'algoritmo di calibrazione calcola i parametri di offset e ridimensionamento.
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
)
}
Lo sviluppatore può implementare la propria calibrazione del magnetometro raccogliendo dati mentre il dispositivo si muove. L'algoritmo di adattamento ellissoidale (ellipsoid fitting) trova i parametri di Hard Iron e Soft Iron minimizzando la somma dei quadrati degli scarti dalla sfera. La libreria Apache Commons Math fornisce un'implementazione dei minimi quadrati non lineari (Levenberg-Marquardt) per questo compito — la precisione dopo la calibrazione software raggiunge 0.5 gradi.
Per minimizzare Hard Iron, i produttori posizionano il magnetometro nella parte superiore del telefono, lontano dall'altoparlante e dal motore di vibrazione. Gli ingegneri Apple nell'iPhone 16 Pro Max (2024) hanno utilizzato una schermatura in foglio di permalloy per il magnetometro, riducendo l'influenza dell'altoparlante di 4 volte. Il Samsung Galaxy S24 Ultra utilizza un circuito di compensazione aggiuntivo che misura la corrente dell'altoparlante in tempo reale per sottrarre il campo indotto. Le custodie con supporti magnetici (ad esempio, nei supporti per auto) creano forti distorsioni — dopo l'uso, il magnetometro potrebbe mostrare la direzione sbagliata fino a una nuova calibrazione.
Android fornisce due sensori: TYPE_MAGNETIC_FIELD (dati calibrati in µT) e TYPE_MAGNETIC_FIELD_UNCALIBRATED (dati grezzi con stima della distorsione). Per le app di navigazione, si consiglia di utilizzare il sensore calibrato — il sistema applica automaticamente la calibrazione integrata basata sull'ultimo movimento a forma di otto.
SENSOR_DELAY_NORMAL (200 ms) è sufficiente per una bussola, SENSOR_DELAY_FASTEST (0 ms) — solo per applicazioni di ricerca specializzate. Dopo aver ricevuto i valori, è possibile convertirli in azimut tramite getRotationMatrix + getOrientation. È importante verificare la precisione del sensore tramite event.accuracy — SENSOR_STATUS_UNRELIABLE significa che è necessaria la calibrazione.
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)
}
}
Il magnetometro non viene utilizzato solo per la bussola. Le applicazioni AR, incluso Pokemon GO, utilizzano il magnetometro per determinare l'orientamento della fotocamera rispetto al mondo reale. Senza magnetometro, ARCore passa alla modalità Screen Axis — l'orientamento è determinato solo dal giroscopio, riducendo la precisione.
Nei sistemi di navigazione automobilistica basati su Android Auto, il magnetometro viene utilizzato per determinare la direzione del movimento quando il segnale GPS viene perso in gallerie e aree urbane dense. In combinazione con i dati di odometria dalle ruote dell'auto (ottenuti tramite OBD-II), il magnetometro consente di continuare la navigazione fino a 5 minuti senza GPS con una precisione di posizionamento di 10–20 metri. Secondo Google Maps Engineering Blog (2024), l'algoritmo ibrido riduce la perdita di percorso nei canyon urbani del 40%.
Le app di navigazione utilizzano il magnetometro per determinare l'azimut del movimento — l'angolo tra il nord e la direzione attuale dell'utente. In Google Maps, i dati del magnetometro vengono combinati con la traccia GPS e la cronologia degli spostamenti per visualizzare la freccia blu di direzione. Quando il segnale GPS viene perso (in gallerie, passaggi sotterranei), il magnetometro rimane l'unica fonte di informazioni sull'orientamento.
La nuova generazione di magnetometri a 3 assi con ASIC integrato (BMM350 di Bosch, 2024) consuma solo 0.35 mA e supporta fino a 200 Hz. Lo sviluppo di magnetometri quantistici e centri NV nel diamante per dispositivi mobili non è ancora uscito dalla fase di laboratorio. Si prevede che entro il 2028, la precisione dei magnetometri mobili raggiungerà 0.01 µT.
Domande frequenti
Disegna un otto con il telefono in aria — questo è il gesto standard per calibrare la bussola digitale. Se la bussola mostra ancora erroneamente, controlla la custodia: i supporti magnetici e gli elementi metallici creano forti distorsioni Hard Iron.
Cause principali: interferenze magnetiche dagli altoparlanti e dal motore di vibrazione del telefono, mancanza di calibrazione dopo il cambio della custodia, influenza di oggetti metallici vicini. In ambienti interni con strutture in cemento armato, il campo magnetico viene distorto particolarmente.
Sì, le app rilevatrici di metalli utilizzano il magnetometro integrato per rilevare anomalie del campo magnetico. Tuttavia, la profondità di rilevamento non supera 10–20 cm e il dispositivo non distingue i tipi di metallo — è più uno strumento educativo.
TYPE_MAGNETIC_FIELD restituisce i dati dopo la calibrazione applicata dal sistema. TYPE_MAGNETIC_FIELD_UNCALIBRATED fornisce valori grezzi più una stima del bias, consentendo allo sviluppatore di applicare la propria calibrazione.
Usa SensorManager.getRotationMatrix con i dati dell'accelerometro e del magnetometro, poi getOrientation — il primo elemento dell'array (azimut) sarà in radianti. Per visualizzare la bussola, converti in gradi: Math.toDegrees(azimuth).
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche