Детектор скорости движущегося автомобиля на ардуино

Собираем робота

Сначала соберём робота, установим всю механику и электронику.

Собираем платформу

Для начала прикрепим колёса к моторам.

Затем с помощью пластиковых П-образных креплений прикручиваем моторчики к платформе

Обратите внимание на взаимное расположение крепления и моторчики: в креплении есть небольшие углубления, так что если всё соединить правильно, то моторчики будут крепко держаться и никуда не выскочат

Теперь крепим балансировочный шар.

Отлично! Платформа собрана. Если вам кажется, что колёсам отведено слишком мало места и они трутся о платформу, то скорее всего вам нужно посильнее надавить на колёса, чтобы они плотнее сели на вал мотора.

Крепим сенсоры

Закрепим их, как показано на фото:

Можно было бы выбрать и другое место. Это могло бы сделать контроль проще или сложнее, а самого робота более или менее эффективным. Оптимальное расположение — вопрос серии экспериментов. Для этого проекта просто был выбран такой способ крепления.

Крепим Arduino

Arduino закрепим с противоположной стороны двумя винтиками и гайками.

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

Крепим Motor Shield и соединительные провода

Установим Motor Shield на Arduino и подсоединим соединительные провода

Обратите внимание, чтобы соотвествовать программному коду из примера ниже, моторчики соединены с Motor Shield так: правый — к клеммам M1 с прямой полярностью (плюс к плюсу), а левый — к M2 с обратной (плюс к минусу)

В этом проекте, для экономии времени концы соединительных проводов просто скручены с контактами моторов. При работе «начисто» стоит жёстко припаять провода к моторам.

Крепим Troyka Shield

Присоединяем сверху Troyka Shield и подключаем датчики к 8 и 9 цифровым контактам. В итоге получаем следующую конструкцию:

Инструкция по сборке робота-автомобиля

В этой статье расскажем вам о том, как по шагам собрать универсального робота на колесной или гусеничной платформе.  Управлять им будет микроконтроллер Ардуино нано. Если вам не нравится долго читать, посмотрите в конце статьи на видео, подготовленное нашими партнерами – каналом ArduMast Club.

Пример платформы робота-машины на Ардуино

Предлагаем инструкцию по созданию универсальной платформы, которая потом пригодится для создания самых разных проектов, независимо от выбранного контролера или типа шасси. Вы можете использовать стандартные варианты из Алиэкспресса, как на видео, можете снабдить машину гусеницами и создать вездеход,  можете придумать вообще ни на что не похожий вариант. Главное, чтобы число двигателей не превышало 4 и сами ни не были слишком мощными (тогда придется менять тип управления моторами – другой драйвер двигателя).

Робот на Ардуино

Для реализации проекта нам понадобится:

  • Контроллер Ардуино (в нашем случае, Arduino Nano).
  • Драйвер двигателя L298N.
  • Двигатели с редукторами.
  • Корпус и шасси для крепления колес и оборудования
  • Корпус для аккумуляторов 18650 с выключателем.
  • Коммутационные провода.

Дополнительное оборудование, которое потребуется для создания полноценного проекта:

  • Датчик расстояния и серво-мотор, на который он установлен.
  • Инфракрасные датчики линии.
  • Светодиоды для индикации и “красоты”.
  • Пьезодинамик – пищалка.
  • Bluetooth модуль (если собираетесь управлять машинкой дистанционно).
  • Sensor shield (упрощает коммутацию).
  • Модуль контроля заряда и подзарядки аккумуляторов.
  • Сами аккумуляторы.

Общая схема машинки на Ардуино

Схема электропитания робота автомобиля

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

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

Схема питания и подключения двигателей в ардуино автомобиле

Все достаточно стандартно и вы найдете в интернете десятки подобных примеров. Но в этой схеме есть большой минус – в случае полного разряда аккумуляторы придут в негодность.

Машинка на Ардуино

Для добавления контроллера разряда придется внести следующие изменения в схему:

Схема питания с контролем разряда аккумулятора

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

Питание робота Ардуино

