Boter Kaas en Eieren Machine (wordt aan gewerkt)

Mijn eerste Arduino project was het bouwen van een Boter Kaas en Eieren Machine. Tijdens dit project heb ik leren etsen (mijn eigen printplaat leren maken), een bootloader leren bouwen en geleerd hoe ik zelf een Arduino kan maken om te voorkomen dat ik in ieder nieuw project een kant en klare Arduino moet stoppen (wat behoorlijk kostbaar wordt). Hoe je kunt etsen, je eigen bootloader of Arduino kunt bouwen en hoe je jouw project van stroom kunt voorzien vind je uitgelegd in de links hierboven. Hieronder vind je alles om jouw eigen Boter Kaas en Eieren Machine te bouwen.

BKEM BKEMB1 BKEMB2

Wat heb je nodig?

Elektronische componenten:

De kosten van bovenstaande componenten zijn ongeveer 40,- Euro (maar wellicht goedkoper te krijgen via een vereniging (inkoopsprijs) of via online webshops).

Overige zaken en onderdelen:

  • Fritzing PCB schema (downloaden)
  • Arduino sketch (downloaden) Note: de sketch werkt nog niet helemaal goed. Winnen bij zet 9 is nog niet goed ge├»mplementeerd, update volgt.
  • Breadboard (voor testopstelling, als je dat wilt)
  • Arduino UNO (voor testopstelling, als je dat wilt)
  • Bootloader (als je de ATMEGA328 chip gebruikt en hier eenvoudig sketches op wilt kunnen uploaden)
  • Montage snoer (bijvoorbeeld deze)
  • Soldeerstation (bijvoorbeeld deze)
  • Soldeer (bijvoorbeeld deze)
  • Loop (vergrootglas)
  • Diverse tangen om montage snoer te knippen, de isolatie te verwijderen en onderdelen vast te houden tijdens het solderen.
  • Voor het kastje:
    • Triplex
    • Plexiglas (wit, doorschijnend)
    • Verf
    • 2 Scharnieren
    • 2 Sluitingen

Hoe werkt de Boter Kaas en Eieren Machine?

Eigenlijk werkt de Boter Kaas en Eieren Machine heel erg simpel. Als je naar de eerste foto (links bovenaan) op deze pagina kijkt zie je een switch (on/off) en 9 vakjes van (wit doorzichtig) plexiglas in het kastje die je in kunt drukken. Met de switch zet je het spelletje aan en vervolgens druk je om de beurt met de andere speler een plexiglazen vlakje in. Met het indrukken van een vlakje wordt een ‘button’ of knopje ingedrukt dat zich onder het plexiglazen vlakje bevindt. Dit signaal wordt door de Arduino opgevangen en vervolgens wordt het bij het knopje horende RGB-ledje door de Arduino in de juiste kleur (rood of blauw) aangezet. De kleur waarmee het ledje gaat branden is gekoppeld aan de speler die aan de beurt is. Speler 1 is blauw, speler 2 is rood. Heb je eenmaal een vlakje ingedrukt dan kun je dit niet meer corrigeren, net zoals je in het echt een rondje of kruisje hebt geplaatst en dit niet meer ongedaan mag maken. De Arduino houdt bij welke zetten gedaan zijn door de beide spelers en laat een winnende rij van drie ledjes branden in de kleur van de speler die gewonnen heeft. Heeft er niemand gewonnen na 9 beurten dan knipperen alle ledjes om en om in blauw en rood. Na het laten knipperen van een rij, of het hele speelbord, doven alle ledjes en kan er opnieuw gespeeld worden. Ben je klaar met spelen, dan kun je het spelletje weer uitzetten door de on/off switch op off te zetten. De machine is dan uit.

Hoe weet de Arduino welke button indrukt is?

De Arduino heeft een beperkt aantal input en output pins. We zouden een Arduino Sketch (het programma op de Arduino) zo kunnen maken zodat alle negen buttons van stroom voorzien en uitgelezen worden door de Arduino, om te bepalen welke button indrukt wordt. We zouden daarvoor 9 output en 9 input pins nodig hebben, immers we hebben 9 buttons of knopjes. Gebruiken we deze oplossing, dan hebben we al 18 input en output pins nodig om te registeren welke button ingedrukt wordt. Nu heeft de Arduino maar 20 pins (de 5V meegerekend en de TX (1) en RX (0) buiten beschouwing gelaten) voor digitale en analoge in- en output. Als we daarnaast nog pins nodig hebben om de 9 ledjes te laten branden dan heb je snel uitgerekend dat dit onmogelijk is.

Een oplossing om het gebruik van het aantal pins op de Arduino te beperken tot slechts 3 in- en 3 output pins waarmee alle buttons uitgelezen kunnen worden is een matrix. Als je nogmaals naar de foto bovenaan de pagina kijkt dan zie je dat we 3 kolommen en 3 rijen van buttons hebben. Als we nu 3 output pins voor iedere kolom van buttons en 3 input pins voor iedere rij van buttons gebruiken dan kunnen we via een heel slim mechanisme toch achterhalen welke button ingedrukt wordt. We laten de Arduino dan heel kort en om en om stroom op de kolommen zetten (de output pins) en we laten de Arduino voor iedere kolom heel snel de 3 rijen (de input pins) uitlezen. We hebben daarnaast nog een extra Ground pin nodig om te zorgen dat de 9 buttons via een pull-down weerstandje naar 0 Volt worden getrokken zodat ze niet zomaar zwevende output geven (‘aan’ geven als ze eigenlijk uit of niet ingedrukt zijn). Pull-down weerstandjes worden hieronder verder uitgelegd.

Hoe werkt dit nu precies? Loop maar eens met mij mee door het onderstaande schema… In het schema zie je de 9 buttons. Deze heten ‘B1’ tot en met ‘B9’, zie je ze? Daarnaast zie je 3 kolommen van rode draadjes lopen, deze heten ‘Stroom K1’ tot en met ‘Stroom K3’ (K staat voor Kol0m). ‘Stroom K1’ tot en met ‘Stroom K3’ worden aangesloten op 3 pinnen van jouw Arduino die in de sketch als output pinnen worden gedefinieerd (je gaat er stroom op zetten). Dan zie je nog 3 rijen van groene draadjes, deze heten ‘Uitlezen R1’ tot en met ‘Uitlezen R3’. Deze worden aangesloten op 3 andere pinnen van jouw Arduino en gedefinieerd in de sketch als input pinnen (je gaat ze uitlezen om te kijken of er een button ingedrukt wordt). De zwarte draadjes en de rest van het schema laten we nu nog even buiten beschouwing. Het idee is nu dat je jouw Arduino in de sketch stroom laat zetten op ‘Stroom K1’ en dan de rijen ‘Uitlezen R1’ tot en met ‘Uitlezen R3’ langs gaat om te kijken of er stroom binnen komt of niet (er komt stroom binnen zodra er een button ingedrukt wordt). Daarna haal de je stroom van ‘Stroom K1’ en zet je vervolgens stroom op ‘Stroom K2’ en herhaal je het uitlezen van de rijen ‘Uitlezen R1’ tot en met ‘Uitlezen R3’. Je haalt de stroom weer van ‘Stroom K2’ en zet vervolgens stroom op ‘Stroom K3’, etc. Dit uitlezen laat je continu doorlopen in jouw sketch.

