Arduino-opdrachten/Button-3: verschil tussen versies

Uit basis
Naar navigatie springen Naar zoeken springen
 
(11 tussenliggende versies door dezelfde gebruiker niet weergegeven)
Regel 2: Regel 2:


== Button-3 ==
== Button-3 ==


{{Leerdoelen|schakelaar met pulldown-weerstand; IF; toestand}}
{{Leerdoelen|schakelaar met pulldown-weerstand; IF; toestand}}
Regel 27: Regel 25:
[[Bestand:Button1_bb.png|thumb|right|250px|Button met interne pullup weerstand]]
[[Bestand:Button1_bb.png|thumb|right|250px|Button met interne pullup weerstand]]


Deze schakeling is gelijk aan de schakeling van Button-0.
Deze schakeling is gelijk aan de schakeling van Button-0: een LED met serieweerstand aan pin D13, en een button met pull-down weerstand aan pin D2.
# Plaats een LED met serieweerstand op het breadboard;
# Verbind de LED met pin 13 van de Arduino;
# Plaats een schakelaar (4 pootjes) over de lege middenrij;
# Verbind de linkerkolom van de schakelaar met pin 2 van de Arduino.
# Plaats een weerstand van 10k Ohm tussen deze linkerkolom en de 0V rij (pulldown-weerstand).
# Verbind de rechterkolom van de schakelaar met de 5V-rij.
# Verbind de voedingsrijen (0V, 5V) van het breadboard met de bijbehorende pinnen van de Arduino.


== Schema ==
== Schema ==
Regel 60: Regel 51:
     ledState = 1 - ledState;
     ledState = 1 - ledState;
     digitalWrite(led, ledState);
     digitalWrite(led, ledState);
     delay(10);     // debounce button
     delay(5);                   // debounce button
   }
   }
  // digitalWrite(led, ledState);
}
}


Regel 68: Regel 60:
== Uitleg van het programma ==
== Uitleg van het programma ==


We gebruiken hier een schakelaar met een externe pulldown-weerstand.
We houden in dit programma de toestand van de led bij (aan of uit), en de vorige toestand van de button. Alleen bij een overgang van LOW naar HIGH (het indrukken van de button) reageren we door de toestand van de led om te draaien.
* in <code>setup</code> initialiseren we de button-pin met <code>pinMode(button, INPUT);</code>
* het lezen van deze pin via <code>digitalRead(button)</code> geeft de waarde <code>HIGH</code> als de knop ingedrukt is.
** "active HIGH"


Met dit programma kun je de LED met één knop aan- en uitzetten.
=== Toestand van de button ===


We houden de toestand van de LED (aan: HIGH of uit: LOW) bij in de variabele <code>ledState</code>, met als waarden <code>LOW</code> en <code>HIGH</code>. Als de knop ingedrukt is, keren we de waarde van deze variabele om.
In de variabele <code>prevButtonState</code> houden we de vorige toestand van de button bij. We detecteren het indrukken van de button doordat dan de vorige toestand LOW is en de huidige toestand HIGH. In dat geval veranderen we de toestand van de LED, van "aan" naar "uit" of omgekeerd.


We schrijven de waarde van deze variabele naar de output (LED).
=== Toestand van de uitvoer ===


=== IF-statement ===
We houden de toestand van de uitvoer (LED) bij in de variabele <code>ledState</code>. We veranderen de toestand van de uitvoer als we een bepaalde gebeurtenis in de invoer detecteren. Merk op dat
 
We gebruiken hier twee voorbeelden van het if-statement. Dit heeft de vorm:
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
if (conditie) {
ledState = 1 - ledState;
  opdracht1;
} else {
  opdracht2;
}
</syntaxhighlight>
</syntaxhighlight>
De betekenis hiervan is:
de waarde van <code>ledState</code> verandert van 0 naar 1, of omgekeerd.
# reken de waarde van de conditie uit
# als deze waarde <code>true</code> is, voer dan <code> opdracht1</code> uit;
# als deze waarde <code>false</code> is, voer dan <code>opdracht2</code> uit.
 
Met andere woorden: slechts één van deze twee opdrachten wordt uitgevoerd.


Een voorbeeld van een conditie is: <code>ledState == HIGH</code>. Het teken <code>==</code> staat voor "is gelijk aan". Deze vergelijking heeft <code>true</code> als resultaat wanneer <code>ledState</code> gelijk is aan <code>HIGH</code>; in alle andere gevallen is het resultaat <code>false</code>.


=== Toestand van de uitvoer ===
Deze vorm komen we vaker tegen:
 
We houden de toestand van de uitvoer (LED) bij in de variabele <code>ledState</code>. Aan de hand van de invoer en aan de hand van de vorige toestand berekenen we dan de nieuwe toestand. Deze kopiëren we naar de uitvoer (LED).
 
Deze vorm zullen we vaker tegenkomen:
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
if (input == X) {
if (input == X) {
Regel 111: Regel 84:
</syntaxhighlight>
</syntaxhighlight>


=== Complement ===
=== Debounce ===
 
Een mechanische schakelaar vertoont vaak contactdender: je hebt dan een aantal snelle overgangen gesloten-open-gesloten, totdat de toestand stabiel gesloten wordt. Zie bijvoorbeeld: https://nl.wikipedia.org/wiki/Denderen. Een microcontroller als de Arduino is snel genoeg om deze overgangen te detecteren. Dit is een probleem voor ons programma, omdat dat bij elke open-gesloten overgang de LED van toestand laat veranderen.


Merk op dat je het if-statement voor het omdraaien van <code>ledState</code> ook kunt schrijven als: <br>
We kunnen dit probleem oplossen door na een overgang niet te snel naar een volgende overgang te kijken. Hiervoor zorgt de "<code>delay(5);</code>".
<code>ledState = 1 - ledState;</code> <br>
(zie de opdrachten).


== Vragen en opdrachten ==
== Vragen en opdrachten ==
Regel 121: Regel 94:
=== Eerste experimenten ===
=== Eerste experimenten ===


* kun je de opdracht <code>digitalWrite(led, ledState);</code> ook binnen het (buitenste) IF-statement plaatsen? Maakt dit verschil in het gedrag van het programma?
* Om het probleem van de contactdender van een schakelaar te onderzoeken maken we een "slechte" schakelaar van  twee breadboard-draden. Deze verbinden we aan de linker en de rechter kolom van de pushbutton schakelaar. We maken contact door de twee andere uiteinden tegen elkaar te houden.
** hoe kun je het effect van contactdender merken? Merk je dit altijd, of gaat het ook soms per ongeluk goed?
** merk je dit effect bij het bovenstaande programma?
** verwijder de regel met de <code>delay</code>, of gebruik <code>delay(0);</code>. Merk je nu het effect van contactdender?


=== Verdiepingsvragen ===
=== Verdiepingsvragen ===

Huidige versie van 10 apr 2017 om 16:14

Arduino opdrachten

Zie ook Regels en richtlijnen
Zie ook Artikelen bewerken

Button-3

Leerdoelen schakelaar met pulldown-weerstand; IF; toestand
Voorkennis Arduino-opdrachten/Button-0
Onderdelen

LED, weerstand 220 ohm (rood-rood-bruin-goud), weerstand 10k ohm (bruin-zwart-oranje-goud), drukknopschakelaar

Libraries en functies

Inleiding

Schakel LED aan en uit

In de vorige sketch hebben we een drukknopschakelaar (button) op een erg eenvoudige manier gebruikt: de LED brandt alleen als je de schakelaar ingedrukt houdt.

In deze sketch leer je hoe je met een enkele schakelaar de LED aan- en uit kunt schakelen.

Hiervoor moet je de toestand van de LED bijhouden: als deze uit was, moet je die aanzetten; als deze aan was, moet je die uitzetten. Voor het bijhouden van de toestand van de LED gebruik je een variabele (ledState). Door middel van een toekenning (in de blokjestaal: "Set", in de Arduino-taal =) kun je de waarde van die variabele veranderen.

Opbouwen van de schakeling

Button met interne pullup weerstand

Deze schakeling is gelijk aan de schakeling van Button-0: een LED met serieweerstand aan pin D13, en een button met pull-down weerstand aan pin D2.

Schema

Button met pulldown-weerstand

Programma

int led = 13;
int button = 2;

int ledState = LOW;
int buttonState = LOW;
int prevButtonState = LOW;

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

void loop() {
  prevButtonState = buttonState;
  buttonState = digitalRead(button);
  if (prevButtonState == LOW && buttonState == HIGH) {
    ledState = 1 - ledState;
    digitalWrite(led, ledState);
    delay(5);                    // debounce button
  }
  // digitalWrite(led, ledState);
}

Uitleg van het programma

We houden in dit programma de toestand van de led bij (aan of uit), en de vorige toestand van de button. Alleen bij een overgang van LOW naar HIGH (het indrukken van de button) reageren we door de toestand van de led om te draaien.

Toestand van de button

In de variabele prevButtonState houden we de vorige toestand van de button bij. We detecteren het indrukken van de button doordat dan de vorige toestand LOW is en de huidige toestand HIGH. In dat geval veranderen we de toestand van de LED, van "aan" naar "uit" of omgekeerd.

Toestand van de uitvoer

We houden de toestand van de uitvoer (LED) bij in de variabele ledState. We veranderen de toestand van de uitvoer als we een bepaalde gebeurtenis in de invoer detecteren. Merk op dat

ledState = 1 - ledState;

de waarde van ledState verandert van 0 naar 1, of omgekeerd.


Deze vorm komen we vaker tegen:

if (input == X) {
  state = newState(state, X);
  setOutput(state);
}

Debounce

Een mechanische schakelaar vertoont vaak contactdender: je hebt dan een aantal snelle overgangen gesloten-open-gesloten, totdat de toestand stabiel gesloten wordt. Zie bijvoorbeeld: https://nl.wikipedia.org/wiki/Denderen. Een microcontroller als de Arduino is snel genoeg om deze overgangen te detecteren. Dit is een probleem voor ons programma, omdat dat bij elke open-gesloten overgang de LED van toestand laat veranderen.

We kunnen dit probleem oplossen door na een overgang niet te snel naar een volgende overgang te kijken. Hiervoor zorgt de "delay(5);".

Vragen en opdrachten

Eerste experimenten

  • Om het probleem van de contactdender van een schakelaar te onderzoeken maken we een "slechte" schakelaar van twee breadboard-draden. Deze verbinden we aan de linker en de rechter kolom van de pushbutton schakelaar. We maken contact door de twee andere uiteinden tegen elkaar te houden.
    • hoe kun je het effect van contactdender merken? Merk je dit altijd, of gaat het ook soms per ongeluk goed?
    • merk je dit effect bij het bovenstaande programma?
    • verwijder de regel met de delay, of gebruik delay(0);. Merk je nu het effect van contactdender?

Verdiepingsvragen