В данной статье я хочу описать процесс сборки своего первого робота на ардуино. Материал будет полезен другим таким же новичкам, как и я, которые захотят изготовить какую-нибудь «самобеглую тележку». Статья представляет собой описание этапов работы с моими дополнениями по различным нюансам. Ссылка на итоговый код (скорее всего, не самый идеальный) дана в конце статьи.
По мере возможности я привлекал к участию своего сына (8 лет). Что именно с ним получалось, а что нет — на это я выделил часть статьи, возможно, кому-то пригодится.
Общее описание робота
Вначале несколько слов о самом роботе (идея). Собирать что-то типовое на старте не очень хотелось. В то же время, набор компонентов был довольно стандартным — шасси, двигатели, ультразвуковой датчик, датчик линии, светодиоды, пищалка. Вначале из этого «супового набора» был придуман робот, который охраняет свою территорию. Он едет на нарушителя, который пересек линию круга, а потом возвращается в центр. Однако в этом варианте была нужна прочерченная линия, плюс лишняя математика, чтобы постоянно оставаться в круге.
Поэтому после некоторых обдумываний я несколько изменил идею и решил делать робота-«охотника». На старте он поворачивается вокруг своей оси, выбирая поблизости цель (человека). Если «жертва» обнаружена, «охотник» включает мигалку и сирену, и начинает ехать на нее. Когда человек отходит/отбегает, робот выбирает новую цель и преследует ее, и так далее. Такому роботу не нужен ограниченный круг, и он может работать на открытой территории.
Как видите, это во многом напоминает игру «догонялки». Хотя в итоге робот и не получился достаточно резвым, но он честно взаимодействует с окружающими его людьми. Особенно это нравится детям (иногда, правда, кажется, что они вот-вот растопчут его, аж сердце ёкает...). Думаю, для популяризации технического конструирования это хорошее решение.
Структура робота
Итак, мы определились с идеей, перейдем к компоновке. Список элементов формируется из того, что должен уметь робот. Тут всё вполне очевидно, поэтому сразу посмотрим на нумерацию:
«Мозги» робота — плата arduino uno (1); была в заказанном из Китая наборе. Для наших целей ее вполне хватает (ориентируемся на количество используемых пинов). Из этого же набора мы взяли готовое шасси (2), на которое крепятся два ведущих колеса (3) и одно заднее (свободно вращающееся) (4). Также в наборе был готовый батарейный отсек (5). Спереди у робота стоит ультразвуковой датчик (HC-SR04) (6), сзади — драйвер двигателей (L298N) (7), по центру — светодиод-мигалка (8), и чуть в стороне — пищалка (9).
На этапе компоновки мы смотрим:
— чтобы все влезло
— чтобы было сбалансировано
— чтобы было рационально размещено
Частично это уже сделали за нас китайские коллеги. Так, тяжелый батарейный отсек поставлен в центр, и примерно под ним стоят ведущие колеса. Все остальные платы легкие, их можно размещать по периферии.
Нюансы:
- В шасси из набора есть много заводских отверстий, но какая в них логика — я так и не разобрался. Двигатели и аккумуляторный блок закрепились без проблем, дальше началась «подгонка» со сверлением новых отверстий, чтобы закрепить ту или иную плату.
- Весьма выручили латунные стойки и прочий крепеж из запасников (иногда приходилось выкручиваться).
- Шины от каждой платы пропускал через зажимы (опять же нашел в запасниках). Весьма удобно, все провода лежат красиво и не болтаются.
Отдельные блоки
Теперь пройдусь по блокам и расскажу персонально про каждый.
Батарейный отсек
Понятно, что робот должен иметь хороший источник энергии. Варианты могут быть разные, я выбрал вариант с 4 аккумуляторами АА. В сумме они дают примерно 5 В, и такое напряжение можно прямо подать на пин 5V платы arduino (минуя стабилизатор).
Некоторая настороженность, конечно, у меня была, но это решение вполне работоспособно.
Так как питание нужно везде, то для удобства я сделал по центру робота два разъема: один «раздает» землю (справа), а второй — 5 В (слева).
Двигатели и драйвер
Сначала про крепление двигателей. Крепление заводское, но сделано с большими допусками. Другими словами, двигатели могут «вихлять» на пару миллиметров влево-вправо. Для нашей задачи это не критично, а вот где-то может и влиять (робота начнет уводить в сторону). На всякий случай я выставил двигатели строго параллельно и зафиксировал клеем.
Для управления двигателями, как я писал выше, используется драйвер L298N. По документации у него три пина на каждый двигатель: один для изменения скорости и пара пинов для направления вращения. Тут есть один важный момент. Оказывается, если напряжение питания 5 В, то регулировка скорости просто не работает! То есть либо совсем не крутит, либо крутит по максимуму. Вот такая особенность, из-за которой я «убил» пару вечеров. В конце концов, нашел упоминание где-то на одном из форумов.
Вообще говоря, низкая скорость вращения мне требовалась при развороте робота — чтобы он имел запас времени просканировать пространство. Но, так как с такой задумкой ничего не вышло, пришлось делать по другому: небольшой поворот — остановка — поворот — остановка и т. д. Опять же, не столь изящно, но работоспособно.
Еще здесь добавлю, что после каждого преследования робот выбирает случайное направление нового поворота (по или против часовой стрелки).
Ультразвуковой датчик
Еще одна железяка, где пришлось искать компромиссное решение. Ультразвуковой датчик на реальных препятствиях дает нестабильные цифры. Собственно, это было ожидаемо. Идеально он работает где-нибудь на соревнованиях, где есть гладкие, ровные и перпендикулярные поверхности, а вот если перед ним «мелькают» чьи-то ноги — тут нужно вводить дополнительную обработку.
В качестве такой обработки я поставил медианный фильтр на три отсчета. Исходя из тестов на реальных детях (во время тестов ни один ребенок не пострадал!), его оказалось вполне достаточно для нормализации данных. Физика здесь простая: у нас есть сигналы, отраженные от нужных объектов (дающие требуемое расстояние) и отраженные от более далеких, например, стен. Вторые представляют собой случайные выбросы в измерениях вида 45, 46, 230, 46, 46, 45, 45, 310, 46… Именно их медианный фильтр и отсекает.
После всей обработки у нас получается расстояние до ближайшего объекта. Если оно меньше некоторой пороговой величины — тогда мы включаем сигнализацию и едем прямо на «нарушителя».
Мигалка и сирена
Пожалуй, самые простые элементы из всего перечисленного. Их видно на фотографиях выше. По железу здесь писать нечего, поэтому теперь перейдем к коду.
Программа управления
Расписывать детально код я смысла не вижу, кому нужно — ссылка в конце статьи, там всё достаточно читабельно. А вот общую структуру было бы неплохо объяснить.
Первое, что пришлось осмыслить: робот — это устройство реального времени. Точнее, вспомнить, потому что и раньше, и сейчас все равно занимаюсь электроникой. Значит, сразу забываем про вызов delay(), который очень любят использовать в скетчах-примерах, и который просто «замораживает» программу на указанный промежуток времени. Вместо этого, как советуют опытные люди, вводим таймеры на каждый блок. Прошел требуемый промежуток — выполнили действие (увеличили яркость светодиода, включили двигатель и так далее).
Таймеры могут быть взаимосвязаны. Так, например, пищалка работает синхронно с мигалкой. Это чуть упрощает программу.
Естественно, всё разбиваем на отдельные функции (мигалка, звук, поворот, движение вперед и так далее). Если так не делать, то потом уже не разобраться, что откуда и куда.
Нюансы педагогики
Все, что было описано выше, я делал в свободное время по вечерам. В неспешном режиме я потратил на робота где-то недели три. На этом можно было бы и завершиться, но я еще обещал вам рассказать о работе с ребенком. Что выполнимо в таком возрасте?
Работа по инструкции
Каждую деталь мы сначала проверяли отдельно — светодиоды, пищалка, моторы, датчики и т. д. Есть большое количество готовых примеров — какие-то прямо в среде разработки, другие можно найти в интернете. Это, несомненно, радует. Берем код, подключаем деталь, убеждаемся, что работает, далее уже начинаем изменять под свою задачу. Подключения по схеме и под некоторым моим контролем ребенок делает сам. Это хорошо. Работать четко по инструкции тоже надо уметь.
Порядок работы («от частного к общему»)
Вот это сложный пункт. Нужно приучать, что большой проект («сделать робота») состоит из мелких задач («подключить датчик», «подключить моторы»...), а те, в свою очередь, из еще более мелких шагов («найти программу», «подключить плату», «загрузить прошивку»...). Выполняя более-менее понятные задачи нижнего уровня, мы «закрываем» задачи среднего уровня, а из них уже складывается общий результат. Объяснял, но, думаю, осознание придет еще не скоро. Где-то, наверное, к подростковому возрасту.
Монтаж
Сверление, резьбы, винты, гайки, пайка и запах канифоли — куда же без этого. Ребенок получил базовый скилл «Работа с паяльником» — удалось спаять несколько соединений (я чуть-чуть помогал, не скрою). Не забывайте про объяснение техники безопасности.
Работа на компьютере
Программу для робота писал я, но каких-то попутных результатов все-таки удалось достичь.
Первое: английский. В школе его только-только начали, поэтому мы «со скрипом» разбирали, что такое pishalka, migalka, yarkost и прочий транслит. Поняли хотя бы это. Я осознанно не стал использовать родные английские слова, так как до этого уровня мы еще не дошли.
Второе: эффективная работа. Учили горячие комбинации клавиш, как быстро выполнять типовые операции. Периодически, когда писали программу, мы менялись с сыном местами, и я говорил, что нужно сделать (замену, поиск и т.д.). Приходилось повторять снова и снова: «выдели двойным кликом», «зажми Shift», «зажми Ctrl» и так далее. Процесс обучения здесь не быстрый, но, я думаю, навыки постепенно отложатся «в подкорку».
Третье: слепая печать. Комментарии в коде я доверил печатать ребенку (пусть тренируется). Сразу поставили правильно руки, чтобы пальцы постепенно запоминали расположение клавиш.
Как видите, у нас все еще только-только начинается. Навыки и знания будем оттачивать и дальше, в жизни пригодятся.
Кстати, про перспективу…
Дальнейшее развитие
Робот сделан, ездит, мигает и пищит. Что же теперь? Воодушевившись достигнутым, мы планируем дорабатывать его дальше. Есть задумка сделать дистанционное управление — по типу лунохода. Было бы интересно, сидя за условным пультом, контролировать движение робота, который ездит совсем в другом месте. Но это уже будет отдельная история…
И в конце, собственно, герои этой статьи (видео по клику):
Спасибо за внимание!
→ Ссылка на код
Комментарии (30)
BiosUefi
15.01.2019 12:43+2Осталось собрать второго (а за ним и третьего) и науськать друг на друга или на общую цель.
Наблюдая за сворой со стороны.
DeadDevelopmentInc
15.01.2019 13:53Попробуйте следующее решение построить на базе машинки на радиоуправлении, +удаленное управление через телефон (есть несколько готовых приложений под андроид) и получится крутой агрегат для сына))
druzhkov Автор
15.01.2019 13:54Приложения андроид подходят для управления именно моделей ардуино?
CrashLogger
15.01.2019 16:15Для Arduino есть bluetooth модули, приложение под Android придется писать самому.
censor2005
15.01.2019 16:24На самом деле есть приложения для управления роботом по блютуз — Arduino Bluetooth rc car, Bluetooth robot remote control. Нужно будет только изменить немного код скетча
druzhkov Автор
15.01.2019 19:33Вживую тестировали? Какие там ограничения по дальности?
censor2005
16.01.2019 05:56Не помню каким именно приложением пользовался, ограничение как у обычного Blutooth — примерно 30 метров прямой видимости
DeadDevelopmentInc
17.01.2019 13:39точное приложение коим еще сам пользовался «Arduino Bluethooth RC Car», общение идет через модуль bluethooth, как уже было отмечено выше, ограничения по дальности зависят от модуля, попадались и хорошие и не очень, но лучше выбирать wifi (далее сам на него перешел)
Alhiimik
15.01.2019 18:01Я в своих проектах отказался от L298N и им подобным — они много теряют энергии в пустоту. Заменил их на Adafruit DRV8871 и его аналоги от Китайцев
enjoyneering
15.01.2019 20:21Как раз недавно писал библиотеку для HС-SR04 с медианным фильтром. Не хотите попробовать? Код будет чище и быстрее, за счет того что можно прописывать максимальное расстояние. Чуть-чуть вырастет точность — библиотека учитывает изменение скорости звука от температуры.
SunTechnik
15.01.2019 21:33Здорово, что автор смог довести дело до конца. У меня такая же платформа, никак собрать не соберусь…
Несколько идей:
По описанию, на плате L298N должен быть джампер, который разрещает управление скоростью.
Есть платформа — mBot. В качестве основы они взяли ту же ардуино, но делали на своей плате. Все схемы открыты. От них я взял, что в качестве драйверов двигателей можно использовать TB6612. На ней гораздо меньше потери.druzhkov Автор
15.01.2019 21:41Даже не один джамер, а два — на каждый двигатель соответственно. Если джампер снимаем, то по документации скорость можно менять. А при низком напряжении питания — шиш. Я как раз об этом и писал в статье.
SunTechnik
15.01.2019 22:05Не буду спорить. Вы сделали, а я нет. + китайские платы бывают со своими уникальными глюками, но вот тут эту проблему успешно решили:
arduino.ru/forum/apparatnye-voprosy/l298n-problema-regulirovki-skorosti
Felan
16.01.2019 07:19Я не очень понял, почему L298N не позвояет управлять скоростью? Вроде у меня тоже китайский комплект. И все прекрасно управляется шимом при питании в пять вольт.
Можно схему посмотреть?
Если что, то мой набор типа такого.druzhkov Автор
16.01.2019 12:04Схему не составлял. Проверял отдельно на одном двигателе — два входа драйвера на цифровые выходы, и один на шим выход ардуино (3, 6, 9...) Два разных скетча пробовал. Не получилось. Может, брак. Потом будем следующего робота собирать, еще отдельно поработаю над этим вопросом.
Alexshev92
16.01.2019 08:07Надо же, буквально на днях начал собирать что-то подобное и тут такая статья вышла.
Интересует такой вопрос: как долго Ваш робот работает без подзаряда батарей? Потребление у него должно быть довольно приличное.druzhkov Автор
16.01.2019 12:10От момента зарядки суммарно накатали минут 30-40, пока не заметно, что энергии стало меньше. Аккумуляторы на 2700 мА*ч.
Areso
17.01.2019 16:07А эта штука не будет принимать за людей другие объекты? Скажем, ножку стула. Или человек отбежит до стены, игрушка за человеком, человек отбегает от игрушки быстро, и ближайший объект к игрушке оказывается… стена?
druzhkov Автор
17.01.2019 16:22Да, на мебель и стены реагирует, это его ограничение. Можно улучшать алгоритм, например, определять, что едет на неподвижный предмет. Или ставить ограничитель на минимальное расстояние, чтобы не врезался никуда. В-общем, есть куда развиваться.
Ermak
23.01.2019 18:08Можно добавить модуль с видеокамерой для ведения трансляции «охоты» на монстров и распознавании «жертв» по лицам. Есть такое для RaspPi 3.
grigorym
24.01.2019 07:554.8 номинального напряжения 4хАА — это очень мало для этих моторов. Лучше все-таки с самого начала именно в схеме предусмотреть разделение силовой части моторов, которые вообще питать от 2х18650 или 3х18650, что дает 7.4В или 11.1В, и низковольтной части ардуины и прочих. Сам на каких-то платформах делал с 4хАА, и плевался потом от тормознутости, а 3х18650 работали отлично.
zoldaten
15.07.2019 17:02с 3-я 18650 надо быть осторожнее, т.к. они дают суммарно более 12 V. хотя и заявлено, что в 18650 — 3,7 V, на практике 4,2 V. можно спалить L298N, если перемычку не убрать.
Tsvetik
31.01.2019 11:18Идея супер.
Я прямо загорелся ее повторить.
А почему бы в качестве платформы не взять шасси от какой-нибудь радиоуправляемой игрушки? В семье с маленькими мальчиками обычно этого добра полно.
И еще. Как с помощью одного УЗ датчика определить в какую сторону из поля видимости ушла цель, чтобы продолжить ее преследовать?druzhkov Автор
08.02.2019 08:48Одним датчиком, я думаю, тут не обойтись. Надо два. Или что-то посерьезнее, потому что УЗ датчик довольно нестабилен с плане определения препятствий (он только на гладких стенках хорошо работает).
zoldaten
15.07.2019 17:00шасси, включая те, что использует автор имеют низкую проходимость, заметно буксуют на коврах, скользят на ламинате. пока лучшее, что мне попадалось это танки —
zoldaten
15.07.2019 17:11есть книга ROS for absolute beginners — link.springer.com/book/10.1007/978-1-4842-3405-1, при желании можно найти в сети. там реализован проект, подобный вашему, но с использованием ROS. в том числе там можно управлять удаленно arduinoй по bluetooth и считывать показания энкодеров с колес. попробуйте, в какой-то мере, это продолжение вашего проекта.
IvanychS
Автору спасибо! Личный опыт всегда интересен.
Понимаю, что проект довольно стандартный, но схемку было бы неплохо выложить.
druzhkov Автор
Схемы, к сожалению, нет, но можно ориентироваться на список пинов, перечисленных в самом начале программы. Я постарался развернуто прокомментировать код.