Dobbelsteen met Arduino Nano. De hardware. - De drukknop. Een drukknop met maakcontact zet je tussen een input pin en GND. Op de knop drukken maakt dan die input pin laag maar bij loslaten “zweeft” hij. Nu zijn zwevende inputs nogal instabiel en daarom wordt er een trekweerstand van pakweg 10k naar de plus gelegd zodat de ingangsspanning altijd gedefinieerd is. Zo’n trekweerstand is zo vaak gewenst dat veel microcontrollers ingebouwde trekweerstanden hebben die naar believen in- of uitgeschakeld kunnen worden. Ze worden wel weak-pullups genoemd en zijn voor een aantal pennen van de Nano beschikbaar. Zie het naslagwerk bij “pinMode”. (Bij de voorbeelden zit de schakelaar aan de +5V de de trekweerstand – pull down in dit geval - aan GND. Waarschijnlijk is hierbij gedacht dat het begrijpelijker is als indrukken van de knop de input pin hoog maakt. In de praktijk ben ik dit nog nooit tegengekomen en uiteraard kun je hier de weak-pullups niet gebruiken.) ---------------------+---------------+--- +5V | | | | .-. \ o weak pullup | |10k \ | | \. '-' o | | naar Nano naar Nano | naar Nano | -----+ -------+ -------+ | | | | | | \ o \ o .-. \ \ | |10k \. \. | | o o '-' | | | | | | ----+----------------+---------------+---- GND created by Andy´s ASCII-Circuit v1.24.140803 Beta www.tech-chat.de Drie manieren om een drukknop op een Nano aan te sluiten. - De LEDs. Voor de dobbelsteen heb je zeven LEDs nodig in een voor de hand liggend patroon. Rechttoe rechtaan zou je zeven outputs met elk een weerstand en een LED toe kunnen passen. Maar er is op output pennen en weerstanden te besparen. D A E G B F C Opstelling LEDs voor dobbelsteen. aantal ogen LEDs ------------ ---------------- 1 G 2 AF (of DC) 3 G en AF 4 AF en DC 5 G en AF en DC 6 AF en DC en EB LEDs voor de ogen van de dobbelsteen De LEDs A en F staan in serie evenals D en C en ook E en B. De waarde van de weerstanden hangt af van de gewenste helderheid, de kleur en de maximale stroom die de LED verdraagt. Een veelgebruikte waarde voor één (rode) LED is 330 Ohm. Voor twee LEDs in serie is dan 150 Ohm aan te raden. In principe is elke digitale output pin te gebruiken maar het is voor de software handiger vier opeenvolgende pennen van één poort te gebruiken, bijvoorbeeld de pennen 8-11 overeenkomend met de pennen 0-3 van poort B. (Ter verduidelijking: De Nano nummert D0 tot en met D13, de processor, de chip dus, heeft daarvoor twee acht bits poorten namelijk D en B.) .-----------. | |8 | B0|----------------------------+ | |9 | | B1|----------------------+ | | |10 | | | B2|---------------+ | | | |11 | | | | B3|--------+ | | | | | | | | | | | | | | | | | .-. .-. .-. .-. | Nano | 330| | | | | | | |3x150 | | | | | | | | | | | | '-' '-' '-' '-' | | | | | | | | | | | | | | | V V V | | | - A - C - B | | | | | | | | | | | | | | V G V V V | | - - F - D - E | | | | | | | | | | | | GND | |--------+------+------+-----+---- '-----------' created by Andy´s ASCII-Circuit v1.24.140803 Beta www.tech-chat.de Aansluiting LEDs dobbelsteen. Software. De software voor een Arduino – sketch genoemd – is in drie stukken onder te verdelen. Eerst een hoop(je) declaraties. Daarin wordt van alles benoemd en ingesteld. Waaronder aanwijzingen voor de compiler, te gebruiken bibliotheken, globale variabelen enzovoorts. Het eigenlijke programma bestaat uit twee functies te weten setup() en loop() die elk weer uit nul of (veel) meer andere functies kunnen bestaan. Setup() wordt één keer uitgevoerd, loop() blijft zich eindeloos herhalen. Eén van de eerste dingen waar je mee te maken krijgt is contactdender. Bounce in het juiste jargon. Alle mechanische schakelaars vertonen bounce en de software moet daarmee afrekenen. De eenvoudigste manier is, kijken of de stand van de schakelaar verandert. Zo niet, gewoon doorgaan, zo wel een poosje wachten tot de dender over is (of zou moeten zijn) en dan reageren. Die wachttijd kan makkelijk tot enige tientallen tot zelfs honderden milliseconden oplopen en al die tijd doet de micro niets anders dan wachten. Voor de dobbelsteen is dat geen probleem omdat de micro toch niets anders te doen heeft. In één van de voorbeelden is te zien hoe je met de functie millis() een betere oplossing kunt maken. Voor de dobbelsteen is het genoeg twee variabelen ter declareren: “huidigeStand” en “vorigeStand”. In loop() lees je de stand van de schakelaar uit in “huidigeStand”. Is die gelijk aan “vorigeStand” dan doe je niets. In het andere geval neem je actie, in dit geval de dobbelsteen gooien. Niet vergeten de waarde van vorigeStand in die van huidigeStand te veranderen. Houdt er ook rekening mee dat een drukknop eerst “aan” en dan weer “uit” gaat. Het gooien van de dobbelsteen moet één uit zes waarden opleveren. Daarvoor declareren we een variabele “aantalOgen” die we beginwaarde 1 geven. Ergens in loop() passen we die waarde aan. Telkens wanneer we er langs komen verhogen we aantalOgen met 1. Als aantalOgen 7 is geworden zetten we hem terug op 1. Als er nu op de knop gedrukt wordt hebben we een waarde voor ogen die we uitvoeren naar de LEDs. Daar zijn verscheiden manieren voor. Hier ga ik daar nu niet verder op in. Eén van de statements die je goed moet bekijken is het “if” statement in het Naslagwerk. Piet PA1PKR