Телефонуйте » (+38) 096 227 41 41

Маленький чіп HMC5883L виконує свої функції за технологією AMR (Anisotropic Magnetoresistive - анізотропний магніторезистивний) і дозволяє вимірювати як напрям, так і величину магнітного поля Землі.

Магнітометр HMC5883L має 3 магніто-резистивних датчиків, розташованих на трьох перпендикулярних осях (декартові осі X, Y і Z). Тут ви можете знайти його datasheet.


Чіп Honeywell HMC5883L

Магнітне поле впливає на ці датчики, змінюючи певним чином струм, що протікає через них. Застосувавши масштабування цього струму, ви визначите магнітну силу (в Гауссах), яка прикладена до кожного датчика.
Компонент HMC5883L спілкується з Arduino через протокол I2C.


Плата компаса, на якій інтегрований HMC5883L

Схема підключення

Arduino GND -> HMC5883L GND
Arduino 3,3 -> HMC5883L Vcc
Arduino А4 (SDA) -> HMC5883L SDA
Arduino А5 (SCL) -> HMC5883L SCL

Бібліотека HMC5884L для Arduino

В Інтернеті ви можете знайти багато бібліотек, запрограмованих спеціально для використання даного датчика. Для прикладів, розглянутих у цій статті використаємо бібліотеку під назвою HMC5884L.
Натисніть тут, щоб завантажити бібліотеку. Після того, як ви завантажили файл ZIP, розпакуйте вміст всередині Program Files> Arduino> LIbraries (якщо ви знаходитесь на Windows), тобто створіть папку HMC5883L.


Файли, що містяться в бібліотеці HMC5883L

Після того, як ви витягли вміст, запустіть Arduino IDE. Якщо все встановлено правильно, то ви знайдете приклад Simple, завантажений в IDE:


Якщо установка пройшла успішно, то ви побачите приклад Simple в HMC5883L

Кращий спосіб дізнатися, як використовувати дану бібліотеку, це повторити прості приклади, в ході яких поступово пояснюються команди і функції: як вони працюють, як їх використовувати. Для цього, розглянемо приклад, який реалізує цифровий компас, в якому будемо використовувати HMC5883L як реальний магнітометр збору даних.

Cтворимо цифровий компас

