arduino компас с компенсацией наклона

Делаем компас на основе Ардуино своими руками

Мы все знаем, что такое компас и для чего он используется. Компас сообщает нам направления, то есть E-W-N-S (восток-запад-север-юг). Традиционный компас работает с магнитной иглой. Северный полюс иглы всегда указывает на географический северный полюс Земли с магнитным югом.

Датчик, который мы используем, MPU9250 имеет магнитометр, который может измерять магнитную интенсивность в заданном направлении. Ограничимся только осями X и Y, чтобы немного упростить задачу.

Комплектующие

arduino kompas 1

arduino kompas 2

Список компонентов для создания компаса на основе Ардуино довольно небольшой:

Конструкция

arduino kompas korpus 1

arduino kompas korpus 1 1

arduino kompas korpus 2

arduino kompas korpus 3

В качестве основного корпуса берем простой кусок древесины и обрезаем ее примерно до 10 см. Затем мы отмечаем два отверстия по длине IC. Важно, чтобы вы правильно установили IC. Если вы сделали что-то не так, пожалуйста, используйте другую сторону или даже лучше, используйте другой кусок дерева. Не пытайтесь исправить кривое отверстие. Винт может плохо удерживать плату в таком случае. В целом процесс создания конструкции компаса Ардуино можно увидеть на фото выше.

Соединения

arduino kompas shema 1

arduino kompas shema 2

arduino kompas shema 3

С протоколом I2C схема соединения в нашем компасе будет несложной, делаем соединения следующим образом:

SDA A4
SCl A5
VCC 5V
GND GND

Убедитесь, что проводные соединения надежны и исправны. Убедитесь, что вы использовали достаточную длину провода.

Код для компаса

Скопировать или скачать код компаса Ардуино вы можете ниже:

Стоит сказать, что предварительно нужно установить библиотеку MPU9250, которые вы можете взять на GitHub по этой ссылке.

Взглянув на серийный монитор, стало ясно, что значения были не в фазе. После некоторого тестирования, наконец, получилось произвести приличную синусоидальную функцию. Ниже вы можете увидеть её, скачав Excel-файл (в архиве):

На этом процесс создания компаса на основе Ардуино завершен. Желаем вам удачных проектов.

Источник

Как сделать электронный компас на датчике MPU-9250 и Arduino

Разобьём всю задачу на более мелкие подзадачи. Так сказать, проведём декомпозицию. И по шагам опишем весь процесс создания электронного компаса. Для проекта нам понадобятся:

1 Подключение датчика MPU-9250к Arduino

Датчик MPU-9250 – это по сути несколько датчиков, расположенных на одном чипе. Так, он реализует функции 3-осевого гироскопа, 3-осевого акселерометра и 3-осевого магнитометра. В данном проекте мы будем использовать только магнитометр. Остальные датчики можно отключить в целях уменьшения потребляемого тока, т.к. будем делать портативное устройство, питающееся от батареи «Крона».

01 Внешний вид модуля с датчиком MPU-9250

Модуль имеет 10 выводов. Вот их назначение:

Вывод Назначение вывода модуля с MPU-9250 (MPU-9255)
VCC Внешнее питание 3.3 В.
GND Общий.
SCL Линия тактовых импульсов I2C и SPI.
SDA Линия данных для I2C или SPI.
EDA Линия данных при подключении внешних датчиков по шине I2C.
ECL Линия тактов при подключении внешних датчиков по шине I2C.
AD0 Для выставления адреса I2C в режиме I2C. В режиме SPI это линия данных от датчика.
INT Линия прерываний. Срабатывание настраивается при конфигурировании датчика MPU-9250.
NCS В режиме SPI – линия выбора ведомого (chip select). В режиме I2C не соединяется ни с чем.
FSYNC Зависит от конфигурации.

Прежде чем подключать датчик MPU-9250 к Arduino, проверим его работоспособность с помощью моей любимой платы с микросхемой FT2232H. Для самого простого теста прочитаем содержимое регистра датчика, в котором содержится постоянное значение. Таким регистром может служить, например, регистр, в котором хранится идентификатор магнитометра, равный 0x48. Подключаться будем по интерфейсу I2C (для сокращения числа проводников). Как и большинство датчиков, MPU-9250 является ведомым на I2C шине. Схема подключения предельно проста: питание +3.3 В подаётся на вывод VCC, земля – GND, тактовая частота приходит на вывод SCL с ножки ADBUS0 микросхемы FT2232, линия данных SDA подключается одновременно к выводам ADBUS1 и ADBUS2 микросхемы FT2232.

02 Подключение датчика MPU-9250 по I2C в качестве ведомого к микросхеме FT2232H

Теперь, когда всё подключено, запускаем в режиме I2C программу SPI via FTDI, многократно описанную нами ранее. Оставляем настройки по умолчанию и сканируем шину I2C. Мы увидим, что программа обнаружила на шине одно устройство по адресу 0x68. Если прочитать из него 127 байтов (именно столько регистров имеет датчик MPU9250, техническое описание можно скачать в приложении к статье), то увидим следующее:

after init Чтение всех регистров датчика MPU-9250 по I2C с помощью FT2232

Здесь нет показаний магнитометра. Магнитометр (он называется AK8963) – это отдельное устройство на кристалле, которое не активно при подаче питания на датчик MPU-9250. Его нужно активировать явно. Для этого необходимо в регистр под номером 0x37 (INT_PIN_CFG) записать значение 0x02. Для этого в программе в поле записи укажем команду «37 02», как на рисунке, и нажмём кнопку «Записать». Полное описание регистра приводится далее.

set magnet addr Включение магнитометра датчика MPU-9250 через регистр I2C_SLV0_ADDR

Карта регистров магнитометра AK8963 представляет собой довольно короткую таблицу, состоящую всего из 13-ти байтов:

mag reg map Карта регистров магнитометра MPU-9250 read magnetometer Чтение регистров магнитометра MPU-9250 по I2C

Как видно, по адресу 0x00 размещается постоянный Device ID, который должен быть равен 0x48. В нашем случае так и есть. Это хороший признак. Значит, магнитометр как минимум отвечает осмысленные данные, а мы можем их читать.

Схема подключений датчика MPU-9250 к Arduino остаётся предельно простой:

Вывод датчика MPU-9250 Вывод Arduino
SCL A5
SDA A4
VCC +3.3V
GND GND

Для того чтобы использовать датчик MPU-9250 в режиме магнитометра, следует придерживаться такой последовательности действий:

Реализуем это в следующем коде.

Скетч для чтения показаний датчика MPU-9255 (разворачивается)

Теперь остаётся перевести показания индукции магнитного поля в азимут. Для этого воспользуемся следующей формулой:

Будем двигаться к следующей задаче.

2 Подключение 7-сегментного светодиодногоиндикатора к Arduino

В качестве индикатора для вывода показаний компаса будем использовать семисегментный индикатор 3361AS-1. Он построен по принципу индикатора с общим катодом.

Светодиодный индикатор с общим катодом – это тип индикатора, состоящий из нескольких светодиодов в одном корпусе, у которых общая земля, а питание на каждый светодиод подаётся отдельно.

Напомню, что 7-сегментным индикатор называется из-за того, что он состоит из 7-ми светодиодов, которые расположены в форме цифры «8». Зажигая определённые сегменты, можно изображать разные цифры. Это похоже на цифры индекса на почтовом конверте: закрашивая определённые участки, мы пишем разные индексы. Зачастую дополнительно к 7-ми сегментам, индикатор содержит десятичную точку. Также индикатор может иметь несколько цифр – разрядов. Сегменты индикатора обозначаются латинскими буквами от A до G, как на рисунке.

7 seg disp Обозначение сегментов индикатора латинскими буквами

Воспользуемся популярным способом управления 7-сегментным индикатором с помощью драйвера CD4511. Это микросхема двоично-десятичного преобразователя, который переводит двоичный код числа в напряжение на соответствующих цифре сегментах индикатора. Такой преобразователь использует всего 4 ножки Arduino. Например, если необходимо отобразить на индикаторе десятичное число «7», следует выставить на входе преобразователя двоичное «0111». Микросхема CD4511 выполняется в разных типах корпусов. Назначение выводов в исполнении с 16-тью ножками, такое:

cd4511 Выводы двоично-десятичного преобразователя CD4511

Отечественными аналогами данного преобразователя являются микросхемы серий ИД1…ИД7.

При подключении двоичного декодера будем руководствоваться следующей таблицей:

Вывод CD4511 Назначение Примечание
A0. A3 Входы двоичного преобразователя Соответствуют разрядам двоичного числа.
a. g Выходы на сегменты индикатора Подключаются через токоограничительные резисторы к соответствующим сегментам светодиодного индикатора.
Lamp Test# Тест индикатора (включает все сегменты) Подключим к питанию, не использовать его.
Blanking# Очистка индикатора (отключает все сегменты) Подключим к питанию, чтобы не использовать его.
Latch Enabled# Выход активен Будет подключен к земле, чтобы выход был всегда активен.
VDD Питание микросхемы и индикатора От 3 до 15 В.
GND Земля Общая у CD4511, Arduino, 7-сегментного индикатора.

