Levende

Hvordan man opbygger en Arduino Pinball Machine: 15 trin (med billeder)

Pinball Machine Using an Arduino Board for Game Control

Pinball Machine Using an Arduino Board for Game Control

Indholdsfortegnelse:

Anonim

Hvis du er ligesom mig, elsker du pinball, men har ikke penge til at købe eller plads til at passe et spil i fuld størrelse. Så hvorfor ikke opbygge din egen?

Her vil vi gå igennem hvordan du opretter dit eget brugerdefinerede pinball spil drevet af en Arduino. Spillet har lys, lyde, funktioner ægte pinball dele, herunder støtfangere, drop targets og slingshots, og endda har en rampe.

Dette projekt kræver en meget stor mængde og mange forskellige materialer, så konsulter hvert efterfølgende afsnit for de nye materialer, der er nødvendige for at fuldføre hvert trin. Som en start er det meget nyttigt, hvis du har adgang til en laser cutter eller CNC router samt grundlæggende elektroniske og hardware værktøjer.

Forfatterens note: Dette instruerbare blev meget nylig offentliggjort, og ikke alle design- og softwarefilerne er blevet fuldstændigt organiseret. Hvis du planlægger at bruge vores filer, skal du skrive en kommentar, så vi kan sørge for, at alt er i sin mest up-to-date tilstand.

forsyninger:

Trin 1: Design

På billedet ovenfor er et Solidworks design af legepladsen og støttesamlingen. Legepladsen er udelukkende brugerdefineret, men skudlinierne (som kurven på back looping shot) blev designet ud fra rigtige pinball-maskiner for at sikre glat spil. Et problem her er, at på grund af deres kompleksitet var de faktiske pinball dele (fx bumpers og drop targets) ikke modelleret, men det skal stadig gøres for at sikre, at alt passer under playfield - delene er meget større nedenunder end ovenfor.

Filerne er inkluderet i opbevaringsstedet, så følg frie til at tilpasse designet til din fancy.

Et par højdepunkter i designet:

Legepladsen er 42 "ved 20,25" tommer, præcis størrelsen af ​​1980's Bally-stil spil. Den er lavet af ½ "krydsfiner, som er standard og bør ikke ændres, da pinball delkonstruktionerne er designet til denne tykkelse. Væggene her består af et ½ "lag oven på et ¼" lag. I den første prototype blev der kun inkluderet ½ "vægge, men disse viste sig at være for korte, og det kunne slå pinballen i luften på specielt faste skud. For det andet giver dette design mulighed for en let hævet skydespil (billedet ovenfor), som gør det muligt for bolden at falde lidt ind i legepladsen, men ikke falde tilbage.

Rampen er designet med klare akryl- og 3d-trykte understøtninger. Det krydser legepladsen, så det giver spilleren mulighed for at ramme rampen flere gange i træk fra venstre flipper. Som sådan bruges klar akryl ikke til at hindre afspillerens billede af bordet:

Endelig understøttes legepladsen af ​​korte vægge ved de fire hjørner, som holder playfield på standard 6,5 grader af hældning. Bagvæggen har en bund "hylde", der kan fjernes og bruges til montering af elektronikken. Dette resulterer i et spil med en fuld størrelse legeplads, men er meget mere kompakt end et typisk spil og kan bæres for hånd af en person. Da playfield er en standard størrelse, kan disse understøtninger fjernes, hvis du vil placere playfield i et standard pinballskab. For at gøre det, kan du overveje at tilføje en returkollektion, som ikke er medtaget i dette design.

Trin 2: Skær træet

For at skære lagene på legepladsen brugte vi en laserskærer. Imidlertid er en laserskærer stærk nok til at skære ½ "krydsfiner svært at finde, kræver højkvalitets krydsfiner og kan risikere at starte en brand, hvis du ikke er forsigtig. Typiske legepladser skæres ved hjælp af en CNC router - mens nogle af hjørnerne måske ikke er så skarpe, skal du stadig opnå anstændige resultater. For nemheds skyld antager nedenstående trin, at du har adgang til den samme laserskærer, vi gjorde. Der er nogle mennesker, der har haft anstændige resultater ved kun at bruge et bor og puslespil, men du skal være meget forsigtig og meget tålmodig, hvis du går på denne rute.

Det første skridt i oprettelsen af ​​playfield er at konvertere designet til .DXF-filer, som kan indføres i en laserskærer. For eksempel er afspilningsfeltet .DXF-filen afbildet nedenfor. De filer, der bruges i dette projekt, er inkluderet i vores lager.

Ved hjælp af laserskæreren skarede vi ud former til playfield, ¼ "mellemlaget (vi brugte duron, et billigere trælignende prototypemateriale, men ¼" krydsfiner vil også fungere), ½ "toplaget og ½" bakker op.

Nødvendige materialer:

  • ½ "krydsfiner til legepladsen og basen
  • ¼ "krydsfiner eller duron til mellemvæggenlaget
  • ½ ", ¾" og 1 "træskruer
  • Adgang til en CNC router eller laserskærer

