Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 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 чел.

Комментарии (11) | Я собрал (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 градуса. Что посоветуете?
Ответить
0
Мирон #
Если использовать скетч тут, то значение в диапазоне от 120 до 237, если использовать пример библиотеки, то 4.83 радианса и 278.87 degress что делать? Порты переподключал, не помогло
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется сила тока?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Паяльник с регулировкой температуры Конструктор - темброблок на LM1036
вверх