Arduino/Schakelaar
Schakelaar
Een schakelaar gebruik je voor een tijdelijke verbinding. Je hebt verschillende soorten, bijvoorbeeld schakelaars waarbij de verbinding gewoonlijk "uit" is, waarbij de verbinding gewoonlijk "aan" is, waarbij je omschakelt tussen twee toestanden, enzovoorts.
Arduino-projecten gebruiken meestal drukschakelaars ("buttons") die voor een tijdelijke verbinding zorgen, zolang de knop ingedrukt is ("push-to-make").
- De meest gebruikte drukschakelaars hebben 4 aansluitingen. Deze aansluitingen zijn paarsgewijs verbonden: de pootjes die naar elkaar wijzen zijn verbonden. Als je de knop indrukt, zijn alle pootjes verbonden.
Schakelingen
Een logische schakeling als een Arduino heeft een spanning nodig als input. Je moet de stand van een schakelaar omzetten in een spanningsniveau. Hiervoor gebruik je een pull-up of een pull-down weerstand.
Pulldown-weerstand
Een pulldown-weerstand plaats je tussen de "output" zijde van de schakelaar en 0V (aarde). De andere kant van de schakelaar verbind je met 5V.
- schakelaar open: output is 0V (LOW);
- de pulldown-weerstand "trekt" de output in dit geval naar 0V;
- er loopt geen stroom door de weerstand, er staat dus geen spanning over de weerstand;
- schakelaar gesloten: output is 5V (HIGH)
- de output is via de schakelaar direct verbonden met 5V;
- er staat een spanning van 5V over de weerstand; de stroom is 5/10.000 (V/Ohm) = 0.5 mA.
Een voorbeeld van een Arduino-programma dat een schakelaar als input direct verbindt met een LED als output:
void setup() {
setMode(13, OUTPUT); // LED on pin 13
setMode(2, INPUT); // button on pin 2
}
void loop() {
if (digitalRead(2) == HIGH) {
digitalWrite(13, HIGH);
} else {
digitalWrite(13, LOW);
}
}
Merk op dat je in plaats van het if-statement ook kunt schrijven: digitalWrite(13, digitalRead(2));
.
Pullup-weerstand
Een pullup-weerstand plaats je tussen de "output" zijde van de schakelaar en 5V. De andere kant van de schakelaar verbind je met 0V.
- schakelaar open: output is 5V (HIGH);
- de pullup-weerstand "trekt" de output naar 5V;
- er loopt geen stroom door de weerstand: er staat dus geen spanning over de weerstand.
- schakelaar gesloten: output is 0V (LOW);
- de output is via de schakelaar direct verbonden met 0V.
- er een spanning van 5V over de weerstand; de stroom is 5/10.000 (V/Ohm) = 0.5 mA.
De Arduino-processor heeft interne pullup-weerstanden. Deze schakel je in door setMode(pin, INPUT_PULLUP)
. Je verbindt dan de schakelaar direct met de Arduino, en je hebt geen weerstand in je eigen schakeling nodig.
In de software moet je er om denken dat een ingedrukte schakelaar met een pullup-weerstand de input-waarde LOW
geeft:
void setup() {
setMode(13, OUTPUT); // led on pin 13
setMode(2, INPUT_PULLUP); // button on pin 2
}
void loop() {
if (digitalRead(2) == LOW) {
digitalWrite(13, HIGH);
} else {
digitalWrite(13, LOW);
}
}
Programma's
Bovenstaande programma's kopiëren de input-waarde van de schakelaar naar de output-LED. Dit gedrag heb je bijvoorbeeld nodig als je een toetsenbord voor een muziekinstrument (orgel) maakt: als je de toets indrukt, hoor je de toon.
In andere toepassingen moet je iets kunnen in- en uitschakelen, bijvoorbeeld een lamp of een motor.
Aparte buttons voor aan- en uitschakelen
int onButton = 2;
int offButton = 3;
int led = 13;
void setup() {
setMode(onButton, INPUT_PULLUP);
setMode(offButton, INPUT_PULLUP);
setMode(led, OUTPUT);
}
void loop() {
if (digitalRead(onButton) == LOW) {
digitalWrite(led, HIGH);
}
if (digitalRead(offButton) == LOW) {
digitalWrite(led, LOW);
}
}
Merk op dat je in dit geval geen delay
nodig hebt.
- de schakelaars zijn "idempotent": het maakt niet uit of je een schakelaar eenmaal of vaker indrukt.
- deze schakeling is bestand tegen contactdender (contact bounce).
Enkele button als omschakelaar
Je kunt ook een button gebruiken voor het omschakelen van een LED: van aan naar uit, of omgekeerd.
int button = 2;
int led = 13;
int ledState = LOW;
void setup() {
setMode(button, INPUT_PULLUP);
setMode(led, OUTPUT);
}
void loop() {
if (digitalRead(button) == LOW) {
if (ledState == LOW) {
ledState = HIGH;
} else {
ledState = LOW;
}
digitalWrite(led, ledState);
delay(200);
}
}
- als je de button indrukt, schakelt de LED om;
- om te voorkomen dat de LED weer direct omschakelt, hebben we een delay ingebouwd (200 msec);
- als je de button ingedrukt houdt, schakelt de LED elke 200 msec om.
Merk op dat je het if-statement voor het omschakelen van de ledState
ook kunt schrijven als: ledState = 1 - ledState;
. Ga er hierbij vanuit dat LOW==0
en HIGH==1
. (Geldt dit ook als de waarden van LOW
en HIGH
omgekeerd zijn?
P.M. (uitwerking volgt nog)
- programma met delay
- van level naar event
- debounce (delay; timer)
Logische schakelingen met schakelaars
- en- en of-schakelingen
- NAND en NOR schakelingen
Vb: gebruik van of-schakeling als trap-schakelaar: je kunt de lamp op verschillende plekken aan- en uitschakelen.
Vb: gebruik van en-schakeling als beveiliging: je kunt een gevaarlijk apparaat alleen inschakelen als je beide handen gebruikt.
Waar moet je om denken?
- De juiste oriëntatie op het breadbord: de pootjes die naar elkaar wijzen zijn intern verbonden. De schakelaar monteer je dan met de verbonden pootjes in dezelfde kolom van het breadboard. (Als je de schakelaar een kwartslag draait, met de niet-verbonden pootjes in dezelfde kolom, doet de schakelaar niets: de breadboard-verbindingen sluiten de schakelaar kort.)
- Als je de schakelaar over de lege middenrij monteert, kun dat maar op één manier. Je hebt dan bovendien meer punten om op de schakelaar aan te sluiten. Je hebt dan voor elke kant bijna twee volledige kolommen.
- In de software kun je last hebben van het verschijnsel dat het contact niet onmiddellijk gemaakt of verbroken wordt - maar dat het signaal een aantal malen verandert voordat dit stabiel wordt: de zogenaamde contact-dender. Dit probleem kun je eventueel op een elektronische manier oplossen, maar je kunt je software er ook op aanpassen.