Главная » Arduino
Призовой фонд
на октябрь 2021 г.
1. Рюкзак Mean Well
Компэл
2. Инвертор авто Mean Well 150 Ватт
Компэл
3. Термос MeanWell
Компэл
4. 100 руб.
От пользователей

Похожие статьи:


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° - юг. Помните, что датчик очень чувствителен к любым намагниченным предметам, а также к сотовым телефонам и другим подобным устройствам излучающих магнитные поля. Также датчик необходимо располагать строго в горизонтальной плоскости, стоит его наклонить и тогда данные будут неверные. При применении цифровых компасов в робототехнике это необходимо учитывать и обычно, такие цифровые компасы применяют в паре с цифровым акселерометром, для компенсации наклона.

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

Теги:

Колтыков А.В. Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (10) | Я собрал (0) | Подписаться

0
Люк #
Получаю значения в диапазоне 200-340. Что это, неисправность компаса?
Ответить
0
RT3R #
У меня постоянно выдает одно значение 69.20. В чем может быть проблема?
Ответить
0
Вьвла #
Ножки а5 с а4 поменяй
Ответить
0
chg #
Исходник почему то не работает, компилятор ругается на строчку "HMC5883L compass; " что может быть? Пишет мол does not name a type
Ответить
0
Hausauer #
Направление движения, которой считается в данном примере, никогда не будет правильным, так как каждая ось (X,Y,Z) имеет свою собственную погрешность, что выражается в различных значениях амплитуд (при повороте датчика на 360 градусов). Поэтому мало того, что каждая ось имеет различную амплитуду синусоиды (данные изменяются по синусоидальному закону), так еще и каждая синусоида смещена (вверх/вниз) относительно друг друга. Поэтому нельзя просто взять и посчитать направление, как heading = atan2(scaled.YAxis, scaled.XAxis) - это только возможно в идеальном случае.
Ответить
0
atom #
У меня тоже проблема с "HMC5883L compass; "
Подскажите начинающим что не так?
Ответить
0
Paul #
Моя платка 3,3v не работает, запустилась только на 5v
Ответить
0
Конст #
проблема с "HMC5883L compass; "
Установите библиотеку. Папку HMC5883L (вытащите её, она в папке HMC5883L(Arduino)[V4]) в папку .../arduino/libraries
Ответить
0
Алексей #
Как сделать так что бы на COM порт выходил сигнал NMEA HDG ?
Ответить
0
Владислав #
Добрый вечер. требуется поворот на 180 градусов, точность 0.2 градуса. Что посоветуете?
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Raspberry Pi 2
Raspberry Pi 2
AVR-программатор USB ASP DC-DC регулируемый преобразователь 1.5-37В 2А с индикатором
вверх