Хабрахабр

Опыт создания первого робота на Ардуино (робот-«охотник»)

Здравствуйте.

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

Что именно с ним получалось, а что нет — на это я выделил часть статьи, возможно, кому-то пригодится.
По мере возможности я привлекал к участию своего сына (8 лет).

Общее описание робота

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

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

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

Структура робота

Итак, мы определились с идеей, перейдем к компоновке. Список элементов формируется из того, что должен уметь робот. Тут всё вполне очевидно, поэтому сразу посмотрим на нумерацию:

Для наших целей ее вполне хватает (ориентируемся на количество используемых пинов). «Мозги» робота — плата arduino uno (1); была в заказанном из Китая наборе. Также в наборе был готовый батарейный отсек (5). Из этого же набора мы взяли готовое шасси (2), на которое крепятся два ведущих колеса (3) и одно заднее (свободно вращающееся) (4). Спереди у робота стоит ультразвуковой датчик (HC-SR04) (6), сзади — драйвер двигателей (L298N) (7), по центру — светодиод-мигалка (8), и чуть в стороне — пищалка (9).

На этапе компоновки мы смотрим:

— чтобы все влезло
— чтобы было сбалансировано
— чтобы было рационально размещено

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

Нюансы:

  1. В шасси из набора есть много заводских отверстий, но какая в них логика — я так и не разобрался. Двигатели и аккумуляторный блок закрепились без проблем, дальше началась «подгонка» со сверлением новых отверстий, чтобы закрепить ту или иную плату.
  2. Весьма выручили латунные стойки и прочий крепеж из запасников (иногда приходилось выкручиваться).
  3. Шины от каждой платы пропускал через зажимы (опять же нашел в запасниках). Весьма удобно, все провода лежат красиво и не болтаются.

Отдельные блоки

Теперь пройдусь по блокам и расскажу персонально про каждый.

Батарейный отсек

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

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

Так как питание нужно везде, то для удобства я сделал по центру робота два разъема: один «раздает» землю (справа), а второй — 5 В (слева).

Двигатели и драйвер

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

По документации у него три пина на каждый двигатель: один для изменения скорости и пара пинов для направления вращения. Для управления двигателями, как я писал выше, используется драйвер L298N. Оказывается, если напряжение питания 5 В, то регулировка скорости просто не работает! Тут есть один важный момент. Вот такая особенность, из-за которой я «убил» пару вечеров. То есть либо совсем не крутит, либо крутит по максимуму. В конце концов, нашел упоминание где-то на одном из форумов.

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

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

Ультразвуковой датчик

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

Исходя из тестов на реальных детях (во время тестов ни один ребенок не пострадал!), его оказалось вполне достаточно для нормализации данных. В качестве такой обработки я поставил медианный фильтр на три отсчета. Вторые представляют собой случайные выбросы в измерениях вида 45, 46, 230, 46, 46, 45, 45, 310, 46… Именно их медианный фильтр и отсекает. Физика здесь простая: у нас есть сигналы, отраженные от нужных объектов (дающие требуемое расстояние) и отраженные от более далеких, например, стен.

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

Мигалка и сирена

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

Программа управления

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

Точнее, вспомнить, потому что и раньше, и сейчас все равно занимаюсь электроникой. Первое, что пришлось осмыслить: робот — это устройство реального времени. Вместо этого, как советуют опытные люди, вводим таймеры на каждый блок. Значит, сразу забываем про вызов delay(), который очень любят использовать в скетчах-примерах, и который просто «замораживает» программу на указанный промежуток времени. Прошел требуемый промежуток — выполнили действие (увеличили яркость светодиода, включили двигатель и так далее).

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

Если так не делать, то потом уже не разобраться, что откуда и куда. Естественно, всё разбиваем на отдельные функции (мигалка, звук, поворот, движение вперед и так далее).

Нюансы педагогики

Все, что было описано выше, я делал в свободное время по вечерам. В неспешном режиме я потратил на робота где-то недели три. На этом можно было бы и завершиться, но я еще обещал вам рассказать о работе с ребенком. Что выполнимо в таком возрасте?

Работа по инструкции

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

Порядок работы («от частного к общему»)

Нужно приучать, что большой проект («сделать робота») состоит из мелких задач («подключить датчик», «подключить моторы»...), а те, в свою очередь, из еще более мелких шагов («найти программу», «подключить плату», «загрузить прошивку»...). Вот это сложный пункт. Объяснял, но, думаю, осознание придет еще не скоро. Выполняя более-менее понятные задачи нижнего уровня, мы «закрываем» задачи среднего уровня, а из них уже складывается общий результат. Где-то, наверное, к подростковому возрасту.

Монтаж

Ребенок получил базовый скилл «Работа с паяльником» — удалось спаять несколько соединений (я чуть-чуть помогал, не скрою). Сверление, резьбы, винты, гайки, пайка и запах канифоли — куда же без этого. Не забывайте про объяснение техники безопасности.

Работа на компьютере

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

В школе его только-только начали, поэтому мы «со скрипом» разбирали, что такое pishalka, migalka, yarkost и прочий транслит. Первое: английский. Я осознанно не стал использовать родные английские слова, так как до этого уровня мы еще не дошли. Поняли хотя бы это.

Учили горячие комбинации клавиш, как быстро выполнять типовые операции. Второе: эффективная работа. Приходилось повторять снова и снова: «выдели двойным кликом», «зажми Shift», «зажми Ctrl» и так далее. Периодически, когда писали программу, мы менялись с сыном местами, и я говорил, что нужно сделать (замену, поиск и т.д.). Процесс обучения здесь не быстрый, но, я думаю, навыки постепенно отложатся «в подкорку».

Скрытый текст

Но, честно, этой осенью мне довелось вести информатику в 9-х классах в одной школе. Вы можете сказать, что описанное выше — это почти очевидно. Ученики не знают таких элементарных вещей, как Ctrl + Z, Ctrl + C и Ctrl + V, выделения текста с зажатым Shift-ом или двойным кликом на слове и прочего. Это ужас. Это при том, что у них шел третий год обучения информатике… Вывод сделайте сами.

Третье: слепая печать. Комментарии в коде я доверил печатать ребенку (пусть тренируется). Сразу поставили правильно руки, чтобы пальцы постепенно запоминали расположение клавиш.

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

Кстати, про перспективу…

Дальнейшее развитие

Робот сделан, ездит, мигает и пищит. Что же теперь? Воодушевившись достигнутым, мы планируем дорабатывать его дальше. Есть задумка сделать дистанционное управление — по типу лунохода. Было бы интересно, сидя за условным пультом, контролировать движение робота, который ездит совсем в другом месте. Но это уже будет отдельная история…

И в конце, собственно, герои этой статьи (видео по клику):

Спасибо за внимание!

→ Ссылка на код

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»