Button matrixStel nu dat je button B5 indrukt (in het midden van het ‘speelbord’). Jouw Arduino zet stroom op ‘Stroom K1’ en gaat de rijen ‘Uitlezen R1’ tot en met ‘Uitlezen R3’ uitlezen om te kijken of er stroom binnen komt. Komt er op 1 van deze rijen stroom binnen? Precies… Nee! De stroom gaat naar B7 maar omdat B7 niet ingedrukt is loopt er geen stroom naar ‘Uitlezen R3’. Via B7 krijgen ook B4 en B1 stroom (volg het rode draadje maar). Maar omdat B4 niet ingedrukt is loopt er geen stroom door naar ‘Uitlezen R2’ of ‘Uitlezen R1’. Geen enkele rij waarop we uitlezen krijgt dus stroom. De conclusie,… er wordt geen button op de kolom ‘Stroom K1’ ingedrukt. De stroom wordt van ‘Stroom K1’ afgehaald en op ‘Stroom K2’ gezet. B8 is niet ingedrukt dus we lezen weer dat er geen stroom binnen komt op ‘Uitlezen R3’. B8 is via het rode draadje verbonden met B5 en B2 (volg het rode draadje) die hierdoor stroom krijgen. B5 is ingedrukt! Door het indrukken van B5 wordt het circuit gesloten en loopt er ineens wel stroom naar de rij ‘Uitlezen R2’. We hebben stroom op ‘Stroom K2’ gezet en ontvangen stroom op ‘Uitlezen R2’ en niet op ‘Uitlezen R1’ of ‘Uitlezen R3’. De enige button die dus ingedrukt kan zijn is B5. Zo werkt een button matrix en kunnen we met heel weinig pinnen achterhalen welke button ingedrukt wordt. Probeer na de rest van de uitleg van dit schema het maar eens na te bouwen. De sketch om jouw eigen button matrix te testen wordt verderop gegeven.

Wat betekent de rest van het schema hierboven?

In de rest van het schema zie je nog figuurtjes (elektrische componenten) die absoluut nodig zijn om de button matrix goed en stabiel te laten werken. De componenten met de namen ‘W1’ tot en met ‘W3’ zijn 220╬ę weerstandjes. ‘D1’ en ‘D2’ zijn diodes. De weerstandjes worden gebruikt als pull-down resistors of weerstandjes (zie uitleg hieronder). Diodes zorgen ervoor dat de stroom maar 1 kant uit kan lopen (in de richting van de punt van het driehoekje). Deze componenten zijn verbonden met de ground pin op jouw Arduino.

Pull-down resistors

Een pull-down resistor of weerstandje wordt geplaatst tussen ground (GND) en een rij waarop buttons uitgelezen worden (‘Uitlezen R1’ tot en met ‘Uitlezen R3’). Als zo’n pull-down weerstandje niet wordt gebruikt dan geeft een button zelfs als hij niet ingedrukt wordt waarden tussen 0 en 5 Volt op de rij waarop de button is aangesloten (en die uitgelezen wordt). We noemen deze veranderingen in stroom zwevende waarden. Zwevende waarden ontstaan omdat dat button heel gevoelig is voor omgevingsfactoren zoals ook elektrische lading in de lucht. Zonder pull-down weerstandje zal de rij waarop de button wordt uitgelezen dus stroom ontvangen tussen 0 en 5 Volt. Soms is de waarde zo hoog (richting 5 Volt) dat de button ingedrukt lijkt te worden terwijl dit in werkelijkheid niet zo is.

Hoe werkt zo’n pull-down weerstandje precies? Stroom kiest altijd de weg van de minste weerstand. Als de button wordt ingedrukt dan loopt de weg van de minste weerstand naar de uit te lezen rij (bijvoorbeeld ‘Uitlezen R1’ als ‘B1’ wordt ingedrukt), richting ground hebben we immers een weerstandje geplaatst waardoor deze weg meer weerstand levert. Als en button niet ingedrukt is is de uit te lezen rij verbonden met ground via het pull-down weerstandje, het signaal wordt hierdoor naar 0 Volt getrokken en de uit te lezen rij zal in dit geval altijd lezen dat de button niet ingedrukt wordt.

Een heel helder fimpje hierover van Jeremy Blum kun je hier vinden (in het Engels).

Diodes

De 2 diodes (‘D1’ en ‘D2’) die tussen de weerstandjes geplaatst zijn in het schema voorkomen dat de zwevende waarden van de ene rij naar andere rijen zou kunnen lopen waardoor deze ‘aan’ zouden meten terwijl er helemaal geen button op die rij ingedrukt is. Zwevende waarden van ‘Uitlezen R1’ kunnen alleen maar richting ground. Zwevende waarden van ‘Uitlezen R2’ kunnen ook alleen maar richting ground omdat de diode tussen ‘Uitlezen R1’ en ‘Uitlezen R2’ voorkomt dat stroom van ‘Uitlezen R2’ naar ‘Uitlezen R1’ kan lopen. Hetzelfde geldt voor de rijen ‘Uitlezen R2’ en ‘Uitlezen R3’.