Arduino UNO урок 14 - цифровой компас HMC5883L |
Микросхема HMC5883L представляет собой 3-х осевой цифровой компас, работающий по шине I2C. В качестве сенсоров используется три магниторезистивных датчика. Напряжение питания составляет 2.2-3.6В. Чувствительность датчика составляет 5 миллигаусс.
Датчик может использоваться в мобильных телефонах, планшетах, навигационном оборудовании и прочей потребительской электронике, но для радиолюбителей он может быть интересен тем, что цифровой компас может очень пригодится при конструировании роботов и радиоуправляемых моделей. В данном уроке мы рассмотрим подключение HMC5883L к Arduino. Т.к. датчик работает по шине I2C, то схема подключения предельно проста:
![](https://kazus.ru/nuke/objects/circuits/U/ud6f0x1tehs8w575qu522m872752qroe/image/213.png)
Т.к. сам чип компаса очень маленький 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 и запуске утилиты мониторинга порта, вы должны увидеть поступающие данные с датчика:
![](https://kazus.ru/nuke/objects/circuits/U/ud6f0x1tehs8w575qu522m872752qroe/image/39.png)
Вращая датчик вокруг своей оси, будет изменяться градус поворота. 0° - это будет север, а 180° - юг. Помните, что датчик очень чувствителен к любым намагниченным предметам, а также к сотовым телефонам и другим подобным устройствам излучающих магнитные поля. Также датчик необходимо располагать строго в горизонтальной плоскости, стоит его наклонить и тогда данные будут неверные. При применении цифровых компасов в робототехнике это необходимо учитывать и обычно, такие цифровые компасы применяют в паре с цифровым акселерометром, для компенсации наклона.
Скетч и библиотеку можно скачать по этой ссылке.
C этой схемой также часто просматривают: |
Цифровой тахометр
Цифровой регулятор мощности
Цифровой таймер для электробытовых машин и приборов
ЦИФРОВОЙ ВОЛЬТМЕТР НА МИКРОСХЕМЕ С520
ЦИФРОВОЙ ИЗМЕРИТЕЛЬ ЧАСТОТЫ ПРИЕМА
Arduino UNO урок 13 - драйвер двигателя L298N
Arduino UNO урок 12 - Подключение джойстика
Arduino UNO урок 11 - Serial LCD
Arduino UNO урок 10 - Подключаем LCD
| ![](/images/ru/clear.gif) |
Графический семиполосный эквалайзер-радуга на Arduino Nano и MSGEQ7
Часы реального времени для Arduino
Старинные часы-метеостанция
Блок питания для Arduino из ATX
ATX блок питания управляемый Arduino
Arduino своими руками с USB портом
Подключение монетоприемника к Arduino
Подключение PS/2 клавиатуры к Arduino
Пробуждение ПК по сети на Arduino
Запись/чтение на SD-карту с Arduino
|