Магнітометр — це датчик, який вимірює напруженість магнітного поля Землі для визначення сторін світу. У мобільних пристроях він працює як цифровий компас, забезпечуючи точність до 1–2 градусів при правильному калібруванні. За даними Bosch Sensortec Application Note, 2024, сучасні MEMS-магнітометри споживають лише 0.5–2 мА і вміщуються в корпусі 1.5×1.5×0.7 мм.
Головне
Магнітометр у мобільному пристрої — це тривісний датчик магнітного поля, заснований на ефекті Холла. Він вимірює проекції вектора магнітної індукції на осі X, Y та Z. У поєднанні з акселерометром магнітометр дозволяє визначити азимут — кут між напрямком на північ та віссю телефона.
У сучасних смартфонах використовуються MEMS-магнітометри на основі анізотропного магніторезистивного ефекту (AMR) та ефекту Холла. AMR-сенсори (AKM серія від Asahi Kasei Microdevices) забезпечують чутливість 0.15 мкТл/LSB та діапазон ±1200 мкТл — цього достатньо для вимірювання поля Землі (25–65 мкТл).
| Параметр | Значення |
|---|---|
| Технологія | AMR / Ефект Холла |
| Діапазон | ±1200 — ±1300 мкТл |
| Споживання | 0.5–2 мА |
| Розмір | 1.5×1.5×0.7 мм |
| Чутливість | 0.15 мкТл/LSB |
Без цифрового компаса навігаційні додатки не можуть визначити напрямок руху. Google Maps використовує магнітометр для відображення орієнтації карти відносно напрямку погляду користувача. При відмові сенсора додаток показує лише положення на карті без синьої стрілки напрямку.
Ефект Холла — фізичне явище виникнення різниці потенціалів на краях провідної пластини при впливі магнітного поля. У MEMS-магнітометрах використовуються тонкоплівкові структури з пермалою (NiFe), опір яких змінюється під дією зовнішнього магнітного поля (AMR-ефект).
Кожен із трьох каналів (X, Y, Z) складається з чотирьох магніторезисторів, включених у міст Вітстона. Магнітне поле змінює опір резисторів на 2–3%, що перетворюється диференціальним підсилювачем у напругу. Вбудований 16-бітний АЦП оцифровує сигнал з частотою до 100 Гц.
Для вимірювання вертикальної складової поля використовується інтегрований концентратор магнітного потоку (IMC — Integrated Magnetic Concentrator). Це тонкоплівкова структура з NiFe, яка відхиляє горизонтальне поле у вертикальну площину, дозволяючи єдиному AMR-мосту вимірювати всі три осі.
Магнітометр визначає орієнтацію відносно магнітного поля Землі (абсолютний референс), а гіроскоп вимірює лише зміну кута (відносні дані). Гіроскоп дає точні дані на коротких інтервалах, але накопичує помилку дрейфу. Магнітометр не дрейфує, але піддається магнітним перешкодам.
Android об'єднує дані трьох сенсорів через SensorManager.getRotationMatrix. Магнітометр використовується для корекції дрейфу гіроскопа на довгих інтервалах. Без магнітометра гіроскоп за 5 хвилин накопичує помилку до 10–20 градусів. За даними Google ARCore (2024), fusion-алгоритм досягає точності 1–3 градуси за наявності магнітометра.
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] — азимут в радіанах
Hard Iron — постійне магнітне поле, створюване феромагнітними матеріалами всередині телефона: магнітами динаміків, вібромотором, металевою рамкою корпуса. Hard Iron спотворення проявляється як постійне зміщення (bias) по кожній осі. Soft Iron — зміна напрямку поля через магнітопроникні матеріали, які спотворюють форму ліній поля.
Стандартна процедура калібрування магнітометра — це обертання телефона по вісімці (figure-8 pattern). У процесі сенсор записує точки в тривимірному просторі. Без спотворень точки лежать на сфері радіусом 25–65 мкТл. Hard Iron зміщує центр сфери, Soft Iron перетворює її в еліпсоїд. Алгоритм калібрування обчислює параметри зміщення та масштабування.
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
)
}
Розробник може реалізувати власне калібрування магнітометра, збираючи дані при русі пристрою. Алгоритм еліпсоїдної підгонки (ellipsoid fitting) знаходить параметри Hard Iron та Soft Iron, мінімізуючи суму квадратів відхилень від сфери. Бібліотека Apache Commons Math надає реалізацію нелінійного методу найменших квадратів (Levenberg-Marquardt) для цього завдання — точність після програмного калібрування досягає 0.5 градуса.
Для мінімізації Hard Iron виробники розміщують магнітометр у верхній частині телефона, подалі від динаміка та вібромотора. Інженери Apple в iPhone 16 Pro Max (2024) застосували екранування магнітометра пермалоєвою фольгою, знизивши вплив динаміка в 4 рази. У Samsung Galaxy S24 Ultra використовується додатковий компенсаційний контур, який вимірює струм у динаміку в реальному часі для віднімання induced-поля. Чохли з магнітними кріпленнями (наприклад, в автомобільних тримачах) створюють сильні спотворення — після використання магнітометр може показувати неправильний напрямок до повторного калібрування.
Android надає два сенсори: TYPE_MAGNETIC_FIELD (калібровані дані в мкТл) та TYPE_MAGNETIC_FIELD_UNCALIBRATED (сирі дані з оцінкою спотворення). Для навігаційних додатків рекомендується використовувати калібрований сенсор — система автоматично застосовує вбудоване калібрування на основі останнього руху по вісімці.
SENSOR_DELAY_NORMAL (200 мс) достатня для компаса, SENSOR_DELAY_FASTEST (0 мс) — лише для спеціальних дослідницьких додатків. Після отримання значень можна перетворити їх в азимут через getRotationMatrix + getOrientation. Важно перевіряти точність сенсора через event.accuracy — значення SENSOR_STATUS_UNRELIABLE означає необхідність калібрування.
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)
}
}
Магнітометр використовується не тільки для компаса. AR-додатки, включаючи Pokemon GO, використовують магнітометр для визначення орієнтації камери відносно реального світу. При відсутності магнітометра ARCore перемикається в режим Screen Axis — орієнтація визначається лише гіроскопом, що знижує точність.
В автомобільних навігаційних системах на базі Android Auto магнітометр використовується для визначення напрямку руху при втраті сигналу GPS у тунелях та щільній міській забудові. У комбінації з даними одометрії від коліс автомобіля (отримуваними через OBD-II) магнітометр дозволяє продовжувати навігацію до 5 хвилин без GPS з точністю позиціонування 10–20 метрів. За даними Google Maps Engineering Blog (2024), гібридний алгоритм знижує відсоток втрати маршруту в міських каньйонах на 40%.
Навігаційні додатки використовують магнітометр для визначення азимуту руху — кута між напрямком на північ та поточним курсом користувача. У Google Maps дані магнітометра комбінуються з GPS-треком та історією переміщень для відображення синьої стрілки напрямку. При втраті сигналу GPS (у тунелях, підземних переходах) магнітометр залишається єдиним джерелом інформації про орієнтацію.
Нове покоління 3-осьових магнітометрів з інтегрованим ASIC (BMM350 від Bosch, 2024) споживає всього 0.35 мА та підтримує частоту до 200 Гц. Розвиток квантових магнітометрів та NV-центрів в алмазі для мобільних пристроїв поки не вийшло зі стадії лабораторних експериментів. Очікується, що до 2028 року точність мобільних магнітометрів досягне 0.01 мкТл.
Часті запитання
Намалюйте вісімку телефоном у повітрі — це стандартний жест для калібрування цифрового компаса. Якщо компас все одно показує невірно, перевірте чохол: магнітні кріплення та металеві елементи створюють сильні спотворення Hard Iron.
Основні причини: магнітні перешкоди від динаміків та вібромотора телефона, відсутність калібрування після зміни чохла, вплив металевих предметів поруч. У приміщенні із залізобетонними конструкціями магнітне поле спотворюється особливо сильно.
Так, додатки-металошукачі використовують вбудований магнітометр для виявлення аномалій магнітного поля. Однак глибина виявлення не перевищує 10–20 см, і прилад не розрізняє типи металів — це скоріше освітній інструмент.
TYPE_MAGNETIC_FIELD повертає дані після калібрування, застосованої системою. TYPE_MAGNETIC_FIELD_UNCALIBRATED віддає сирі значення плюс оцінку зміщення (bias), дозволяючи розробнику застосувати власне калібрування.
Використовуйте SensorManager.getRotationMatrix з даними акселерометра та магнітометра, потім getOrientation — перший елемент масиву (азимут) буде в радіанах. Для відображення компаса перетворіть у градуси: Math.toDegrees(azimuth).
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також