Arduino project met geheugenspel: zelfbouw-Simon

Marco den Teuling
0

Inhoudsopgave

Experimenteerboards zijn zeker niet alleen leuk om mee te knutselen en te leren programmeren, maar ook met het eindresultaat kun je veel plezier hebben, zoals dit Arduino project laat zien. We maken een spel om je kortetermijngeheugen te trainen.

Nee, als je de instructies in dit artikel opvolgt krijg je als eindresultaat niet de beschikking over een nieuwe 3D-gameklassieker. Maar leuk is dit Arduino project wel. Sommigen zal het zelfs herinneren aan de jaren 70 klassieker Simon (in een nieuw jasje uitgebracht als ‘Simon Swipe’). De computer speelt daarbij een reeks tonen af die elke ronde langer wordt. Bij elke toon gaat een van vier gekleurde lampjes branden. De speler moet via vier drukknoppen telkens proberen de steeds langer wordende reeks na te spelen. Bij een fout eindigt het spel en begin je opnieuw.

Arduino project spel zelfbouw Simon

Project overzicht

Dit Arduino project is volgens ons minder geschikt als een kennismaking met programmeren, dat kun je beter al wat gedaan hebben. De schakeling (al ziet die er op de foto ingewikkeld uit) is echter wel goed te doen als je verder nog niet veel met digitale elektronica geëxperimenteerd hebt.

Het project is voor het gemak bovendien prima onder te verdelen in drie opeenvolgende stappen. Om te beginnen moet je eerst een led, knop en luid­spreker aansluiten en de code schrijven die nodig is om bij een knopdruk een toon en led te activeren. Als volgende stap kun je de schakeling en de code daarna uitbreiden naar vier leds en vier knoppen. De logica van de game komt daarna in stap drie, waar dan verder geen draden meer aan te pas komen. Als uitbreiding zou je kunnen overwegen om nog seriële communicatie met een via usb aangesloten pc te programmeren om bijvoorbeeld de resultaten of hoogste scores bij te houden.

Schakeling

Afgezien van wat draadverbindingen en weerstanden gebruikt het Arduino project maar drie soorten componenten. Daarvan is de piëzo-luidspreker het eenvoudigst aan te sluiten: de minpool wordt verbonden met de massa, de pluspool met een digitale pin van de Arduino. Als de polen op het speakertje niet gelabeld zijn, is de rode aansluiting op de luidspreker de pluspool en de zwarte dienovereenkomstig de minpool.

Ook bij de leds is het belangrijk de polen goed aan te sluiten. De minpool herken je doordat die een korter pootje heeft dan de pluspool of doordat de behuizing aan die kant aan de onderzijde (voelbaar) afgevlakt is. Je mag een led echter niet rechtstreeks met de plus en massa verbinden, want dan brandt hij door. In de schakeling moet er daarom altijd een voorschakelweerstand bij worden geplaatst om de stroomtoevoer te beperken. De Arduino levert +5 volt aan zijn digitale uitgangen, waardoor een weerstand van 220 ohm nodig is om de led voldoende te laten branden. Of je de weerstand tussen de uitgang en de led zet of tussen de led en massa maakt daarbij verder niet uit. Ook de richting waarin de stroom door de weerstand gaat is niet belangrijk.

Arduino project spel zelfbouw Simon schakeling component

De schakeling ziet er ingewikkeld uit, maar gebruikt eigenlijk maar drie soorten componenten.

Knoppen aansluiten

De knoppen moeten aan de ene kant worden verbonden met de stroomtoevoer, oftewel de 5V-output van de Arduino. Het andere uiteinde van elke knop wordt verbonden met een van de digitale pinnen, die in de software vervolgens als input wordt gedefinieerd. Als de knop ingedrukt wordt, krijgt de Arduino dan 5V op de input en wordt die als ‘high’ gelezen. Als de knop niet wordt ingedrukt, is er geen contact en is de toestand ongedefinieerd.

Om dan toch een ‘low’ te herkennen, verbind je hem via een flink grote weerstand met de massa. Een weerstand van 10 kilo-ohm is in de praktijk genoeg. De aansluiting via deze zogeheten pull-downweerstand zorgt er vervolgens voor dat de ingang als het contact niet gesloten is dan toch verbonden is met de massa. Als het contact gesloten is, staat er dan 5 volt op de input omdat er door de grote weerstand dan namelijk (bijna) geen stroom loopt.

Software

Om het voorbeeld Arduino project te maken, hebben we de Arduino-IDE gebruikt. Arduino-programma’s, ook wel ‘sketches’ genoemd, hebben in principe altijd eenzelfde opbouw. Ze bestaan uit minimaal twee functies, die respectievelijk setup() en loop() moeten heten. Als je de Arduino aanzet, roept hij na het initialiseren eenmaal de functie setup() aan en daarna herhaalt hij de functie loop() in een eindeloze lus.

In de eerste functie zet je dus de code die het programma eenmalig moet uitvoeren bij het starten van het programma. Dat is bijvoorbeeld de aanroep pinMode(), waarmee je bepaalt welke pinnen het project als input en output moet gebruiken. Heb je bijvoorbeeld een led aangesloten op pin 5, dan zou de instructie

pinMode(5, OUTPUT);

kunnen zijn. Maar het is niet zo fraai om daar direct een bepaald pinnummer voor te gebruiken. Als de toepassing achteraf om welke reden dan ook moet worden aangepast, moet je overal in de code het getal 5 vervangen door het nieuwe nummer. Bij uitgebreidere programma’s verlies je bovendien al snel uit het oog wat er achter pin 5 schuilgaat. Daarom kun je in de functie setup() beter code gebruiken in de trant van:

const int button = 1;
const int led = 5;
const int speaker = 9;

Daarmee wijs je eenmalig namen toe aan de gebruikte pinnen, waardoor je de code later slechts op één plek hoeft aan te passen als je de pintoewijzing aanpast. De bijbehorende setup-functie ziet er dan als volgt uit:

cc
void setup() {
pinMode(button, INPUT);
pinMode(led, OUTPUT);
pinMode(speaker, OUTPUT);
}

De code die de led bij het indrukken van een knop laat branden moet natuurlijk ook een toon afspelen. Dat ziet er dan als volgt uit:

cc
int buttonState = LOW;
void loop() {
if(digitalRead(button) !=
buttonState) {
if(buttonState == LOW) {
digitalWrite(led, HIGH);
tone(speaker, 440);
buttonState = HIGH;
}
else {
digitalWrite(led, LOW);
noTone(speaker);
buttonState = LOW;
}
}
}

Daarbij leest de functie digitalRead() de status van een als ingang geschakelde pin uit. Het resultaat daarvan is LOW of HIGH. Het programma slaat de laatst gelezen waarde dan op in de variabele buttonState. Gaat die van LOW naar HIGH, dan schakelt digitalWrite(led, HIGH) de aan led toegewezen pin naar +5 volt. Met tone(speaker, 440) speel je via de pin speaker een toon af met een frequentie van 440 Hz. Met de opdracht no­Tone() kun je het geluid weer stoppen. Je kunt bij de aanroep van de functie tone() eventueel een derde parameter opgeven waarmee je kunt bepalen na hoeveel milliseconden het geluid automatisch moet stoppen.

Kinderspel

Wil je meerdere knoppen en leds bedienen, dan is het praktisch om die in arrays te bewaren en het uitlezen van de knoppen in een lus te laten plaatsvinden. Hoe dat gaat, kun je in de voorbeeld­toepassing bekijken. Het gaat daarbij om gangbare C++-code zonder Arduino-specifieke functies.

Ook het implementeren van de spel­logica is grotendeels standaard programmeerwerk. Als enige systeemfunctie komt daar nog de functie delay() aan te pas. Daarmee wordt het programma dan het opgegeven aantal milliseconden gepauzeerd. Dat wordt niet alleen gebruikt om de toevallig gegenereerde melodie af te spelen, maar ook om een korte pauze in te lassen als het indrukken of loslaten van een toets gedetecteerd wordt.

Goedkope drukknoppen hebben namelijk de neiging te ‘stuiteren’. Als je ze indrukt of loslaat, veren de contacten na en schakelen ze in korte tijd meerdere malen tussen ‘aan’ en ‘uit’. Om te voorkomen dat het programma dat als meerdere acties interpreteert, wacht het gewoon 10 milliseconden voordat de lus verder herhaald wordt.

Veel plezier met dit en andere projecten met je Arduino!

(Hajo Schulz, c’t magazine)

Arduino project: melodietrainer
Arduino project benodigdhedenPc, Arduino-board, bread­board, 4 leds, 4 knoppen, weerstanden en schakeldraad
Arduino project doelgroepSchakeling: beginners,
programmeren: gevorderden
Arduino project softwareArduino-IDE (C++)
Arduino project niveau

makkelijk              < — >                moeilijk

Meer over Arduino en andere experimenteerboards in c't sep/2018

Deel dit artikel

Marco den Teuling
Marco den TeulingHad als eerste eigen computer ooit een 16-bit systeem, waar van de 48 kilobyte toch echt niet ‘genoeg voor iedereen’ was. Sleutelt graag aan pc’s, van de hardware tot het uitpluizen van de BIOS-instellingen. Vindt ‘Software as a Service’ een onbedoeld ironische naamgeving.

Lees ook

Met Raspberry Pi port knocking de computers in je netwerk beveiligen

Iedereen die een computer of server met het openbare internet verbindt, wordt al snel het doelwit van hackers. Sommige wetenschappers gaan ervan uit d...

Je Raspberry Pi op afstand bedienen? Zo krijg je het voor elkaar met SSH!

De Raspberry Pi op afstand bedienen is handig en kan op verschillende manieren. Via SSH is het makkelijkste op te zetten, we laten zien hoe.

0 Praat mee
avatar
  Abonneer  
Laat het mij weten wanneer er