Всі ви знайомі з подібними об'єктами. Невеликий циліндричний ящик з голкою всередині з магнітного матеріалу, яка взаємодіє з магнітним полем Землі, повертаючись відповідно до силових ліній, які проходять через поверхню землі, таким чином вказуючи на північ.
Те, що ми хочемо мати з Arduino - це створити компас, який дасть нам значення 0°, коли датчик вказуватиме на магнітну північ, і 180°, коли датчик насправді вказуватиме на південь.
Пропонуємо даний код, бо він дуже корисний для того, щоб зрозуміти, як використовувати цей датчик, код дуже простий і зрозумілий для всіх, хто ознайомився з командами бібліотеки HMC5883L.
Спочатку ви повинні імпортувати бібліотеку HMC5883L:
#include <HMC5883L.h>
Оскільки плата HMC5883L спілкується з Arduino через протокол I2C, то ви також повинні імпортувати бібліотеку Wire.
#include <wire.h>
Після включення всіх необхідних бібліотек, оголосимо екземпляр HMC5883L як глобальну змінну.
HMC5883L compass;
Тепер можемо почати, щоб визначити зміст двох всюдисущих методів setup() і loop() в будь-якому скетчі Arduino.
Почнемо, що логічно, писати метод setup(). І спершу ми активуємо протокол I2C зв'язку між Arduino і магнітометра:
void setup() {
    Wire.begin();

Крім того, так як нам потрібно десь відобразити значення показань магнитометра, то використаємо послідовний зв'язок між Arduino і ПК. Тому вкажіть:
Serial.begin(9600);
Serial.println("Serial started");

Після того, як всі з'єднання ініціалізовані, можете також ініціалізувати магнітометр, визначаючи:
compass = HMC5883L();
Наступним кроком буде налаштувати датчик відповідно до наших потреб. Перш за все, необхідно визначити коефіцієнт підсилення (масштабувати відповідь), при якому працювати з магнітометром:
Serial.println("Setting scale to +/- 1.3Ga");
int error = compass.SetScale(1.3);
if(error != 0)
    Serial.println(compass.GetErrorText(error));
Serial.println("Setting measurement mode to continuous.");
error = compas.SetMeasurementMode(Measurement_Continuous);
if(error != 0)
   Serial.println(compass.GetErrorText(error));

За допомогою цих рядків коду ми просто встановили підсилення на 1,3 Гс (кінець шкали), тому вимірювання повинні бути між значеннями -1.3 і 1.3 Гс.
Ви можете встановити тільки деякий кінцевий масштаб (підсилення) для магнітометра HMC5883L, і вони є: 0,88, 1,3, 1,9, 2,5, 4,0, 4,7, 5,6 і 8,1 Гс. Зайве говорити, що, якщо ваші вимірювання потрапляють в певний діапазон, то можете спробувати вибрати менший масштаб, що зробить точність виміру більш високою.
Тепер почнемо визначати зміст функції loop(). Код, написаний в цій функції, буде працювати безперервно, і щоразу, коли він виконується, буде зроблене вимірювання за допомогою датчика:
void loop(){
   MagnetometerRaw raw = compass.ReadRawAxis();

Функція ReadRawAxis() повертає значення, отримане безпосередньо з магнітометра. Тому, отримані таким чином значення, не мають ніякого відношення до істинного значення напруженості магнітного поля - вони є лише пропорційні їй. Так що, якщо ви зацікавлені в істинному значенні магнітного поля (в Гс), то не повинні розглядати цю функцію, а замінити її функції ReadScaledAxis().
В нашому випадку, однак, ми зацікавлені в моделюванні орієнтації магнітної стрілки компаса, тому фактичні значення нас не цікавлять. Так що можна сміливо використовувати необроблені прочитані значення.
Нагадаємо, що магнітометр може виконувати вимірювання одночасно на трьох декартових осях. Щоб отримати ці значення, просто зверніться до наступних значень, що належать до змінної об'єкта MagnetometerRaw, де вони зберігаються. Ось приклад того, як ми можемо отримати три значення для кожної осі (не включені в коді).
int xAxis = raw.XAxis;
int yAxis = raw.YAxis;
int zAxis = raw.ZAxis;

Замість цього, якщо хочете, то можете використовувати фактичні значення представлені безпосередньо в масштабі (виміряні в Гаусах) (не включені в код):
MagnetometerScaled scaled = compass.ReadScaledAxis();
int xAxis = scaled.XAxis;
int yAxis = scaled.YAxis;
int zAxis = scaled.ZAxis;

Тепер ви можете визначити компас всередині функції loop():
float heading = atan2(raw.YAxis, raw.XAxis);
if(heading < 0)
    heading += 2*PI;

оскільки кут ви отримуєте за цієї формулою в радіанах, то перетворимо його у формат градусів, який є найбільш знайомий нам і дуже легко читається:
float headingDegrees = heading * 180/M_PI;
Тепер ми просто повинні побачити значення, що відображається на ПК, а це пов'язано з приєнанням Arduino через послідовний канал зв'язку:
Serial.println(headingDegrees);
delay(1000);

Затримка delay() додана для того, щоб робити вимірювання щосекунди (1000 мс), але ви можете змінити цей параметр при бажанні.
Ось весь код:
#include <Wire.h>
#include <HMC5883L.h>
 
HMC5883L compass;
 
void setup()
{
   Wire.begin();
   Serial.begin(9600);
   compass = HMC5883L();
 
   Serial.println("Setting scale to +/- 1.3Ga");
   int error = compass.SetScale(1.3);
   if(error != 0)
     Serial.println(compass.GetErrorText(error));
 
   Serial.println("Setting measurement mode to continuous");
   error = compass.SetMeasurementMode(Measurement_Continuous);
   if(error != 0)
   Serial.println(compass.GetErrorText(error));
}
 
void loop()
{
   MagnetometerRaw raw = compass.ReadRawAxis();
   float heading = atan2(raw.YAxis, raw.XAxis);
   if(heading < 0)
      heading += 2*PI;
   float headingDegrees = heading * 180/M_PI;
   Serial.println(headingDegrees);
   delay(1000);
}

Тепер підключіть Arduino до комп'ютера і відкрийте послідовний зв'язок через який ви можете контролювати свій цифровий компас. Поверніть плату HMC5883 поки не отримаєте значення 0. Якщо ви отримуєте 0, то ви вказуєте на північ (магнітний).


Монітор послідовного порта

Магнітне відхилення

Магнітне поле, яке оточує земну кулю, не є ні ідеальним, ні однорідним - воно схильне до безперервних змін у просторі та часі. Цей ефект називається магнітним відхиленням. В цифровому компасі цей ефект можна взяти до уваги, злегка змінивши формулу, використану в попередньому прикладі.
По-перше, ми повинні отримати значення магнітного відхилення для місцезнаходження, в якому проводимо вимірювання. Існує чудовий сайт в Інтернеті (www.magnetic-declination.com), який може забезпечити значення магнітного відхилення в режимі реального часу. Цей сайт негайно надасть магнітне відхилення для того географічного місця, з якого ви зайшли на сайт. Наприклад, для Київа маємо:


Значення магнітного відхилення в Києві на час написання цієї статті.

З інформаційного вікна в центрі показаної карти нам цікаво, головним чином, магнітне відхилення:
Magnetic declination: +7° 19′
Declination is POSITIVE (EAST)

Тепер відвідаємо сайт WolframAlpha для розрахунків і наукової інформації онлайн. Він допоможе нам легко конвертувати значення магнітного відхилення в радіани. У полі введення надрукуйте:
(7° 19') in radians


Сайт WolframAlpha дозволяє робити багато розрахунків і перетворення одиниць вимірювання онлайн


Результат перетворення в мілірадіанах.

Додаємо наступний код в функцію loop():
float declinationAngle = 127.7/1000;
heading += declinationAngle;

Це тому, що у нас відхилення EAST (Схід), але якщо відхилення WEST (ЗАХІД), то ми повинні будемо написати:
heading -= declinationAngle;
І, на завершення…
if(heading <0)
   heading += 2*PI;
if(heading > 2*PI)
   heading -= 2*PI;
float headingDegrees = heading * 180/M_PI;

(За матеріалами: meccanismocomplesso.org)

Новини

  • SDR в IoT

    iotSDR пропонує платформу розробок для IoT-радіо та мережевих доменів. На платі два передавачі Microchip AT86RF215, для вводу-виводу модему на Xilinx ZYNQ SoC, приймач GNSS MAX2769 для GPS, Galileo, BieDou та Glonass. Плата сумісна з ПЗ GNURadio SDR. Дозволяє розробити протоколи фізичного рівня LoRa, SigFox, WightLess, Bluetooth, BLE, 802.15.4, ZigBee тощо для IoT, або шлюз IoT через TheThingsNetwork, LPWAN або Google Thread. Пам'ять EEPROM: 1x AT24MAC602 , flash-пам'ять: 1x QSPI 128 Мб, RAM: 256 MБ DDR3,слот для Micro SD карти, входи/виходи: 2x 8-бітних інтерфейси PL, інтерфейс 8-бітного PS, Gigabit Ethernet, USB 2.0 (USB3310), USB 2.0 (CP2104), 2x SMA RF-роз'єми для приймача діапазонів IoT, 2x SMA RF-роз'єми для приймача 2,4 ГГц , RF-роз'єм приймач GNSS, FPGA-роз'єм JTAG для програмування. Розміри плати: 76,2 мм x 101,6 мм.

     

    in Новини

Записатися на курс