Индикатор 3361AS не имеет токоограничительных резисторов, поэтому необходимо озаботиться этим самому, подключая индикатор. При напряжении питания 5 В сопротивление на каждый сегмент должно быть около 200 Ом.

Желательно также подключить керамический конденсатор ёмкостью примерно 1 мкФ между землёй и питанием микросхемы CD4511.

Нам нужно одновременно управлять тремя разрядами десятичного числа, используя только один преобразователь CD4511. Но чисто физически это невозможно. Однако можно добиться иллюзии постоянного свечения всех разрядов светодиодного индикатора. Для этого придётся быстро переключаться между разрядами, постоянно обновляя показание каждого разряда. Мы будем поочерёдно активировать каждый из разрядов индикатора 3361AS, выставлять на нём с помощью двоичного преобразователя CD4511 нужную цифру, а затем переключаться на следующий разряд.

Для человеческого глаза такое переключение между разрядами будет незаметно, но если результат снять на видео, то можно увидеть, как мерцают разряды чисел при переключении между разрядами, и даже мерцание отдельных светодиодов.

Скетч для управления трёхразрядным 7-сегментным индикатором (разворачивается) 04 Управление трёхразрядным семисегментным индикатором с помощью преобразователя CD4511 и Arduino

Итак, теперь мы умеем выводить трёхзначные числа на 7-сегментный индикатор, что нам понадобится для отображения азимута.

3 Подключение динамика / пьезоизлучателяк Arduino

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

Схема подключения излучателя к Arduino очень простая: объединяем земли, а в цепь питания ставим резистор сопротивлением около 100 Ом (для защиты порта Ardunio).

buzzer Схема подключения пьезоизлучателя к Arduino

Для Arduino есть специальные функции tone() и noTone(), которые используются для извлечения звука заданной частоты:

Здесь piezoPin – номер вывода Arduino, к которой подключён звуковой извещатель. Давайте изменим в предыдущем скетче функцию loop() таким образом (изменения выделены жирным):

И конечно же, не забудем объявить в начале скетча piezoPin и задать ему режим работы OUTPUT. Теперь каждую минуту излучатель будет подавать звуковой сигнал продолжительностью 500 мс и частотой 1000 Гц.

4 Собираем всё вместе:компас на Arduino

Схема нашего устройства будет такой (нарисована в DipTrace Schematic):

schematic Схема электронного компаса на MPU-9255 и Arduino

Здесь ARD1 – это Arduino Nano, CD4511 – драйвер управления 7-сегментным дисплеем 3361AS, MPU-9255 – собственно, сам модуль с магнитным датчиком, SW1 – кнопка для запуска и останова отслеживания азимута, BUZ – звуковой извещатель, а PWR – клемма для подачи внешнего питания от батареи «Крона» на устройство.

Монтаж компаса будем производить на печатной плате, которую «разведём» в программе DipTrace PCB Layout.

board Печатная плата для электронного компаса на Arduino

Закажем печатную плату здесь. На этом предприятии делают всё быстро и качественно. Например, изготовление данной печатной платы заняло около суток от момента заказа до отправки. Единственный минус – придётся долго ждать доставки из Китая (2-4 недели).

pcb Печатная плата для электронного компаса на MPU-9255 и Arduino

Распаяем элементы на плате.

mpu9250 solder Пайка радиоэлементов на плате электронного компаса MPU-9250

После распайки компонентов плата электронного компаса будет выглядеть так:

pcb soldered Печатная плата для электронного компаса с распаянными элементами

Останется только придумать какой-то корпус для платы с компасом.

compass assembly Сборка платы с датчиком MPU-9250 в корпус

В процессе экспериментов выяснились несколько деталей, которые потребовали доработки. Во-первых, динамик вносит искажения в показания компаса. Величина искажения зависит от типа динамика и его близости к датчику. Поэтому его желательно отнести подальше от датчика, а не размещать непосредственно на плате.

pcb powered Электронный компас в процессе отладки

Во-вторых, изначальный скетч определения азимута выводит довольно приблизительные и нестабильные измерения. Поэтому в части работы компаса всё было переделано. Я взял за основу скетч, представленный в этой статье. Он отличается тем, что используются показания акселерометра для коррекции наклона датчика, а также вводятся дополнительные коррекции, связанные с индивидуальными особенностями датчика (в частности, чувствительность ASAX, ASAY, ASAZ). Для нормальной работы этого скетча необходимо сделать следующее.

Для всего описанного ниже переменная DEBUG в скетче должна быть true. Более подробные пояснения приводятся в самом скетче.

