Электромеханическая игра «Лабиринт»

ВВЕДЕНИЕ

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

Рисунок 1 – Внешний вид готовой игры

ПЕРЕЧЕНЬ ЭЛЕМЕНТОВ

– Ардуино Уно;

– USB-кабель;

– брэдбоард;

– два сервопривода с качалками и комплектом шурупов/винтов для крепления;

– модуль джойстика;

– датчик пересечения луча;

– резисторы на 100 Ом и 10 кОм;

– зуммер;

– модуль понижающего преобразовав 5 Вольт);

– батарея 9 В или аккумулятор 12 В для питания сервоприводов;

– перемычки и провода;

– бумага;

– картон;

– клей ПВА;

– линейка, нож, ножницы;

– шарик;

– 4 металлических стойки с комплектом винтов для крепления.

ПЛАН

1 Механическая часть (подвижная платформа и лабиринт);

2 Электронная часть (сервоприводы, пъезоэлектрический излучатель, джойстик, щелевой датчик, модуль понижающего преобразователя напряжения);

3 Программная часть (программа на языке S4A).

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

Принцип действия

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

НЕ нашли? Не то? Что вы ищете?

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

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

Соответственно, наша игра должна состоять из трех частей:

– механическая (сам лабиринт и подвижная система, которая его наклоняет);

– электронная (Ардуино, сервомоторы, джойстик, щелевой датчик и система питания);

– программная (программа на языке Scratch, которая управляет нашим устройством).

Механическая часть

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

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

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

Рисунок 2 – Схема подвижной платформы

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

На внутренней рамке, которая имеет возможность двигаться в двух плоскостях, закрепляется лабиринт. Предлагаемая конфигурация лабиринта приведена на рисунке 3. Красный квадрат – начало движения шарика, синий – конец лабиринта, где прорезается отверстие и устанавливается щелевой датчик.

Рисунок 3 - Лабиринт

Электронная часть

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

Как работать с сервомоторами и пъезоилучателем мы уже изучали на предыдущих уроках «Умная поилка» и «Надежный охранник», а работу с джойстиком, датчиком и преобразователем мы рассмотрим сейчас.

1 Джойстик

Модуль джойстика имеет 5 выводов: VCC (+5D), GND (земля), Х (перемещение по оси Х), Y (перемещение по оси Y) и Button (сигнализирует, нажата ли кнопка). Статус текущего положения джойстика снимается с выводов X, Y и Button.

Рисунок 4 – Джойстик

На выходах Х и Y сигнал изменяется в зависимости от угла наклона ручки. При использовании напряжения питания 5 В, по умолчанию на аналоговых выводах X и Y будет примерно 2.5 В (среднее положение ручки). При перемещении джойстика в одну сторону напряжение будет нарастать до 5 В, при движении джойстика в другую сторону напряжение будет падать до 0 В. Соответственно, подключив эти выводы к аналоговым входам Arduino, можно получать точное положение ручки джойстика и реагировать на угол наклона, а не только на сам факт наклона ручки. Под ручкой расположена кнопка, которую можно активировать нажатием на ручку.

2 Щелевой датчик

Рисунок 5 – Щелевой датчик

Такой тип датчиков часто используется в качестве датчиков приближения или пересечения луча. Датчик состоит из двух устройств – светодиода (чаще всего, инфракрасного) и фототранзистора (по своему принципу действия похожего на фоторезистор, который мы изучали ранее в уроке «Магический ночник»), между которым в датчике сформирована щель. Размер щели зависит от размеров объектов, которые необходимо обнаруживать. Как же работает такой датчик? Пока в щели датчика нет никаких объектов, фотодиод освещает фототранзистор, сопротивление фототранзистора мало и, соответственно, падение напряжения на нем тоже мало. Когда луч светодиода перекрывается, фототранзистор затемняется, сопротивление его резко возрастает и падение напряжения на нем растет. То есть, такой датчик, фактически, работает как кнопка, и его можно подключить к обычному цифровому входу Ардуино. Хотя, если срабатывание цифрового входа недостаточно четкое, можно воспользоваться и аналоговым входом.

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

Рисунок 6 – Схема включения щелевого датчика

Сопротивление резистора в цепе светодиода зависит от допустимого значения силы тока через светодиод и составляет, обычно, порядка 100-300 Ом, а сопротивление резистора в цепи фототранзистора зависит от сопротивления освещенного фототранзистора и составляет порядка 4,7 – 10 кОм.

3 Понижающий преобразователь напряжения

Рисунок 7 – Понижающий преобразователь напряжения

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

Для того, чтобы преобразовать большее напряжение в меньшее используют понижающие преобразователи напряжения. В роли таких преобразователей могут выступать аналоговые стабилизаторы, например, LM1117, LM7805, LM317, и импульсные преобразователи, работающие по принципу ШИМ, например LM2596, LM2577, MP1584. Аналоговые преобразователи проще в использовании, но, при большой разнице между входных и выходным напряжениями сильно греются, а импульсные свободны от этого недостатка. Кроме того, импульсные преобразователи могут быть не только понижающими, но и повышающими, то есть преобразовывать меньшее напряжение в большее.

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

