Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Машина для игры в пинбол, управляемая Arduino

Компоненты и расходные материалы

Arduino Mega 2560
× 1
2-контактный ЖК-дисплей Adafruit
× 1
Источник питания 24 В
× 1
Датчик силы Adafruit
× 1
Сборка всплывающего амортизатора
× 1
Переключатель всплывающего бампера
× 1
Целевой переключатель
× 1
Переключатель ролловера
× 1
Сборка флиппера
× 1
Светодиодные лампы
× 1

Об этом проекте

Машина для игры в пинбол, управляемая Arduino

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

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

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

Дело

Корпус сделан из дубовой фанеры, купленной в домашнем магазине. Все размеры в этом документе указаны в дюймах. Передняя и задняя панели имеют размеры 20H x 23W. Боковые панели 20H x 47L. Куски были вырезаны со скошенными краями и соединены с помощью столярного устройства для печенья и столярного клея. Карманные винты и клей тоже подойдут. Машина будет подвергаться жестокому обращению, поэтому она должна быть сильной. Перед тем, как соединить их вместе, я также вырезал ¾ ”дадо на 1 дюйм снизу. Не приклеивайте полку. Он должен плавать, чтобы допускать расширение и сжатие. Полка использовалась для размещения основного источника питания и источника питания для декоративной светодиодной лампы, установленной под крышкой. Размер игровой поверхности составляет 22 x 42 л. Учтите, что он значительно короче шкафа. Это дает мне около 3 дюймов спереди, чтобы пропустить провода до кнопок флиппера и светодиодных фонарей. Это также дает место для шарового плунжерного механизма. Игровая поверхность просто опирается на небольшие деревянные бруски, прикрученные к бокам примерно на 4 дюйма ниже верхней части корпуса. Чтобы добраться до внутренней части автомата, я просто открываю крышку, снимаю игровое поле и переворачиваю его.

Корпус и игровая поверхность построены под прямым углом. Поле для игры обеспечивается ногами, как показано на этом виде сбоку. Автоматы для игры в пинбол могут иметь углы от 1 до 7 градусов. Чем выше угол, тем быстрее игра. Поскольку я не знал, какой угол мне понадобится, я разработал регулируемые ножки. Сами ножки деревянные и доступны в большинстве домашних магазинов. Затем я просверлил отверстие глубиной 12 дюймов в конце каждой ноги с помощью сверла. В нижней части я использовал двухкомпонентную эпоксидную смолу, чтобы вставить тройник диаметром 3/8 дюйма. Будьте осторожны, чтобы клей не попал на резьбу и не заблокировал просверленное отверстие. Затем я вставил стержень с резьбой 12 дюймов 3/8 дюйма в ногу и нарезал гайку на стержень. Затем я прикрепил к концу выравнивающую ножку. Регулирующую ножку и гайки тройника я приобрел по ссылкам ниже.

http://www.mscdirect.com/product/details/40610032

http://www.mscdirect.com/product/details/67300962

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

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

Крышка

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

Ардуино

Arduino Mega 2560 в основном выполняет четыре функции. Он определяет, когда активируются переключатели, соответственно включает и выключает свет, отслеживает подсчет очков и отображает счет и номер мяча на небольшом ЖК-дисплее. Большая часть проводки довольно проста. Например, мишени подключаются к одному из цифровых входов Arduino и к земле. Входные данные настраиваются с помощью оператора, как показано ниже.

pinMode (номер контакта, INPUT_PULLUP)

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

Единственная сложность - это поп-бамперы. Переключатели опрокидывания и мишени, используемые в этой игре, получают свою мощность от Arduino. Поп-бамперы получают свои от отдельного источника питания на 25 вольт, поскольку им требуется больше энергии, чем может обеспечить Arduino. У Pop Bumpers есть переключатель, который их активирует, но я не могу прочитать его напрямую из-за высокого напряжения. Следовательно, я сначала отправляю выходной сигнал переключателя Pop Bumper на делитель напряжения. Пример делителя напряжения можно найти по ссылке ниже.

Делитель напряжения

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

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

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

Наконец, я использовал Arduino для отображения счета и номера мяча.

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

Источник питания

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

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

Ball Shooter или Plunger

Стрелок или поршень был куплен по следующей ссылке

http://www.marcospecialties.com/pinball-parts/B-12445

В передней части корпуса необходимо просверлить отверстие, чтобы плунжер прошел через него. Затем он ввинчивается внутрь корпуса. Необходимо очень внимательно следить за тем, чтобы поршень был правильно выровнен с игровым полем. Поместите линейку на игровое поле и отметьте точку попадания внутрь корпуса. Затем поднимитесь так, чтобы середина поршня была равна по высоте половине высоты шарика. (Пинболлы размером 1 и 1/16 дюйма продаются в магазине Pinball.)

Игровое поле

Игровое поле изготовлено из фанеры, облицованной березовым покрытием толщиной ¼ дюйма. Чтобы сделать игру более декоративной, я купил картинку по ссылке НАСА ниже.

http://hubblesite.org/gallery/printshop/ps35/

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

Ласты

Ласты были куплены по ссылке ниже.

http://www.pinballlife.com/index.php?p=product&id=172

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

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

Рогатки

Полную сборку рогатки можно найти здесь. Вам также понадобятся булавки и резинки. Вы можете найти их в том же месте. Также показано изображение рогатки, установленной снизу. Я должен отметить, что провод 16 калибра использовался для всех компонентов, подключенных к источнику питания 24 В, а провод калибра 22 использовался для соединений с платой Arduino.

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


Поп-заставки

Сборки поп-бамперов можно купить здесь. Также вам понадобятся переключатели и колпачки. Отбойники устанавливаются путем просверливания трех отверстий:двух для металлических опорных стержней и одного для вала, запускающего переключатель. Когда мяч катится по белому диску на виде сверху, он толкает вал вниз. Это приводит в действие листовой переключатель, который затем активирует соленоид. Затем соленоид тянет вниз металлическое кольцо, которое отправляет мяч в противоположном направлении.

Цели, поворотные переключатели и огни

Цели доступны по ссылке ниже.

http://www.marcospecialties.com/pinball-parts/A-14691-5

Переключатели и крепления для переворачивания можно найти ниже.

http://www.actionpinball.com/parts.php?item=A-12687

Лампы, которые я использовал, больше не производятся, но их аналоги показаны ниже.

http://www.actionpinball.com/parts.php?item=LED4555

Вам также потребуются крепления для ламп, показанные ниже.

http://www.actionpinball.com/parts.php?item=077-5030-00

Подключение всего этого в основном одинаково и было упомянуто в разделе Arduino.

Резюме

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

Код

  • Машинный код для пинбола Arduino
