Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Máquina de Pinball Controlada por Arduino

Componentes e suprimentos

Arduino Mega 2560
× 1
Tela LCD de 2 pinos Adafruit
× 1
Fonte de alimentação de 24 V
× 1
Sensor de força Adafruit
× 1
Conjunto de pára-choque pop
× 1
Pop Bumper Switch
× 1
Chave de destino
× 1
Chave de rollover
× 1
Conjunto do flipper
× 1
Lâmpadas LED
× 1

Sobre este projeto


Máquina de Pinball Controlada por Arduino

Construir uma máquina de pinball controlada por Arduino exigia uma combinação de habilidades de marcenaria, mecânica, eletrônica e programação. Demorou cerca de seis meses de esforço em tempo parcial para criar e foi a coisa mais complicada que já construí. Principalmente porque não consegui encontrar muitas informações sobre como construir uma máquina de pinball.

Este documento fornecerá uma descrição de como esta máquina foi construída. Tentarei fornecer referências suficientes para que, se você decidir construir o seu, seja mais fácil do que eu. Ao mesmo tempo, não consigo enfatizar o suficiente a necessidade de testar tudo. Usei uma peça sobressalente de madeira compensada para fazer o protótipo de cada componente antes de instalar na máquina real. Isso vai lhe poupar muito sofrimento a longo prazo.

Como você pode ver na foto, a máquina tem um gabinete de madeira e usa peças de reposição para máquinas de pinball disponíveis no mercado. A máquina é controlada por uma única placa Arduino Mega 2560. Se você deseja ver a máquina em ação, acesse este link ou assista aqui:

O Caso

A caixa é feita de compensado de carvalho comprado em sua loja. Todas as dimensões neste documento estão em polegadas. Os painéis frontal e traseiro têm 20H x 23W. Os painéis laterais são 20H x 47L. As peças foram cortadas com esquadrias e unidas com junta de biscoito e cola para madeira. Parafusos de bolso e cola também teriam funcionado. A máquina vai suportar muitos abusos, por isso precisa ser forte. Antes de juntá-los, também cortei um dado de 2,5 cm acima da parte inferior. Não cole a prateleira. Ele precisa flutuar para permitir a expansão e a contração. A prateleira foi usada para manter a fonte de alimentação principal e a fonte de alimentação para a luz LED decorativa montada sob a tampa. A superfície de jogo é 22w x 42L. Observe que ele é significativamente mais curto do que o gabinete. Isso me dá cerca de 3 polegadas na frente para passar os fios até os botões do inversor e as luzes LED. Também dá espaço para o mecanismo do êmbolo esférico. A superfície de jogo simplesmente repousa sobre alguns pequenos blocos de madeira aparafusados ​​nas laterais cerca de 4 polegadas abaixo do topo do case. Para chegar às entranhas da máquina, eu simplesmente abro a tampa, removo o campo de jogo e o viro.

O case e a superfície de jogo são todos construídos em ângulos retos. O arremesso do jogo é fornecido pelas pernas, conforme mostrado nesta vista lateral. As máquinas de pinball podem ter ângulos de 1 a 7 graus. Quanto maior o ângulo, mais rápido o jogo. Como eu não tinha certeza do ângulo que precisava, projetei as pernas para serem ajustáveis. As próprias pernas são de madeira e estão disponíveis na maioria das lojas domésticas. Em seguida, fiz um buraco de 30 centímetros de profundidade no final de cada perna usando uma broca. Na extremidade inferior, usei um epóxi de dois componentes para inserir uma porca em T de 3/8 de polegada. Tenha cuidado para não deixar cola nos fios ou onde ela irá bloquear o furo que você fez. Em seguida, inseri uma haste de rosca de 12 polegadas e 3/8 de polegada na perna e rosquei uma porca na haste. Em seguida, coloquei um pé nivelador na extremidade. O pé nivelador e as porcas do tee que peguei nos links abaixo.

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

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

As placas de montagem das pernas da mesa foram simplesmente aparafusadas à prateleira inferior e as pernas aparafusadas. Para ajustar a altura da máquina, basta afrouxar a porca e, em seguida, parafusar a haste roscada para dentro ou para fora. Em seguida, reaperte a porca para se certificar de que a mesa permanece segura.

Na foto, você notará um cabo elétrico e um cabo USB. O cabo elétrico vem de um filtro de linha que conectei à parte traseira da máquina. Tudo é conectado lá, de forma que um botão liga ou desliga tudo. O cabo USB está lá, para que eu possa reprogramar a placa Arduino sem ter que remover o campo de jogo.

A tampa

A moldura da tampa é feita de carvalho e tem as mesmas dimensões do gabinete. A parte superior e as laterais têm 1,5 polegadas de largura, enquanto a parte inferior tem 5 polegadas de largura. A largura extra na parte inferior é usada para esconder a lacuna entre o campo de jogo e o gabinete. Um dado foi executado na borda interna das peças da estrutura para segurar a tampa de acrílico. Usei acrílico em vez de vidro porque é mais leve, seguro e fácil de cortar. A tampa foi montada com parafusos de bolso. Fiz isso para poder desmontá-lo, caso o Plexiglas precisasse ser substituído. Também montei uma faixa de luzes LED coloridas sob a tampa para fins decorativos. Finalmente, montei a tampa na caixa usando uma dobradiça de piano que encaixei na tampa e na caixa.

Arduino

O Arduino Mega 2560 basicamente faz quatro coisas. Ele determina quando os interruptores são ativados, liga ou desliga as luzes de acordo, acompanha a pontuação e exibe a pontuação e o número da bola em um pequeno LCD. A maior parte da fiação é bem simples. Por exemplo, os alvos são conectados a uma das entradas digitais do Arduino e ao solo. A entrada é configurada usando uma instrução conforme mostrado abaixo.

pinMode (Pin_Number, INPUT_PULLUP)

Quando o código detecta que a entrada mudou de alto para baixo, ele sabe que o alvo foi atingido e então liga a luz LED de pinball apropriada.

A única complicação disso são os Pop Bumpers. Todos os interruptores e alvos de rollover usados ​​neste jogo obtêm sua energia do Arduino. Os Pop Bumpers obtêm seus de uma fonte de alimentação separada de 25 volts, pois precisam de mais energia do que o Arduino pode fornecer. Os Pop Bumpers têm um interruptor para ativá-los, mas não consigo ler diretamente por causa da alta tensão. Consequentemente, primeiro envio a saída do interruptor Pop Bumper para um divisor de tensão. Um exemplo de divisor de tensão pode ser encontrado no link abaixo.

Divisor de Tensão

Depois de passar pelo divisor de tensão, a tensão é reduzida para 5 volts e o Arduino pode lidar com isso. Descobri que obtinha menos leituras falsas com essas se usasse as entradas analógicas, já que os divisores de tensão parecem sempre vazar alguma corrente. Com as entradas analógicas, pude verificar se um limite foi excedido para que eu pudesse separar facilmente um sinal de ruído.

Durante o jogo, se todo um determinado tipo de dispositivo (alvo, pop bumpers ou rollovers) tivesse sido ativado, programei o Arduino para piscar todas as luzes desses dispositivos e aumentei a pontuação para eles.

Também usei um pequeno sensor de força para saber quando uma bola foi perdida. Isso me permite controlar o número de bolas jogadas e determinar quando o jogo termina. Quando o jogo acaba, todas as luzes piscam em sequência.

Por fim, usei o Arduino para exibir a pontuação e o número da bola.

O diagrama de fiação anexado mostra como um de cada um dos componentes principais foi conectado. O diagrama seria muito confuso se todos fossem exibidos.

Fonte de alimentação

Para alimentar os componentes do pinball, usei uma fonte de alimentação de 24 volts. Esta unidade tinha bastante potência para os flippers e os sidekicks. É um pouco fraco para os pára-choques pop. Você pode querer usar uma fonte de alimentação mais forte para eles. Se fizer isso, você terá que fazer seus próprios divisores de tensão, já que só consegui encontrar aqueles que tinham no máximo 25 volts. Informações sobre como fazer um divisor de tensão podem ser encontradas aqui.

Em vez de conectar tudo diretamente à fonte de alimentação, coloquei os fios dela em um par de barramentos e depois montei na parte inferior do campo de jogo. Isso tornou muito mais fácil conectar os diferentes componentes. Você pode ver um dos barramentos na segunda foto da seção Slingshot. Eles estão disponíveis na loja doméstica do departamento elétrico.

Atirador de bolas ou êmbolo

O arremessador de bolas ou êmbolo foi comprado no link a seguir

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

É necessário fazer um orifício na frente da caixa para que o êmbolo passe. Em seguida, é aparafusado no interior da caixa. É necessário muito cuidado para garantir que o êmbolo esteja devidamente alinhado com o campo de jogo. Coloque uma régua no campo de jogo e marque o ponto onde ela atinge o interior da caixa. Em seguida, suba o suficiente para que o meio do êmbolo seja igual à metade da altura do pinball. (Pinballs têm 1 e 1/16 polegadas de tamanho e estão disponíveis no Pinball.)

Campo de jogo

O campo de jogo é feito de compensado com revestimento de bétula de ¼ de polegada. Para deixar o jogo mais decorativo, comprei uma foto no link da Nasa abaixo.

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

Primeiro borrifei a madeira compensada com adesivo de contato e depois laminei o pôster sobre ela. Então, virei e cortei no tamanho certo.

Flippers

Os flippers foram adquiridos no link abaixo.

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

Quando você compra a maioria dos componentes do pinball, eles tendem a vir sem instruções úteis. A forma de conectar os flippers é mostrada na figura abaixo. Veio deste link.



Além do mecanismo de flipper, você precisará de um bastão de flipper, de um interruptor de flipper e de um botão.

Estilingues

Um conjunto completo de estilingue pode ser encontrado aqui. Você também precisará de alfinetes e elásticos. Você pode encontrá-los no mesmo local. Também é mostrada uma foto do estilingue quando montado por baixo. Devo ressaltar que um fio de bitola 16 foi usado para todos os componentes conectados à fonte de alimentação de 24 volts e um fio de bitola 22 foi usado para as conexões com a placa Arduino.

A primeira foto também mostra alguns trilhos de metal próximos aos morcegos flipper. Não consegui encontrar um lugar para comprar os trilhos, então os fiz. Usei um fio de aço cromado que encontrei na loja da casa. Foi usado para marcar gramados quando eles foram pulverizados com inseticida. Cortei e dobrei o fio. Em seguida, fiz furos no campo de jogo e coloquei epóxi nos trilhos.




Pop Bumpers

Conjuntos de amortecedores pop podem ser adquiridos aqui. Você também precisará de interruptores e bonés. Os pára-choques pop são instalados fazendo três orifícios, dois para as hastes de suporte de metal e um para o eixo que aciona o interruptor. Quando uma bola rola no disco branco visto na vista superior, ela empurra a haste para baixo. Isso aciona o interruptor de folha, que então ativa o solenóide. O solenóide puxa para baixo um anel de metal que envia a bola na direção oposta.



Alvos, interruptores de rollover e luzes

Os alvos estão disponíveis no link abaixo.

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

Chaves e montagens de rollover podem ser encontradas abaixo.

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

As lâmpadas que usei não são mais feitas, mas os equivalentes são mostrados abaixo.

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

Você também precisará dos suportes de lâmpada mostrados abaixo.

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

A fiação de todos esses é basicamente a mesma e foi mencionada na seção do Arduino.

Resumo

Depois de começar, você sem dúvida encontrará outros sinos e assobios que deseja adicionar, mas isso deve ajudá-lo a começar.

Código

  • Código de máquina de Pinball Arduino
Código de máquina de Pinball Arduino Arduino
Permite que o Arduino controle o jogo de uma máquina de pinball caseira
 const int TxPin =17; Pontuação longa =0; Long OldScore =0; Alvo longo =1; Pop longo =1; Roll longo =10; alvos int [8]; int Rolls [3]; int Pops [4]; int Milli =10; soma int =0; Flash int =100; bola int =0; int i =0; Int Shot =0; int Lost =0; Pressão int =1024; #include ; SoftwareSerial mySerial =SoftwareSerial (255, TxPin); void setup () {/ * Palavras sem um s são o valor obtido pela interação com um dispositivo. * Funciona com um s para rastrear com quais indivíduos interagiram. * O último é necessário para determinar quando todos foram atingidos e o valor precisa ser atualizado * e as luzes precisam ser apagadas. * / pinMode (TxPin, OUTPUT); digitalWrite (TxPin, HIGH); mySerial.begin (9600); mySerial.write (12); // Limpar mySerial.write (17); // Liga a luz de fundo // entradas alvo 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); // rollover entradas pinMode (10, INPUT_PULLUP); pinMode (11, INPUT_PULLUP); pinMode (12, INPUT_PULLUP); // abaixe a chave do lançamento da bola pinMode (15, INPUT_PULLUP); // botão de tiro de bola superior pinMode (16, INPUT_PULLUP); // saída lcd pinMode (17, OUTPUT); // luzes do alvo, respectivo pinMode (32, OUTPUT); pinMode (33, SAÍDA); pinMode (34, SAÍDA); pinMode (35, SAÍDA); pinMode (36, SAÍDA); pinMode (37, SAÍDA); pinMode (38, SAÍDA); pinMode (39, SAÍDA); // luzes de rollover, respectivo pinMode (40, OUTPUT); pinMode (41, SAÍDA); pinMode (42, SAÍDA); // pop light bumper lights pinMode (50, OUTPUT); pinMode (51, SAÍDA); pinMode (52, SAÍDA); pinMode (53, OUTPUT);} void loop () {// coloque seu código principal aqui, para executar repetidamente:// Se um resistor pull-down for usado, o pino de entrada será BAIXO quando a chave estiver aberta e ALTO quando o interruptor está fechado. // verificar se um alvo foi atingido // ****** Alvos ***** for (int i =0; i <8; i ++) {if (digitalRead (i + 2) ==LOW) {/ / Alvos ativados Alvos [i] =1; Pontuação =Pontuação + Alvo; // liga a luz do alvo digitalWrite (i + 32, HIGH); // atrasar para não obter vários pontos para um atraso de acerto (Milli); pausa; }} Soma =0; para (int i =0; i <8; i ++) {Soma =Soma + Alvos [i]; } if (Sum ==8) {// todos os alvos acesos, então pisque e desligue. for (int j =0; j <3; j ++) {for (int i =0; i <8; i ++) {digitalWrite (i + 32, LOW); } atraso (Flash); para (int i =0; i <8; i ++) {digitalWrite (i + 32, ALTO); } atraso (Flash); } para (int i =0; i <8; i ++) {digitalWrite (i + 32, LOW); Alvos [i] =0; } atraso (Flash); // Multiplica o valor alvo por 10 Target =Target * 5; // goto Skip; } // *********** Rollovers ********* para (int i =0; i <3; i ++) {if (digitalRead (i + 10) ==LOW) {// rollover ativado Rolls [i] =1; Pontuação =Pontuação + Rolagem; // liga a luz de rollover digitalWrite (i + 40, HIGH); // atrasar para não obter vários pontos para um atraso de acerto (Milli); pausa; }} Soma =0; para (int i =0; i <3; i ++) {Soma =Soma + Rolos [i]; } if (Sum ==3) {// todos os rollovers acesos, então pisque e desligue. for (int j =0; j <3; j ++) {for (int i =0; i <3; i ++) {digitalWrite (i + 40, LOW); } atraso (Flash); para (int i =0; i <3; i ++) {digitalWrite (i + 40, ALTO); } atraso (Flash); } para (int i =0; i <3; i ++) {digitalWrite (i + 40, BAIXO); Rolls [i] =0; } atraso (Flash); // Multiplica a pontuação por 2 Score =Score * 2; Roll =Roll * 10; // goto Skip; } // ********** Pop Bumpers ********** for (int i =0; i <4; i ++) {if (analogRead (i)> 500) {/ / pop ativado Pop [i] =1; Pontuação =Pontuação + Pop; // liga a luz do bumper digitalWrite (i + 50, HIGH); // atrasar para não obter vários pontos por um acerto //mySerial.print(analogRead(i)); //mySerial.print (""); atraso (Milli); pausa; }} Soma =0; para (int i =0; i <4; i ++) {Soma =Soma + Pops [i]; } if (Sum ==4) {// todos os pop-bumpers acesos, então pisque e desligue. for (int j =0; j <3; j ++) {for (int i =0; i <4; i ++) {digitalWrite (i + 50, LOW); } atraso (Flash); para (int i =0; i <4; i ++) {digitalWrite (i + 50, ALTO); } atraso (Flash); } para (int i =0; i <4; i ++) {digitalWrite (i + 50, BAIXO); Pops [i] =0; } atraso (Flash); // Multiplica o valor alvo por 10 Pop =Pop * 2; // goto Skip; } Pular:// Determina o número da bola if (digitalRead (15) ==LOW) {// bola bateu no interruptor do beco inferior // se ainda não foi feito, aumente Bola se (Tiro ==0) {// Definir Perdido =0 uma vez que não está na almofada de pressão Perdido =0; Pressão =leitura analógica (7) + 20; // define OldScore para reimprimir o valor da bola no LCD OldScore =-1; Bola =Bola + 1; if (Bola ==6) {Bola =1; Pontuação =0; Alvo =1; Roll =1; Pop =1; } Tiro =1; }} if (digitalRead (16) ==LOW) {// bola bateu no interruptor do beco inferior // se ainda não tiver feito isso, aumente Bola se (Tiro ==0) {// Definir Perdido =0 já que não está na almofada de pressão Perdida =0; Pressão =leitura analógica (7) + 15; // define OldScore para reimprimir o valor da bola no LCD OldScore =-1; Bola =Bola + 1; if (Bola ==6) {Bola =1; Pontuação =0; Alvo =1; Roll =1; Pop =1; } Tiro =1; }} if (analogRead (7)> ​​Pressão) {// bola na almofada de pressão Shot =0; if (Lost ==0) {//mySerial.print(analogRead(7)); // Pontuação =Pontuação + 100; Perdido =1; if (Ball ==5) {// Game Over // flash rollovers e, em seguida, desligue. for (int j =0; j <3; j ++) {for (int i =0; i <3; i ++) {digitalWrite (i + 40, LOW); } atraso (Flash); para (int i =0; i <3; i ++) {digitalWrite (i + 40, ALTO); } atraso (Flash); } para (int i =0; i <3; i ++) {digitalWrite (i + 40, BAIXO); Rolls [i] =0; } // flash pop bumpers e, em seguida, desligar para (int j =0; j <3; j ++) {for (int i =0; i <4; i ++) {digitalWrite (i + 50, LOW); } atraso (Flash); para (int i =0; i <4; i ++) {digitalWrite (i + 50, ALTO); } atraso (Flash); } para (int i =0; i <4; i ++) {digitalWrite (i + 50, BAIXO); Pops [i] =0; } // Flash Targets e depois desligue. for (int j =0; j <3; j ++) {for (int i =0; i <8; i ++) {digitalWrite (i + 32, LOW); } atraso (Flash); para (int i =0; i <8; i ++) {digitalWrite (i + 32, ALTO); } atraso (Flash); } para (int i =0; i <8; i ++) {digitalWrite (i + 32, LOW); Alvos [i] =0; } mySerial.write (12); // Deletar atraso (5); // Atraso necessário mySerial.print (Score); // Primeira linha mySerial.write (13); // Form feed mySerial.print ("Game Over !!!"); // Segunda linha}}} // imprime no LCD if (Score! =OldScore) {mySerial.write (12); // Deletar atraso (5); // Atraso necessário //mySerial.print(analogRead(7)); mySerial.print (Score); // Primeira linha mySerial.write (13); // Form feed mySerial.print ("Ball ="); // Segunda linha mySerial.print (Ball); OldScore =Score; }} 

Esquemas


Processo de manufatura

  1. Raspberry Pi / Hologram SMS interruptor de alimentação CA controlado
  2. Robô Raspberry Pi controlado por Bluetooth
  3. Luz da mesa interativa controlada por gestos
  4. Máquina de LEVITAÇÃO ULTRASÔNICA Usando ARDUINO
  5. LEDs controlados por Alexa através do Raspberry Pi
  6. Carro RC controlado por joystick
  7. Braço robótico controlado por Nunchuk (com Arduino)
  8. Manipulador de interruptor de luz sem fio
  9. Robô controlado por fala
  10. Arduino Apple Watch