Рисунок 8 – Схема подключения преобразователя

ПРАКТИЧЕСКАЯ ЧАСТЬ

Целью нашей практической работы является создание электромеханической игры «Лабиринт».

Шаг 1. Создаем механическую часть игры

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

Подходящий вариант подвижной системы, но прездназначенный для 3Д-печати, можно найти в сети Интернет на портале . А после моделирования и небольшой доработки в программе SolidWorks его можно изготовить из картона с помощью линейки, ножниц, ножа и клея. В результате мы получим платформу, похожую на приведенную на рисунке 9.

Рисунок 9 – Изготовленные части подвижной платформы

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

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

Рисунок 10 – Готовая механическая часть

Шаг 2. Создаем электронную часть

Основную схему нашей игры соберем на брэдбоарде. Электрическая схема игры должна выглядеть так.

Рисунок 11 – Электрическая схема игры

Поскольку джойстик представляет собой три устройства в одном (одна кнопка и два потенциометра), то и подключаем его к Ардуино стандартным способом – с использованием одного цифрового (D3) и двух аналоговых (A4 и A5) входов.

Датчик попадания шарика в конец лабиринта тоже состоит из двух устройств в одном корпусе – светодиода и фототранзистора. Светодиод мы подключаем к схеме так же, как мы делали это раньше с другими светодиодами, – через резистор сопротивлением 100 Ом. Фототранзистор по принципу действия похож на фоторезистор и поэтому мы подключаем его к схеме, как фоторезистор – через резистор 10 кОм, а сигнал снимаем с плюсового вывода фототранзистора. Этот сигнал мы подали на цифровой вход Ардуино (D2), подключив датчик, как кнопку.

Буззер мы подключаем к цифровому выходу D10 Ардуино, а сервоприводы – к выходам D4 и D8.

Про систему питания и преобразователь напряжения следует сказать отдельно. При попытках подать питание на два сервопривода непосредственно от Ардуино оказывается, что она не способна обеспечить ток, достаточный для одновременного перемещения двух сервоприводов. При этом, при движении сервоприводов, Ардуино перезагружается и теряет связь со Scratch. Именно поэтому нам придется включить в схему дополнительный источник питания (в нашем случае это аккумулятор на 12 Вольт) и преобразователь с 12 Вольт до 5 (зеленый модуль LM2596, показанный на схеме). На вход этого преобразователя мы подаем напряжение с аккумулятора, а выходное его напряжение используем для питания сервоприводов. И, конечно же, нам необходимо объединить нулевой вывод аккумулятора и вывод GND Ардуино, чтобы все напряжения в нашей схеме отсчитывались от одной общей точки.

Шаг 3. Создаем программу

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

Сразу необходимо сказать, что, скорее всего, джойстик в нейтральном положении будет выдавать значения, не совсем равные половине диапазона аналогового входа (от 0 до 1023), а сервоприводы в среднем положении (90 градусов) не будут устанавливать лабиринт точно в горизонтальное положение. Для того, чтобы преодолеть эти недостатки, мы введем в программу четыре переменных (AX0, AY0 и UX0, UY0). Первая пара переменных будет служить для коррекции угла наклона платформы (в нашем случае платформа находится в горизонтальном положении, когда углы сервоприводов равны 86 и 78 градусов). А вторая пара переменных служит для коррекции значений аналоговых входов (в нейтральном положении наш джойстик показывает значения 494 и 518).

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

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

А теперь подробнее расскажем, как будет работать наша программа. Начинается она с обычной команды «Когда шелкнут по флажку», которая запускает программу.

Рисунок 12 – Программа игры на языке Scratch

Все команды «Установить…» служат для:

– установки кота, отсчитывающего время игры, в центр экрана, если кто-то до начала игры мышкой сдвинул его;

– установки всех созданных переменных в начальные значения.

Далее кот приветствует игроков словом «Привет!», а система устанавливает лабиринт в горизонтальное положение.

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

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

С этого момента и до срабатывания датчика достижения шариком конца лабиринта (команда «Повторять до…») выполняется основной игровой цикл. В нем считываются значения аналоговых входов (положение джойстика), рассчитывается угол (с коррекцией горизонтального положения лабиринта и нейтрального положения джойстика), на который надо повернуть сервоприводы. Для того, чтобы платформа поворачивалась примерно на 5 градусов в крайнем положении джойстика, значение, считываемое с аналогового входа необходимо разделить на 100. Тогда от среднего положения платформа повернется на 1023/2/100 ≈ 5º.

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

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

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

После этого программа готова к новому сеансу игры.

Выводы

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

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