Живой

Как собрать автомат для пинбола Arduino: 15 шагов (с картинками)

Arduino Mega RFID Relay+

Arduino Mega RFID Relay+

Оглавление:

Anonim

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

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

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

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

Расходные материалы:

Шаг 1: Дизайн

На рисунке выше изображен дизайн Solidworks игрового поля и вспомогательной сборки. Игровое поле является чисто пользовательским, но линии выстрела (такие как кривая выстрела с обратной петлей) были разработаны на основе реальных игровых автоматов для обеспечения плавности игры. Одна трудность здесь заключается в том, что из-за их сложности фактические части пинбола (например, бамперы и мишени для сбрасывания) не были смоделированы, но все же необходимо позаботиться о том, чтобы все соответствовало игровому полю - детали намного больше ниже, чем выше.

Файлы включены в репозиторий, поэтому не стесняйтесь настраивать дизайн в соответствии с вашими предпочтениями.

Несколько основных моментов дизайна:

Размер игрового поля составляет 42 на 20,25 дюйма, что соответствует размеру игр 1980 года в стиле Bally. Он сделан из ½ ”фанеры, которая является стандартной и не подлежит замене, так как узлы деталей пинбола рассчитаны на эту толщину. Стены здесь состоят из ½ ”слоя поверх ¼” слоя. В первом прототипе были включены только ½-дюймовые стены, но они оказались слишком короткими и могли поднять пинбол в воздух при особенно четких выстрелах. Во-вторых, эта конструкция допускает слегка приподнятую линию стрелка (на фото выше), которая позволяет мячу немного падать на игровое поле, но не падать обратно.

Рампа разработана с прозрачными акриловыми и 3d-печатными опорами. Он пересекает игровое поле, так что дает игроку возможность несколько раз подряд ударить по рампе от левого флиппера. Таким образом, прозрачный акрил используется, чтобы не заслонять вид игрока за столом:

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

Шаг 2: рубить дрова

Чтобы разрезать слои игрового поля, мы использовали лазерный резак. Тем не менее, лазерный резак, достаточно мощный для резки фанеры толщиной 1/2 дюйма, найти сложно, требует качественной фанеры и может привести к пожару, если вы не будете осторожны. Типичные игровые поля обрезаются с помощью маршрутизатора с ЧПУ - хотя некоторые углы могут быть не такими четкими, вы все равно должны добиться приличных результатов. Для простоты нижеприведенные шаги предполагают, что у вас есть доступ к тому же лазерному резцу, что и у нас. Есть некоторые люди, которые добились приличных результатов, используя только упражнение и лобзик, но вы должны быть очень осторожны и очень терпеливы, если вы идете по этому пути.

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

С помощью лазерного резака мы вырезали формы для игрового поля, промежуточный слой ¼ ”(мы использовали duron, более дешевый материал для изготовления прототипов, похожий на дерево, но также подойдет ¼” фанера), верхний слой ½ ”и ½” поддерживает.

Необходимые материалы:

  • ½ ”фанера для игрового поля и основания
  • Lywood ”фанера или дюрон для промежуточного слоя стены
  • Шурупы ½ ”, ¾” и 1 ”
  • Доступ к фрезерному станку с ЧПУ или лазерному резцу

Шаг 3: собрать игровое поле

Начните с зажима кусков the ”слоя дурона на фанере в соответствующих местах. Используя ручную дрель, сначала просверлите пилотные отверстия с помощью сверла 3/32 ”, а затем используйте wood” шурупы с плоской головкой, чтобы прикрепить слой ¼ ”к игровому полю. Это важно сделать сверху вниз (т.е. так что винт сначала проходит через layer ”слой, затем в ½” основание), так как ¼ ”части маленькие и тонкие и будут отклоняться от базового слоя, если их сверлить в противоположном направлении. Также важно убедиться, что головки винтов находятся на одном уровне со слоем ¼ ”и не дают никакой дополнительной толщины.

И последнее замечание: эти винты могут идти практически куда угодно, так как этот слой будет в большинстве случаев невидим для игрока после сборки игрового поля. Но есть исключение - не вставляйте винты в полосу стрельбы. (Мы изначально сделали эту ошибку).

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

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

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

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

Необходимые материалы:

  • 3/4 "шурупы с плоской головкой
  • Сборка стрелок
  • Более длинные (~ 1,5 ") шурупы для дерева
  • Ручная дрель с 3/32 "битом
  • Смазочное масло
  • 1 "шурупы с плоской головкой
  • Файл и / или дремель, и наждачная бумага

Шаг 4: Добавьте компоненты

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

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

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

Аналогичным образом установите все ролловеры с помощью винтов 1/2 ", чтобы их можно было легко вдавить сверху и вернуть на место. Используя болты 6-32, также прикрепите переключатель ворот в верхнем левом углу наш дизайн. Этот выключатель ворот также служит в качестве одностороннего открытия, которое позволяет выстрелам с правой стороны и от стрелка попадать в бамперы. Это аспект конструкции, который приводит к тому, что выстрелы попадают в правую рампу и правую петлю. разные места и добавляет больше разнообразия в игре.

Чтобы установить фары, сначала поместите пластиковые вставки в отверстия. Эти вставки имеют толщину около 1/4 дюйма. При использовании фрезерного станка с ЧПУ, правильный способ их монтажа - вырезать слой размером ¼ ”, немного больший, чем отверстие для вставки. В нашем дизайне, поскольку лазерный резак не может разрезать частичные слои, мы используем 3D-печатные кронштейны, которые поддерживают вставки. Используйте эпоксидную смолу, чтобы закрепить вставки (сначала шероховатые края) и наждачную бумагу, чтобы убедиться, что вставки находятся на одном уровне с игровым полем.

Затем вставьте светодиоды в их кронштейны, вставив и повернув их на место. Затем прикрутите кронштейны на место так, чтобы эти светодиоды располагались непосредственно под каждой вставкой. Легкие кронштейны, связанные ниже, довольно тонкие и на самом деле достаточно тонкие, чтобы винты 1/2 "могли пробить верхнюю часть стола. Используйте пару шайб, чтобы этого не произошло.

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

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

Кнопки ласта и кнопка запуска устанавливаются путем помещения их в отверстия и фиксации на месте с помощью гайки. Листовые переключатели кнопки ласта крепятся болтами внутри кнопок с помощью 6-32 болтов и замыкают цепь переключателя при нажатии кнопок.

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

Необходимые материалы (большинство из них были приобретены на сайте PinballLife.com, и их можно найти, просто выполнив условия поиска ниже).

  • 1 сборка цели сброса с 3 банками
  • 3x поп бампер в сборе
  • 1 левый узел ласт
  • 1 правая сборка ласт
  • 2 летучих мышей
  • 2 кнопки флиппера
  • 2 ласточкин пуговицы
  • 1 кнопка запуска
  • 1 комплект резиновых колец
  • ~ 30 постов звезд игрового поля, (1 1/16 "используется)
  • 2 полосы движения
  • 2 кнопочных переключателя
  • 2 рогатки в сборе
  • 1 стоячая цель
  • 10 переключателей
  • 8 светодиодов # 44 в байонетном стиле
  • 8 легких байонетных кронштейнов (миниатюрное байонетное 2-выводное гнездо с длинным монтажным кронштейном)
  • 5 1-1 / 2 "x 13/16" синяя стрелка
  • 3 1 "x 3/4" прозрачная вставка пули
  • 6-32 болта (2,5 дюйма, а также некоторые меньшие размеры), гайки и шайбы
  • ~ 2 "широкий переключатель ворот (как и здесь, это может быть трудно найти, мы сняли наш со старой сломанной рампы для пинбола, купленной на ebay)

Шаг 5: Построй рампу

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

Опоры для рамп напечатаны в 3D с использованием makerbot и прикреплены болтами к игровому полю, а пластмасса - с помощью тех же 6-32 болтов.

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

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

К передним правому углу рампы прикреплен переключатель узких ворот, прикрепленный к 3D опорам, где он поворачивает, чтобы пройти через игровое поле. Этот переключатель - то, что записывает, когда был сделан удачный выстрел с рампы.

Необходимые материалы:

  • 1/4 "прозрачный акрил (12x24" лист)
  • 1/2 "прозрачный акрил (12x24" лист)
  • Акриловый цемент
  • Доступ к 3D-принтеру и лазерному резаку
  • Крышка рампы
  • Болты с плоской головкой 6-32 для рампы
  • Камерный сверло или ручной инструмент
  • Узкий выключатель

Шаг 6: спланируйте блок электроники и расположение выводов

