Stap 1: Aansluiten van de knop
Dit is een pulsdrukschakelaar, met een stabiele positie (open) wanneer geen kracht wordt uitgeoefend en orkestdirectie (gesloten), wanneer gedrukt. Het is een van de eenvoudigste electro-mechanische lastafhankelijk remventiel.
Verbinding maken met de knop zoals geïllustreerd in de foto van deze stap.
(Niet onder de indruk van de grootte van mijn breadbord. Een kleine stap zullen eigenlijk handiger.)
De i/o-Pin
De AVR (aka ATmega, d.w.z. de Atmel chip voeden van de Arduino board) heeft verschillende I/O pinnen. I/O betekent dat ze kunnen worden vrij geconfigureerd door software als input of output.
Pin 2 zullen een goede keuze voor ons voorbeeld. Het zal worden gebruikt voor het meten van de status van de knop: ingedrukt of losgelaten.
Pull-up weerstand
De PIN-code moet worden aangesloten op ergens via de knop. De vraag is: waar.
Een eerste idee zou zijn om te gaan naar de VCC. VCC is de gebruikelijke benaming voor de voedingsspanning, hier 5V.
Dus wanneer de knop is ingedrukt, de pin op VCC zou worden aangesloten, en de software HIGH lezen zou. Maar wanneer de knop wordt losgelaten, de pin is verbonden met nergens, aka "drijvende", en zal worden blootgesteld aan lawaai, en de software zal hoge en lage lezen op een grillige manier.
Dus is de oplossing het gebruik van een zogenaamde pull-up of pull-down weerstand. Een dergelijke weerstand zorgt ervoor dat de pin altijd met GND of VCC, rechtstreeks of via de weerstand, afhankelijk van de positie van de knop verbonden is.
Gelukkig, de AVR-chip heeft intern een 20 kOhm pull-up weerstand die verbonden kan worden met de pin (intern). De PIN-code moet worden geconfigureerd als input, en zijn waarde, in dit geval vertelt of de pull-up is aangesloten (anders de waarde definieert, wanneer de pin is geconfigureerd als uitgang, de uitgang staat).
Met deze pull-up, we de pin met GND via de knop verbinding maken, en hebben deze situaties wanneer de knop wordt losgelaten, respectievelijk ingedrukt:
Button not pressed: VCC | 20K | | internal | | pull-up |_| | | _____ input ––––*––––––o–––––––––o o––––– GND pin released button
Input is geïsoleerd van de GND, dus alleen aangesloten op VCC via de weerstand. Geen huidige stromen.
Zonder de pull-up weerstand, zou de input "zweven".
Button pressed: VCC | : 20K | | : internal | | : pull-up |_| : some current flows | `- - - - - - - - - -> | input ––––*––––––o–––––––––o–––––o––––– GND pin pushed button
Ingang is nu rechtstreeks verbonden GND. Sommige huidige stroomt door de weerstand.
In beide gevallen hebben we nu een duidelijk omschreven situatie.
Consumptie
Wanneer de knop is ingedrukt, de weerstand krijgt een spanningsverschil gelijk is aan de VCC, en een huidige ik stroomt:
IK = VCC / R
= 5 / 20.000 = 0,25 mA
Overeenkomt met het consumeren van de kracht P:
P = VCC2 / R
= 52 / 20.000 = 1,25 mW
Dit is niet veel, en alleen wanneer de knop is ingedrukt wordt verbruikt. Pull-up en pull-down weerstanden hebben vaak nog meer waarden, dus minder energie verbruikt. Als u geen bijzondere redenen, gebruik dit handige 20 k interne pull-up.
Polariteit
Hadden we een pull-down tot onze beschikking hebben, we zouden hebben aangesloten de pin op VCC in plaats van de GND en lezen hoog op pers, die logischer is. Maar aangezien we alleen een pull-up hebben, we moeten de polariteit omkeren door software, bij pin bemonstering.
Volg voor meer informatie over I/O pinnen, http://www.arduino.cc/en/Tutorial/DigitalPins.
Programmering
De configuratie van de AVR-pin (als input en met pull-up ingeschakeld) wordt beschreven in de onderstaande code.
Code
––––––––––8<––––––––––
#define BUTTON_PIN 2 void setup() { ... pinMode(BUTTON_PIN, INPUT); digitalWrite(BUTTON_PIN, HIGH); // connect internal pull-up ... } void loop() { ... }
––––––––––>8––––––––––