11 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Собираем роботпылесос на Arduino Основные алгоритмы движения

Робот пылесос — Часть2: Электроника и программа

В конце первой части статьи была представлена электронная схема простого управляющего алгоритма. В этой части будет рассмотрена электронная и программная составляющая системы управления робота, на основе микроконтроллера.
Электроника:
Плата управления построена на микроконтроллере atmega16, изначально она разрабатывалась, как универсальный модуль, поэтому оказалось плохо защищена от помех электродвигателя турбины. Проблема решилась экранированием проводов двигателя и установкой на него конденсатора в 0.1мкф, также необходимо кинуть вывод RESET контроллера прямо (без резистора) на +5v, это позволяет избавиться от произвольно сброса.


Плата контроллера.

Драйвер двигателей собран на микросхеме L298, по стандартной схеме.

Плата драйвера двигателей.

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

Макетная плата.


Общая электронная схема.

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

Поиск зарядной станции

Программа:
Наверное, самая интересная часть всей работы – это создание алгоритма и написание программы управления роботом.
Алгоритм уборки разделён на 4 режима:
•Режим ожидания
•Спираль
•Движение вдоль стены
•“Газонокосилка”

Разберём каждый из них по отдельности.

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

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

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

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

“Газонокосилка”
Алгоритм был предложен на робофоруме и опробован в среде logo. Является хорошей заменой случайному блужданию, в чём можно убедиться, прогнав алгоитм в logo на модели своей комнаты:


Конечно, в реальных условиях всё не так идеально, но зато из сенсоров, для данного алгоритма уборки, нужны только датчики соударений.
Приводить блок-схему этого алгоритма не буду, на робофоруме, есть код на logo.

Программа писалась на чистом С без asm вставок.
Код распилен на несколько частей:
main.c -документ с main функцией и главным циклом.
Periphery.с -аппаратные зависимости, настройка периферии контролера.
Action.c -функциональная часть программы
util/drivers.c -функции управления устройствами
util/timer.c -служба таймеров

Periphery.c
Содержит только одну функцию — Periphery() в которой прописывается настройка периферии контроллера. Функция вызывается единожды, из главной функции программы.

util/drivers.c
Содержит макросы для управления уборочным узлом:

А также функцию управления приводными двигателями:

*_vector – направление вращение двигателя: 1-вперед, 0-стоп, -1-назад
*_speed – скорость вращения, число от 0 до 10

util/timer.c
Внутри две функции:

Функция управления временными задержками. Вызывается только по прерыванию с таймера-счётчика2, каждую 1/1000сек.

Единственным параметром передаётся указатель на переменную, от которой будет отсчитываться время. Переменная должна быть заранее инициализирована некоторым, отличным от нуля значением. Как только значение переменной станет равно нулю указатель на неё будет удалён из очереди таймеров. Длину очереди таймеров можно задать с помощью макроса SIZE_ARRAY_HOURS. Обратите внимание что функция Timer_Task не является аналогом функции _delay(), так-как отдаёт управление сразу же, проверять дотикал ли таймер необходимо вручную. Например, вот так выглядит организация задержек в функции управления индикатором:

Action.c
Функциональная часть кода разбита на модули, для каждого физического или программного устройства пишется свой модуль. Физические устройства:
-Привод
-Кнопка управления
-Индикатор
-Пылесос

Программное устройство:
-Управление циклом уборки.

Модули выполняют разную работу в зависимости от текущего режима. Программа внутри них организована по типу конечного автомата, с помощью конструкции switch – case. Модули могут взаимодействовать с помощью глобальных переменных или изменяя счётчики конечного автомата друг друга.

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

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

В Action.c так же есть функция util_mode(char _mode), она используется для смены режима работы. Помимо присваивания нового значения переменной Mode, в определении функции прописано обнуление счётчиков конечных автоматов и переменных-таймеров.

Исходники
Проект собирается с помощью компилятора avrGCC, Makefile присутствует.