Для зарядки можно использовать модуль повышения напряжения с 5v до необходимого уровня зарядки, который зависит от количества серий используемых аккумуляторов. Он имеет гнездо типа микро USB и при частом использовании оно может сломаться, поэтому мы рекомендуем установить дополнительное гнездо для последующей подзарядки пяти вольтовым блоком питания. Для зарядки двух литий-ионных аккумуляторов необходимо настроить выходное напряжение на 8,4 Вольта.

Схема питания с модулем зарядки для ардуино робота машинки

Подключаем двигатели и плату

С питанием платформы мы разобрались, теперь подключим остальные компоненты. Для начала припаиваем провода к моторам, затем обматываем их изолентой, чтобы случайно в дальнейшем не оторвать контакты. Можно сделать так, что в итоге на 2 двигателя будут идти всего два провода вместо 4х. Это немного упростит монтаж и сэкономит место на платформе.

Монтируем драйвер двигателей на платформу так, чтобы его радиатор был спереди

ЭТО ВАЖНО! В противном случае, вам придется переписывать программу для микроконтроллера. Драйвер двигателя для Ардуино робота

Затем размещаем холдер и плату БМС. Не забываем оставлять место спереди для последующего монтажа каких-либо сенсоров. Ардуиио нужно разместить так, чтобы была в дальнейшем возможность подключить его к ПК для прошивки. Это же правило относится и к модулю для зарядки аккумуляторов.

Питание для ардуино и других электронных компонентов мы возьмем от драйвера двигателей.

Подключаем Bluetooth к машинке

Мы собираемся использовать модуль Bluetooth через  SoftwareSerial (библиотеку SoftwareSerial.h), поэтому подключаем модуль блютуз к 3 и 4 цифровым пинам ардуино.  RX к D3,   TX к D4

Схема подключения Bluetooth к ардуино машинкеПодключаем BluetoothСхема подключения драйвера двигателя к роботу

Схема подключения компонентов к Arduino

Датчик расстояния машины

Платформа робота готова! Теперь осталось загрузить прошивку для контроллера Ардуино и программу для смартфона RC CAR. Вы можете посмотреть на нашем сайте обзор Android приложений для работы с Arduino.

Принцип действия датчиков движения

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

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

Популярные статьи  Экономическая сущность компенсации реактивной мощности

Принцип действия инфракрасных устройств напоминает работу термометра с высокой чувствительностью. Они настроены на определенную температуру и срабатывают, когда в поле их «зрения» попадает объект с соответствующим показателем. Ввиду высокой чувствительности приборов к температурным колебаниям их нельзя ставить в кухне или рядом со входными дверьми.

В представленном видео подробно рассказано о датчиках движения, их разновидностях и особенностях работы:

Программирование

В начале кода заголовочный файл объявляется с именем «LiquidCrystal.h», который используется для ЖК-дисплея. В следующей строке контакты LCD указаны в функции «LiquidCrystal lcd (4,5,6,7,8,9)». Здесь цифра в скобках показывает контакты Arduino, которые подключены к LCD.

#includeLiquidCrystal lcd(4, 5, 6, 7, 8, 9);

В строках 4 и 5 sensor1 и sensor2 объявлены как целые числа (integer) — это выводы Arduino, которые подключены к ИК-датчикам.

int sensor1 = 2; int sensor2 = 3;

После этого объявляются 4 целых числа с именем Time1, Time2, Time и flag. Где «Time1» — это измеренное время, когда «sensor1» активирован, а «Time2» — это измеренное время, когда «sensor2» активирован. Time — это разница между «Time1» и «Time2», которая эквивалентна времени, в течении которого автомобиль проезжал между «sensor1» и «sensor2» или «sensor2» и «sensor1».

int Time1; int Time2; int Time; int flag = 0;

Затем мы объявляем целочисленную константу distance, которая является расстоянием между датчиками IR1 и IR2 в сантиметрах. Для примера я взял расстояние равным 30 см. Вы, конечно же, можете поменять на свое значение (лучше до 5 метров).

Далее переменная Speed, объявляется как число с плавающего запятой (тип float). И она используется для хранения скорости автомобиля.

При запуске «void setup ()» срабатывают 2 функции обработки внешних прерываний «attachInterrupt(0,fun1,RISING)» и «attachInterrupt(1,fun2,FALLING)». Например, «attachInterrupt(0,fun1,RISING», означает, что когда IR2 обнаружит падающую волну (int.0), то прерывание запустит функцию fun1.

ЖК-дисплей запускается с помощью функции «lcd.begin (16,2)». А очищается с помощью функции «lcd.clear ()». Сообщение на экране «SPEED MEASURMENT» печатается на с помощью функции «lcd.print».

void setup() attachInterrupt(0,fun1,RISING); attachInterrupt(1,fun2,FALLING);

lcd.begin(16,2); lcd.clear(); lcd.print(«SPEED MEASURMENT»); >

void fun1() запускается, когда активирован «interrupt0 (int.0)». В этой функции текущее время измеряется с помощью «Time1 = millis ()».

Функция void fun2(), это тоже самое, что и «void fun1 ()», но запускается она, когда активируется «interrupt1 (int.1)».

В «void loop ()», время Time измеряется с помощью «Time1» и «Time2». «Time» должно быть положительным, поэтому дополнительно используется «if else». Но этот цикл выполняется, когда flag=0, поэтому используется условие «if». Если «Time1» и «Time2» равны, «Speed» будет нулевым.

В строке 47 проверяется if (Speed == 0). Если это условие верно, то на ЖК-дисплее печатается «… .OK….», что указывает на то, что система готова к использованию.

Строки 51 и ниже отвечают за отображение на ЖК-дисплее скорости движущегося объекта, после того, как «Time1» и «Time2» станут равными нулю.

if (Speed == 0) lcd.setCursor(0, 1); lcd.print(«. OK. «); > else lcd.setCursor(2, 1); lcd.print(Speed); lcd.print(» cm/sec»); delay(10500); Time1 = 0; Time2 = 0; > >

Первый код

Для начала установим Arduino IDE с сайта arduino.cc (статья об установке IDE)— это кросс-платформенная бесплатная среда разработки. Теперь, если мы подключим наш Arduino, то сможем попробовать написать первый код на самом простом примере: программе мигания светодиодом. На большинстве Arduino-контроллеров он есть и подключен к пину 13. Кстати, в мире Arduino программы принято называть скетчами. Вот текст скетча с комментариями:

Arduino

// Дадим этому пину имя LED:
const int LED = 13;
void setup() {
// Инициализация цифрового пина
// для вывода:
pinMode(LED, OUTPUT);
}
void loop() {
// Подать уровень логической единицы
// на пин 13 (зажечь светодиод):
digitalWrite(LED, HIGH);
// Приостановить выполнение скетча
// на секунду:
delay(1000);
// Подать уровень логического нуля
// на пин 13 (потушить светодиод):
digitalWrite(LED, LOW);
// Снова приостановить выполнение
// скетча на секунду:
delay(1000);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

// Дадим этому пину имя LED:

constintLED=13;

voidsetup(){

// Инициализация цифрового пина

// для вывода:

pinMode(LED,OUTPUT);

}

voidloop(){

// Подать уровень логической единицы

// на пин 13 (зажечь светодиод):

digitalWrite(LED,HIGH);

// Приостановить выполнение скетча

// на секунду:

delay(1000);

// Подать уровень логического нуля

// на пин 13 (потушить светодиод):

digitalWrite(LED,LOW);

// Снова приостановить выполнение

// скетча на секунду:

delay(1000);

}

Обрати внимание на функции setup и loop. Они должны присутствовать в любом Arduino-скетче

Setup вызывается единожды при включении или после перезапуска контроллера. Если хочешь, чтобы код выполнялся только один раз, его следует размещать именно здесь. Чаще всего это всевозможные процедуры инициализации чего-либо. Наш скетч не исключение: цифровые пины Arduino могут работать и как входы, и как выходы. В функции setup мы говорим, что пин 13 будет работать как цифровой выход контроллера.

После того как функция setup завершит свою работу, автоматически запускается замкнутый цикл, внутри которого будет вызываться функция loop. От нас требуется написать, что мы хотим там выполнять. А мы хотим подать на пин 13 уровень логической единицы (5 В), то есть зажечь светодиод, затем подождать одну секунду (1000 в миллисекундах), потом подать уровень логического нуля (0 В) и опять подождать одну секунду. Следующий вызов loop все повторит.

Детектор скорости движущегося автомобиля на ардуино

Теперь «заливаем» наш скетч в контроллер. Нет, нам не понадобится программатор. Контроллеры Arduino, кроме наших скетчей, содержат специальную программу — bootloader, которая, в частности, управляет загрузкой кода из компьютера. Так что для заливки скетча нам понадобится только USB-кабель и пункт меню File → Upload (Ctrl + U) в Arduino IDE.

Код нашего Helloworld.

Шаг 4: приводы

Под приводом можно понимать устройство, которое преобразовывает энергию (в робототехнике под энергией понимается электрическая энергия) в физическое движение. Большинство приводов производят вращательное или линейное движение.

В нашем случае привод – это DC-мотор, скорость которого равна 3000 оборотам в минуту, а вращающий момент 0.002 Н•м. Теперь добавим к нему шестерню с передаточным числом 1:48. Новая скорость уменьшается на коэффициент 48 (в результате давая 3000/44 = 68 оборотов в минуту) и вращающий момент увеличивается на коэффициент 48 (в результате давая 0.002 x 48 = 0.096 Н•м).

Простой металлоискатель на базе Arduino

Для постройки понадобятся:

  • одноплатный компьютер Arduino Nano;
  • зуммер (небольшой динамик-«пищалка»);
  • катушка индуктивности — покупная или намотанная самостоятельно;
  • конденсатор на 10 нФ;
  • резистор на 330 Ом;
  • резистор на 1 кОм;
  • диод типа 1N4148;
  • светодиод;
  • макетная плата;
  • источник питания на 9 В;
  • провода для соединения.

Схема устройства

Готовый металлоискатель на Arduino схематически выглядит так:

Детектор скорости движущегося автомобиля на ардуино

Всеми процессами управляет микрокомпьютер Arduino. О нахождении в поле «зрения» металла сигнализирует дополненный светодиодом зуммер, а катушка с конденсатором служат непосредственно для обнаружения. Импульсный диод в схеме нужен для понижения напряжения, а резистор ограничивает ток на контактах Ардуино.

Все элементы монтируются на макетной плате. Вид в сборе:

Детектор скорости движущегося автомобиля на ардуино

Схема действует следующим образом:

  • на выходе Ардуино мы создаем импульсы прямоугольной формы;
  • они поступают на LR фильтр верхних частот;
  • с каждым переходом уровня на катушке возникнет быстрый остроконечный импульс. Долгота его пропорциональна значению индуктивности нашей катушки.
Популярные статьи  Как подключить магнитофон, который работает и от 220 в и от батареек?

Измеряя ширину импульса, можно замерить и саму индуктивность

Но важно учесть, что длина импульсов всего около 0.5 микросекунды, и «поймать» их по отдельности с помощью Arduino затруднительно. Поэтому в систему внедрен конденсатор: он заряжается импульсами до уровня считывания напряжения контроллером через аналоговый контакт A5

На аналогово-цифровом преобразователе из него будет получено цифровое значение. Когда напряжение считано, конденсатор разряжается подачей низкого напряжения на А5 — так называемый «логический нуль» (перед этим программа переводит контакт из режима «ввода» на «вывод».

Цикл занимает примерно 200 мс. Для большей точности его можно повторить его несколько раз и получить среднее значение, с каковым и работать. Зная приближенное значение индуктивности, плата анализирует его и выдает заданные сигналы на диод и динамик.

Прошивка

Поскольку мы делаем импульсный металлоискатель на Ардуино, мало его собрать — нужно еще залить управляющее ПО. В терминологии Arduino оно называется «скетч» и прошивается в плату при помощи входящей в комплект среды разработки.

Детектор скорости движущегося автомобиля на ардуино

Пример простого скетча для описанной выше схемы:

Здесь:

  • инициализируются два контакта контроллера. Первый генерирует идущие на катушку импульсы, второй — читает напряжение с конденсатора;
  • также включаются два контакта — они управляют диодом и звуковым зуммером.

При попадании в область детекции катушки зуммер издает звук, а диод часто мигает.

Прибор может быть собран в любом удобном корпусе, покупном или самодельном. В самом простом случае его можно смонтировать даже на селфи-палке.

Детектор скорости движущегося автомобиля на ардуино

Приложение «Приборная панель для планшета»

Благодарим пользователя портала Drive2 за опубликованную версию приложения и описание метода установки приложения:

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

После установки необходимо зайти в настройки Андроид, в раздел «Домашний экран», выбрать приложение приборной панели VenatorLite2. Очень важный момент! Выйти в настройки Андроида из приложения приборной панели для возврата стандартного Launcher-a нельзя. Перед тем как установить приложение вместо Launcher-a необходимо убедиться что в настройки можно зайти из статусбара. Иначе вернуть стандартный лаунчер будет проблематично.

ПРИМЕЧАНИЕ! Перед установкой автозагрузки желательно настроить и отладить работу приложения.

После запуска приложения нужно зайти в настройки (нажать на значок шестеренки справа вверху). Тут надо указать ip-адрес и порт (В нашем примере этими значениями являются: адрес 192.168.4.1 и порт 3333).

Осталось все подключить и протестировать. Если все сделали правильно, то при вкючении устройства и подаче на 4-ый пин ардуино «плюса» приборная панель включится.

А вот как выглядит приборная панель, установленная в ОКУ:

Желаем успеха в реализации данного проекта

Шаг 3: теория

Детектор скорости движущегося автомобиля на ардуиноРисунок 6 – Область обнаружения объектаДетектор скорости движущегося автомобиля на ардуиноРисунок 7 – Формулы

Диаграммы направленности лучей

На левом рисунке 6 выше показаны наложенные диаграммы направленности для преобразователя A и преобразователя B.

Датчик A получит эхо от любого объекта в «красной зоне».

Датчик B будет получать эхо, только если объект находится в «лиловой зоне». Вне этой зоны определить координаты объекта невозможно (целевая зона может быть полностью «освещена» звуком, если расположить датчики ниже базовой линии).

Большие «лиловые» зоны обнаружения возможны, если датчики расставлены широко.

Расчеты

Что касается правого рисунка 7 выше.

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

\[площадь = основание \cdot высота/2 \qquad (1)\]

Преобразование уравнения (1) дает нам высоту (координату Y):

\[высота = площадь \cdot 2 / основание \qquad (2)\]

Пока всё хорошо… Но как мы вычислим площадь?

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

На рисунке 7 показано, как это сделать.

Преобразователь A посылает импульс, который отражается от объекта во всех направлениях. Этот импульс слышат оба преобразователя, и A, и B. Преобразователь B не передает импульсов, он только слушает.

Обратный путь к преобразователю A показан красным цветом. Если разделить его на два и учесть скорость звука, мы можем рассчитать расстояние d1 с помощью формулы:

\[d1 _{(см)} = время_{(микросекунды)}/59 \qquad (3)\]

Значение 59 для константы получается следующим образом:

  • Скорость звука составляет примерно 340 м/с, что составляет 0,034 см/мкс (сантиметр/микросекунда).
  • Обратное значение 0,034 см/мкс составляет 29,412 мкс/см, которое при умножении на 2 (чтобы получить длину обратного пути) дает в результате 58,824 или 59 при округлении.
  • Это значение можно подстроить вверх/вниз, чтобы учесть температуру, влажность и давление воздуха.

Путь к преобразователю B показан синим цветом. Если из этого пути вычесть расстояние d1, мы получим расстояние d2. Формула для d2 будет следующей:

\[d2 _{(см)} = время_{(микросекунды)}/29,5 — d1 \qquad (4)\]

Величина 29,5 для константы получается следующим образом:

Тут нет обратного пути, поэтому мы используем 29,5, что является половиной значения, используемого в формуле (3) выше.

Теперь у нас есть длины всех сторон треугольника ABC… погуглите «Герон».

Формула Герона

Формула Герона использует нечто, называемое «полу-периметром», в который вы добавляете каждую из трех сторон треугольника и делите результат на два:

\[s = (a + b + c)/2 \qquad (5)\]

Теперь полощадь может быть рассчитана по следующей формуле:

\

Как только мы узнаем эту площадь, мы сможем вычислить высоту (координату Y) из формулы (2) выше.

Теорема Пифагора

Теперь координату X можно вычислить, отложив из вершины треугольника перпендикулярную линию до базовой линии, чтобы получить прямоугольный треугольник. Теперь координату X можно вычислить с помощью теоремы Пифагора:

\

Работа схемы

Схема робота на основе Arduino и датчика скорости LM393 представлена на следующем рисунке.

Схема запитывается от литиевого элемента на 7.4V. Эти 7.4V подаются на контакт 12V драйвера двигателя, а регулятор напряжения драйвера двигателя преобразует их в стабилизированное напряжение +5V, которое используется для питания платы Arduino, ЖК дисплея, датчиков и джойстика.

Двигатели управляются с помощью цифровых контактов 8, 9, 10 и 11 платы Arduino. Поскольку нам необходимо управлять еще и скоростью вращения двигателей мы используем сигналы ШИМ (широтно-импульсной модуляции), подаваемые на положительные контакты двигателей. Для этой цели мы используем контакты 9 и 10 платы Arduino, на которых возможно использование ШИМ сигналов. Значения положения осей X и Y джойстика подаются на аналоговые контакты A2 и A3 соответственно.

Поскольку, как мы уже знаем, датчик H206 формирует управляющее воздействие (триггер) каждый раз когда обнаруживается отверстие в пластине с делениями. Для повышения точности определения скорости мы эти управляющие воздействия будем подавать на входы внешних прерываний на контактах 2 и 3 платы Arduino. После сборки робота у нас получилась конструкция показанная на следующем рисунке. Более подробно вы ее можете рассмотреть на видео, приведенном в конце статьи.

Как устроен металлодетектор

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

  • светодиоды;
  • сообщения на смартфон;
  • вывод визуальных кодов на встроенный экран, и так далее.

Любой металлоискатель состоит из трех основных блоков:

  • катушка (или несколько). Они играют роль обнаруживающих металл передающих или принимающих антенн;
  • блок управления;
  • устройство вывода сигнала.
Популярные статьи  Монтаж электропроводки в квартире — правила, основные этапы, план-схема

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

В блоке управления расположен генератор сигнала и центральная схема — контроллер. Существует множество схем металлоискателей под разные виды плат. Распространена схема устройства «Пират» на базе двух чипов:

  • операционного двухканального усилителя TL072 и его аналога К157УД2 (приемный модуль);
  • чипа NE555 (передающий узел системы).

Но в последнее время становятся популярны варианты на Arduino. Причина этого — простота, дешевизна, хорошая изученность семейства Ардуино и мощные программные возможности платформы.

Программа для Arduino

Детектор скорости движущегося автомобиля на ардуино

Можете почитать по поводу ПИД-регулирования на Вики, если вы не знакомы с этими регуляторами. PID класс для Arduino использует три входа: заданное положение, измерение и выход. Выход зависит от текущего положения и измерений. ПИД-регулятор старается изменить выход таким образом, чтобы измерения соответствовали заданному положению. В алгоритме используется интересная математика. Алгоритм ПИД-регулирования старается отработать таким образом, чтобы значения оставались максимально стабильными.

В нашем алгоритме для стабилизации используется два ПИД-контроллера: один для тангажа и другой для крена. Разница в скорости вращения пропеллеров 1 и 2 будет такой же как и разница в скорости пропеллеров 3 и 4. Аналогично для пар 1,3 и 2,4. После этого ПИД-регулятор изменяет разницу в скорости, выводя тангаж и крен в нуль.

Не забудьте проверить какие цифровые пины с Arduino идут к моторам и соответственно изменить скетч.

3Скетч для определения скорости вращения диска

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

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

Установка для определения скорости вращения на основании показаний датчика Холла

Вспомним формулу угловой скорости:
ω = φ / tгде ω – угловая скорость, φ – угол поворота, t – время, за которое диск повернулся на этот угол. В нашем случае угол (1 оборот) будет равен 360° или 2π радиан. Всё,
что нам остаётся – это подсчитать время, за которое происходит один оборот диска.

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

Временная диаграмма цифрового сигнала с датчика Холла для вращающегося диска

Для определения промежутка времени используем встроенную функцию millis(), которая возвращает количество миллисекунд, прошедших с момента включения платы Arduino.

int digitalPin = 12; // с цифрового выхода датчика Холла
unsigned long runTime; // время с запуска платы Arduino, мс
int prevValue = 0; // предыдущее считанное значение

void setup() {
  pinMode(digitalPin, INPUT);
  Serial.begin(9600);
  runTime = millis(); // запоминаем время запуска программы
}

void loop() {
  int digitalValue = digitalRead(digitalPin); // значение с цифрового канала  
  delay(50); // небольшая задержка чтобы исключить дребезг контактов
  if ((prevValue == HIGH) && (digitalValue == LOW)) { // ловим переход HIGH->LOW сигнала 
    unsigned long timeSpan = millis() - runTime; // время одного оборота, мс
    runTime = millis(); // запомним текущее время
    Serial.println("Период оборота = " + (String)timeSpan + " мс"); 
    double omega = 2 * PI / (timeSpan * 1.0E-3);
    Serial.println("Угловая скорость = " + (String)omega + " рад/с");  
  }
  prevValue = digitalValue; // запомним предыдущее значение датчика Холла
}

Загрузим скетч, и начнём вращать наш диск с магнитом. Период оборота и угловая скорость выводятся в окно консоли:

Скорость и период вращения диска выводятся в монитор последовательного порта

Кстати, если на небольшом расстоянии друг за другом на диске разместить два магнита, то можно будет определить не только скорость вращения, но и направление. Естественно, скетч придётся немного усложнить.

Возвращаясь к идее спидометра для велосипеда, нужно вспомнить ещё одну формулу – связь угловой и линейной скоростей:
v = ω r

Здесь v – линейная скорость, ω – угловая скорость, r – радиус колеса велосипеда. Теперь несложно дописать наш последний скетч с учётом этой формулы.

Схема подключения Arduino

Схема подключения платы MPU6050 приведена ниже

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

VDD -> 3.3v

GND -> GND

INT-> digital 2

SCL -> A5

SDA -> A4

VIO -> GND

Если вы запитаете от 5 В, плата может испортиться, так что будьте внимательны и используйте именно 3.3 В. На некоторых платах MPU6050 есть регулятор напряжения, который выполняет роль предохранителя, но рисковать все равно не стоит. Если на вашей плате есть контакт AD0, его надо подключить к земле (GND). В нашем случае контакт VIO подключен к AD0 на самой плате, так что подключать пин AD0 не надо.

Скетч для Arduino

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

Скопируйте код программы, вставьте его в пустой скетч и запустите. Откройте серийный монитор Arduino IDE (Tools->Serial Monitor) и убедитесь, что вы подключены к 9600 (нижний левый).

Если вы все сделали правильно, должно обнаружиться устройство I2C и ему присвоиться адрес 0x68 ил 0x69. Запишите его. Если появились ошибки, проверьте подключение.

После того как вы установили библиотеки, откройте файл MPU6050_DMP6 (MPU6050 -> Examples). Рекомендую вам его просмотреть, даже если вы не особо ориентируетесь в коде. Если у вас присвоился адрес 0x69, вам надо раскомментировать одну строку в верхней части кода (после #includes), так как по умолчанию стоит 0x68. Теперь программа должна компилироваться.

Загрузите программу, откройте окно серийного монитора (в этот раз с 115200) и следуйте инструкциям. Поздравляю, так как сейчас вы должны были получить значения с акселерометра/гироскопа через Arduino!

Прежде чем двигаться дальше, надо откалибровать ваш гироскоп/акселерометр. Найдите плоскую горизонтальную поверхность и поставьте на нее плату MPU6050.

Теперь запустите скетч для калибровки, который можно скачать здесь: MPU6050_calibration.ino (опять-таки, по умолчанию установлен порт 0x68, но вы можете его изменить). Запишите данные отклонений (offset), которые вы получите. Эти данные вы будете использовать в скетче MPU6050_DMP6 (и в дальнейшей программе для квадрокоптера).

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

Рейтинг
( Пока оценок нет )
Денис Серебряков/ автор статьи
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: