Arduino UNO урок 14 - Підключаємо цифровий компас HMC5883L
Мікросхема HMC5883L представляє собою 3-осний цифровий компас, що працює по шині I2C. У якості сенсорів використовуються три магніторезистивних датчика. Розробник: компанія Honeywell. Даташит PDF. Напруга живлення складає 2.2-3.6В. Чутливість датчика складає 5 мілігаус.
Датчик може використовуватися в мобільних телефонах, планшетах, навігаційному обладнанні та іншій споживчій електроніці, але для радіолюбителів він може бути цікавим тим, що цифровий компас може дуже знадобитися при конструюванні роботів і радіокерованих моделей. У цьому уроці ми розглянемо підключення HMC5883L до Arduino. Оскільки датчик працює по шині I2C, схема підключення вкрай проста:
Оскільки сам чіп компаса дуже маленький 3x3 мм (16-вивідний LPCC корпус), то деякі фірми випускають плати з зручними виводами для підключення і припаяними підтягувачами. Саме таку плату ми і будемо використовувати в якості прикладу.
Вивід SDA чіпа підключаємо до виводу SDA плати Arduino (зазвичай Analog IN 4), а вивід SCL чіпа відповідно до виводу SCL плати Arduino (зазвичай Analog IN 5). На Arduino Mega це 20 і 21 пін. І не забуваємо живлення 3.3В та загальний GND.
На сайті bildr існує готова бібліотека для роботи з датчиком. Нею ми і скористаємося (трохи виправивши помилку при перевірці діапазону scale). Папку HMC5883L помістіть у ваш каталог Libraries. Код роботи з датчиком:
#include "Wire.h" #include "HMC5883L.h" HMC5883L compass; void setup(){ Serial.begin(9600); Wire.begin(); compass = HMC5883L(); // створюємо екземпляр HMC5883L бібліотеки setupHMC5883L(); // ініціалізація HMC5883L } void loop(){ float heading = getHeading(); Serial.println(heading); delay(250); } void setupHMC5883L(){ // ініціалізація HMC5883L, і перевірка наявності помилок int error; error = compass.SetScale(0.88); // чутливість датчика з діапазону: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1 if(error != 0) Serial.println(compass.GetErrorText(error)); // якщо помилка, то виводимо її error = compass.SetMeasurementMode(Measurement_Continuous); // установка режиму вимірювань як Continuous (безперервний) if(error != 0) Serial.println(compass.GetErrorText(error)); // якщо помилка, то виводимо її } float getHeading(){ // зчитуємо дані з HMC5883L і розраховуємо напрямок MagnetometerScaled scaled = compass.ReadScaledAxis(); // отримуємо масштабовані елементи з датчика float heading = atan2(scaled.YAxis, scaled.XAxis); // висчитываем направление // коригуємо значення з урахуванням знаків if(heading < 0) heading += 2*PI; if(heading > 2*PI) heading -= 2*PI; return heading * RAD_TO_DEG; // переводимо радіани в градуси }
Чутливість датчика задається функцією SetScale() і може бути вибрана лише з наступних значень: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1. Більш детально читайте даташит.
Після завантаження скетчу в контролер Arduino і запуску утиліти моніторингу порту, ви повинні побачити надходять дані з датчика:
Обертання датчика навколо своєї осі буде змінювати градус повороту. 0° - це буде північ, а 180° - південь. Пам'ятайте, що датчик дуже чутливий до будь-яких намагнічених предметів, а також до мобільних телефонів та інших подібних пристроїв, які випромінюють магнітні поля. Також датчик необхідно розташовувати строго в горизонтальній площині, якщо його нахилити, то дані будуть неправильними. При використанні цифрових компасів у робототехніці це необхідно враховувати, і зазвичай такі цифрові компаси використовують у парі з цифровим акселерометром для компенсації нахилу.
- HMC5883L.rar (6 Кб)