Заключение:
Робот в собранном виде:

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

UPD 2014-06-06
Перезолил исходники на GitHub.

Собираем робот-пылесос на Arduino


Шаг первый. Создаем поворотную платформу для робота
Для своей первой самоделки автор использовал танк из игры «Танковый бой», из игрушки были выброшены все лишние детали, остался только корпус, а также двигатели и колеса. После этого был установлен Arduino UNO, драйвер двигателей и ультразвуковой дальномер. В качестве источника питания использовались три литиевые батареи по 3.7 В.

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

Также из-за очень большой скорости передвижения робот порой не успевал реагировать на сигналы дальномера и врезался.


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

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




Контактные бампера изготавливаются очень просто. Нужно взять картон и на одну его сторону приклеить фольгу, это будет первым контактом. К этой фольге нужно подать напряжение +5 В. Напротив платформы нужно установить изогнутый проводок от витой пары, он подключается через резистор, благодаря этому ложных срабатываний будет меньше. Когда робот будет во что-то врезаться, то будут замыкаться контакты, и затем электроника будет разворачивать робота в другом случайном направлении.

Шаг третий. Делаем пылесос и пылесборник
Благодаря таким материалам как картон и скотч можно быстро собрать практически любой макет. Для работы турбины используется источник питания в 18 Вольт, напрямую от батареи. При такой нагрузке кулеры греются, но работают.









Для изготовления турбины берется кулер от компьютера и затем от него отламываются все лопасти. Далее на кулер крепится турбина от пылесоса, ее нужно приклеить суперклеем. Самое главное здесь — приклеить точно, не должно быть дисбаланса. Без нагрузки и питании 18 Вольт кулер выдает порядка 2600 RPM, что создает отличную тягу. В заключении вся конструкция собирается так, как можно увидеть на фото и после этого робота можно испытывать.

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

Читать еще:  Инструкция о мерах пожарной безопасности в организации

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

*Заполняя форму вы соглашаетесь на обработку персональных данных

Как сделать робот-пылесос своими руками — 2 идеи сборки

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

Материалы для сборки

Итак, для сборки робота-пылесоса нужно разобраться с его составными частями, пойдем по порядку. Он должен сам передвигаться по комнате, поэтому нужны двигатели, в зависимости от конечной конструкции их должно быть от 2-х до 4-х, а также возможность переключения направления вращения и скорость, значит, нужна плата для управления двигателями. Если вы используете двигатели постоянного тока, то нужна плата с 4-мя транзисторами (H-мост).

Самодельный робот-пылесос должен определять столкновения со стенами и мебелью. Для этого нужно предусмотреть датчики препятствия и концевые выключатели на «бампере». Также нужен сам рабочий орган – пылесос. При этом он должен быть рассчитан на работу от постоянного тока низкого напряжения (например, 12В).

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

Система, которая будет всем этим управлять. Простейший вариант на Arduino. Для такой задачи подойдет любая из плат, по размерам удобно разместить вариант Nano или Pro mini.

Идея №1: робот-пылесос из картона

Основа робота делается из плотного картона. Его лучше склеить в пару слоев, а волокна разместить перпендикулярно. Для его технической начинки нужен такой набор деталей:

  1. Любая плата Arduino.
  2. Breadboard или простая макетная плата, в принципе можно и без неё, всё просто спаять.
  3. 2 ультразвуковых датчика расстояния (дальномер).
  4. Турбина от пылесоса.
  5. Небольшой двигатель или кулер от компьютера.
  6. Двигатели с редукторами и колеса.
  7. Контроллер для двигателя.
  8. Провода для соединений схемы.
  9. Аккумуляторы и контроллер заряда.

В качестве питания для робота нужно использовать 3 литиевых аккумулятора. Напряжение каждого из них 3,7 В. Для их заряда нужен контроллер. Например, такой как на фото:

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

Для регулировки скорости на пин ENA или ENB подаётся ШИМ сигнал, а для задания направления вращения подают разноименные сигналы на IN1 и IN2 для одного двигателя и IN3, IN4 для другого двигателя. При этом если на пине IN1 у нас логическая единица, а на пине IN2 – логический ноль, двигатель крутится в одну сторону, чтобы сменить направление нужно поменять местами 1 с 0. Его нужно собрать с ардуино по такой схеме (пины можно использовать любые, это вы укажете в скетче).

Схема на ардуино

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

Основа из картона

Вот вид с нижней стороны. Два ведущих колеса с угловым редуктором и поворотное колесо:

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

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

Контактные бампера можно сделать и своими руками, для этого нужен тонкий, но жесткий провод, например от витой пары. Для этого формирует контактную площадку на внутренней стороне бампера из фольги, и закрепляем проводник как это показано ниже. При столкновениях робота-пылесоса с мебелью и стенами они будут соприкасаться. Вам остается отрегулировать расстояние от проволоки до фольги, чтобы добиться нужной чувствительности и исключить ложные срабатывания. На фольгу подается 5В, а провод идёт на вход Ардуино, подтянутый к минусу через резистор на несколько кОм.

Самодельный контактный бампер

Устройство питается от аккумуляторов, для питания системы управления можно применить линейные стабилизаторы типа l7805. Чтобы отрегулировать скорость вращения моторов подойдет понижающий преобразователь, например LM2596.

Самое сложное — это сконструировать и собрать пылесос. Вот его приблизительный чертеж:

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

Вот так выглядит обратная сторона турбины, закрепленной на роторе кулера. Закрепить её можно на термоклей или на суперклей

Вид турбины изнутри

Вот и вся пошаговая инструкция по сборке робота-пылесоса, сделанного из подручных материалов. Алгоритм его работы такой: робот-пылесос едет вперед, пока не встретит препятствие. После столкновения (или приближения, если вы используете УЗ дальномеры) останавливается, отъезжает назад на заданное расстояние, разворачивается на произвольный угол и едет дальше.

Идея №2: почти заводской робот

Предлагаем вашему вниманию не более сложный проект робота-пылесоса. Вот его внешний вид в собранном состоянии:

Самодельный роботизированный пылесос

Система навигации в нем собрана из комплекта 6-ти ИК-датчиков препятствия. На случай, если не сработал ни один из них, то предусмотрены два контактных датчика (концевых выключателя). Система управления двигателями на таком же драйвере с микросхемой L298N. Для его сборки вам понадобится:

  1. Плата Ардуино, в оригинале использовалась Pro-mini.
  2. USB-TTL переходник для прошивки этой модели ардуино. Если вы будете использовать Arduino Nano, то он не нужен, т.к. в ней есть возможность прошивки по USB.
  3. Драйвер для моторчиков L298N.
  4. Моторчики для колес с редуктором.
  5. 6 ИК-датчиков.
  6. Моторчики для турбины (по возможности помощнее).
  7. Крыльчатка турбины пылесоса.
  8. Моторчики для щеток могут быть любыми.
  9. 2 датчика столкновения.

Всё это собрать по такой схеме:

Схема сборки робота-пылесоса

Для сборки цепи питания робота-пылесоса нужны:

  1. 4 литиевых аккумулятора, подойдут типа 18650.
  2. 2 преобразователя постоянного напряжения (повышающий и понижающий).
  3. Контроллер для заряда и разряда 2-х аккумуляторов (искать в интернете по запросу 2s li-ion controller). В схеме используется последовательное включение двух параллельно включенных банок, в итоге их выходное напряжение получается больше 7,4В, а параллельная цепочка нужна для повышения ёмкости и автономности работы.

Вот схема питания этого робота:

Кроме этого нужен пластик (ПВХ) или любой другой материал для корпуса робота, можно его распечатать на 3D-принтере, если у вас есть такая возможность.

Для работы самоделки нужна прошивка, вот пример алгоритма хаотичной уборки, мы взяли его с сети. Ссылка для скачивания скетча: прошивка для робота-пылесоса.

В этой статье были рассмотрены 2 конструкции робота-пылесоса, которые можно повторить и собрать своими руками. Сделать автоматическое средство для уборки помещения можно, вложившись в бюджет от 30 до 100 долларов. Самыми дорогими деталями являются аккумуляторы, двигатели и платы ардуино. Если у вас получилось собрать самодельный робот-пылесос или вы придумали другую конструкцию, присылайте примеры в комментарии, будем рады открытому общению!

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

Arduino.ru

Самодельный робот-пылесос.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Отличный проект! А поиск станции зарядки планируется? Я сейчас делаю этот «модуль» для своего робота. Пока не очень успешно.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

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

а моя зарядка для ли ион заряжает их до 4,55 — 4,6 как то так.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Отличный проект! А поиск станции зарядки планируется? Я сейчас делаю этот «модуль» для своего робота. Пока не очень успешно.

Читать еще:  Инструкция по эксплуатации газового котла

Скорее всего нет. Реализация трудная, да и ненужная и вот почему:

1. Допустим 2х комнатная квартира без порогов, тогда придется ставить три станции, в одной комнате, в другой и на кухне, иначе он просто одну не найдет.

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

Поэтому от этой идеи я отказался, проще воткнуть штекер от зарядки.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

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

а моя зарядка для ли ион заряжает их до 4,55 — 4,6 как то так.

Может это не литий ион, или тестер врет?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Заряжайте в режиме полимера, реально ионы заряжают до 4.2в. Почему в аймаксе сделали для иона 4.1 мне не понятно, возможно раньше такая химия была. Я полимеры заряжаю в режиме ион, так они долше живут, заряд получается в районе около 90%.

Зарядил в режиме литий полимер, влил на 100 мА больше и зарядил как положено до 8,4 вольта, но процесс зарядки идет по другому.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

В Сочи 1метр на 1,5 метра купил за 850 рублей, толщина 4мм.

Хорошая цена. В Севастополе в местном сторительном нашел лист 1х2 метра 2тыс. с копейками.

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

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

здравствуйте, подскажите какие пины на ардуино отвечают за ик датчики

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Подключены к аналоговым пинам.

14, 15, 16, 17 они же A0, A1, A2, A3

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Подключены к аналоговым пинам.

14, 15, 16, 17 они же A0, A1, A2, A3

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

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

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Подключал по такой схеме.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Добрый всем вечер!

Почти доделал версию 2.0, но возникли трудности в составлении алгоритма прямолинейного движения.

Имеются два мотор редуктора со встроенными энкодерами. Энкодеры повесил на прерывания, за один оборот колеса каждый дает примерно 1000 тиков+- 150 тиков. Моторы подключил через L298N, я понимаю , что надо сравнивать количество тиков от энкодеров и в зависимости от разницы, выравнивать скорость моторов ШИМом, но не могу составить алгоритм этих действий.

Если кто знает, как организовать такой алгоритм, помогите пожалуйста.

Поиск по интернету ничего не дал, там какие-то уж очень замудренные алгоритмы, которые на Ардуино не получится организовать.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Энкодеры повесил на прерывания, за один оборот колеса каждый дает примерно 1000 тиков+- 150 тиков.

А вас не смущает, откуда берутся эти дополнительные +- 150 тиков, если принцип работы энекодера вроде бы не подразумевает появления блуждающих сигналов из ниоткуда? Каждый оборот колеса должен давать одинаковое и всегда точное количество тиков, без всяких +-.

Если с одного колеса приходит больше тиков, то уменьшайте коэффициент заполнения в ШИМ-сигнале управления мотором этого колеса. Так до тех пор, пока количество тиков с обоих колес не выравняется. Чтобы скорость не падала, можно, наоборот, добавить мощи противоположному колесу.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Я имел ввиду одно колесо крутится быстрее другого примерно на 150 тиков. Если левый энкодер выдает 950 тиков в секунду, то правый 1100. поставил на пол, пылесос уходит в сторону. Уменьшил ШИМ на правом моторе до 230, стали крутится примерно одинаково. А вот как это реализовать в программе, чтобы автоматически выравнивал скорость, пока думаю. Ведь надо еще как-то обрабатывать сигналы с шести инфракрасных датчиков препятствий и двух датчиков столкновения, да еще управление с пульта. Мне кажется одна ардуина не потянет.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Задача не самая сложная, если проявить смекалку. Так как смекалки у меня нет, а на ум приходят только дубовые решения, то я бы задействал режим захвата таймера, если бы у атмеги328 было два канала на захват. Идея заключается в том, чтобы не считать импульсы, а измерять время между ними. Причем, МК позволяет делать это с высокой точностью. В этом случае скорость колес можно было бы выровнять еще задолго до того, как каждое из них сделает полный оборот.

Словесное описание алгоритма таково: вешаем выход с энкодера кадого колеса на свой канал захвата. Канал захвата — это такая подсистема таймера, которая тупо фиксирует состояние счетчика и сохраняет его в отдельном регистре МК при назначенном событие. Событием в нашем случае будет приход «тика» с энкодера. Пришел тик с одного колеса, мы прочитали значение счетчика, пришел тик с другого колеса, прочитали второе и сравнили эти значения. У какого счетчика значение меньше, то колесо крутится быстрее. Если ШИМ-сигнал имеет достаточную разрядность, то тут же можно убавлять ему длительность импульса на единицу (ну или прибавлять единицу на другом колесе). В таком случае весь алгоритм выравнивания скоростей описывается одним сравнением. Не знаю, как кому, а мне это не кажется такой уж сложной задачей, которая была бы не по плечу ардуине.

Только беда не в том, что вычислительной мощи не хвататет, а в том, что нет достаточных ресурсов у периферии. Вот у STM8S, даже у младших моделей, на таймере по четыре канала, которые могут работать на захват или генерацию ШИМ независимо друг от друга. Если бы этот пылесос ездил на STM8S, то там бы все управление движением можно было организовать средствами одного таймера. Но в нашем случае это нереализуемые хотелки, т.ч. надо смотреть в другую сторону.

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

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

Создание прототипа робота пылесоса на базе Arduino Uno

  • Цена: $5.80
  • Перейти в магазин

Arduino — это открытая платформа, которая позволяет собирать всевозможные электронные устройства. Arduino будет интересен креативщикам, дизайнерам, программистам …., и желающим собрать собственный гэджет. Устройства могут работать как автономно, так и в связке с компьютером. Всё зависит от идеи.
Платформа состоит из аппаратной и программной частей. Для программирования используется упрощённая версия C++. Разработку можно вести как с использованием бесплатной среды Arduino IDE, так и с помощью произвольного C/C++ инструментария.
Для программирования и общения с компьютером понадобится USB-кабель.

Читать еще:  Установка электронного замка своими руками

Для постройки прототипа робота — пылесоса заказал плату Arduino Uno. Вместе c Uno заказал: Драйвер двигателей, для управления двигателями, Ик датчики «органы чувств» робота пылесоса, Ну и проводочки, куда без них? Преобразователь DC-DC и аккумуляторы заказывал в других онлайн магазинах.

Составляющие моего устройства:

— Arduino -центральный контроллер
— Драйвер двигателей — устройство, которое преобразовывает управляющие сигналы малой мощности в токи, достаточные для управления моторами
— ИК датчики — датчики препятствий расстояние обнаружения препятствия 3-80см
— ИК датчики — датчики препятствий расстояние обнаружения препятствия 2-20см
— Электродвигатель турбины
— Электродвигатель боковых щеток
— Электродвигатель центральной щетки
— Электродвигатель перемещения
— Аккумуляторы литиевые

Вот, что получилось.
Фотки не все, загружаю, какие остались.

Компоненты устройства:

