Каталог товарів
Клієнту
Тема сайту:
+38 (066) 305-77-25
Наша адреса
Харків, тимчасово - доставка тільки Новою Поштою, УкрПоштою, МістЕкспрес, ROZETKA Delivery
Телефони
Графік роботи
  • Пн-Пт: з 9 до 18
  • Сб: з 10 до 17
  • Нд: з 11 до 16
E-mail
Ми в соцмережах
Перейти до контактів
0 0
Каталог
Головна
Закладки
0
Порівняти
0
Контакти

Підключення QMC5883 датчика положення/магнітометра до Arduino

Підключення QMC5883 датчика положення/магнітометра до Arduino

Вступ

У світі навігації та точних вимірювань важливим інструментом є магнітометри. Вони дозволяють визначати напрямок у просторі завдяки магнітному полю Землі. Одним з популярних триосьових магнітометрів є датчик QMC5883. Він дозволяє вимірювати магнітне поле по трьох осях (X, Y, Z), що робить його чудовим рішенням для проектів з Arduino, де необхідно визначати напрямок або положення.

Завдяки компактним розмірам та простоті інтеграції через інтерфейс I2C, QMC5883 може бути використаний у робототехніці, компасах, навігаційних системах для безпілотних апаратів і навіть у дослідженнях магнітного поля.

Цей датчик є аналогом популярного HMC5883L, проте має деякі технічні відмінності, зокрема змінену адресу I2C. Це означає, що він не є сумісним з програмами, розробленими для HMC5883L, без внесення змін у код.

У цьому посібнику ми детально розглянемо, як підключити QMC5883 до Arduino, як налаштувати його для отримання точних даних і як використовувати ці дані для визначення напрямку або положення об'єктів.

Огляд QMC5883

QMC5883 є високоточним триосьовим магнітометром, який вимірює магнітне поле Землі по осях X, Y та Z. Це дає можливість точно визначати напрямок, що особливо корисно для проектів, пов'язаних з навігацією та компасами.

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

Завдяки чутливості в межах ±8 гаусс та роздільній здатності у 12 біт, QMC5883 забезпечує високу точність вимірювань. Ця функція особливо важлива у проектах, де потрібна надійна стабільність результатів вимірювань.

Окрім того, датчик має вбудований стабілізатор LDO, що дозволяє використовувати його при живленні 5 В, хоч інтерфейс I2C все одно працює на 3.3 В. Це робить QMC5883 зручним для різних платформ без необхідності використання перетворювачів рівнів напруги.

Завдяки своїй компактності та точності, QMC5883 часто використовується у таких проектах, як робототехніка, системи навігації для безпілотників, а також компаси для портативних пристроїв.

QMC5883 Магнітометр

Необхідні компоненти

Щоб підключити та успішно використовувати датчик QMC5883 з Arduino, вам знадобиться кілька важливих компонентів, які забезпечать коректну роботу системи.

  • Arduino — можна використовувати будь-яку модель, що підтримує протокол I2C, наприклад, Arduino Uno, Nano або Mega.
  • Датчик QMC5883 — триосьовий магнітометр, що забезпечує точне визначення положення та напрямку.
  • Кабелі Dupont — використовуються для підключення датчика до плати Arduino через макетну плату або безпосередньо.
  • Макетна плата (за бажанням) — допомагає легко з'єднувати компоненти без постійного паяння.
  • Джерело живлення (опціонально) — Arduino можна живити через USB від комп'ютера або використовувати зовнішнє живлення.

Для цього проекту не потрібно багато компонентів. QMC5883 є легким у підключенні, тому підготовка не займе багато часу.

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

Для підключення датчика QMC5883 до плати Arduino використовується стандартний протокол I2C. Цей протокол дозволяє зручно передавати дані між датчиком і мікроконтролером, використовуючи всього два дроти для зв'язку.

Основні пін-коди підключення датчика:

  • VCC — підключається до 5 В або 3.3 В на платі Arduino.
  • GND — підключається до заземлення (GND) на Arduino.
  • SDA — підключається до піну A4 (SDA) на Arduino.
  • SCL — підключається до піну A5 (SCL) на Arduino.

Переконайтеся, що правильно підключені пін-коди I2C для забезпечення стабільної передачі даних.

Після підключення ви можете використовувати кабелі Dupont для створення з'єднань на макетній платі або безпосередньо з'єднувати компоненти.

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

Встановлення бібліотеки QMC5883

Для роботи з датчиком QMC5883 ми використовуватимемо бібліотеку QMC5883LCompass, яка дозволяє зчитувати та обробляти дані магнітного поля.

