Um magnetômetro é um sensor que mede a intensidade do campo magnético da Terra para determinar os pontos cardeais. Em dispositivos móveis, funciona como uma bússola digital, fornecendo precisão de até 1–2 graus com calibração adequada. De acordo com Bosch Sensortec Application Note, 2024, os MEMS-magnetômetros modernos consomem apenas 0.5–2 mA e cabem em um pacote de 1.5×1.5×0.7 mm.
Principais conclusões
O magnetômetro em um dispositivo móvel é um sensor de campo magnético de três eixos baseado no efeito Hall. Ele mede as projeções do vetor de indução magnética nos eixos X, Y e Z. Combinado com um acelerômetro, o magnetômetro determina o azimute — o ângulo entre a direção norte e o eixo do telefone.
Os smartphones modernos usam MEMS-magnetômetros baseados no efeito magnetorresistivo anisotrópico (AMR) e no efeito Hall. Os sensores AMR (série AKM da Asahi Kasei Microdevices) fornecem sensibilidade de 0.15 µT/LSB e uma faixa de ±1200 µT — suficiente para medir o campo da Terra (25–65 µT).
| Parâmetro | Valor |
|---|---|
| Tecnologia | AMR / Efeito Hall |
| Faixa | ±1200 — ±1300 µT |
| Consumo | 0.5–2 mA |
| Tamanho | 1.5×1.5×0.7 mm |
| Sensibilidade | 0.15 µT/LSB |
Sem uma bússola digital, os aplicativos de navegação não conseguem determinar a direção do movimento. O Google Maps usa o magnetômetro para exibir a orientação do mapa em relação à direção do olhar do usuário. Quando o sensor falha, o aplicativo mostra apenas a localização no mapa sem a seta azul de direção.
O efeito Hall é um fenômeno físico de aparecimento de uma diferença de potencial nas bordas de uma placa condutora quando exposta a um campo magnético. Os MEMS-magnetômetros usam estruturas de filme fino de permalloy (NiFe), cuja resistência muda sob a influência de um campo magnético externo (efeito AMR).
Cada um dos três canais (X, Y, Z) consiste em quatro magnetorresistores conectados em uma ponte de Wheatstone. O campo magnético altera a resistência dos resistores em 2–3%, que é convertida em tensão por um amplificador diferencial. Um ADC integrado de 16 bits digitaliza o sinal em uma frequência de até 100 Hz.
Para medir o componente vertical do campo, um concentrador magnético integrado (IMC) é usado. Esta é uma estrutura de filme fino de NiFe que desvia o campo horizontal para o plano vertical, permitindo que uma única ponte AMR meça todos os três eixos.
O magnetômetro determina a orientação em relação ao campo magnético da Terra (referência absoluta), enquanto um giroscópio mede apenas a mudança angular (dados relativos). O giroscópio fornece dados precisos em intervalos curtos, mas acumula erro de deriva. O magnetômetro não deriva, mas é suscetível a interferências magnéticas.
O Android combina dados de três sensores através do SensorManager.getRotationMatrix. O magnetômetro é usado para corrigir a deriva do giroscópio em intervalos longos. Sem um magnetômetro, o giroscópio acumula um erro de 10–20 graus em 5 minutos. De acordo com o Google ARCore (2024), o algoritmo de fusão atinge precisão de 1–3 graus com um 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] — azimute em radianos
Hard Iron — um campo magnético permanente criado por materiais ferromagnéticos dentro do telefone: ímãs de alto-falantes, motor de vibração, estrutura metálica. A distorção Hard Iron aparece como um deslocamento constante (bias) em cada eixo. Soft Iron — uma mudança na direção do campo causada por materiais magneticamente permeáveis que distorcem as linhas de campo.
O procedimento padrão de calibração do magnetômetro é girar o telefone em forma de oito. Durante o processo, o sensor registra pontos no espaço tridimensional. Sem distorções, os pontos estão em uma esfera de raio 25–65 µT. O Hard Iron desloca o centro da esfera, o Soft Iron a transforma em um elipsoide. O algoritmo de calibração calcula os parâmetros de deslocamento e escala.
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
)
}
O desenvolvedor pode implementar sua própria calibração do magnetômetro coletando dados enquanto o dispositivo se move. O algoritmo de ajuste elipsoidal (ellipsoid fitting) encontra os parâmetros de Hard Iron e Soft Iron minimizando a soma dos quadrados dos desvios da esfera. A biblioteca Apache Commons Math fornece uma implementação de mínimos quadrados não lineares (Levenberg-Marquardt) para esta tarefa — a precisão após a calibração por software atinge 0.5 graus.
Para minimizar o Hard Iron, os fabricantes colocam o magnetômetro na parte superior do telefone, longe do alto-falante e do motor de vibração. Engenheiros da Apple no iPhone 16 Pro Max (2024) usaram blindagem de folha de permalloy para o magnetômetro, reduzindo a influência do alto-falante em 4 vezes. O Samsung Galaxy S24 Ultra usa um circuito de compensação adicional que mede a corrente do alto-falante em tempo real para subtrair o campo induzido. Capas com suportes magnéticos (por exemplo, em suportes de carro) criam fortes distorções — após o uso, o magnetômetro pode mostrar a direção errada até a recalibração.
O Android fornece dois sensores: TYPE_MAGNETIC_FIELD (dados calibrados em µT) e TYPE_MAGNETIC_FIELD_UNCALIBRATED (dados brutos com estimativa de distorção). Para aplicativos de navegação, é recomendável usar o sensor calibrado — o sistema aplica automaticamente a calibração integrada com base no último movimento em forma de oito.
SENSOR_DELAY_NORMAL (200 ms) é suficiente para uma bússola, SENSOR_DELAY_FASTEST (0 ms) — apenas para aplicações de pesquisa especializadas. Depois de receber os valores, você pode convertê-los em azimute via getRotationMatrix + getOrientation. É importante verificar a precisão do sensor através de event.accuracy — SENSOR_STATUS_UNRELIABLE significa que a calibração é necessária.
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)
}
}
O magnetômetro não é usado apenas para a bússola. Aplicativos AR, incluindo Pokemon GO, usam o magnetômetro para determinar a orientação da câmera em relação ao mundo real. Sem um magnetômetro, o ARCore muda para o modo Screen Axis — a orientação é determinada apenas pelo giroscópio, o que reduz a precisão.
Em sistemas de navegação automotiva baseados no Android Auto, o magnetômetro é usado para determinar a direção do movimento quando o sinal GPS é perdido em túneis e áreas urbanas densas. Em combinação com dados de odometria das rodas do carro (obtidos via OBD-II), o magnetômetro permite continuar a navegação por até 5 minutos sem GPS com precisão de posicionamento de 10–20 metros. De acordo com o Google Maps Engineering Blog (2024), o algoritmo híbrido reduz a perda de rota em cânions urbanos em 40%.
Os aplicativos de navegação usam o magnetômetro para determinar o azimute do movimento — o ângulo entre o norte e o rumo atual do usuário. No Google Maps, os dados do magnetômetro são combinados com a trilha GPS e o histórico de movimentos para exibir a seta azul de direção. Quando o sinal GPS é perdido (em túneis, passagens subterrâneas), o magnetômetro permanece a única fonte de informação de orientação.
A nova geração de magnetômetros de 3 eixos com ASIC integrado (BMM350 da Bosch, 2024) consome apenas 0.35 mA e suporta até 200 Hz. O desenvolvimento de magnetômetros quânticos e centros NV em diamante para dispositivos móveis ainda não saiu da fase de laboratório. Espera-se que até 2028, a precisão dos magnetômetros móveis atinja 0.01 µT.
Perguntas frequentes
Desenhe um oito com o telefone no ar — este é o gesto padrão para calibrar a bússola digital. Se a bússola ainda mostrar incorretamente, verifique a capa: suportes magnéticos e elementos metálicos criam fortes distorções Hard Iron.
Principais causas: interferência magnética dos alto-falantes e motor de vibração do telefone, falta de calibração após trocar a capa, influência de objetos metálicos próximos. Em ambientes internos com estruturas de concreto armado, o campo magnético é distorcido especialmente.
Sim, aplicativos de detector de metais usam o magnetômetro embutido para detectar anomalias do campo magnético. No entanto, a profundidade de detecção não excede 10–20 cm e o dispositivo não distingue tipos de metais — é mais uma ferramenta educacional.
TYPE_MAGNETIC_FIELD retorna dados após a calibração aplicada pelo sistema. TYPE_MAGNETIC_FIELD_UNCALIBRATED fornece valores brutos mais uma estimativa de bias, permitindo que o desenvolvedor aplique sua própria calibração.
Use SensorManager.getRotationMatrix com dados do acelerômetro e magnetômetro, depois getOrientation — o primeiro elemento do array (azimute) estará em radianos. Para exibir a bússola, converta para graus: Math.toDegrees(azimuth).
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também