От того, насколько качественно вы сделаете предварительную работу, будет сильно зависеть работа и стабильность показаний компаса.

Скетч для магнитного компаса на датчике MPU-9250/MPU-9255 (разворачивается)

Источник

arduino72 1

Микросхема HMC5883L представляет собой 3-х осевой цифровой компас, работающий по шине I 2 C. В качестве сенсоров используется три магниторезистивных датчика. Разработчик: компания Honeywell. Даташит PDF. Напряжение питания составляет 2.2-3.6В. Чувствительность датчика составляет 5 миллигаусс.

Датчик может использоваться в мобильных телефонах, планшетах, навигационном оборудовании и прочей потребительской электронике, но для радиолюбителей он может быть интересен тем, что цифровой компас может очень пригодится при конструировании роботов и радиоуправляемых моделей. В данном уроке мы рассмотрим подключение HMC5883L к Arduino. Т.к. датчик работает по шине I 2 C, то схема подключения предельно проста:

arduino72 2

Т.к. сам чип компаса очень маленький 3×3 мм (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. Код работы с датчиком:

Чувствительность датчика задается функцией SetScale() и может быть выбрана только из следующих значений: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1. Более подробно читайте даташит.

После загрузки скетча в контроллер Arduino и запуске утилиты мониторинга порта, вы должны увидеть поступающие данные с датчика:

arduino72 3

Источник

Цифровой компас на основе Arduino и магнитометра HMC5883L

Мозг помогает человеку достаточно хорошо ориентироваться в окружающем пространстве. К сожалению, у роботов человеческого мозга нет, поэтому им нужно каким-либо другим образом «чувствовать» свое направление движения чтобы они могли автономно передвигаться по новой для них местности. Для преодоления этой проблемы роботы используют множество разнообразных датчиков, однако чаще всего для этой цели используется магнитометр, который может информировать робота в каком направлении он передвигается (или развернут лицом). Это помогает роботу не только чувствовать направление движения, но и давать ему команды для поворота на заранее определенный угол или в определенном направлении.

digital compass using arduino and hmc5883l magnetometer

В этой статье мы рассмотрим как работает магнитометр и как его подключить к плате Arduino. На основе магнитометра и платы Arduino мы спроектируем цифровой компас, на котором горящий светодиод будет указывать направление на север. Схему компаса мы распаяли на печатной плате, изготовленной в компании PCBGOGO.

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

Что такое магнитометр и как он работает

Надеемся, что слово магнитометр не ассоциируется у вас с мутантом по имени «Магнето» из популярной киноэпопеи «Люди Х» – но он там был реально крут, не правда ли? ))

На самом деле магнитометр представляет собой устройство, которое может ощущать («чувствовать») магнитные полюса Земли и указывать направление к ним. Все мы знаем что Земля представляет собой огромный сферический магнит с северным и южным полюсами. Естественно, этот огромный магнит создает магнитное поле. Магнитометр улавливает (ощущает) это магнитное поле и на основании направления этого магнитного поля он может определять направление (в котором мы смотрим или развернуты лицом).

Как работает датчик (магнитометр) HMC5883L

Датчик (магнитометр) HMC5883L содержит в своем составе микросхему HMC5883L от компании Honeywell. Эта микросхема содержит внутри себя 3 магниторезистивных материала, которые упорядочены (ориентированы) по осям x, y и z. Количество тока, протекающего через эти материалы, чувствительно к магнитному полю Земли. То есть, измеряя изменения в токе, протекающем через эти материалы, мы можем обнаруживать изменения в магнитном поле Земли. В дальнейшем эти изменения можно передать любому микроконтроллеру (например, плате Arduino) по протоколу I2C.

Поскольку показания данного датчика основаны на величине магнитного поля, то на них в значительной степени будут влиять расположенные рядом металлические предметы. Поэтому иногда данные датчики используются в детекторах металла. Но если вы будете использовать магнитометр в составе компаса следите чтобы рядом с ним не было крупных металлических предметов, иначе показания компаса будут неправильными – надеюсь, все помнят фильм про пятнадцатилетнего капитана и как его обманули с показаниями компаса.

Разница между HMC5883L и QMC5883L

Некоторые поставщики радиодеталей продают датчики QMC5883L (они изготавливаются той же самой компанией Honeywell) вместо HMC5883L поскольку QMC5883L стоят дешевле. Печальная новость здесь состоит в том, что работа этих двух датчиков немного отличается и один и тот же программный код не будет работать с обоими этими датчиками. Поэтому и адрес в протоколе I2C у них будет различный. Код программы, приведенный в нашей статье, будет работать только с QMC5883L – он более дешевый и его проще достать.