(Обновление автора: при расширенном использовании 48 В могут взорвать некоторые из транзисторов в этой конфигурации. Я бы рекомендовал использовать 35 В или ниже с этой электроникой или использовать более профессиональный ресурс платы управления, подобный перечисленному здесь: http: // pinballmakers .com / вики / index.php / Строительство)

Эта машина имеет 3 уровня напряжения: 48 В для питания соленоида, 6,3 В для светодиодов и 5 В для логики и звука. Чтобы обеспечить эти уровни напряжения, мы использовали источник питания с ЧПУ для 48 В и готовые адаптеры постоянного тока для обеспечения 6,3 В и 5 В. (Можно было бы просто использовать 6,3 В, поскольку Arduino понижает напряжение питания на своем 5 В выходном выводе, но мы держали эти источники питания изолированными). 48 В - это высокое напряжение, и, хотя оно не смертельно само по себе, оно может повредить детали и быстро вызвать перегрев компонентов, если возникнут какие-либо проблемы со схемой. Используйте плавкий предохранитель на 5 А на входе и выходе основного источника питания 48 В, чтобы избежать пожара, если какой-либо из транзисторов закоротит.

На экране Arduino мы прикрепили провода с разъемами Molex, разработанными для удовлетворения требований к входу и выходу каждой из трех вспомогательных плат: платы управления соленоидом, платы управления светом / звуком и платы ввода.

В нашем дизайне у нас были следующие назначения контактов. Это, конечно, довольно гибко. Контакт 0 остался открытым. (Instructables не позволяет создавать списки номеров, начинающиеся с 0.)

  1. открыто
  2. открыто
  3. Прерывание / Вход Активный вывод
  4. Кодированный входной контакт
  5. Кодированный входной контакт
  6. Кодированный входной контакт
  7. Кодированный входной контакт
  8. Кодированный входной контакт
  9. Правый бампер выход
  10. Средний выход бампера
  11. Левый бампер выход
  12. Отбросить целевой вывод
  13. Выход главного переключателя флиппера
  14. Мастер выключатель света на выходе
  15. Вывод света
  16. Вывод света
  17. Вывод света
  18. Вывод звука
  19. открыто

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

Необходимые материалы:

  • 48В блок питания с ЧПУ (как этот)
  • Готовые источники питания 6,3 В и 5 В (как этот)
  • 5А плавкие предохранители и держатели предохранителей, а также термоусадочные трубки для подключения
  • Разъемы Molex
  • Щит-прототип Arduino
  • Много проволоки 22AWG, припой и терпение

Шаг 7: Сделать платы водителя

Плата водителя отвечает за включение входов от Arduino, кнопок флиппера и переключателя рогатки для запуска катушек. Поскольку сигналы находятся на уровне 5 В, а соленоиды - на 48 В, для передачи сигнала необходимы мощные полевые МОП-транзисторы. Транзисторы, используемые в этой конструкции, представляют собой полевые МОП-транзисторы на 100 В от Mouser.

Есть три схемы, изображенные выше, которые включают ласты, рогатки и цели бамперов / сбрасывания. У каждого есть свои требования, но во всех из них, когда транзистору подается сигнал 5 В, для соленоида открывается путь тока, и через катушку проталкивается 5–8 А для мощного удара. Это много тока! Фактически, этот большой ток сожжет компоненты, если транзистор будет включен в течение более короткого импульса. При тестировании этой схемы с использованием программного обеспечения или других методов убедитесь, что питание соленоида не происходит более секунды.

Основным источником проблем в вышеупомянутых схемах является индуктивный удар. Соленоиды являются мощными индукторами, и, как вы знаете, ток в индукторах не может мгновенно измениться. Таким образом, когда транзистор отключен, все еще есть короткий момент, когда через соленоид протекает 5-8 ампер, и весь этот ток должен куда-то идти. Если не дать пути к земле, этот ток будет приводить напряжение на стоке транзистора до сотен вольт и разрушать транзистор. Кроме того, когда транзистор разрушается, он закорачивает все три клеммы, что приводит к увеличению тока постоянного тока и может разрушить соленоид, если не установлен надлежащий предохранитель. (Мы уничтожили 8 транзисторов в нашем открытии и пытаемся решить эту проблему, но, к счастью, не было соленоидов, так как мы всегда быстро отключали питание вручную).

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

Чтобы решить эту проблему, мы добавили RC-схему «демпфирования». Эта схема имеет конденсатор последовательно с резистором. Конденсатор поглощает достаточный ток от индуктора, так что диод успевает включиться и выполнить свою функцию. Для получения дополнительной информации о цепях RC демпфера, проверьте здесь

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

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

Во-вторых, флипперы имеют две разные катушки (катушка малой и большой мощности) и переключатель конца хода, который срабатывает при высоком уровне флиппера. Этот переключатель выполняет важную функцию, позволяя катушке высокой мощности первоначально срабатывать, чтобы дать мощный ход, но переключаясь на катушку малой мощности (~ 130 Ом против 4 Ом), которая дает достаточно энергии, чтобы держать флиппер «поднятым», как Пока кнопка находится, но не потребляет такой большой ток, чтобы перегореть соленоид. На рисунке ниже переключатель EOS нормально замкнут, но у нашей сборки был нормально разомкнутый переключатель, и для преобразования этого сигнала в нормально замкнутый сигнал потребовался другой транзистор.

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

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

Плата драйверов (фактически две платы) состоит из двух драйверов флиппера, двух драйверов рогатки и четырех драйверов с одним переключателем для оставшихся соленоидов. Вместо прямой пайки мы использовали разъемы Molex 0,1 дюйма для подключения этой платы к соленоидам, источникам питания и переключателям, чтобы можно было легче выполнять любой ремонт или регулировку.

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

материалы:

  • 12 мощных транзисторов на 100 В
  • Конденсаторы 10-50 мкФ (неполярные, если возможно)
  • Резисторы 300, 5к, 500к и 3М
  • 1 меньший транзистор для рогатки
  • Несколько диодов 1N4004
  • Прототипы паяемых макетов (или, что еще лучше, дизайн ваших собственных печатных плат)

Шаг 8: Сделайте плату ввода датчика

Поскольку мы используем только Arduino, мы ограничены 20 цифровыми контактами. Пинбольный автомат, однако, имеет несколько десятков уникальных входов переключателей, не говоря уже о выходах, необходимых для освещения, звука и управления соленоидами. Чтобы облегчить эту проблему, мы сделали предположение, что никакие два входа не сработают одновременно (тем самым ограничивая нас использованием только одного шара). Это предположение позволяет нам «кодировать» входы коммутатора путем преобразования их в 5-битный двоичный регистр с 6-м контактом, который запускает прерывание всякий раз, когда был получен действительный вход коммутатора. Чтобы достичь этого, мы использовали каскад из 8-к-3-х кодеров, чтобы сделать 24-к-5 кодировщиков, использующих этот кодер, в макете, показанном на рисунках выше.

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

Вторая макетная плата использовалась для размещения каждого из 24 штекерных разъемов Molex; каждый переключатель на игровом поле будет иметь гнездовой разъем на конце длинного провода, который подключается к этой плате. Цели отбрасывания - это уникальный случай, который может быть обработан несколькими способами. Мы последовательно подключили каждый переключатель цели сброса, чтобы вход закрывался, когда они все выключены, и позволяет Arduino посылать сигнал на соленоид, чтобы снова запустить цели сбрасывания.

материалы:

  • 4 энкодера с приоритетом выходного сигнала 3-состояния от 8 до 3

Шаг 9: Создайте периферийную плату Light / Sound / Score

Чтобы сохранить контакты аналогично кодеру, мы использовали декодер 3-8 для управления нашими источниками света. Это дало нам ограничение на то, что мы не могли зажечь больше одного источника света одновременно, но это был приемлемый компромисс, чтобы высвободить контакты для других элементов. Мы также включили 4-й «основной» выход света, который мог контролировать все источники света одновременно. Это, например, может позволить нам несколько раз мигать всеми огнями при первом включении игры (что дает четкое указание на то, что на самом деле что-то происходит с игроком, когда он нажимает кнопку запуска, что в противном случае трудно без корыто или красочный дисплей).

Приведенная выше схема показывает транзисторную схему, аналогичную схеме управления, но гораздо более простую, поскольку для более низких напряжений в рабочем состоянии (6,3 В для источников света) требуются меньшие транзисторы и не требуется такая большая схема защиты. Мы использовали диодный вентиль ИЛИ для транзисторов, чтобы изолировать сигнал главного переключателя и отдельный световой сигнал. Это позволяет нам использовать только один транзистор на свет вместо двух, и предотвращает «борьбу» микросхем Arduino и кодера с источником или потребителем тока.

В то время как мы использовали слаботочные светодиоды для каждого из источников освещения игрового поля (те, что под вставками), кнопка запуска и 3 поп-бампера каждый имели лампочки накаливания, каждый из которых потребляет около 250 мА. Транзисторы рассчитаны на 530 мА постоянного тока, поэтому, чтобы не превысить это, мы позаботились о том, чтобы только два лампы накаливания проходили через один транзистор.

Мы также прикрепили пассивный 5-вольтовый пьезо-зуммер, который позволяет нам воспроизводить элементарные звуки на этой доске.

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

  • 10 осветительных транзисторов (мы их использовали)
  • 5V пьезо-зуммер

Шаг 10: Шаг 11: Создай свои правила игры

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

Смотрите здесь github-репозиторий для файлов, на которые есть ссылки в этом проекте.

Часть 1. Создайте правила игры

Конечный автомат по умолчанию для игры в пинбол представлен на рисунке.

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

Шаг 11: Вариант 1. Напишите свой собственный файл Pinball.txt

В текстовом документе по пинболу вы найдете три раздела: один для частей, один для «состояний» и один для «действий». Здесь вы можете определить конкретные действия для каждого компонента. Для большинства компонентов вы, вероятно, захотите придерживаться конечного автомата с одним состоянием. Например, если каждый раз при ударе по бамперу игрок должен набрать еще 100 очков, зажечь индикатор рампы и набрать 100 очков, тогда диаграмма состояний будет выглядеть как на рис. 1 с соответствующим кодом. Если вы хотите, чтобы у компонента был конечный автомат с несколькими состояниями, скажем, вы хотели, чтобы индикатор включался при ударе по бамперу, а затем выключался при повторном ударе, ваша диаграмма состояний / соответствующие состояния будут выглядеть как на рисунке 2 Наш конкретный компьютер предоставляет структуры, как на рисунке 3, для которых вы можете определить правила. Их имена, внутренние кодированные макросы (о которых вам не нужно беспокоиться, но они могут быть полезны, если вы решите исследовать исходный код) и коды прерываний приведены на рисунке 3. На рисунке 4 эти имена подключены к компонентам игрового поля.

Советы по написанию вашей игры в пинбол
Так как игровые компоненты привязаны к определенным прерываниям (указанным в поле «pos»), которые, в свою очередь, определяются аппаратным обеспечением, мы не рекомендуем слишком сильно модифицировать раздел «parts» за пределами поля «states». Мы предлагаем резервирование состояния 0 и действия 0 для компонентов, которые не влияют на оценку, таких как кнопка запуска и игровой переключатель. Наш код выглядит так, как показано на рисунке 5.

Шаг 12: Определите последовательности звука и звука

Восемь индикаторов на плате управляются с помощью декодера от 3 до 8 + один главный переключатель, как описано ранее. Определенные источники света можно зажечь, написав контакты, соответствующие двоичной закодированной версии кода детали. Вспомогательная функция light_sequence предоставляет пользователю интерфейс для указания источника света, который он / она хочет осветить, а макросы определены в документе state_machine_headers.h. Таблица снова была предоставлена ​​для вашего удобства программирования. Что касается звука, мы использовали библиотеку тонов Arduino для программирования коротких звуковых последовательностей для различных игровых событий. У нас есть четыре готовых звука, которые вы можете выбрать (используя executeSound (<количество звука, которое вы хотите>)). Эти звуки соответствуют длинной веселой последовательности, короткой веселой последовательности, короткой грустной последовательности и длинной грустной последовательности. Если вы хотите запрограммировать свои собственные звуки, вы можете посмотреть здесь, как это сделать (pitch.h был включен в репозиторий): http://www.arduino.cc/en/Reference/Tone

Шаг 13: загрузи файл Pinball.txt в Arduino

Когда вы закончите писать FSM, вот как загрузить вашу игру на Arduino (предполагается, что вы используете Mac). Все файлы можно найти в репозитории github.

  1. Распакуйте zip-файл arduino-serial.
  2. Перейдите к файлу arduino-serial и сохраните файл конфигурации игры здесь. «Pinball.txt» предоставляет образец шаблона, который вы можете использовать.
  3. Откройте Arduino. Загрузите эскиз игры в пинбол.
  4. Откройте терминал и введите следующие команды:
    • делать
    • ./arduino-serial -b 9600 -p pinball.txt
  5. Теперь мы должны читать и хранить данные во внутренней памяти Arduino. Если есть какие-либо искаженные линии, Arduino напечатает сообщение об ошибке, и вы можете отправить файл повторно.
  6. Когда вы закончите загрузку кода с помощью терминала, например, когда Arduino напечатает «готовое» сообщение, вы можете открыть Arduino Serial для чтения сообщений из игры.

Общие проблемы / оптимизации для программной игры

  1. Жестко запрограммированные и настраиваемые игры - мы заметили, что прерывания в жестко запрограммированной игре реагировали гораздо точнее, чем в настраиваемой игре. Это может быть потому, что настраиваемая игра имеет много функций общего назначения, которые требуют условных выражений. Это замедлило скорость чтения цикла, из-за чего мы пропустили несколько прерываний и повлияли на общую скорость работы игры. Чтобы решить эту проблему, мы сократили некоторые возможности настройки файла конфигурации игры, чтобы добиться приемлемого времени отклика в цепи. Изначально у нас были проблемы с объемом оперативной памяти Arduino и с тем, сколько игровых правил он может хранить, но это оказалось меньшей проблемой, чем первоначально ожидалось, и именно скорость цикла была большим ограничивающим фактором.
  2. Отмена прерываний - из-за быстрых действий в игре в пинбол у нас было несколько случаев, когда пин-код прерывания получал несколько прерываний для пинбола, поражающего только один игровой компонент. Кроме того, поскольку эти прерывания были получены до того, как кодер успел правильно прочитать все входные данные, прерывания будут связаны с неверными компонентами. Чтобы решить эту проблему, мы использовали внешнюю библиотеку устранения неполадок, которая отвечает через 1 мс после получения первого прерывания, давая время для пиков кодера, чтобы достигнуть максимума, прежде чем игра прочитает входной код.
  3. Отображение. Несмотря на то, что последовательное отображение позволяет игре распечатывать подробные сообщения, игроку трудно читать выходные сообщения при игре в быстро развивающуюся игру в пинбол. Игроку также неудобно играть в игру с подключенным компьютером. В будущем мы надеемся реализовать цифровой дисплей, который может отображать счет и другую игровую информацию на дисплее, который пользователь может легко увидеть, например, на светодиодной матрице или 7-сегментном дисплее.

Шаг 14: Вариант 2: Советы по жесткому кодированию вашей собственной игры

Сначала прочитайте документ state_machine_headers.h, чтобы понять глобальные структуры данных, в которых хранится информация о конечном компьютере. Вы должны инициализировать эти структуры данных в соответствии с вашими правилами игры в Arduino IDE перед загрузкой в ​​код Arduino. Предоставляются следующие структуры данных:

Игра содержит информацию о каждой части. Состояние содержит информацию о переходах между состояниями. Действия содержат информацию о выполняемых действиях. Эти структуры заполняются прочитанным файлом. Определите входы / выходы для всех контактов. Контакты прерывания должны быть определены как контакты INPUT.

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

Вспомогательная функция executeState обновляет текущее состояние детали и выполняет действия на основе закодированной информации.

Первая версия кода игры в жестком коде находится в файле simplepinballgame.ino.

Шаг 15: Подключите все

Чтобы связать Arduino с нашими платами драйверов, мы использовали простейший экран для более легкого доступа к контактам на других платах. Есть много проводов, так что будьте осторожны! Следуйте схеме, приведенной в разделе «Электронные контакты и схема», чтобы подключить свои выходы Arduino к соответствующим контактам. Разъемы Molex должны помочь в выяснении, какие разъемы соединяются с какими.

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

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

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

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

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

К сожалению, энкодер имеет свойство иногда пульсировать индикаторный вывод высоко до того, как 5 выводов энкодера полностью разрешат свои значения. Мы знали, что это произошло, когда номер нажатого переключателя был один за другим, но он может показаться вам по-другому. Мы решили эту проблему, используя библиотеку debouncing, чтобы создать небольшую задержку между тем, когда мы замечаем, что переключение изменилось, и когда мы записываем, какое переключение было. Однако будьте осторожны, так как слишком большая задержка (более 15-20 мсек) может привести к тому, что вы полностью пропустите ввод.

Извините, но мы пока не нашли хорошего решения для этого.