Щоб встановити бібліотеку, дотримуйтесь таких кроків:

  1. Перейдіть на сторінку QMC5883LCompass.
  2. Натисніть Download ZIP та збережіть файл на вашому комп'ютері.
  3. У Arduino IDE виберіть SketchInclude LibraryAdd .ZIP Library....
  4. Оберіть завантажений ZIP-файл та натисніть Open.

Або ж ви можете встановити бібліотеку через менеджер бібліотек Arduino:

  1. Відкрийте Arduino IDE.
  2. Перейдіть до SketchInclude LibraryManage Libraries....
  3. У пошуку введіть "QMC5883LCompass" від MPrograms.
  4. Знайдіть бібліотеку та натисніть Install.
Встановлення бібліотеки qmc5883lcompass

Додаткові можливості бібліотеки:

  • Зчитування значень осей X, Y, Z.
  • Обчислення азимута (напрямку компаса).
  • Отримання 16-ти точкового напряму (0-15), що відповідає напрямкам, як-от N, NE, SE і т.д.
  • Згладжування показників XYZ через алгоритми усереднення та видалення мінімальних і максимальних значень.
  • Налаштування режиму чипа: зміна адреси I2C, режиму роботи (постійний або очікування), частоти вибірки та діапазону чутливості.
  • Функція калібрування для точних вимірювань з мінімальними похибками.

Написання коду

Щоб зчитувати дані з датчика QMC5883 за допомогою бібліотеки QMC5883LCompass, розглянемо базовий код, де кожна команда відповідає за конкретну функцію.

Приклад коду для зчитування показників осей X, Y, Z:

#include <Wire.h>  // Підключення бібліотеки для роботи з протоколом I2C
#include <QMC5883LCompass.h> // Підключення бібліотеки для роботи з датчиком QMC5883L

QMC5883LCompass compass;  // Створення об'єкта для роботи з компасом

void setup() {
  Serial.begin(9600);  // Ініціалізація серійного зв'язку для відображення результатів
  compass.init();  // Ініціалізація датчика QMC5883
}

void loop() {
  int x, y, z;  // Оголошення змінних для збереження показників осей
  compass.read();  // Зчитування значень магнітного поля з осей X, Y, Z
  x = compass.getX();  // Збереження даних осі X
  y = compass.getY();  //Збереження даних осі Y
  z = compass.getZ();  // Збереження даних осі Z
  Serial.print("X: "); Serial.print(x);  // Виведення значення осі X
  Serial.print(" Y: "); Serial.print(y);  // Виведення значення осі Y
  Serial.print(" Z: "); Serial.println(z);  // Виведення значення осі Z і перехід на нову стрічку
  delay(500);  // Затримка в 500 мілісекунд перед наступним зчитуванням
}
  

Цей код забезпечує зчитування значень магнітного поля по трьох осях (X, Y, Z) і виводить їх у серійний монітор кожні 500 мілісекунд.

Обчислення азимута (напрямку)

Бібліотека також дозволяє обчислювати азимут — напрямок у градусах. Це зручно для визначення орієнтації компаса або пристрою. Ось як це реалізувати:

#include <QMC5883LCompass.h>  // Підключення бібліотеки для роботи з датчиком QMC5883L

QMC5883LCompass compass;  // Створення об'єкта для взаємодії з компасом

void setup() {
  Serial.begin(9600);  // Ініціалізація серійного зв'язку зі швидкістю 9600 біт/с
  compass.init();  // Ініціалізація датчика QMC5883L
}

void loop() {
  int a;  // Змінна для збереження значення азимута
  
  compass.read();  // Зчитування даних з датчика компаса

  a = compass.getAzimuth();  // Отримання значення азимута (напрямку)

  Serial.print("Азимут: ");  // Виведення тексту "Азимут: " у серійний монітор
  Serial.println(a);  // Виведення значення азимута та перехід на нову стрічку

  delay(500);  // Затримка 500 мс перед наступним вимірюванням
}  

У цьому прикладі функція getAzimuth() повертає значення азимута в градусах, що дозволяє визначати напрямок, у якому спрямований датчик.

Отримання напрямків компаса (16 точок)

Окрім градусів, ви також можете отримати назви напрямків компаса, наприклад, N (північ), NE (північний схід) тощо. Ось як це зробити:

#include <QMC5883LCompass.h>

QMC5883LCompass compass;

void setup() {
  Serial.begin(9600);  // Ініціалізація серійного монітора
  compass.init();  // Ініціалізація компаса
}