Машинный код для пинбола Arduino Arduino
Позволяет Arduino управлять процессом игры на самодельном автомате для игры в пинбол
 const int TxPin =17; длинный счет =0; long OldScore =0; длинная цель =1; длинный поп =1; длинный рулон =10; int Targets [8]; int Rolls [3]; int Pops [4]; int Milli =10; int Sum =0; int Flash =100; int Ball =0; int я =0; int Shot =0; int Lost =0; int Давление =1024; #include ; SoftwareSerial mySerial =SoftwareSerial (255, TxPin); void setup () {/ * Слова без s - это значение, получаемое при взаимодействии с устройством. * Работает с отслеживанием того, с какими отдельными из них взаимодействовали. * Последнее необходимо, чтобы определить, когда все были поражены, значение требует обновления * и нужно выключить свет. * / pinMode (TxPin, ВЫХОД); digitalWrite (TxPin, HIGH); mySerial.begin (9600); mySerial.write (12); // Очистить mySerial.write (17); // Включить подсветку // целевые входы pinMode (2, INPUT_PULLUP); pinMode (3, INPUT_PULLUP); pinMode (4, INPUT_PULLUP); pinMode (5, INPUT_PULLUP); pinMode (6, INPUT_PULLUP); pinMode (7, INPUT_PULLUP); pinMode (8, INPUT_PULLUP); pinMode (9, INPUT_PULLUP); // входные данные для одновременного нажатия клавиш pinMode (10, INPUT_PULLUP); pinMode (11, INPUT_PULLUP); pinMode (12, INPUT_PULLUP); // переключатель нижнего броска pinMode (15, INPUT_PULLUP); // переключатель верхнего броска pinMode (16, INPUT_PULLUP); // вывод на ЖК-дисплей pinMode (17, OUTPUT); // целевые огни, соответствующие pinMode (32, OUTPUT); pinMode (33, ВЫХОД); pinMode (34, ВЫХОД); pinMode (35, ВЫХОД); pinMode (36, ВЫХОД); pinMode (37, ВЫХОД); pinMode (38, ВЫХОД); pinMode (39, ВЫХОД); // индикаторы переворачивания, соответствующие pinMode (40, OUTPUT); pinMode (41, ВЫХОД); pinMode (42, ВЫХОД); // выскакиваем фары на бампере pinMode (50, OUTPUT); pinMode (51, ВЫХОД); pinMode (52, ВЫХОД); pinMode (53, OUTPUT);} void loop () {// поместите сюда ваш основной код, чтобы запускать его несколько раз:// Если используется понижающий резистор, входной вывод будет НИЗКОМ, когда переключатель открыт, и ВЫСОКИМ, когда выключатель замкнут. // проверяем, была ли поражена цель // ****** Targets ***** for (int i =0; i <8; i ++) {if (digitalRead (i + 2) ==LOW) {/ / Цель активирована Targets [i] =1; Оценка =Оценка + Цель; // включаем целевой свет digitalWrite (i + 32, HIGH); // задержка, чтобы не получить несколько очков за одно попадание delay (Milli); ломать; }} Сумма =0; для (int i =0; i <8; i ++) {Sum =Sum + Targets [i]; } if (Sum ==8) {// все цели горят, поэтому мигают, а затем выключаются. for (int j =0; j <3; j ++) {for (int i =0; i <8; i ++) {digitalWrite (i + 32, LOW); } задержка (Flash); для (int я =0; я <8; я ++) {digitalWrite (я + 32, ВЫСОКИЙ); } задержка (Flash); } для (int я =0; я <8; я ++) {digitalWrite (я + 32, LOW); Цели [i] =0; } задержка (Flash); // Умножение целевого значения на 10 Target =Target * 5; // goto Skip; } // *********** Ролловеры ********* for (int i =0; i <3; i ++) {if (digitalRead (i + 10) ==LOW) {// активирован опрокидывание Rolls [i] =1; Оценка =Оценка + Бросок; // включаем подсветку при наведении курсора digitalWrite (i + 40, HIGH); // задержка, чтобы не получить несколько очков за одно попадание delay (Milli); ломать; }} Сумма =0; для (int i =0; i <3; i ++) {Sum =Sum + Rolls [i]; } if (Sum ==3) {// все опрокидывания светятся, мигают, а затем выключаются. for (int j =0; j <3; j ++) {для (int i =0; i <3; i ++) {digitalWrite (i + 40, LOW); } задержка (Flash); для (int я =0; я <3; я ++) {digitalWrite (я + 40, ВЫСОКИЙ); } задержка (Flash); } для (int я =0; я <3; я ++) {digitalWrite (я + 40, LOW); Rolls [i] =0; } задержка (Flash); // Умножить результат на 2 Оценка =Оценка * 2; Бросок =Бросок * 10; // goto Skip; } // ********** Pop Bumpers ********** for (int i =0; i <4; i ++) {if (analogRead (i)> 500) {/ / pop активировано Pops [i] =1; Оценка =Оценка + Популярность; // включаем подсветку всплывающего бампера digitalWrite (i + 50, HIGH); // задержка, чтобы не получить несколько очков за одно обращение //mySerial.print(analogRead(i)); //mySerial.print (""); задержка (Милли); ломать; }} Сумма =0; для (int я =0; я <4; я ++) {Sum =Sum + Pops [я]; } if (Sum ==4) {// все всплывающие бамперы горят, поэтому мигают, а затем выключаются. for (int j =0; j <3; j ++) {for (int i =0; i <4; i ++) {digitalWrite (i + 50, LOW); } задержка (Flash); для (int я =0; я <4; я ++) {digitalWrite (я + 50, ВЫСОКИЙ); } задержка (Flash); } для (int я =0; я <4; я ++) {digitalWrite (я + 50, LOW); Pops [i] =0; } задержка (Flash); // Умножаем целевое значение на 10 Pop =Pop * 2; // goto Skip; } Пропустить:// Определить номер мяча if (digitalRead (15) ==LOW) {// мяч попал в нижнюю часть переулка // если это еще не сделано, увеличить мяч if (Shot ==0) {// Установить Lost =0 поскольку не на нажимной подушке Lost =0; Давление =аналог Читать (7) + 20; // устанавливаем OldScore так, чтобы значение мяча было перепечатано на LCD OldScore =-1; Мяч =Мяч + 1; if (Ball ==6) {Ball =1; Оценка =0; Цель =1; Рулон =1; Поп =1; } Shot =1; }} if (digitalRead (16) ==LOW) {// мяч попадает в нижнюю часть переулка // если это еще не сделано, увеличиваем мяч if (Shot ==0) {// Устанавливаем Lost =0, так как не на нажимной подушке Lost =0; Давление =аналог.Читать (7) + 15; // устанавливаем OldScore так, чтобы значение мяча было перепечатано на LCD OldScore =-1; Мяч =Мяч + 1; if (Ball ==6) {Ball =1; Оценка =0; Цель =1; Рулон =1; Поп =1; } Shot =1; }} if (analogRead (7)> ​​Pressure) {// шар на прижимной подушке Shot =0; if (Lost ==0) {//mySerial.print(analogRead(7)); // Оценка =Оценка + 100; Потерянный =1; if (Ball ==5) {// Game Over // мигает ролловерами, а затем выключается. for (int j =0; j <3; j ++) {для (int i =0; i <3; i ++) {digitalWrite (i + 40, LOW); } задержка (Flash); для (int я =0; я <3; я ++) {digitalWrite (я + 40, ВЫСОКИЙ); } задержка (Flash); } для (int я =0; я <3; я ++) {digitalWrite (я + 40, LOW); Rolls [i] =0; } // мигает всплывающими бамперами, а затем выключается for (int j =0; j <3; j ++) {for (int i =0; i <4; i ++) {digitalWrite (i + 50, LOW); } задержка (Flash); для (int я =0; я <4; я ++) {digitalWrite (я + 50, ВЫСОКИЙ); } задержка (Flash); } для (int я =0; я <4; я ++) {digitalWrite (я + 50, LOW); Pops [i] =0; } // Flash Targets и затем выключаем. for (int j =0; j <3; j ++) {for (int i =0; i <8; i ++) {digitalWrite (i + 32, LOW); } задержка (Flash); для (int я =0; я <8; я ++) {digitalWrite (я + 32, ВЫСОКИЙ); } задержка (Flash); } для (int я =0; я <8; я ++) {digitalWrite (я + 32, LOW); Цели [i] =0; } mySerial.write (12); // Очистить задержку (5); // Требуемая задержка mySerial.print (Score); // Первая строка mySerial.write (13); // Подача формы mySerial.print ("Игра окончена !!!"); // Вторая строка}}} // выводим на ЖК-дисплей if (Score! =OldScore) {mySerial.write (12); // Очистить задержку (5); // Требуемая задержка //mySerial.print(analogRead(7)); mySerial.print (Оценка); // Первая строка mySerial.write (13); // Подача формы mySerial.print ("Ball ="); // Вторая строка mySerial.print (Ball); OldScore =Оценка; }} 

Схема


Производственный процесс

  1. Raspberry Pi / Hologram SMS Controlled AC Power Switch
  2. Робот Raspberry Pi, управляемый через Bluetooth
  3. Интерактивный настольный светильник, управляемый жестами
  4. Ультразвуковой левитационный аппарат с использованием ARDUINO
  5. Светодиоды, управляемые Alexa через Raspberry Pi
  6. Радиоуправляемая машина с джойстиком
  7. Роботизированная рука, управляемая нунчук (с Arduino)
  8. Манипулятор беспроводного переключателя света
  9. Робот, управляемый речью
  10. Arduino Apple Watch