Каталог товаров
Клиенту
+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("Это предоставит настройки калибровки для вашего чипа QMC5883L. Когда будет предложено, перемещайте магнитометр во всех направлениях, пока калибровка не будет завершена.");  // Вывод инструкций для пользователя
  Serial.println("Калибровка начнется через 5 секунд.");  // Вывод инструкции о начале калибровки через 5 секунд
  delay(5000);  // Задержка на 5 секунд перед началом калибровки

  Serial.println("КАЛИБРОВКА. Продолжайте перемещать ваш датчик...");  // Инструкция для пользователя о начале калибровки
  compass.calibrate();  // Выполнение процесса калибровки

  Serial.println("ГОТОВО. Скопируйте строки ниже и вставьте их в скетч вашего проекта.");  // Сообщение о завершении калибровки
  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: ");
  Serial.print(x);

  Serial.print(" Y: ");
  Serial.print(y);

  Serial.print(" Z: ");
  Serial.print(z);

  Serial.print(" Азимут: ");
  Serial.print(a);

  Serial.print(" Направление (число): ");
  Serial.print(b);

  Serial.print(" Направление (текст): ");
  Serial.print(myArray[0]);  // Первый символ текстового направления
  Serial.print(myArray[1]);  // Второй символ (если есть)
  Serial.print(myArray[2]);  // Третий символ (если есть)

  Serial.println();  // Переход на новую строку после вывода данных

  delay(500);  // Задержка перед следующим считыванием данных
}

Объяснение кода

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

После загрузки этого кода на плату Arduino, откройте серийный монитор, чтобы увидеть значения, которые генерирует датчик. Это позволит убедиться, что калибровка прошла успешно и все показатели работают корректно.

Анализ результатов

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

QMC5883 результаты

Заключение

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

Успехов с QMC5883! А мы уже хорошо поработали, так что время немного отдохнуть.

Минуточка настроения: Иногда магнитное поле может "направить" вас в сторону, которой совсем не ожидали!


Когда подключаешь датчик магнитного поля, а он показывает: "Холодильник — на Север" — может, это не полярность, а просто пришло время съесть кусочек сала с чесноком!☕

© 2024 Мій Проект. Автор материала Jazzzman. Использование материалов разрешено только с указанием источника.