void loop() {
  int a, b;  // Змінні для збереження азимута та напрямку
  char direction[3];  // Масив для зберігання текстового напрямку

  compass.read();  // Зчитування даних з компаса

  a = compass.getAzimuth();  // Отримання азимута в градусах
  b = compass.getBearing(a);  // Отримання напрямку (0-15)
  compass.getDirection(direction, a);  // Отримання текстової назви напрямку (N, NE, E і т.д.)

  // Виведення напрямку
  Serial.print("Напрямок: ");
  Serial.print(direction[0]);  // Перший символ напрямку (наприклад, "N")
  Serial.print(direction[1]);  // Другий символ (якщо є)
  Serial.print(direction[2]);  // Третій символ (якщо є)
  Serial.println();  // Перехід на новий рядок

  delay(500);  // Затримка перед наступним вимірюванням
}

Функція getDirectionName() повертає назву напрямку, що дозволяє використовувати ці дані для навігаційних або орієнтаційних проектів.

Калібрування датчика QMC5883

Для точних вимірювань магнітного поля, необхідно виконати калібрування датчика QMC5883. Бібліотека QMC5883LCompass надає спеціальну утиліту для калібрування, що допоможе налаштувати датчик відповідно до вашого середовища.

Крок 1: Запуск ескізу калібрування

Для початку переконайтеся, що ваш датчик QMC5883 підключений до Arduino, а потім відкрийте в Arduino IDE приклад калібрування:

  1. Виберіть ПРИКЛАДИQMC5883LCOMPASSCALIBRATION.
  2. Завантажте ескіз на ваш Arduino та відкрийте серійний монітор.
  3. Переміщуйте датчик у різних напрямках, слідуючи інструкціям на екрані серійного монітора.

Під час калібрування збиратимуться мінімальні та максимальні значення для кожної осі (X, Y, Z). Коли процес завершиться, система надасть вам рядок коду, подібний до:

compass.setCalibration(-1537, 1266, -1961, 958, -1342, 1492);
  

Скопіюйте цей код та збережіть його для подальшого використання.

Крок 2: Використання даних калібрування

Після калібрування ви можете використовувати отримані дані у своєму проекті. Для цього відкрийте свій проект та додайте рядок калібрування безпосередньо під виклик compass.init():

compass.init();
compass.setCalibration(-1537, 1266, -1961, 958, -1342, 1492);
  
QMC5883 Калібрування

Тепер ваш датчик відкалібровано, і ви можете використовувати його для точних вимірювань магнітного поля.

Рекомендація

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

compass.setCalibration(X_MIN, X_MAX, Y_MIN, Y_MAX, Z_MIN, Z_MAX);
  

Приклад коду для калібрування

Нижче наведено приклад коду для калібрування датчика QMC5883. Цей код дозволяє вам зібрати дані калібрування для подальшого використання:

#include <QMC5883LCompass.h>  // Підключення бібліотеки для роботи з QMC5883L

QMC5883LCompass compass;  // Створення об'єкта для роботи з датчиком компаса

void setup() {
  Serial.begin(9600);  // Ініціалізація серійного монітора для виведення даних
  compass.init();  // Ініціалізація датчика QMC5883L
  
  Serial.println("This will provide calibration settings for your QMC5883L chip. When prompted, move the magnetometer in all directions until the calibration is complete.");  // Виведення інструкцій для користувача
  Serial.println("Calibration will begin in 5 seconds.");  // Виведення інструкції про початок калібрування через 5 секунд
  delay(5000);  // Затримка на 5 секунд перед початком калібрування

  Serial.println("CALIBRATING. Keep moving your sensor...");  // Інструкція для користувача про початок калібрування
  compass.calibrate();  // Виконання процесу калібрування

  Serial.println("DONE. Copy the lines below and paste it into your projects sketch.");  // Повідомлення про завершення калібрування
  Serial.println();
  Serial.print("compass.setCalibrationOffsets(");  // Виведення результату калібрування для мінімальних та максимальних значень
  Serial.print(compass.getCalibrationOffset(0));  // Виведення калібрування для осі X
  Serial.print(", ");
  Serial.print(compass.getCalibrationOffset(1));  // Виведення калібрування для осі Y
  Serial.print(", ");
  Serial.print(compass.getCalibrationOffset(2));  // Виведення калібрування для осі Z
  Serial.println(");");
  Serial.print("compass.setCalibrationScales(");  // Виведення масштабування для осей
  Serial.print(compass.getCalibrationScale(0));  // Виведення масштабування для осі X
  Serial.print(", ");
  Serial.print(compass.getCalibrationScale(1));  // Виведення масштабування для осі Y
  Serial.print(", ");
  Serial.print(compass.getCalibrationScale(2));  // Виведення масштабування для осі Z
  Serial.println(");");
}