Вид снизу:

Вид сверху:

Вид сбоку:

Перед первым пуском:





Первый пуск)) без корпуса


#define DriveVector1 2
#define DriveSpeed1 3
#define DriveVector2 4
#define DriveSpeed2 5
#define InSensor1 12
#define InSensor2 11
#define LedLamp 13

int sensorStatus1, sensorStatus2;
int HIGHValue, LOWValue;

void setup()
<
// put your setup code here, to run once:
pinMode(DriveVector1, OUTPUT);
pinMode(DriveVector2, OUTPUT);
pinMode(DriveSpeed1, OUTPUT);
pinMode(DriveSpeed2, OUTPUT);
pinMode(LedLamp, OUTPUT);
pinMode(InSensor1, INPUT);
pinMode(InSensor2, INPUT);
HIGHValue = HIGH div 2;
LOWValue = LOW;
>

sensorStatus1 = digitalRead (InSensor1);
sensorStatus2 = digitalRead (InSensor2);

void BodyForward()
<
digitalWrite(DriveVector1, LOWValue);
digitalWrite(DriveSpeed1, HIGHValue);
digitalWrite(DriveVector2, LOWValue);
digitalWrite(DriveSpeed2, HIGHValue);
>

void BodyBackward()
<
digitalWrite(DriveVector1, HIGHValue);
digitalWrite(DriveSpeed1, LOWValue);
digitalWrite(DriveVector2, HIGHValue);
digitalWrite(DriveSpeed2, LOWValue);
>

void BodyRight()
<
digitalWrite(DriveVector1, HIGHValue);
digitalWrite(DriveSpeed1, LOWValue);
digitalWrite(DriveVector2, LOWValue);
digitalWrite(DriveSpeed2, HIGHValue);
>

void BodyStop()
<
digitalWrite(DriveVector1, 0);
digitalWrite(DriveSpeed1, 0);
digitalWrite(DriveVector2, 0);
digitalWrite(DriveSpeed2, 0);
>

Робот, ездящий по линии под управлением Arduino

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

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

В нашем примере будет собран робот на лёгкой платформе с двумя колёсами и двумя датчиками линии, расположенными на днище робота перед колёсами.

В результате выглядеть он будет так:

Что понадобится

Для нашего примера понадобятся следующие детали:

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

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

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

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

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

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

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

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

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

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

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

Крепим Arduino

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

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

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

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

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

Крепим Troyka Shield

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

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

Теперь напишем программу, которая заставит собранную конструкцию двигаться по нарисованной линии. В проекте мы будем использовать чёрную линию, напечатанную на белых листах бумаги.

Основная идея алгоритма

Пусть у нас усть белое поле, и на нём чёрным нарисован трек для нашего робота. Используемые датчики линии выдают логический ноль, когда «видят» чёрное и единицу, когда «видят» белое.

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

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

Таким образом получаем простую систему с тремя состояниями:

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

Реализация на Arduino

Проблема инертности и её решение

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

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

Эксперимент проведём для разных скоростей. Код программы для эксперимента таков:

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

Таким образом, начиная с некоторого момента у нашего робота нет никакой возможности успеть среагировать и остаться на треке.

Что можно сделать?! После того, как сенсоры улавливают поворот, можно остановиться и вернуться назад на некоторое расстояние, зависящее от скорости перед остановкой. Однако мы можем отдать команду роботу ехать с какой-то скоростью, но не можем приказать ему проехать какое-то расстояние.

Для того, чтобы понять зависимость расстояния при заднем ходе от времени, был проведён ещё один замер:

На скорости 50, например, робот проделывал путь, зависящий от времени следующим образом:

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

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

Адаптивное поведение

Перед финальным экспериментом произведём ещё несколько поправок.

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

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

В итоге наш код будет выглядит следующим образом:

Результат

Что дальше?

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

Нет ничего лучше, чем обставить оппонента на секунду-другую.

Ссылка на основную публикацию
Adblock
detector