Введение
Это руководство в первую очередь предназначено для тех, кто хочет начать заниматься программированием и созданием роботов, но не знает куда идти дальше после мигания светодиодами на Arduino.
Руководство в первую очередь применялось в небольших классах для любопытных детей, но вполне успешно может быть опробовано в домашних условиях в силу текущих событий в мире.
Итак, предлагаю собрать несложного, но почти живого робота, который будет приятно жужжать, сам решать свои движения и, надеюсь, принесёт тележку удовольствия тем, кто его будет собирать.
Интересно? Тогда начнём.
Возраст
Изначальная предполагаемая целевая аудитория — дети примерно 7-10 лет, но уверен, что это может быть интересно и детям в возрасте до 99 лет и старше.
От себя лично могу добавить, что при определённой помощи данный процесс удалось успешно донести и повторить в классе из десяти детей в возрасте примерно 5-6 лет, пусть и с некоторыми упрощениями и абстракциями. Детям понравилось и это главное.
По ходу статьи я добавлю замечания на случай того, если кто-то будет это собирать с ребёнком. На случай у кого будет желание попробовать это с группой детей, то советую попробовать с одним студентом для начала.
Полностью с нуля со всеми деталями можно собрать это примерно за 2-3 часа. Или чуть дольше если торопиться и что-то пойдёт не так.
Идея
Для первого материала был выбран простой вариант двух-колёсного робота, который должен передвигаться по линии. Сенсорами будут два инфракрасных датчика, которые будут отслеживать траекторию.
Все детали должны быть доступны для покупки онлайн с возможностью подобрать альтернативные варианты.
Пайка нужна только один раз что бы припаять провода к моторам (два мотора по два провода на каждый = четыре точки для пайки).
Для простоты повторения и дальнейших экспериментов была выбрана платформа Arduino. Она хорошо подходит для простых прототипов и общего понимания.
Так же новичкам будет легче повторить и добавить что-то своё, благо порог вхождения достаточно низок.
Теория
Для общего понимания попробуем сравнить робота с чем-то более знакомым.
Наш робот очень похож на человеческий организм. По этой причине мы можем сравнить все его компоненты с разными органами человека.
Например, у человека есть органы осязания, которые получают информацию об окружающем мире вокруг.
Информация от глаз поступает в мозг, где происходит обработка.
Мозг получает эти сигналы, решает что надо делать и отдаёт команды ногам, которые ведут нас к чему-то интересному.
Устройство робота можно свести к трём основным узлам:
Сенсоры (Sense) — это сенсоры, которыми робот «видит» окружающий мир. В нашем случае — это глаза робота, которые смотрят на дорогу.
Мозг (Plan) — это та часть робота, которая получает информацию от сенсоров, обрабатывает и передаёт команды на исполняемые части.
Исполнители (Act) — эти части робота непосредственно выполняют действия по командам, которые были получены от мозга.
Если это перевести на нашего робота, то получится такое:
Глаза робота — это сенсоры, которые «видят» происходящее перед роботом. В нашем случае глаза смотрят на дорогу.
Мозг робота — это маленький компьютер, которые получает информацию от глаз, решает как на неё реагировать и отдаёт команды мышцам.
Мышцы робота — это драйвер моторов, который получает и усиляет сигнал от мозга и крутит колёса в нужном направлении.
Ноги робота — это как раз наши колёса, которые везут робота навстречу новым приключениям.
Так как сигналы мозга слабы, что бы дать команду нашим ногам, у нас есть мышцы, которые принимают сигналы от мозга, усиляют их, а потом передают движение ногам.
В нашем случае «Исполнители» — это мышцы+ноги.
Упрощённо полный путь сигнала можно представить в виде: глаза -> мозг -> мышцы -> ноги.
Соединительные провода — это нервная система робота, по которой приходят сигналы к мозгу и отправляются команды другим органам. Про нервную систему детям я обычно рассказываю на моменте сборки.
Реализация
Теперь попробуем нашу теорию претворить в жизнь.
Как с любой сложной задачей надо правильно разбить её на несколько простых маленьких задачек.
Весь проект для упрощения разделим на две части: программная и железная.
При повторении проще начать с программной части, что бы «мозг» уже был готов по окончанию сборки.
Программная часть
Алгоритм
Алгоритм до безобразия прост.
У робота впереди стоят два сенсора, которые «смотрят» на дорогу. Сенсоры могут различать светлое и тёмное по тому как отражается свет от поверхности.
Дорога выполнена в виде тёмной полосы, по которой робот едет.
Если оба сенсора видят светлое — значит, мы идём по дороге, так как наша тёмная дорога проходит ровно между сенсорами.
Когда один сенсор видит тёмное, то дорога ушла вбок и мы делаем поворот — колесо со стороны этого сенсора замедляется.
В случае когда оба сенсора видят тёмное, то это сигнал остановки.
Схематично этот процесс изображён на данном рисунке:
Черный цвет — это дорога. Зелёный цвет — наши сенсоры-глаза.
На схеме слева дорога идёт прямо и оба сенсора видят светлое отражение.
Но на схеме справа дорога уже заворачивает и левый сенсор замечает тёмное отражение для того что бы робот мог начать делать нужный манёвр и остаться на дороге.
В коде я сделал небольшой трюк с поворотом: колесо не просто замедляется, а чуть-чуть крутится назад. В этом случае робот может делать более резкие повороты.
Сам код можно посмотреть на GitHub.
Закачивание программы в «мозг»
Когда я вёл класс с 5-6-летками, то на все «мозги» предварительно была загружена нужная программа, что бы не тратить на это время во время класса.
Сам процесс закачивания программы в микроконтроллер не отличается от других Arduino-совместимых плат: установить плагин для ESP8266 (если ещё не установлен), подключить ESP8266 модуль по USB, открыть или скопировать скетч (файл .ino) и нажать «Upload».
Тут есть более подробная инструкция установки поддержки ESP8266 в Arduino для тех, кто с этим пока не знаком.
Железная часть
Как основа для шасси, использована двух-колёсная платформа. Она легко доступна, у неё простая конструкция и с ней легко работать.
«Центром управления» был выбран популярный микроконтроллер Espressif ESP8266, реализованный в виде модуля NodeMCU.
Так же для этой платы есть удобный модуль для драйверов двигателя на L293DD. Как раз достаточно для раскачивания двух небольших моторов. Только благодаря наличию этого модуля для моторов количество соединительных проводов заметно снижается.
Схема соединений
Примерная схема соединений получается такой:
Список основных компонентов
- ESP8266 NodeMCU v2
- Motor Shield для NodeMCU v2
- Пара инфра-красных сенсоров
- Двух-колёсное шасси с моторами и колёсами
- Соединительные провода (Dupont wires) для сенсоров
- Дополнительные винты/гайки/крепления для установки сенсоров и контроллера на шасси
- Чёрная изолента для дороги (если поверхность достаточно светлая, то можно и синюю)
Общая стоимость всех деталей обычно не превышает $20.
Немного подробнее о компонентах:
- ESP8266 NodeMCU v2:
Существует несколько вариантов ESP8266 NodeMCU модулей. Они не все совместимы друг с другом как электрически, так и механически.
В данном проекте используется ESP8266 NodeMCU «v2». Самый простой признак — этот модуль использует CP2102 для USB интерфейса. Вариант NodeMCU на базе CH340G обычно шире физически и поэтому не подойдёт для драйвера моторов. - Motor Shield для NodeMCU v2:
Прелесть этого модуля тем, что NodeMCU плата вставляется в него и поэтому количество проводов в проекте сильно уменьшается.
Существует только один вариант этого модуля на базе L293DD. Этой микросхемы достаточно как раз что бы раскачать двигатели на нашем шасси. - Инфракрасные сенсоры:
Данные модули представляют из себя светодиод (излучатель) и фотодиод (приёмник). По отражению робот может определить что он видит перед собой — тёмную полосу или светлый пол.
Я советую брать модули с подстройкой, что бы можно было отрегулировать чувствительность и уменьшить ложные срабатывания при определении светлого и тёмного.
Советую заказать больше двух — стоят они не много, но у них есть высокий риск сломаться при неосторожном обращении. - Для шасси был выбран один из самых популярных и доступных вариантов на интернет просторах.
В этом комплекте уже есть моторы со встроенными редукторами, колёса, держатель для трёх AA элементов и минимальный набор винтов и гаек что бы это всё собрать вместе.
Как альтернативный вариант для питания, можно заменить держатель 3 * AA на держатель для одного литий-йоного элемента в формате 18650. - Dupont провода.
Провода надо с разъёмами мама-мама (female-female). Оптимальная длина примерно 20 см.
Желательно что бы провода были разных цветов во избежании путаницы при подключении. - Дорога
Это обычная тканевая клейкая лента. Клеится еле-еле, но это как раз хорошо, так как она не оставляет следа и легко изменять дорогу если нужны корректировки.
Сборка
В классе с 5-6-летками пункты 1-5 были выполнены предварительно для того, что бы детям надо было только разобраться с подключением проводов для соединения ключевых органов робота друг с другом.
То есть, они как раз собирают эту соединительную сигнальную нервную систему сами. Тут по ходу можно ещё раз показать где тут глаза, мозг, мышцы, ноги и как они все взаимодействуют друг с другом.
- Небольшая подготовительная операция.
a) Часто провода идут не припаянными к моторам. В этом случае надо их припаять. Это единственный момент где нужна пайка. Если нет вариантов, то можно кого-то заранее попросить припаять или попробовать самому прикрутить провода, но в случае прикручивания сложно сделать хороший контакт. Надо иметь это в виду.
b) Модули драйвера двигателей могут идти с джампером на гребёнке с питанием (VIN-VM-NC) или без оного. В последнее время джампер не ставят, но сама гребёнка есть.
Если есть джампер в закромах, то надо его поставить в позицию VIN-VM. У меня не было такого количества джамперов для всего класса и я просто припаял перемычку снизу платы.
Конфигурация VIN-VM позволяет использовать один и тот же источник питания для моторов и для «мозгов».
- Начнём со сборки самой платформы.
Перед установкой компонентов я советую установить шестигранные крепления для модуля драйвера двигателей и инфракрасных сенсоров.
Теперь установим держатели для моторов и сами моторы. Колёса лучше ставить в самом конце.
Потом надо установить держатель для AA элементов. Провода пока соединять не надо. Выключатель я не устанавливал, так как на модуле драйвера двигателя уже есть выключатель.
Часто в комплекте есть энкодеры (круглые диски с поперечными отверстиями по кругу), но в данном проекте они не используются, поэтому устанавливать не обязательно. - Вставляем «мозг» робота на «мышцы», то есть ставим модуль микроконтроллера на модуль драйвера двигателей.
Важно соблюдать правильное направление, иначе будет «взрыв мозга» в виде белого дыма, на котором работает вся электроника в мире. Антенна на модуле микроконтроллера должна совпадать с нарисованной антенной на модуле драйвера. - Привинчиваем бутерброд с «мозгами» и «мышцами» на шасси.
- Устанавливаем два инфракрасных сенсора так, что бы передатчик-приёмник «смотрели» вниз.
Можно либо установить сами модули вертикально (но я не придумал как это сделать легко), либо подогнуть передатчик-приёмник на 90 градусов. Подгинать надо не спеша, что бы не отломать их случайно. Если есть время, то может быть проще просто перепаять как надо без риска отломать.
- Соединяем провода.
На модуле драйвера есть восемь синих клемм. Достаточно ослабить их отвёрткой, что бы внутрь пролез провод и потом закрутить винт, что бы провод не выпадал и имел хороший контакт.
Подключим питание на VIN и GND (VIN-красный, GND-чёрный). Важно соблюдать полярность и не перепутать «плюс» и «минус».
Подсоединим оба мотора на A-/A+ для левого и b+/B+ для правого. Тут тоже надо соблюдать полярность, но при ошибке мотор будет крутиться в другую сторону и в этом случае достаточно провода поменять местами в клеммах.
Теперь соединим «глаза». Тут я использую «Dupont wire» для удобства. Пожалуй, для детей (да и для некоторых взрослых) это самый сложный шаг. У каждого модуля сенсора есть три контакта — «плюс» (VCC), «минус» (GND) и «сигнал» (OUT). Сложность в том, что на модуле драйвера эти сигналы стоят в другом порядке и важно проверить правильное соединение.
Левый «глаз» робота идёт на группу «5», а правый «глаз» идёт на группу «6» (группы заданы в программе робота).
Первый пуск
Ставим наше творение на относительно светлый пол (главное, не на стол или куда-то ещё откуда он может упасть) и включаем кнопкой на модуле драйвера. Кнопка находится ближе к синим клеммам и рядом с VIN-VM-NC джампером.
На пустом относительно светлом полу робот должен ехать вперёд. Он может немного заворачивать вбок из-за асимметричности моторов или сборки, но это не так важно.
Если робот крутится на месте как кот, играющийся со своим хвостом, то это означает то, что один из моторов с перевёрнутой полярностью. Провода этого мотора надо поменять местами на синих клеммах.
На случай если робот едет назад, то полярность надо поменять на двух моторах.
Бывает что один из моторов не крутится вообще, обычно достаточно проверить соединение, так как бывает что провод слишком глубоко закручен в синюю клемму и прижим приходится на изоляцию от провода, а не на сам провод.
Проверка «зрения»
Для проверки сенсоров достаточно приклеить полоску чёрной изоленты перпендикулярно движению так, что бы оба сенсора на неё попали. Если робот остановился на полоске, то сенсоры работают и настроены правильно.
Бывает, что при слишком тонкой полоске робот может проскочить её из-за своей инерционности. В этом случае достаточно сделать полоску пошире.
Дорога
Теперь строим дорогу, экспериментируем с углами и поворотами, отмечаем остановки.
На мой взгляд, интереснее закольцевать дорогу, что бы робот не останавливался.
Итог
Он видит. Он едет. Сам.
Это результат одного из проведённых классов по сборке с пяти-летними студентами:
А тут самое интересное — запуск и проверка:
podde
Ну вы даёте. Программную часть рассказать двумя ссылками, да ещё и на английском языке. Ребёнок в моей душе негодует. Можно было весь пост дать ссылкой, раз уж так.
nochkin Автор
Алгоритм программы на русском языке есть в статье в секции «Алгоритм» прямо перед ссылкой на неё. С GitHub'а можно взять уже готовый код.
В статье больше упор на само устройство робота. Материал для дошкольников и им сложно с программой, поэтому я обычно рассказываю общий алгоритм программы, а не прохожу по всему коду подробно.
Сам код простой. Если есть такая необходимость пройтись по каждой строчке когда, то это уже на отдельную статью тянет. Но, конечно, могу и это сделать если будет многим интересно.