Arduino UNO урок 14 - Підключаємо цифровий компас HMC5883L

HMC5883L

Мікросхема HMC5883L представляє собою 3-осний цифровий компас, що працює по шині I2C. У якості сенсорів використовуються три магніторезистивних датчика. Розробник: компанія Honeywell. Даташит PDF. Напруга живлення складає 2.2-3.6В. Чутливість датчика складає 5 мілігаус.

Датчик може використовуватися в мобільних телефонах, планшетах, навігаційному обладнанні та іншій споживчій електроніці, але для радіолюбителів він може бути цікавим тим, що цифровий компас може дуже знадобитися при конструюванні роботів і радіокерованих моделей. У цьому уроці ми розглянемо підключення HMC5883L до Arduino. Оскільки датчик працює по шині I2C, схема підключення вкрай проста:

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

Оскільки сам чіп компаса дуже маленький 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 і запуску утиліти моніторингу порту, ви повинні побачити надходять дані з датчика:

Дані від датчика HMC5883L

Обертання датчика навколо своєї осі буде змінювати градус повороту. 0° - це буде північ, а 180° - південь. Пам'ятайте, що датчик дуже чутливий до будь-яких намагнічених предметів, а також до мобільних телефонів та інших подібних пристроїв, які випромінюють магнітні поля. Також датчик необхідно розташовувати строго в горизонтальній площині, якщо його нахилити, то дані будуть неправильними. При використанні цифрових компасів у робототехніці це необхідно враховувати, і зазвичай такі цифрові компаси використовують у парі з цифровим акселерометром для компенсації нахилу.

Прикріплені файли:
Top