Schakelaars in alle soorten en maten...
Aanraakschakelaar TTP223B en TTP223
TTP223B
Deze sensoren kun je gebruiken als een gewone drukschakelaar, maar je hebt een draad meer nodig. Sluit de GND en VCC pinnen aan op GND en 5V. Er gaat bij de TTP223B een groen lampje branden als teken dat alles goed is. De rode TTP223 schakelaar is zo goedkoop dat je ze soms per 10 stuks moet kopen. Ze zijn iets kleiner dan de TTP223B, zodat ze makkelijker in te bouwen zijn. Wel moet je bij deze uitvoering zelf de pinnen eraan solderen. Sluit de signaalpin aan op één van de digitale pinnen van de Arduino, bijvoorbeeld pin 2. Als de schakelaar wordt aangeraakt dan wordt de digitale poort 1 en anders 0. Hieronder volgt een eenvoudig programmavoorbeeld. Sluit eventueel een ledje aan tussen pin 13 en de naastgelegen GND (of kijk naar het ledje van pin 13 op het Arduino board). Als je de schakelaar aanraakt brand het ledje. Het werkt allemaal erg soepel.
TTP223
void setup() {
pinMode(2, INPUT); pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, digitalRead(2));
}
TIP: als je de schakelaar wilt verstoppen, bijvoorbeeld achter een tekst, dan kan dat. Als je er een dun papiertje tegen aan houdt werkt hij nog steeds. In het project "Toverpot" zie je dat zo'n schakelaar zelfs door glas heen nog werkt.
TIP: je kunt de werking van de rode TTP223 ook omkeren, hij is dan altijd aan en gaat uit als je hem aanraakt. Soldeer daarvoor een draadje tussen soldeerpunten bij A op de achterkant van de sensor. Je kunt er ook een aan/uit schakelaar van maken. Soldeer daarvoor een draadje tussen de soldeerpunten bij B.
Kleurige aanraakschakelaar Heltec HTTM-SCR
Voor en achterzijde
Deze schakelaars geven als ze aanstaan licht in één kleur of in een kleur die volgens een vast patroon verandert. Je kunt ze achter een plexiglas front bevestigen, waardoor je geen moeilijke gaten hoeft te maken. Door een ondoorzichtig papiertje tussen het plexiglas en de schakelaar te zetten waar je een vorm uit hebt geknipt, kun je allerlei vormen krijgen. De schakelaar heeft dezelfde aansluitingen als de hierboven genoemde schakelaars, maar in een andere volgorde (dit is duidelijk op de schakelaar aangegeven). Normaal is dit een schakelaar die aan blijft tot je er weer op drukt, maar je kunt er ook een drukknop van maken door aan de rechterkant tussen de twee soldeerpunten een weerstand van enkele kilo-ohms te solderen. Dat is voor een heleboel projecten overigens niet nodig omdat je dit met programmacode kunt simuleren. Deze schakelaars werken prima.
Zelfgemaakte aanraakschakelaars
Op internet vind je veel schema's voor zelfbouw aanraakschakelaars. Ze zijn heel makkelijk te maken, maar men vergeet er vaak bij te vermelden dat ze alleen werken als de Arduino geaard is. Je kunt ze daarom alleen gebruiken als de Arduino via je computer geaard wordt, maar niet als je deze op een batterij of powerbank aansluit! De schakelaars die hierboven zijn beschreven werken dan wel.
Trillingsschakelaar (vibration switch) SW-18010P
Deze schakelaar is normaal open. In het afgesloten buisje zit een dunne draad gewikkeld, die bij een kleine beweging trilt en dan kortsluiting maakt met de dikke draad. Je sluit de dikke draad aan op de GND en de dunne op een digitale pin (andersom mag ook). In het voorbeeld heb ik ze aangesloten op pin 2. Tussen pin 3 en GND heb een weerstand in serie met een rode led aangesloten. De code om te testen is als volgt:
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(3, OUTPUT);
}
void loop() {
digitalWrite(3, LOW);
if (digitalRead(2) == LOW) {
digitalWrite(3, HIGH);
delay(200);
}
}
Als je de sensor beweegt gaat het rode ledje op pin 3 aan. Deze trillingsschakelaar is vrij gevoelig. Er zijn minder gevoelige uitvoeringen.
Er zijn ook "breakout boards" met een trillingssensor erop. Deze hebben een regelbare weerstand waarmee je de gevoeligheid kunt instellen. Ze zijn voorzien van twee ledjes: een om aan te geven dat ze zijn aangesloten op VCC en een die aangaat bij trilling. Je sluit de derde poot ("DO") aan op een digitale pin. Zodra deze hoog wordt is er een trilling gedetecteerd.
Reed schakelaar
De lange poot van de led zit rechts.
Deze sensor reageert op een magnetisch veld. Als er geen veld is dan staat hij open, anders dicht. Hierdoor is de schakelaar heel eenvoudig te gebruiken om bijvoorbeeld een led aan of uit te schakelen. Om hem te testen hoef je geen programma in je Arduino te zetten. In onderstaand schema heb ik de voeding van af de Arduino aangesloten op de rode en blauwe lijn onder, maar je kunt hier ook een batterij op aansluiten, met de geschikte weerstand. Als je de Arduino 3,3 volt uitgang gebruikt dan is bij de meeste soorten leds niet per se nodig. Houd een sterke magneet bij de schakelaar en de led gaat aan.
Hall schakelaar
Deze schakelaar reageert evenals de Reed schakelaar op een magneetveld. Er is zoveel over te vertellen dat er een aparte pagina voor is gemaakt.
IR nabijheidsschakelaar
Over dit onderdeel is zoveel te vertellen dat er een aparte pagina voor is gemaakt.
Microswitch (voor nauwkeurig schakelen)
In tegenstelling tot wat de naam doet vermoeden, zijn dit meestal geen kleine schakelaars. Het zijn wel schakelaars die reageren op een zeer kleine kracht. De bedoeling is dat ze steeds bij precies dezelfde hoeveelheid indrukken inschakelen. Hierdoor kun je ze bijvoorbeeld gebruiken als eindstop: het voorwerp stopt met grote zekerheid en je weet precies waar het gestopt is. Er zijn passieve en actieve microswitches.
Microswitch met rol
NC NO C
Passieve microswitch
Veel passieve microswitches hebben drie aansluitingen, met (vaak) de bijschriften C (of COM), NC en NO. C betekent common; NO normally open en NC normally closed. Je kunt deze schakelaars dus gebruiken als maakcontact of als breekcontact. Erg handig! Als deze bijschriften ontbreken, dan zijn de aansluitingen vaak genummerd in de volgorde 1 (= C), 3 (= NO) en 2 (= NC). Ik testte een type met een rolwieltje (zie afbeelding) en een met een lange arm. Beide werken zeer goed. Je moet C op GND aansluiten en een van de andere contacten op een digitale pin, die je als INPUT_PULLUP declareert. NO houdt deze uitgang hoog, tenzij de schakelaar is ingedrukt en NC houdt de ingang laag, tenzij de schakelaar wordt ingedrukt. Je maakt normaal gesproken een keuze tussen deze twee mogelijkheden en laat de andere aansluiting zweven. Het meest logisch is om de maakverbinding te gebruiken, maar soms is juist de breekverbinding beter, bijvoorbeeld als een motor wordt gevoed via de schakelaar. Als de drukschakelaar inkomt dan stopt die motor onmiddellijk, ongeacht de toestand van de Arduino.
Als een apparaat (bijvoorbeeld een motor) direct uit moet als de schakelaar inkomt, dan is het VEEL beter dat NIET via de Arduino te doen, maar de schakelaar direct in de voedingslijn naar dat apparaat op te nemen (C van de schakelaar gaat naar GND en NC van de schakelaar gaat naar de - pool van het apparaat; de + van het apparaat gaat naar VCC of naar een uitvoerpin van de Arduino). Je kunt als je dat wilt, de NO aansluiting gebruiken om de Arduino te vertellen dat de schakelaar is ingekomen. Erg handig! De timing is nu minder kritisch, waardoor het bij eenvoudige toepassingen niet nodig is om een interrupt functie te gebruiken. Hieronder zie je hoe je dit principe kunt testen. In plaats van een motor wordt een blauwe led gebruikt. Als de schakelaar wordt ingedrukt, dan gaat deze led uit en gaat de led op poort 13 aan. De bijbehorende code is:Aansluitschema voor de test
// Testprogramma microswitch
// Neem de switch op in de toevoerleiding van de testled
// Als de switch schakelt gaat de testled direct uit; vrijwel gelijktijdig
// krijgt de Arduino een signaal. Daarop zet hij de signaalled aan.
#define ledje 13 // Sluit de signaalled aan op poort 13
#define switch 2 // Sluit NO van de microswitch aan op pin 2
void setup() {
pinMode(ledje, OUTPUT);
pinMode(switch, INPUT_PULLUP);
}
void loop() {
digitalWrite(ledje, !digitalRead(switch));
}
Als je de schakelaars op een breadboard of Arduino wilt aansluiten moet je er kabeltjes aan solderen. Er bestaan wel bedrade microschakelaars ("wired microswitches"), maar ideaal is dat niet.
- Actieve microswitch
Dit type schakelaars bevat elektronica. Ze hebben een spanningsbron nodig hebben om goed te kunnen werken.
Ik testte een merkloze "Crash Collision Switch Sensor". Op de module zit een indicatielampje dat gaat branden als de switch ingedrukt is. De module geeft een zo kleine uitgangsstroom, dat je er niets rechtstreeks op kunt aansluiten. In plaats daarvan sluit je de uitgang aan op een van de digitale pinnen van de Arduino (in het voorbeeld gebruik ik pin 2) en dan kan je een andere Arduino pin gebruiken die iets meer vermogen mag leveren of je kunt een versterker gebruiken. Om een lampje uit te laten gaan zodra de switch inschakelt kun je dezelfde code gebruiken als bij de aanraakschakelaar hierboven. Gebruik het ledje van de Arduino zelf, of sluit op poort 13 een led aan. Het lampje op poort 13 gaat uit zodra je de schakelaar indrukt.
Meerstandenschakelaar
Testopstelling schakelaar
Er zijn schakelaars te koop met 12 pinnen, die bij ronddraaien stuk voor stuk verbonden worden met een centrale pin. Soms zit er een ring bij waarmee je het aantal standen kunt beperken. Als je niet alle 12 standen nodig hebt dan moet je die ring gebruiken, want de gebruiker vindt het vast niet fijn als er schakelstanden zijn die niets doen. Om zo'n schakelaar effectief te kunnen gebruiken moet je de 12 pinnen van de schakelaar NIET aansluiten op de digitale pinnen van je Arduino. Dat kan wel, maar je houdt bijna geen andere pinnen meer over. Wat je wel moet doen: sluit de eerste pin aan op GND en de laatste pin die je gebruikt op VCC. Verbind alle tussenliggende pinen met een weerstand van enkele tientallen kΩ (liefst allemaal dezelfde waarde). Sluit nu de centrale pin van de schakelaar aan op een analoge pin, bijvoorbeeld A1. Als je nu A1 uitleest, dan vindt je een spanning die evenredig is met de stand van de schakelaar. In de voorbeeld sketch zie je hoe je de knop betrouwbaar kunt uitlezen. Als je alles hebt getest is het handig de weerstanden gewoon op de knop te solderen. Je houdt dan drie aansluitdraden over. Er zit wel een nadeel aan deze methode: tijdens het schakelen is de spanning even niet gedefinieerd. Als je de knop continu uitleest is dat een bezwaar. Maar in veel toepassingen doe je dat niet: als je bijvoorbeeld aan het begin een stand kiest, of als je eerst een stand kiest en dan een startknop indrukt dan speelt dit probleem niet. In het voorbeeld programma heb je het probleem wel, want daar lees ik de knop steeds uit. Je kunt de situatie verbeteren door een forse condensator tussen aarde en A1 te schakelen, maar nogmaals: in de praktijk kun je beter gewoon een extra drukknop gebruiken om de keuze te bevestigen. Je leest de knop dan alleen maar uit als het nodig is.
// Testprogramma voor 12-standen schakelaar
// Let op: als je geen grote condensator gebruikt
// dan zie je steeds enkele foute standen voorbijkomen
#define Knop A1
int OudeStand = 0;
int Stand;
void setup() {
Serial.begin(9600); while (!Serial);
}
void loop() {
int Stand = geefStand();
if ( Stand != OudeStand ) {
OudeStand = Stand;
Serial.print("Keuze = "); Serial.println(Stand);
}
}
int geefStand(void) {
int spanning = analogRead(Knop);
int ret = 1 + round(11 * spanning / 1023.0); // Let op: 11 x
return (ret);
}
Tilt schakelaar
Een tiltschakelaar reageert op een beweging. Ik gebruik ze echter als ook vaak als onzichtbare hoofdschakelaar: keer je het apparaat om dan gaat de Arduino aan.
Er zijn twee soorten schakelaars: uitvoeringen met kwik en uitvoeringen met twee balletjes (bijvoorbeeld type SW-520D). Ze zijn beide erg goedkoop te verkrijgen. De uitvoering met kwik heeft het duidelijkste schakelmoment. Toch moet ik, gezien het gevaar van kwik in een breekbaar omhulsel, deze schakelaar afraden. Bij de uitvoering met balletjes kan het contact even aan en uit gaan voordat de aan-stand bereikt is. In de praktijk is dat nauwelijks een bezwaar. Voor weer andere toepassingen moet je een schakelaar nemen die bij een bepaalde hoek schakelt, of die reageert op beweging.
De rest van de paragraaf moet ik nog schrijven; zie voor een toepassing het project "Toverpot"
Drukschakelaar
In veel projecten met de Arduino zul je een of meer drukknoppen gebruiken. Als je zo'n knop wilt verbinden met de Arduino dan leg je een van de aansluitingen aan GND en een andere verbind je met een digitale pin van de Arduino. Het is belangrijk dat je deze knop instelt als INPUT_PULLUP. Als je namelijk gewoon INPUT kiest, dan is die pin nergens mee verbonden als de knop niet is ingedrukt. Hierdoor kun je allerlei fouten verwachten. Met INPUT_PULLUP zorg je ervoor dat de spanning op de pin hoog is als de knop NIET ingedrukt is en laag als je deze wel ingedrukt is.
Omdat de schakelaar verbonden is met aarde, betekent een lage spanning dat de knop is ingedrukt; digitalRead() geeft dan echter de waarde FALSE terug. Dit wordt in het programma hieronder omgekeerd door een uitroepteken voor digitalRead te zetten.
#define knop 2
#define led 13
void setup() {
pinMode(knop, INPUT_PULLUP);
pinMode(led, OUTPUT);
}
void loop() {
boolean knopIn = !digitalRead(knop);
digitalWrite(led, knopIn);
}
Bij sommige Arduino alternatieven, zoals de nodeMCU werkt INPUT_PULLUP maar bij een paar pinnen, dus je moet of die pinnen gebruiken, of zelf een weerstand leggen tussen de pin en VCC (maar kijk even in de documentatie of de pin die je wilt gebruiken niet automatisch een PULL_DOWN weerstand heeft). Het maakt niet zo heel veel uit hoe groot je de weerstand kiest, een waarde van enkele kiloOhms voldoet prima.
Twee pootjes
Simpele drukknop
De eenvoudigste knop heeft twee aansluitingen, die bijna altijd normaal open zijn (Dit wordt NO genoemd: "Normally Open") als je de knop niet indrukt dan veert hij terug in de open stand. Hij is wel in de "normally closed" uitvoering te krijgen, maar meestal is dat bij Arduino projecten niet nodig. Deze knop kun je goed inbouwen. Je zult wel zelf twee draadjes moeten solderen.
Vier pootjes
Aansluiting drukknop
Als de drukschakelaar vier pinnen heeft dan kan het zijn dat de pootjes intern twee aan twee aan elkaar vast zitten, maar het kan ook zijn dat ze gelijktijdig werken, zodat je zowel de aarde als de spanning kunt onderbreken. Bij de schakelaar in de afbeelding zijn de pinnen twee aan twee verbonden; hij kost ongeveer 1 cent per stuk, maar wordt toch in allerlei dure apparaten gebruikt. Hij is makkelijk in een breadboard te gebruiken en ook is hij prima op een veroboard te solderen door de klemmende pootjes. Er bestaan ook uitvoeringen van met een lange drukknop. De pootjes aan de lange zijde zijn met elkaar verbonden. Om deze reden moet je de knop monteren zoals aangegeven in de afbeelding (dus met de pootjes aan de lange zijde verticaal). De knop kan eventueel over de sleuf in het midden van een breadboard worden gezet, maar dat is meestal niet zinvol. De led in dit voorbeeld is aangesloten op pin 13, zodat geen weerstand nodig is.
Zes pootjes
VLNR: terugverende schakelaar, schakelaar UIT, schakelaar AAN
Op de foto zie je een zeer goedkope drukschakelaar met zes pootjes. Deze schakelaars hebben zowel een NO ("normally open") als een NC ("normally closed") aansluiting. Als je de dubbele streep naar voren houdt (of als die er niet is het driehoekje op de knop), dan zijn de voorste en de achterste pinnen normaal open en de middelste en de achterste normaal dicht. De linker en rechter rij pinnen zijn niet met elkaar verbonden, dus je kunt twee spanningen gelijktijdig schakelen. Bij de lage spanningen van de Arduino's er geen noodzaak om GND en VCC allebei te onderbreken, dus je hebt eigenlijk maar een van beide rijen nodig. Deze schakelaar bestaat in twee uitvoeringen: een zogenaamde "momentary switch" (een schakelaar die terugveert) en een schakelaar die in zijn stand blijft staan (foto midden en rechts). Deze schakelaar is lastig in een breadboard te prikken, maar solderen op een veroboard gaat uitstekend. Zet de schakelaar zo in het breadboard dat de pinnen in horizontale richting naast elkaar zitten. Als het driehoekje (of de markering met twee streepjes) links zit, dan werken de twee linkse pinnen zoals bij de andere drukknoppen die hierboven beschreven zijn. Kies je de rechtse twee pinnen, dan kun je hetzelfde programma gebruiken als hierboven, maar met het uitroepteken voor digitalRead() weg. Het werkt allemaal erg goed!