Inhoudsopgave:

Plug and Play Arcade-knoppen - Ajarnpa
Plug and Play Arcade-knoppen - Ajarnpa

Video: Plug and Play Arcade-knoppen - Ajarnpa

Video: Plug and Play Arcade-knoppen - Ajarnpa
Video: Pandora's Box 7s Plug and Play Arcade Spelcomputer ! 2024, November
Anonim
Plug en Play Arcade-knoppen
Plug en Play Arcade-knoppen

Ik ben onlangs begonnen met het gebruik van Arduino om mijn projecten te maken. Als ontwerper maak ik graag aangepaste interfaces voor mijn games/interactieve projecten.

Het enige probleem dat ik tegenkwam was dat het gebruik van seriële communicatie behoorlijk ingewikkeld is en vatbaar voor problemen en bugs. Ik wilde een snelle en gemakkelijke oplossing waarmee ik externe knoppen kan gebruiken om mijn games te bedienen.

Omdat ik een plug-and-play-apparaat wilde dat je direct met elke computer kon gebruiken, kocht ik een Arduino Leonardo. Het is bijna identiek aan een Uno, maar met een paar verschillen. Het belangrijkste verschil dat ik voor dit project in mijn voordeel zal gebruiken, is dat het als een HID kan fungeren. Een HID of Human Interface Device is een USB-protocol waarmee uw computer invoer van toetsenborden en een computermuis kan herkennen en accepteren zonder dat u voor elk apparaat aangepaste stuurprogramma's hoeft te installeren.

let op: je kunt ook een Uno gebruiken, als je de firmware bijwerkt, zoals hier getoond.

Stap 1: Materialen

Voor dit project heb je nodig:

1x HID-compatibele microcontroller (er zijn er een paar zoals Arduino micro, Due & leonardo, ik zal de Arduino Leonardo gebruiken)

1x USB naar arduino kabel (voor de Leonardo is het USB micro)

3x Arcade-knoppen (ik heb deze gekocht)

1x soldeerloze breadboard

3x 10k ohm weerstanden

3x 220 ohm weerstanden

Doorverbindingsdraden

Je kunt natuurlijk meer knoppen toevoegen, of alles op een breadboard solderen om dingen meer permanent te maken.

Stap 2: Prototyping

Prototyping
Prototyping
Prototyping
Prototyping
Prototyping
Prototyping

Dus voordat ik de arcade-knoppen kocht die ik wilde gebruiken, heb ik dit uitgeprobeerd met standaard drukknoppen. Sluit de knoppen op de standaard manier aan, ik geloof dat ik 10K ohm-weerstanden heb gebruikt.

De programmering is dankzij de Leonardo vrij eenvoudig. U moet de toetsenbordbibliotheek opnemen. Ik gebruikte het Arduino-standaardvoorbeeld "Toetsenbordbericht" als basis voor mijn code.

Nu is de vraag hoe u wilt dat uw knoppen werken. Je hebt in principe twee keuzes, één druk op de knop en een continue stroom van letters als je erop drukt. Het hangt echt van je project af wat je zou willen.

Als u wilt dat er een enkele keer iets gebeurt als er op een toets wordt gedrukt, zoals een sprong of een aan/uit-schakelaar, dan kiest u voor de methode met één druk op de knop. Bij deze methode kijk je naar de status van de knop, is deze omhoog of omlaag? Dan vergelijk je het met de vorige staat, was het al omhoog of omlaag? Als de vorige knopstatus hetzelfde is als de huidige knopstatus, gebeurt er niets. Maar als de status van de knop verandert, zoals bij het indrukken of loslaten van een knop, gebeurt er iets. In mijn code typt het alleen een letter wanneer de knop wordt ingedrukt, niet wanneer het wordt losgelaten, maar je zou dit kunnen veranderen.

#include "Toetsenbord.h"

const int buttonLinks = A0; // invoerpin voor drukknop

const int buttonRechts = A1; const int buttonUp = A2;

int previousButtonStateLeft = HOOG; // voor het controleren van de status van een drukknop

int previousButtonStateRight = HOOG; int previousButtonStateUp = HOOG;