void loop() {
  delay(1000);  // Немає потреби в повторному циклі після завершення калібрування
}
  

Код калібрування допомагає зібрати дані для налаштування вашого датчика на подальші точні вимірювання.

Тестування на практиці та виведення результатів

Після успішного калібрування датчика QMC5883, необхідно протестувати його роботу і переконатися, що він коректно зчитує дані та виводить точні результати. Для цього використовуємо серійний монітор Arduino IDE для виведення показників осей та азимута.

Код для тестування

Нижче наведено приклад коду для тестування роботи датчика. Він виводить значення осей X, Y, Z та азимут та напрямок у серійний монітор:

#include <QMC5883LCompass.h>  // Підключення бібліотеки для роботи з датчиком QMC5883L

QMC5883LCompass compass;  // Створення об'єкта для роботи з компасом

void setup() {
  Serial.begin(9600);  // Ініціалізація серійного монітора для виведення даних
  compass.init();  // Ініціалізація датчика QMC5883L
}

void loop() {

  int x, y, z, a, b;  // Оголошення змінних для збереження значень осей, азимута та напрямку
  char myArray[3];  // Масив для збереження текстової назви напрямку (наприклад, N, NE)

  compass.read();  // Зчитування значень з датчика компаса

  x = compass.getX();  // Отримання значення по осі X
  y = compass.getY();  // Отримання значення по осі Y
  z = compass.getZ();  // Отримання значення по осі Z

  a = compass.getAzimuth();  // Отримання азимута в градусах (0-360°)

  b = compass.getBearing(a);  // Обчислення напрямку на основі азимута

  compass.getDirection(myArray, a);  // Отримання текстової назви напрямку (наприклад, "N", "NE")

  // Виведення даних на серійний монітор українською мовою
  Serial.print("X: ");  // Виведення значення осі X
  Serial.print(x);

  Serial.print(" Y: ");  // Виведення значення осі Y
  Serial.print(y);

  Serial.print(" Z: ");  // Виведення значення осі Z
  Serial.print(z);

  Serial.print(" Азимут: ");  // Виведення азимута
  Serial.print(a);

  Serial.print(" Напрямок (число): ");  // Виведення числового напрямку
  Serial.print(b);

  Serial.print(" Напрямок (текст): ");  // Виведення текстової назви напрямку (наприклад, N)
  Serial.print(myArray[0]);  // Перший символ текстового напрямку
  Serial.print(myArray[1]);  // Другий символ (якщо є)
  Serial.print(myArray[2]);  // Третій символ (якщо є)

  Serial.println();  // Перехід на новий рядок після виведення даних

  delay(500);  // Затримка на 250 мс перед наступним зчитуванням даних
}

Пояснення коду

  • compass.setCalibration(...) — задає калібрувальні дані, отримані раніше.
  • compass.read(&x, &y, &z) — зчитує значення магнітного поля по трьох осях.
  • compass.getAzimuth() — обчислює азимут у градусах, що вказує напрямок компаса.

Після завантаження цього коду на плату Arduino, відкрийте серійний монітор, щоб побачити значення, які генерує датчик. Це дозволить переконатися, що калібрування пройшло успішно і всі показники працюють коректно.

Аналіз результатів

Перевіряйте значення осей X, Y, Z — вони повинні змінюватися відповідно до положення датчика в просторі. Значення азимута також повинні коректно змінюватися під час повороту датчика. Якщо дані не відповідають очікуванням, перевірте підключення та налаштування калібрування.

QMC5883 результати

Висновок

Датчик QMC5883 допоможе вам точно визначати напрямок і орієнтацію. Ми вже пройшли через підключення, налаштування, калібрування та тестування — залишилось лише застосувати це на практиці.

Успіхів з QMC5883! А ми вже гарно попрацювали, тож час трохи відпочити.

Хвилинка настрою: Іноді магнітне поле може вас "направити" у напрямку, який аж ніяк не очікував!


Коли підключаєш датчик магнітного поля, а він показує: "Холодильник - на Північ"  — може, це не полярність, а просто настав час з'їсти шматочок  сала з часником!☕

© 2024 Мій Проект. Автор матеріалу Jazzzman. Використання матеріалів дозволено лише з посиланням на джерело.