qmc5883l magnetometer sensor

Чтобы узнать какая модель датчика у вас, HMC5883L или QMC5883L, посмотрите поближе что на нем написано. Если на нем написано что то вроде L883, то это HMC58836L, а если написано что то вроде DA5883, то это QMC5883L. Внешний вид обоих этих модулей показан на следующем рисунке.

difference between hmc5883l and qmc5883l

Работа схемы

Схема цифрового компаса на основе платы Arduino и магнитометра HMC5883L представлена на следующем рисунке.

circuit diagram for digital compass using arduino and hmc5883l magnetometerКак видите, схема достаточно проста. Нам просто необходимо подключить датчик HMC5883L к плате Arduino и соединить 8 светодиодов с контактами платы Arduino Pro mini.

Магнитометр HMC5883L имеет 5 контактов. Его контакт DRDY (Data Ready) мы не будем использовать поскольку в нашем проекте датчик будет работать в непрерывном режиме. Контакты Vcc и ground (земля) датчика используются для питания модуля от платы Arduino. Контакты SCL и SDA используются для связи по протоколу I2C и подключены к контактам A4 и A5 (которые также являются контактами для связи по протоколу I2C) платы Arduino Pro mini. Поскольку контакты датчика имеют внутренние подтягивающие резисторы, то нет необходимости добавлять в схему внешние подтягивающие резисторы.

Для индикации направления в проекте мы используем 8 светодиодов, подключенных к контактам платы Arduino с помощью ограничивающих ток резисторов сопротивлением 470 Ом. Схема запитывается от батарейки 9V через переходник типа barrel Jack – на фотографиях хорошо видно что он из себя представляет. Эти 9V попадают на контакт Vin платы Arduino, затем с помощью встроенного регулятора платы Arduino это напряжение понижается до 5V, которое и используется для питания нашей схемы.

Изготовление печатной платы для цифрового компаса

fabricating the pcbs for the digital compass

Когда дизайн печатной платы готов можно приступать к ее изготовлению. Для этого необходимо выполнить следующую последовательность шагов.

Шаг 1. Перейдите по адресу https://www.pcbgogo.com/?code=t, зарегистрируйтесь там если это ваше первое посещение. Затем на вкладке PCB Prototype введите размеры вашей печатной платы, число ее слоев и какое количество печатных плат вам необходимо. Мы использовали размер печатной платы 80mm×80mm.

enter pcb dimensions on pcbgogo website

order pcb for digital compass from pcbgogo

Шаг 3. Загрузите в сервис свои Gerber файлы и оплатите заказ. После загрузки сервис PCBGOGO проверяет ваши Gerber файлы на корректность.

Разумеется, мы не настаиваем, чтобы вы заказывали печатную плату именно в PCBGOGO, вы можете заказать ее у любого производителя печатных плат, с которым вы привыкли работать.

Сборка печатной платы

Нам платы пришли в отличном состоянии, их внешний вид вы можете посмотреть на следующих рисунках.

pcb for digital compass using arduino and hmc5883l magnetometer

Нам понадобилось около 10 минут чтобы припаять к плате необходимые компоненты, после этого мы получили следующий вид нашей платы:

soldered components on pcb for digital compass

Объяснение программы для Arduino

Основная цель работы программы – считать данные с магнитометра QMC5883L и преобразовать их в градусы (от 0 до 360). А когда мы будем знать градусы мы легко сможем определить светодиод, который нужно зажечь чтобы указать нужное направление. Мы в нашем проекте будем указывать направление на север – вы можете изменить это по своему желанию, внеся изменения в код программы. То есть горящий светодиод у нас будет указывать направление на север.

Полный код программы приведен в конце статьи, здесь же мы рассмотрим его основные фрагменты.

После добавления библиотеки мы можем приступать к написанию программы. Первым делом нам в программе необходимо подключить используемые библиотеки – библиотека wire используется для осуществления связи по протоколу I2C, а MechaQMC5883 – для работы с магнитометром (ее мы только что добавили в Arduino IDE).

Источник

Понравилась статья? Поделить с друзьями:

А вот еще кое-что интересное для вас:

  • Для чего нужен дубликаты госномера авто. 10 причин сделать себе его
  • Разновидности похоронных бюро и сферы их деятельности
  • Как быстро изучить английский язык? Плюсы и минусы онлайн школы по изучения языков
  • Эффективное создание текста вакансии: ключевые шаги и рекомендации
  • Размещение серверов в дата-центрах: преимущества и недостатки

  • 0 0 голоса
    Article Rating
    Подписаться
    Уведомить о
    0 Комментарий
    Старые
    Новые Популярные