Trin 3: Saml Playfield

Begynd med at klemme stykkerne fra ¼ "duronlaget på krydsfiner i deres respektive placeringer. Ved hjælp af en håndboremaskine skal du først bore pilothuller ved hjælp af en 3/32 "bit og derefter bruge fladhovedet ¾" træskruer til at fastgøre ¼ "lag til legepladsen. Det er vigtigt at gøre dette fra top-down (dvs. så skruen først går gennem ¼ "lag og derefter i ½" bunden), da ¼ "dele er små og tynde og vil bøje væk fra bundlaget, hvis det bores i modsat retning. Det er også vigtigt at sikre, at skruehovederne er flush med ¼ "lag og giver ikke nogen yderligere tykkelse.

En sidste note: disse skruer kan gå næsten hvor som helst, da dette lag vil være mest usynligt for spilleren, når playfield er samlet. Men der er en undtagelse - sæt ikke skruer ind i skyderbanen. (Vi lavede oprindeligt denne fejl).

Derefter fastgøres sidevæggene, og brug de længste træskruer til at bore ind i dem fra toppen af ​​brættet, så igen, at skruehovederne er flush med toppen. Når det er gjort, skal du klemme ½ "lagstykkerne oven på duronen og skrue dem ind som før, undtagen denne gang skrues ind fra bunden ved hjælp af 1" skruer. Da toplaget er ½ "tykt, er det mindre sandsynligt at bøje væk fra bunden, og skruen fra bunden sikrer, at skruerne bliver usynlige for afspilleren.

Tilslut endelig skyderblokken (billedet ovenfor med skytter) ved at skrue ind fra bundsiden ved hjælp af 2 skruer, så blokken ikke let kan vride. Skytterblokken har en "U" -formet slot, der passer til skytteren, som kan installeres ved at spænde møtrikken på den anden side. Du må også bruge smøremiddel for at reducere friktionen mellem skydepinden og bolden.

Designet kan have brug for nogle justeringer på dette tidspunkt. For eksempel, i vores design, var skæringen til drop-målene for smal og skulle udvides ved hjælp af en dremel. Hvis du bruger vores filer som mere end en reference, skal du prøve at kontakte forfatterne, der muligvis kan levere opdaterede filer. Det er også en god ide at skure ned i hårde områder, specielt hvor to træstykker mødes.

For det meste slutter dette træbearbejdning, og vi kan flytte til at sætte i komponenter.

Nødvendige materialer:

  • 3/4 "fladt hoved træskruer
  • Shooter samling
  • Længere (~ 1,5 ") træskruer
  • Håndbor med 3/32 "bit
  • Smøreolie
  • 1 "fladt hoved træskruer
  • En fil og / eller dremel og sandpapir

Trin 4: Tilføj komponenterne

På dette tidspunkt i designfasen skal du have en generel ide om den orientering, der kræves for at sikre, at alle komponenterne egentlig passer under legepladsen. (Hvis du bruger vores design, henviser du billedet af undersiden af ​​vores tabel ovenfor).

Først skal du installere drop-målene, stand-up mål og slingshot assemblies ved at sætte ½ "træskruer gennem monteringshullerne i samlingen. Gør det samme med popstøddæmperne, men sørg for at fjerne hætten først, eller at samlingen ikke passer ind i hullet!

For det andet, installer vippekonstruktionerne. Sørg for, at de roterer i den rigtige retning. Solenoiden, når den bliver affyret, vil pille stiften i spolen, og dette bør dreje akslen således, at flipper roterer op mod legepladsen. Når flipper samlinger er installeret, skal du sætte flipper flagermus ind fra den anden side.Brug en skruenøgle på låsemøtrikken i samlingen for at stramme dem på plads, og brug derefter fjederen, der skulle komme sammen med forsamlingen, for at sikre, at flipperne stødes ned igen, når de ikke fyres.

På samme måde skal du installere alle omstillingsbryderne ved hjælp af 1/2 "skruerne, så de let kan trykkes ind fra toppen og fjeder igen på plads. Ved hjælp af 6-32 bolte skal du også fastgøre portbryderen øverst til venstre for Vores design. Denne portafbryder tjener også som en envejsåbning, som giver mulighed for skud fra højre side og fra skytteren til at falde ind i bumpers. Dette er et designaspekt, der resulterer i skud ind i den højre rampe og højre loop går til forskellige steder og tilføjer mere variation til spillet.

For at installere lysene skal du først placere plastindsatserne i hullerne. Disse indsatser er ca. ¼ "tykke. Hvis du bruger en CNC-router, er den rigtige måde at montere disse på at klippe et ¼ "lag lidt større end indsatshullet. I vores design, da laserskæreren ikke kan skære partielle lag, vi 3D-udskrevne parenteser, der understøtter indsatserne. Brug epoxy til at holde indsatserne på plads (skrue om kanterne først) og sandpapiret for at sikre, at indsatserne er på niveau med legepladsen.

Derefter indsæt LED'erne i deres beslag ved at indsætte og dreje dem på plads. Derefter skrues beslagene på plads, så disse lysdioder sidder lige under hver indsats. De lette parenteser, der er forbundet nedenfor, er temmelig tynde og faktisk tynde nok, at 1/2 "skruer kan stikke på toppen af ​​bordet. Brug et par skiver, så dette ikke sker.

Playfield posts er installeret ved hjælp af 6-32 bolte. Når du har installeret, skal du pakke gummier fra gummisættet omkring dem for at få passive støtfangere. Disse giver bordet meget mere "liv" end hvis designet skulle være helt krydsfiner. Ved hjælp af de samme bolte skal du fastgøre køreskinnerne lige over flipperne. Lim også end-of-game-kontakten på plads.

Bemærk, at de fleste spil har en dedikeret tilbagesendelsessamling som den her. Dette var dog ikke inkluderet i dette design, primært på grund af omkostninger. Afvigelsen er selvfølgelig, at spilleren nu har ansvaret for at placere bolden tilbage i skyderbanen, når det er drænet. Vi har dog en skydespil, som er knyttet til skyderen som vist tidligere.

Flipperknapperne og startknappen er installeret ved at placere dem i hullerne og låses på plads med palnøtter. Knapperne til flipper-knapblade er boltet inde i knapperne med 6-32 bolte og lukker et switch-kredsløb, når knapperne trykkes.

På dette tidspunkt vil dit spillefelt (ovenfra) ligne et næsten komplette pinballbord! Alt der mangler er rampen. Du er velkommen til at fortælle blandt dine venner om, hvor fantastisk det ser ud, mens du selv er bange for, hvor meget ledning og lodning der skal gøres.

Materialer der kræves (flertallet blev købt fra PinballLife.com, og kan findes ved blot at søge i nedenstående vilkår).

  • 1 3-bank drop mål samling
  • 3x popkofanger samling
  • 1 venstre flipper samling
  • 1 højre flipper samling
  • 2 flipper flagermus
  • 2 flipper knapper
  • 2 flipper knap palnødder
  • 1 startknap
  • 1 gummi ring sæt
  • ~ 30 playfield stjerneindlæg, (1 1/16 "brugt)
  • 2 lane guider
  • 2 flipper knapblad switche
  • 2 slangesamlinger
  • 1 standup mål
  • 10 omstillingsbrydere
  • 8 LED # 44 bajonet-stil lys
  • 8 bajonet-lyskonsoller (Miniature Bayonet Base 2-bøsning med lang monteringsbeslag)
  • 5 1-1 / 2 "x 13/16" blå pilindsats
  • 3 1 "x 3/4" klar kugleindsats
  • 6-32 bolte (2,5 ", samt nogle mindre størrelser), møtrikker og skiver
  • ~ 2 "bred port switch (som den her, dette kan være svært at finde, vi skrabet vores fra en gammel brudt pinball ramp købt på ebay)

Trin 5: Byg rammen

For at lave rampen, brug ¼ "akryl til basisstykkerne og ⅛" akryl til sidevæggene. Det klare akryl giver et godt, rent udseende, mens du ikke blokerer afspilningen af ​​afspilningsområdet for afspilleren. Brug af farvet akryl kan også være en flot udseende, men det anbefales ikke at bruge et helt uigennemtrængeligt materiale som træ.

Støttene til ramperne er 3D trykt ved hjælp af en makerbot og boltet til playfield og plastik med de samme 6-32 bolte.

Akrylstykkerne her limes sammen ved hjælp af acrylcement, som er et opløsningsmiddel, som i det væsentlige smelter og svejser plasten sammen. Sørg for at bruge en lille mængde, og det vil skabe en meget stærk obligation, der næsten er usynlig.

Ved indgangen til rampen har vi medtaget en rampeflappe som den i billedet ovenfor. Dette er et tyndt stykke metal, der giver en meget glat overgang fra legepladsen til rampens plastik, snarere end at have flippen skal "springe" op på ¼ "tykkelsen af ​​plastik. Du kan købe en af ​​disse billigt fra en pinball specialbutik eller Ebay (vi gjorde), eller bare lave en af ​​dine egne ud af metalplader. I kommercielle spil er disse nittet, så boltene ikke holder op og kommer i vejen for bolden. Da vi ikke havde det rigtige udstyr til at gøre det, sørgede vi for at bruge fladhovedskruer og skubbe ud et hul i plastik og metal for at opnå samme effekt.

Der er en smal portknap, der er fastgjort til 3D-understøtningerne på rampens forreste højre hjørne, hvor det viser sig at gå over legepladsen. Denne switch er, hvad der registreres, når et vellykket rampeskud er blevet ramt.

Nødvendige materialer:

  • 1/4 "klar akryl (12x24" ark)
  • 1/2 "klar akryl (12x24" ark)
  • Akrylcement
  • Adgang til en 3D printer og laserskærer
  • Ramp flap
  • Fladhoved 6-32 bolte til rampeflappen
  • Kammerboremaskine eller håndværktøj
  • Smal portomskifter

Trin 6: Planlæg Electronics Block og Pin Layout

(Forfatterens opdatering: Med udvidet brug kan 48V blæse nogle af transistorerne i denne konfiguration. Jeg vil anbefale at bruge 35V eller lavere med disse elektronik eller bruge en mere professionel kontrolkort ressource som dem der er angivet her: http: // pinballmakers .com / wiki / index.php / Byggeri)

Denne maskine har 3 spændingsniveauer: 48V til magnetventilen, 6,3V for LED'erne og 5V for logikken og lyden. For at tilvejebringe disse spændingsniveauer anvendte vi en CNC-strømforsyning til 48V og DC-adaptere uden for hylderne for at give 6.3V og 5V. (Det kunne være muligt at bare bruge 6.3V, da Arduino nedregulerer sin forsyningsspænding til sin 5V udgangsstift, men vi holdt disse strømforsyninger isoleret). 48V er en højspænding, og selvom det ikke er dødbringende, kan det være skadeligt for dele og kan hurtigt forårsage overophedning af komponenter, hvis der er problemer med kredsløbet. Brug en 5-A slow-blow-sikring på både indgang og udgang fra den vigtigste 48V strømforsyning for at undgå at starte en brand, hvis nogen af ​​transistorerne er korte.

På Arduino skjoldet monterede vi ledninger med kvindelige Molex-stik, der matchede indgangs- og udgangskravene for hver af de tre underbrætter: magnetventilkortet, lyskilden / lydkortet og indgangskortet.

I vores design havde vi følgende pinopgaver. Dette er selvfølgelig ret fleksibelt. Pin 0 blev åben. (Instruktører lader os ikke lave nummerlister fra og med 0.)

  1. Åben
  2. Åben
  3. Interrupt / Input Active pin
  4. Kodet indgangsstift
  5. Kodet indgangsstift
  6. Kodet indgangsstift
  7. Kodet indgangsstift
  8. Kodet indgangsstift
  9. Højre kofangerudgang
  10. Mellemkofanger udgang
  11. Venstre kofangerudgang
  12. Slet mål output
  13. Flipper master switch output
  14. Hovedlyskontaktudgang
  15. Light output pin
  16. Light output pin
  17. Light output pin
  18. Lydudgangsstift
  19. Åben

Selvom det ikke er implementeret i vores design, kan SCL- og SDA-stifterne bruges til display og de resterende stifter kan bruges til yderligere styring, f.eks. Tilføjelse af funktioner (en kugle retur) eller flere lyskombinationer.

Nødvendige materialer:

  • 48V CNC strømforsyning (som denne)
  • 6,3 V og 5 V strømforsyninger (som denne)
  • 5A-sikringer og sikringsholdere og varmekrympeslanger til forbindelsen
  • Molex stik
  • Arduino prototype skærmbræt
  • Masser af 22AWG ledning, loddemetal og tålmodighed

Trin 7: Lav førerkortene

Førerkortet er ansvarlig for at dreje indgangene fra Arduino, piletasterne og slangeskuddet skifter til spoler. Da signalerne er på 5V-niveauet og solenoiderne ved 48V, er kraftige MOSFETS nødvendige for at relæere signalet. Transistorerne, der anvendes i dette design, er disse 100V-klassificerede MOSFET'er fra Mouser.

Der er tre skemaer, der er afbildet ovenfor, som omfatter flippers, slingshots og bumpers / drop targets. Hver har lidt forskellige krav, men i alle dem, når transistoren får et 5V signal, åbner en strømbane til solenoiden og 5-8 ampere trykkes gennem spolen for at give et kraftigt spark. Dette er meget aktuelt! Faktisk vil denne meget nuværende udbrænde komponenterne, hvis transistoren holdes på for mere end en meget kort puls. Sørg for, at du ved test af dette kredsløb ved hjælp af software eller andre metoder aldrig strømforsyne en magnetventil i mere end et sekund.

Den største kilde til problemer i de ovennævnte kredsløb er induktivt spark. Solenoiderne er kraftfulde induktorer, og som du måske ved, kan strømmen i induktorer ikke ændres øjeblikkeligt. Som sådan, når transistoren er slukket, er der stadig et kort øjeblik, hvor 5-8 ampere strømmer gennem solenoiden, og alt det nuværende har brug for et sted at gå. Hvis der ikke gives en vej til jorden, vil denne strøm køre spændingen ved transistoren dræne op til hundredvis af volt og ødelægge transistoren. Når transistoren er ødelagt, shorts det også alle tre terminaler, hvilket medfører, at forstærkere af kontinuerlig strøm strømmer og kan ødelægge solenoiden, hvis der ikke er installeret en ordentlig sikring. (Vi ødelagde 8 transistorer i vores opdagelse og forsøgte at løse dette problem, men heldigvis ingen solenoider, da vi altid var hurtige til manuelt at afbryde strømmen).

Der er to metoder til at forhindre induktivt kick: For det første skal hver pinball-enhed komme med en diode, der peger fra transistoren, dræne tilbage til forsyningen. Dette skal i teorien forhindre, at transistoren dræner fra at overskride forsyningsspændingen, da det engang sker, vil dioden tænde og dræne al den resterende energi fra induktoren. Desværre i virkeligheden slår disse dioder alene ikke hurtigt nok til at undertrykke det induktive spark nok af sig selv.

For at løse problemet tilføjede vi et RC 'snubber' kredsløb. Dette kredsløb har en kondensator i serie med en modstand. Kondensatoren absorberer tilstrækkelig strøm fra induktoren, således at dioden har tid til at tænde og udføre sin funktion. For mere information om RC snubber kredsløb, tjek her.

Kofangeren / droptarget-solenoiddriverens kredsløb er ret simpel og har bare transistoren, solenoiden, snubberen og en forbindelse til at modtage input fra Arduino. På dette bord og efterfølgende plader skal du sørge for at binde solenoiden sådan, at dioden (som ikke er vist i skematisk) peger mod højspændingssiden.

Flipper driveren kredsløb er lidt mere kompliceret af tre grunde. For det første anbefales det at skabe dette svar direkte i kredsløbet for at få en hurtig reaktion mellem knappetrykket og flipperaktionen, snarere end som separate indgange og udgange, der håndteres af Arduino. Forsinkelsen forårsaget af Arduino er lille, men en erfaren spiller vil være i stand til at fortælle straks og blive frustreret af manglen på kontrol.

For det andet har flipperne to forskellige spoler (en lav-effekt og en højspændingsspole) en end-of-stroke-knap, som udløser når flippen er høj. Denne switch tjener den vigtige funktion, så højspændingsspolen i første omgang kan brændes for at give et kraftigt slagtilfælde, men skifter til lavspændingsspolen (~ 130 ohm mod 4 ohm), der giver tilstrækkelig strøm til at holde flippen holdt 'op' som så længe knappen er placeret, men tegner ikke så meget strøm som at brænde solenoiden ud. I billedet nedenfor er EOS-kontakten normalt lukket, men vores samling havde en normalt åben switch og nødvendiggjort en anden transistor til at konvertere det til et normalt lukket signal.

For det tredje, mens vi ønskede, at knappen for at styre flipperne direkte, inkluderede vi også et "master" -skifte signal fra Arduino, der kunne aktivere eller deaktivere flipperne afhængigt af om bolden var i spil. Dette resulterer i brugen af ​​den tredje transistor i kredsløbet.

Tilsvarende har slangebordet sine egne komplikationer. Mens den kun bruger en transistor, skal den, som flipperne, styres direkte af indgangsswitcherne (som vi har kablet i serie) for hurtig reaktion, og at der ikke kræves ekstra udgangsstifter på Arduino. Desværre, hvis transistorens port er forbundet direkte til kontakten, er svaret alt for hurtigt til at have mere end et knapt mærket kick, da kontakten ikke forbliver lukket i meget lang tid. For at få et mere kraftfuldt kick (dvs. at lade slingshot-solenoiden "følge igennem"), tilføjede vi en diode og en stor modstand ved transistorens port, hvilket giver mulighed for et hurtigt svar, men skaber en stor tidskonstant for spændingsforfald ved den knudepunkt, så porten forbliver tæt på 5V (og transistoren på) lang nok til at få et mærkbart spark, selv efter at slangeskifterne er blevet åbnet igen. En anden komplikation er at sende denne indgang til Arduino, da inputkortet (som vi vil se senere) kræver lav indgange, og slangeskuddet virker, når en indgang skubbes højt. For at løse dette problem inkluderede vi en tredje transistor, der lukker, når hver input går højt og således kan behandles som enhver anden indgangskontakt på playfield

Førerkortet (faktisk to brædder) består af to flipper chauffører, to slingshot chauffører og fire single-chauffør chauffører til de resterende solenoider. I stedet for lodning direkte brugte vi 0,1 "molex-stik til at fastgøre dette bord til solenoider, strømforsyning og kontakter, så alle reparationer eller justeringer kunne gøres lettere.

Vi brugte loddebordebræt til vores designs, men at designe faktiske printplader med disse funktioner ville have et meget renere resultat og hjælpe med at mildne rodet på ledninger, som disse maskiner uundgåeligt har.

Materialer:

  • 12 100V-nominelle effekttransistorer
  • 10-50 uF kondensatorer (ikke-polære hvis muligt)
  • 300, 5k og 500k og 3M modstande
  • 1 mindre transistor til slingshot switch
  • Flere 1N4004 dioder
  • Prototype loddebordebræt (eller, endnu bedre, designe dine egne PCB'er)

Trin 8: Lav sensorindgangsstyret

Da vi kun bruger en Arduino, er vi begrænset til 20 digitale stifter. Pinball-maskinen har dog et par dusin unikke indgangsstik, for ikke at nævne udgange, der er nødvendige til lys, lyd og kørelektroider. For at afhjælpe dette problem antog vi, at intet to indgange skulle udløses på én gang (hvilket begrænser os til kun at bruge 1 bold). Denne antagelse gør det muligt for os at 'kode' for indgangene ved at konvertere dem til et 5-bit binært register med en 6. pin, der udløste en afbrydelse, når der blev modtaget en gyldig kontaktindgang. For at opnå dette anvendte vi en kaskade med 8-til-3-kodere til at lave en 24-til-5-encoder ved hjælp af denne encoder i layoutet vist i billederne ovenfor.

Dette var en af ​​de vigtigste udviklinger i projektet, da det gjorde det muligt for os at øge vores maskiners kompleksitet meget fra vores oprindelige plan om bare at have flippers, bumpers og et eller to mål.

Et andet prototypebord blev brugt til at placere hver af de 24 male Molex-stik; hver afbryder på spillefeltet ville have en kvindelig stik i enden af ​​en lang ledning, der plugger ind i dette kort. Drop-målene er et unikt tilfælde, der kan håndteres på flere måder. Hvad vi gjorde var wire hver drop target switch i serie, så indgangen er lukket, når de er helt nede og giver Arduino mulighed for at sende et signal til solenoiden for at slukke drop targets back up.

Materialer:

  • 4 3-state-output prioritet 8-til-3-kodere

Trin 9: Lav lys / lyd / score Peripheral Board

For at gemme pins på samme måde som encoderen brugte vi en 3 til 8 dekoder til at styre vores lys. Dette gav os den begrænsning, at vi ikke kunne tænde mere end et lys til enhver tid, men det var en acceptabel afvejning for at frigøre stifterne til andre elementer. Vi omfattede også en 4 "master" lydudgang, der kunne styre alle lysene på én gang. Dette kan for eksempel give os mulighed for at blinke alle lysene flere gange, når spillet først tændes (hvilket giver en stærk indikation af, at der rent faktisk sker noget med afspilleren, når han eller hun trykker på startknappen, hvilket ellers er svært uden en bold trough eller farverige display).

Ovennævnte skematiske har et transistorkredsløb svarende til drivere, men meget enklere, da de lavere spændinger i spil (6,3 V for lysene) har brug for mindre transistorer og ikke nødvendiggør så meget beskyttelseskredsløb. Vi brugte en diode ELLER-port til transistorerne til at isolere master-switch-signalet og det individuelle lyssignal. Dette gør det muligt for os at bruge kun en transistor pr. Lys i stedet for to og forhindrer Arduino og encoderchipserne fra at "kæmpe" for at kilden eller synkronisere strømmen.

Mens vi anvendte lavstrøm LED'er til hver af playfield-lysene (dem nedenunder indsatser), kom startknappen og de 3 pop-bumpere hver med glødelamper, der tegner ca. 250mA hver. Transistorerne er klassificeret til 530mA kontinuerlig strøm, for ikke at overstige dette, sørgede vi for, at kun to glødelamper nogensinde gik gennem en enkelt transistor.

Vi har også vedhæftet en passiv 5V piezo summer, der giver os mulighed for at spille rudimentære lyde på dette kort.

Brugerdefinerede lys- og lydsekvenser kan programmeres ved hjælp af funktioner light_sequence + sound_sequence eller gennem Pinball Language-grænsefladen.

  • 10 belysningstransistorer (vi brugte disse)
  • 5V Piezo summer

Trin 10: Trin 11: Design dine spilregler

Der er to muligheder for at definere reglerne for pinball spillet. Du kan interagere med spillet ved hjælp af et brugerdefineret pinball-dokument eller regler for hardkodespil. Hardkodede spilregler giver mulighed for mere fleksibilitet, herunder sekventielle skud og tidsbestemte bonusser, mens brug af pinball-dokumentet / parsersystemet muliggør mere fleksible, men enklere regler. Vi starter med grænsefladen til det konfigurerbare spil og derefter detaljerer nogle af de hårdkodede spilregler, så du kan vælge hvilken konfiguration du vil have til dit eget pinball spil.

Se github-arkivet her for de filer, der refereres til i dette projekt.

Del 1. Design dine spilregler

Standard tilstandsmaskine til et pinball spil findes på billedet.

Dette findes i standard startkode. Nu har du to muligheder - enten at skrive din egen kode til maskinen eller bruge den angivne formatering til pinball spillet.

Trin 11: Mulighed 1. Skriv din egen Pinball.txt-fil

I pinball-tekstdokumentet finder du tre sektioner: en for dele, en for "stater" og en for "handlinger". Her kan du definere de specifikke handlinger for hver komponent. For de fleste komponenter vil du sandsynligvis holde fast i en state-state-maskine. For eksempel, hvis hver gang en kofanger er ramt, skal spilleren score 100 point, tænde et rampelys og score 100 point, så vil statsdiagrammet se ud som figur 1 med den tilsvarende kode. Hvis du vil have en komponent til at have en stat med flere state-state-maskiner, vil du sige, at du ville have et lys til at tænde, når en kofanger er ramt, og derefter slukke, når den er ramt igen, vil din tilstandsdiagram / tilhørende tilstande ligne Figur 2 . Vores særlige maskine giver strukturerne, som i figur 3, som du kan definere regler for. Deres navne, interne kodede makroer (som du ikke behøver at bekymre dig om, men det kan være nyttigt, hvis du beslutter dig for at undersøge kildekoden), og afbrydelseskoder er angivet i figur 3. Figur 4 forbinder disse navne med playfield-komponenter.

Tips til at skrive dit pinball spil
Da spilkomponenterne er bundet til specifikke afbrydelser (angivet ved "pos" -feltet), som igen er defineret af hardware, anbefaler vi ikke at ændre sektionen "dele" for meget uden for "state" -feltet. Vi foreslår forbeholder tilstand 0 og aktion 0 for komponenter, der ikke har effekter på scoring, såsom startknappen og game switchen. Vores kode ser som vist på figur 5.

Trin 12: Definer lys og lydsekvenser

De otte lamper på bordet styres ved hjælp af en 3-til-8 dekoder + en hovedafbryder, som tidligere beskrevet. Specifikke lys kan tændes ved at skrive stifterne svarende til den binære kodede version af delkoden høj. Light_sequence helper-funktionen giver en brugerflade til at angive det lys, som han / hun ønsker at tænde, og makroer er defineret i state_machine_headers.h-dokumentet. Der er endnu en tabel til rådighed for din programmerings bekvemmelighed. Hvad angår Sound brugte vi Arduino-tonebiblioteket til at programmere korte lydsekvenser til forskellige spilbegivenheder. Vi har fire præfabrikerede lyde, som du kan vælge imellem (ved hjælp af executeSound (<# lyd du vil have)). Disse lyde svarer til en lang, munter sekvens, kort munter sekvens, kort trist sekvens og lang trist sekvens. Hvis du ønsker at programmere dine egne lyde, kan du se her, hvordan du gør det (pitch.h er medtaget i lageret): http://www.arduino.cc/en/Reference/Tone

Trin 13: Indlæs Pinball.txt fil til Arduino

Når du er færdig med at skrive FSM, kan du læse dit spil på din Arduino (forudsat at du bruger Mac). Alle filer kan findes på github-arkivet.

  1. Udpak den arduino-serielle zip-fil.
  2. Naviger til arduino-seriel filen, og gem din game config-fil her. "Pinball.txt" giver en eksempelskabelon, som du kan bruge.
  3. Åben Arduino. Upload pinball spil skitse.
  4. Åbn terminal og skriv følgende kommandoer:
    • lave
    • ./arduino-serial -b 9600 -p pinball.txt
  5. Nu skal vi læse og lagre data i Arduinos interne hukommelse. Hvis der er ukorrekte linjer, vil Arduino udskrive en fejlmeddelelse, og du kan vælge at sende filen igen.
  6. Når du er færdig med at uploade koden ved hjælp af terminal, f.eks. når Arduino udskriver en "færdig" besked, kan du åbne Arduino Serial for at læse meddelelser fra det igangværende spil.

Fælles problemer / optimeringer til software-spil

  1. Hardkodede versus konfigurerbare spil - vi bemærkede, at afbrydelserne i det hårdkodede spil reagerede meget mere præcist end det i det tilpassede spil. Dette kunne skyldes, at det tilpassede spil havde mange generelle funktioner, som krævede betingede udsagn. Dette nedsatte læsens hastighed, hvilket fik os til at savne flere afbrydelser og påvirket spilets samlede driftshastighed. For at løse dette problem reducerede vi nogle af konfigurationsfilens customizability for at opnå acceptable svarstider i kredsløbet. Vi havde oprindeligt bekymringer om RAM-kapaciteten hos Arduino og hvor meget af reglerne det kunne lagre, men det viste sig at være mindre et problem end oprindeligt forventet, og det var hastigheden på sløjfen, der var den største begrænsende faktor.
  2. Afbrydelse af afbrydelser - på grund af hurtige handlinger fra pinball-spillet havde vi flere tilfælde, hvor afbrydelsestiften modtog flere afbrydelser, da pinballen kun ramte en spilkomponent. Da disse afbrydelser blev modtaget, før koderen havde tid til korrekt at læse alle indgange, ville afbrydelserne være forbundet med forkerte komponenter. For at løse dette problem anvendte vi et eksternt debatterende bibliotek, der svarer 1ms efter den første afbrydelse er modtaget, hvilket giver tid til encoderpindene at nå høje, før spillet læser indgangskoden.
  3. Display - Selvom seriel visning gør det muligt for spillet at udskrive detaljerede meddelelser, er det svært for en spiller at læse outputmeddelelserne, når han spiller et hurtigt spil af pinball. Det er også uhåndterligt for spilleren at skulle spille spillet med en vedhæftet computer. I fremtiden håber vi at gennemføre et digitalt display, der kan vise scoreren og andre spiloplysninger på en skærm, som brugeren nemt kan se, som en LED-matrix eller en 7-delt display.

Trin 14: Mulighed 2: Råd om hardkodning af dit eget spil

Først - læs gennem state_machine_headers.h dokumentet for at forstå de globale datastrukturer, der lagrer information om statsmaskinen. Du bør initialisere disse datastrukturer til dine spilregler inden for Arduino IDE før du lægger ind i Arduino-koden. Følgende datastrukturer leveres:

Game structs at holde oplysninger om hver del Stater for at holde oplysninger om state overgange Handlinger til at holde oplysninger om handlinger, der skal udføres Disse strukturer er befolket af den læste fil. Definer input / output for alle pins. Afbrydelsestifter skal defineres som INPUT-stifter.

Inden for hovedløkken skal du kontrollere hver cyklus for at se, om en afbrydelse er fyret for hver spilkomponent. Definer hver spilkomponent i en switch-sætning.

Hjælperfunktion executeState opdaterer den aktuelle tilstand af delen og udfører handlinger baseret på den kodede information.

Den hårdkodede første version af spilkoden findes i filen "simplepinballgame.ino"

Trin 15: Forbind Alt

For at interfere med Arduino med vores førerkort anvendte vi en protoshield for lettere at få adgang til stifterne på de andre brædder. Der er mange ledninger, så pas på! Følg layoutet angivet i Electronic Pins og Layout for at forbinde dine Arduino udgange til deres tilsvarende stifter. Molex-stik skal hjælpe meget med at finde ud af, hvilke stik der forbinder med hvilke.

Her er en kort fejlfinding FAQ, hvis du løber ind i nogle af de fælles problemer, vi gjorde:

Typen af ​​input-encoderen er, at der er 6 inputstifter i Arduino: 5, der sammen viser, hvilken indgang der udløses, og en 6. pin, der går højt, hvis en enkelt indgang udløses. Koden skrevet kun registrerer, når denne sjette pin ændres fra lav til høj. Så hvis Arduino ikke modtager input, og du er sikker på at alle eller i det mindste de fleste af kontakterne fungerer, skal du kontrollere, om der er nogen afbrydere, der er fastlåst. For eksempel, hvis alle drop-målene er nede og ikke er fyret tilbage, er det en lukket skifte og forhindrer Arduino i at modtage andre indgange.

Kontroller, at møtrikken, der holder skyderen på plads, er strammet helt, eller at skyderen ikke er løs. Alternativt, olie skytterstangen.

Dette kan være et mekanisk / design problem, hvis omskifterne er placeret i for bred en bane, så bolden kan gå 'rundt' dem. Ellers kan det være resultatet af for længe af en forsinkelse et eller andet sted i koden. Hvis du for eksempel har travlt med at spille en tone ved hjælp af tonebiblioteket og en forsinkelse () -opstilling, vil Arduino ikke kunne hente indgange i løbet af den tid. En løsning vi brugte var at kun afspille lyde til rampeskuddet, standup-målet, startknappen og end-of-game-switchen, da vi vidste, hvor meget tid vi ville have efter disse skud, før en ny indgang sandsynligvis ville blive udløst .

Vi har ganske vist ikke tildelt specifikke overskrifter til specifikke lys eller specifikke solenoider, hvilket betyder at første gang du tilslutter alt i (eller efterfølgende tidspunkter, hvis du ikke mærker dem på en eller anden måde), er udgangsstifterne (eller output-lyskodningen) forbundet i vilkårlig rækkefølge. Brug prøve-og-fejl til at løse hvilke stifter, der svarer til hvilken udgang og juster koden i overensstemmelse hermed. For lys og støddæmper er dette ikke så dårligt - men mærket absolut alle indgange og skriv ned, hvilket er hvilket som den proces kan have op til 24 værdier og vil tage lidt længere tid at kalibrere.

Encoderen har den uheldige egenskab, at der undertiden pulserer indikatorstiften højt, før de 5 omformerstifter har fuldt ud løst deres værdier. For os vidste vi, at dette var sket, da antallet af kontakten, der blev trykket, var off-by-one, men det kan vise sig anderledes for dig. Vi løste dette problem ved at bruge et debouncing bibliotek til at skabe en lille smule forsinkelse mellem, når vi bemærker, at en switch er ændret, og når vi registrerer hvilken switch det var. Forsigtig, men som for meget af en forsinkelse (mere end 15-20mS) kan få dig til at savne input helt.

Beklager, men vi har ikke rigtig fundet ud af en god løsning til denne endnu.