ongeldige setup() {

// maak van de pushButton-pin een invoer: pinMode (buttonLeft, INPUT); pinMode (knopRechts, INPUT); pinMode (knopOmhoog, INPUT); // initialiseer controle over het toetsenbord: Keyboard.begin(); }

lege lus() {

// lees de drukknop: int buttonStateLeft = digitalRead (buttonLeft); // als de knopstatus is gewijzigd, if ((buttonStateLeft != previousButtonStateLeft) // en het is momenteel ingedrukt: && (buttonStateLeft == HIGH)) { // typ een bericht Keyboard.print("a"); } // sla de huidige knopstatus op voor vergelijking de volgende keer: previousButtonStateLeft = buttonStateLeft;

// lees de drukknop:

int buttonStateRight = digitalRead (buttonRight); // als de knopstatus is gewijzigd, if ((buttonStateRight != previousButtonStateRight) // en het is momenteel ingedrukt: && (buttonStateRight == HIGH)) { // typ een bericht Keyboard.print("w"); } // sla de huidige knopstatus op voor vergelijking de volgende keer: previousButtonStateRight = buttonStateRight;

// lees de drukknop:

int buttonStateUp = digitalRead(buttonUp); // als de knopstatus is gewijzigd, if ((buttonStateUp != previousButtonStateUp) // en het is momenteel ingedrukt: && (buttonStateUp == HIGH)) { // typ een bericht Keyboard.print("d"); } // sla de huidige knopstatus op voor vergelijking de volgende keer: previousButtonStateUp = buttonStateUp; }

Als je wilt dat er continu iets gebeurt zolang de knop wordt ingedrukt, zoals je zou willen voor een beweging naar links of naar rechts, laat hem dan gewoon een letter schrijven zonder de vorige knopstatus te controleren. Vergeet niet om een kleine vertraging toe te voegen om te voorkomen dat het gek wordt en om het stuiteren van uw knoppen tegen te gaan. Er zijn elegantere manieren om dit probleem op te lossen, maar dit is gemakkelijk en snel.

#include "Toetsenbord.h"

const int buttonLinks = A0; // invoerpin voor drukknop

const int buttonRechts = A1; const int buttonUp = A2;

ongeldige setup() {

// maak van de pushButton-pin een invoer: pinMode (buttonLeft, INPUT); pinMode (knopRechts, INPUT); pinMode (knopOmhoog, INPUT); // initialiseer controle over het toetsenbord: Keyboard.begin(); }

lege lus() {

// lees de drukknop: int buttonStateLeft = digitalRead (buttonLeft); if (buttonStateLeft == HOOG) //als de knop wordt ingedrukt { // typ een bericht Keyboard.print ("a"); vertraging (50); // Vertraging voor bounce & om je computer te laten inhalen }

// lees de drukknop:

int buttonStateRight = digitalRead (buttonRight); if (buttonStateRight == HOOG) // als de knop wordt ingedrukt { // typ een bericht Keyboard.print ("w"); vertraging (50); // Vertraging voor bounce & om je computer te laten inhalen }

// lees de drukknop:

int buttonStateUp = digitalRead (buttonUp); if (buttonStateUp == HOOG) // als de knop wordt ingedrukt { // typ een bericht Keyboard.print ("d"); vertraging (50); // Vertraging voor bounce & om je computer te laten inhalen } }

U kunt altijd een combinatie van beide methoden gebruiken, afhankelijk van wat het beste bij uw behoeften past.

Stap 3: Lasersnijden van de behuizing

Lasersnijden van de behuizing
Lasersnijden van de behuizing

Voor de behuizing heb ik 3 mm mdf gebruikt, met een 2 mm plexiglas inzetstuk. Ik heb het inzetstuk toegevoegd omdat ik in een later stadium wat LED's aan de binnenkant van de behuizing wil toevoegen om het mooi en glanzend te maken.

Ik heb mijn afmetingen ingevoerd in makercase en het svg-bestand gedownload. Ik opende het in Illustrator en voegde de gaten toe waar ik ze wilde hebben. Als je geen Illustrator hebt, kun je Inkscape gebruiken voor deze stap.

Je hoeft natuurlijk geen lasercutter te gebruiken, dit is een simpele doos met een paar gaatjes erin. Het zou gemakkelijk genoeg moeten zijn om het te maken met meer traditioneel elektrisch gereedschap (of zelfs handgereedschap!) Ik ben gewoon erg lui en had toegang tot een lasersnijder.

Stap 4: Arcade-knoppen solderen

Arcade-knoppen solderen
Arcade-knoppen solderen
Arcade-knoppen solderen
Arcade-knoppen solderen
Arcade-knoppen solderen
Arcade-knoppen solderen

Een arcade-knop (of in ieder geval de mijne) bestaat uit drie delen. De kunststof behuizing, de LED houder (met LED erin) en de microschakelaar. De microschakelaar is het eigenlijke knopgedeelte van de knop en is wat je nodig hebt om verbinding te maken met je Arduino. Er zijn drie terminals (metalen bits die uitsteken, waar je je draden soldeert) op de microschakelaar. Degene bovenaan (of onderaan, wat je wilt) is de grond. De andere twee terminals zijn de Normal Open (NO) en Normal Closed (NC). NEE betekent dat als de schakelaar wordt ingedrukt, er verbinding wordt gemaakt. NC betekent dat als de knop wordt ingedrukt, de verbinding wordt verbroken. We zullen de NO gebruiken voor dit project. Ik heb de grond, NO en NC op mijn microschakelaar op de foto's gelabeld.

Mijn knoppen zijn verlicht, dus ik heb draden aan de LED-houder gesoldeerd. Zorg ervoor dat u uw draden een kleurcode geeft, zodat u weet welke kant de anode is en welke de kathode (positieve en negatieve kanten van de LED).

Ik heb header-pinnen op mijn draden gesoldeerd, zodat ze gemakkelijk te gebruiken zijn met een soldeerloze breadboard. Ik heb de draad gewoon aan een header-pin gesoldeerd en er een beetje krimpkous omheen gedaan om ze veerkrachtiger te maken.

Stap 5: Stapel de knoppen en verbind ze met uw bord

Stapel de knoppen en verbind ze met uw bord
Stapel de knoppen en verbind ze met uw bord
Stapel de knoppen en verbind ze met uw bord
Stapel de knoppen en verbind ze met uw bord
Stapel de knoppen en verbind ze met uw bord
Stapel de knoppen en verbind ze met uw bord
Stapel de knoppen en verbind ze met uw bord
Stapel de knoppen en verbind ze met uw bord

Nu is het tijd om je arcade-knoppen in je hoesje te stapelen. Verwijder de borgring uit de kunststof behuizing en steek deze door het gat in de behuizing. Draai de borgring aan de andere kant vast om de knop vast te zetten. Steek de LED-houder erin en draai eraan om hem op zijn plaats te vergrendelen. Wiebel in de microschakelaars (er zijn kleine noppen en gaten die op één lijn liggen met elkaar om het op zijn plaats te houden).

Om de schakelaars op het bord aan te sluiten, verwijdert u de drukknoppen die u al dan niet hebt toegevoegd. Verbind de draad die van de grond van de microschakelaar naar de grond van de Arduino en de weerstand leidt (waar het been van de drukknop zat). Verbind de draad die van de NO van de microschakelaar naar de 5v van de Arduino leidt.

Voor de LED-draden verbindt u de negatieve draad met de grond en de positieve via een 220OHM-weerstand met de 5v. Als je ze zo aansluit, staan ze altijd aan. Je zou ze in de code kunnen toevoegen en ze desgewenst synchroon met de knoppen kunnen in- en uitschakelen.

Stap 6: Helling coderen

Dus nu heb je je mooie nieuwe knoppen aan je oude code bevestigd en plotseling werkt het niet meer zoals het zou moeten. De letters verschijnen met twee of drie tegelijk en het werkt niet zoals het zou moeten met eenvoudige HTML5-spellen. Welkom in de hel.

Eerste dingen eerst. De code die we schreven tijdens het prototypen? het werkt prima en is eenvoudig, maar het is niet elegant. Als u meer knoppen wilt toevoegen, moet u codefragmenten kopiëren en plakken en alle waarden erin wijzigen. Als je er één vergeet, betreed je de bugfixing-hel. Hier een thema detecteren? Coderen is een hel, maar een erg leuke, probleemoplossende hel.

We willen mooie korte code. Dus we zullen alle individuele gehele getallen van de knop veranderen in arrays. Op deze manier, als u meer knoppen wilt toevoegen, hoeft u alleen het aantal knoppen, de pinnen waar ze zich bevinden en hun uitvoer te wijzigen. We veranderen ook de belangrijkste invoer naar ASCII omdat… het beter werkt?

Nu, als je op mij lijkt, schrijf je een eenvoudige en gemakkelijke manier om de knoppen te gebruiken en het zal niet zo goed werken als je zou willen. Dus je maakt nieuwe versies (onthoud kinderen, incrementele back-ups!), probeert verschillende dingen, schrijft steeds meer gecompliceerde code die nog steeds niet goed werkt en gaat uiteindelijk terug naar de eenvoudige code die je uren geleden hebt geschreven EN merkt een kleine fout op die lost alles meteen op.

Laat me je die reis besparen, hier is de werkende code:

Disclaimer: deze tekst is geschreven na urenlang coderen en bug repareren van een zeer eenvoudige code. Negeer eventuele tekenen van frustratie en concentreer u op de onderstaande werkende code;)

#include "Keyboard.h"#define buttonAmount 3

int-knopPin = {

A0, A1, A2 }; //Waar zijn de knoppen? int asciiLetter = { 97, 100, 119}; //Letters in ASCII, hier: a, d, w int buttonState [buttonAmount]; //Is de knop ingedrukt of niet?

ongeldige setup() {

for (int i = 0; i < buttonAmount; i ++) {// doorloop de array pinMode (buttonPin , INPUT); // stel alle pinnen in om in te voeren}}

lege lus() {

for (int i = 0; i < buttonAmount; i++) // fiets door de array { buttonState = digitalRead (buttonPin ); //Wat doen de knoppen? if (buttonState == HIGH){ //Als de knop wordt ingedrukt Keyboard.press(asciiLetter); //stuur de corresponderende letter} else //als de knop niet is ingedrukt { Keyboard.release(asciiLetter); //laat de brief los } }

}

Stap 7: Alles werkt

Veel plezier met je plug & play aangepaste controller!

Als je dit instructable leuk vond, overweeg dan om op mij te stemmen in de wedstrijd!

Aanbevolen: