Inhoudsopgave:

Arduino en Touchpad Tic Tac Toe - Ajarnpa
Arduino en Touchpad Tic Tac Toe - Ajarnpa

Video: Arduino en Touchpad Tic Tac Toe - Ajarnpa

Video: Arduino en Touchpad Tic Tac Toe - Ajarnpa
Video: Arduino - Tic Tac Toe Game with Touchpad 2024, September
Anonim
Arduino en Touchpad Tic Tac Toe
Arduino en Touchpad Tic Tac Toe

Of een oefening in invoer- en uitvoermultiplexen en werken met bits. En een inzending voor de Arduino-wedstrijd.

Dit is een implementatie van een boter-kaas-en-eieren-spel met een 3x3 array van tweekleurige LED's voor een display, een eenvoudig resistief touchpad en een Arduino om alles samen te binden. Om te zien hoe het werkt, bekijk de video:Wat dit project vereist:Onderdelen en verbruiksartikelen Eén perf-bord (of stripbord) Negen tweekleurige LED's, gemeenschappelijke kathode Negen identieke weerstanden, in het bereik van 100-220 ohm Zes identieke weerstanden, in het 10kohm - 500kohm bereik Een enkelpolige schakelaar met dubbele worp Een bosje header-pinnen Een bosje elektriciteitsdraad Een klein vierkant vel transparant acryl, ~ 1 mm dik, 8 cm aan de zijkant Doorzichtige plakband Krimpkous (optioneel) Al het bovenstaande zijn vrij algemene items, de totale kosten mogen niet hoger zijn dan USD $ 20. Gereedschap Een Arduino-installatie (Arduino Duemilanove, Arduino IDE, computer, USB-kabel) Gebruikelijke elektrische gereedschappen (multimeter, soldeersoldeerpistool, draadknippers, draadknipper) Alles wat met Arduino te maken heeft te vinden op https://www.arduino.cc. Verder met de opbouw!

Stap 1: Bedrading van de LED-matrix

Bedrading van de LED-matrix
Bedrading van de LED-matrix
Bedrading van de LED-matrix
Bedrading van de LED-matrix

Om een LED te laten branden, moeten beide draden zijn aangesloten. Als we een paar pinnen zouden toewijzen aan elk van de 18 LED's (9 rood, 9 groen), zouden we snel geen pinnen meer hebben op de Arduino. Met multiplexen kunnen we echter alle LED's adresseren met slechts 9 pinnen! Om dit te doen, worden de LED's op een dwarsbalk aangesloten, zoals weergegeven in de eerste afbeelding. De LED's zijn gegroepeerd in kolommen van drieën en hun kathodes zijn gegroepeerd in rijen van zessen. Door een bepaalde anodelijn hoog en een bepaalde kathodelijn laag in te stellen en een hoge impedantie te hebben op alle andere anode- en kathodelijnen, kunnen we selecteer welke LED we willen laten branden, aangezien er maar één mogelijk pad is dat de stroom kan nemen. Bijvoorbeeld, in de tweede figuur, door de groene anode 1 lijn hoog in te stellen en de kathode 1 lijn laag, licht de groene LED linksonder op. Het huidige pad wordt in dit geval blauw weergegeven. Maar wat als u meer dan één LED op verschillende lijnen wilt laten branden? We zullen vasthoudendheid van visie gebruiken om dit te bereiken. Door heel snel paren LED-lijnen te selecteren, wordt de illusie gewekt dat alle geselecteerde LED's tegelijkertijd branden.

Stap 2: LED-matrixindeling

LED-matrixindeling
LED-matrixindeling
LED-matrixindeling
LED-matrixindeling

Het onderstaande schakelschema laat zien hoe de LED's fysiek zijn aangesloten (G1-G9: groene LED's, R1-R9: rode LED's). Dit diagram is voor enkele rode en groene LED's. Als u tweekleurige rode/groene LED's met gemeenschappelijke kathode gebruikt, hoeft u slechts één kathodepoot per rood/groen paar te bedraden. De rode en groene anodelijnen gaan naar de PWM-pinnen van de Arduino (pinnen 3, 5, 6, 9, 10, 11 op de Duemilanove), zodat we later effecten zoals fading kunnen hebben. De kathodelijnen gaan naar pinnen 4, 7 en 8. Elk van de kathode- en anodelijnen heeft 100 ohm weerstanden voor bescherming.

Stap 3: De LED-matrix aanpakken

Voor de boter-kaas-en-eieren-code moeten we de volgende informatie over de LED's kunnen opslaan: - of een LED brandt of niet - indien aan, of deze rood of groen is Een manier om dit te doen is door de status op te slaan in een 9-cels array, waarbij drie cijfers worden gebruikt om de status weer te geven (0 = uit, 1 = rood aan, 2 = groen aan). Elke keer dat we de status van de LED moeten controleren, bijvoorbeeld om te controleren of er een win-conditie is, moeten we door de array bladeren. Dit is een werkbare methode, maar nogal onhandig. Een meer gestroomlijnde methode zou zijn om twee groepen van negen bits te gebruiken. De eerste groep van negen bits slaat de aan-uit-status van de LED's op en de tweede groep van negen bits slaat de kleur op. Dan wordt het manipuleren van de LED-statussen gewoon een kwestie van beetje rekenen en verschuiven. Hier is een uitgewerkt voorbeeld. Laten we zeggen dat we ons boter-kaas-en-eieren-raster grafisch tekenen, en eerst 1s en 0s gebruiken om de aan-uit-status weer te geven (1 is aan, 0 is uit): 000 000 = matrix met led linksonder brandt 100 100 010 = matrix met diagonaal LED's branden 001 Als we de cellen van linksonder opsommen, kunnen we bovenstaande weergaven als een reeks bits schrijven. In het eerste geval zou dat 100000000 zijn, en in het tweede geval zou het 001010100 zijn. Als we deze als binaire representaties beschouwen, dan kan elke reeks bits worden gecondenseerd tot een enkel getal (256 in het eerste geval, 84 in het tweede geval). Dus in plaats van een array te gebruiken om de toestand van de matrix op te slaan, kunnen we gewoon een enkel getal gebruiken! Op dezelfde manier kunnen we de kleur van de LED op dezelfde manier weergeven (1 is rood, 0 is groen). Laten we eerst aannemen dat alle LED's branden (dus de aan-uit-status wordt weergegeven door 511). De onderstaande matrix geeft dan de kleurstatus van de LED's weer: 010 groen, rood, groen 101 rood, groen, rood 010 groen, rood, groen Nu, bij het weergeven van de LED-matrix, hoeven we alleen maar door elk van de bits te bladeren, eerst in de aan-uit-stand en vervolgens in de kleurstand. Laten we bijvoorbeeld zeggen dat onze aan-uit-status 100100100 is en de kleurstatus 010101010. Dit is ons algoritme voor het verlichten van de LED-matrix: Stap 1. Voeg een bitsgewijze toevoeging van de aan-uit-status toe met een binaire 1 (dwz bit maskeren). Stap 2. Als het waar is, brandt de LED. Doe nu een bitsgewijze toevoeging van de kleurstatus met een binaire 1. Stap 3. Als het waar is, laat de rode LED oplichten. Als het onwaar is, licht dan de groene LED op. Stap 4. Verschuif zowel de aan-uit-status als de kleurstatus, één bit naar rechts (dwz bitverschuiving). Stap 5. Herhaal stap 1 - 4 totdat alle negen bits zijn gelezen. Merk op dat we de matrix achterstevoren vullen - we beginnen met cel 9, ga dan terug naar cel 1. Ook worden de aan-uit- en kleurstatussen opgeslagen als een niet-ondertekend geheel getal (woord) in plaats van een ondertekend geheel getal. Dat komt omdat bij bitverschuiving, als we niet voorzichtig zijn, we onbedoeld het teken van de variabele kunnen veranderen. Bijgevoegd is de code voor het verlichten van de LED-matrix.

Stap 4: Het touchpad construeren

Het touchpad bouwen
Het touchpad bouwen
Het touchpad bouwen
Het touchpad bouwen
Het touchpad bouwen
Het touchpad bouwen
Het touchpad bouwen
Het touchpad bouwen

Het touchpad is gemaakt van een dunne laag acryl, groot genoeg om over de LED-matrix te liggen. Plak vervolgens de rij- en kolomdraden op de acrylplaat met doorzichtige tape. Doorzichtige tape wordt ook gebruikt als isolerende afstandhouder tussen de draden, op de kruispunten. Zorg ervoor dat u schoon gereedschap gebruikt om te voorkomen dat er vingervet op de plakkerige kant van de tape komt. Vingerafdrukvlekken zien er niet alleen lelijk uit, maar maken de tape ook minder plakkerig. Knip het ene uiteinde van elk van de lijnen af en soldeer het andere uiteinde aan een langere draad. Soldeer een weerstand in lijn met de draden, voordat u op connectoren soldeert. De weerstanden die hier worden gebruikt zijn 674k, maar elke waarde tussen 10k en 1M zou goed moeten zijn. De verbindingen met de Arduino worden gemaakt met behulp van de 6 analoge pinnen, met pinnen 14-16 verbonden met de draadrasterrijen en pinnen 17-19 verbonden met de kolommen.

Stap 5: Het touchpad - hoe het werkt

Het touchpad - hoe het werkt
Het touchpad - hoe het werkt
Het touchpad - hoe het werkt
Het touchpad - hoe het werkt

Net zoals we een crossbar-multiplexer gebruikten om een LED-matrix met minimale pinnen op te zetten, kunnen we een vergelijkbare crossbar-multiplexer gebruiken om een aanraaksensorarray op te zetten, die we vervolgens kunnen gebruiken om de LED's te activeren. Het concept voor dit touchpad is eenvoudig. Het is in wezen een draadraster, met drie blote draden die in rijen lopen en drie blote draden die in kolommen boven de rijen lopen. Op elk snijpunt bevindt zich een klein vierkantje isolatie dat voorkomt dat de twee draden elkaar raken. Een vinger die de kruising aanraakt, maakt contact met beide draden, wat resulteert in een enorme, maar eindige weerstand tussen de twee draden. Een kleine, maar detecteerbare stroom kan daarom via de vinger van de ene draad naar de andere vloeien. Om te bepalen op welke kruising werd gedrukt, werd de volgende methode gebruikt: Stap 1: Stel alle kolomlijnen in op OUTPUT LOW. Stap 2: Stel de rijlijnen in op INPUT, met de interne pullups geactiveerd. Stap 3: Voer een analoge uitlezing uit op elke rijlijn totdat de waarde onder een bepaalde drempel daalt. Dit vertelt u in welke rij het ingedrukte snijpunt is. Stap 4: Herhaal stap 1-3, maar nu met de kolommen als invoer en de rijen als uitvoer. Dit vertelt u in welke kolom het ingedrukte kruispunt is. Om de effecten van ruis te minimaliseren, worden een aantal metingen gedaan en vervolgens gemiddeld. Het gemiddelde resultaat wordt vervolgens vergeleken met een drempelwaarde. Aangezien deze methode alleen toetst aan een drempelwaarde, is deze niet geschikt voor het detecteren van gelijktijdig drukken. Omdat boter en kaas beurtelings verloopt, is het voldoende om één keer te drukken. Bijgevoegd is een schets die illustreert hoe het touchpad werkt. Net als bij de LED-matrix worden bits gebruikt om aan te geven op welke kruising werd gedrukt.

Stap 6: Alles samenbrengen

Alles bij elkaar zetten
Alles bij elkaar zetten

Nu alle afzonderlijke componenten klaar zijn, is het tijd om ze allemaal samen te voegen. Leg het draadraster op de LED-matrix. Mogelijk moet u de pinnummers in de LED-matrixcode opnieuw ordenen om deze te synchroniseren met de draadrastersensor. Zet het draadrooster vast met bevestigingen of lijmen naar keuze, en plak het op een mooi speelbord. Voeg een schakelaar toe tussen pin 12 en aarde van de Arduino. Deze schakelaar is om te schakelen tussen de modus voor 2 spelers en de modus voor 1 speler (vs de microcontroller).

Stap 7: Tic Tac Toe programmeren

Bijgevoegd is de code voor het spel. Laten we eerst het boter-kaas-en-eieren-spel opsplitsen in zijn verschillende stappen, in de modus voor twee spelers: Stap 1: Speler A kiest een ongevulde cel door een kruispunt aan te raken. Stap 2: De LED voor die cel licht op met de kleur A. Stap 3: Controleer of Speler A heeft gewonnen. Stap 4: Speler B kiest een ongevulde cel. Stap 5: De LED voor die cel licht op met kleur B. Stap 6: Controleer of speler B heeft gewonnen. Stap 7: Herhaal 1-6 totdat er een win-conditie is, of als alle cellen gevuld zijn. Lezen van de cellen: Het programma wisselt tussen het lezen van het raster en het weergeven van de LED-matrix. Zolang de netsensor geen niet-nulwaarde registreert, loopt deze lus door. Wanneer een kruising wordt ingedrukt, slaat de variabele Ingedrukt de positie van de ingedrukte cel op. Controleren of de cel niet gevuld is: Wanneer een positiemeting wordt verkregen (variabele Ingedrukt), wordt deze vergeleken met de huidige celstatus (opgeslagen in de variabele GridOnOff) met behulp van een bitsgewijze toevoeging. Als de ingedrukte cel niet gevuld is, gaat u verder met het oplichten van de LED, anders gaat u terug naar het lezen van de cellen. De kleuren wisselen: Een booleaanse variabele, Turn, wordt gebruikt om vast te leggen wiens beurt het is. De LED-kleur die wordt gekozen wanneer een cel wordt gekozen, wordt bepaald door deze variabele, die elke keer dat een cel wordt gekozen afwisselt. Controleren op een win-conditie: er zijn slechts 8 mogelijke win-condities en deze worden opgeslagen als woordvariabelen in een array (winArray). Twee bitsgewijze toevoegingen worden gebruikt om de gevulde celposities van een speler te vergelijken met de winvoorwaarden. Als er een wedstrijd is, dan toont het programma een winstroutine, waarna het een nieuw spel start. Controleren op een gelijkspelconditie: Als er negen beurten zijn geregistreerd en er is nog steeds geen winvoorwaarde, dan is het spel een gelijkspel. De LED's gaan dan uit en een nieuw spel wordt gestart. Overschakelen naar de modus voor één speler: Als de schakelaar in de aan-stand staat, gaat het programma naar de modus voor één speler, waarbij de menselijke speler als eerste begint. Aan het einde van de beurt van de menselijke speler kiest het programma gewoon een willekeurige cel. Dit is natuurlijk niet de slimste strategie!

Stap 8: Opmerkingen en verdere verbeteringen

Hier een video die de modus voor één speler laat zien, waarbij het programma totaal willekeurige zetten speelt: Het hier getoonde programma is slechts een minimale, kale versie. Hiermee kunnen veel andere dingen worden gedaan: 1) LED's met drie tegelijk laten branden De huidige code geeft slechts één LED tegelijk weer. Met de hier getoonde bedrading is het echter mogelijk om alle LED's die op één kathodelijn zijn aangesloten tegelijkertijd te laten branden. Dus in plaats van alle negen posities te doorlopen, hoeft u alleen maar door de drie kathodelijnen te bladeren.2) Gebruik interrupts om de LED's weer te geven Afhankelijk van de LED-weergaveroutine en de hoeveelheid verwerking, kunnen de LED's enige mate van flikkerend. Door gebruik te maken van interrupts kan de timing van de LED's nauwkeurig worden gecontroleerd en zou leiden tot een vloeiendere weergave.3) Een slimmere computerspeler teen speler. Ik hoop dat je deze instructable net zo leuk hebt gelezen als ik eraan heb gewerkt!

Aanbevolen: