Arduino - Knop

De knop is een basiscomponent die veel wordt gebruikt in vele Arduino-projecten. Het lijkt eenvoudig, maar dat is het niet altijd vanwege mechanische en fysieke eigenschappen. Beginners kunnen er veel problemen mee ondervinden. Deze handleiding maakt het makkelijk voor beginners. Laten we beginnen!

※ Notiz:

Voordat we verder gaan met de knop, willen we twee veelvoorkomende fouten bespreken die nieuwkomers vaak tegenkomen:

  1. Het probleem van "floating input":
    • Symptoom: Wanneer een knop wordt aangesloten op een Arduino-ingangspin, is de status van die pin willekeurig en komt deze niet overeen met de druktoestand van de knop.
    • Oorzaak: Er wordt géén pull-down of pull-up weerstand gebruikt bij de knop-pin.
    • Oplossing: ⇒ Gebruik een pull-down of pull-up weerstand op de ingangspin. Dit wordt later in deze handleiding uitgelegd.
  • Het “chattering” fenomeen:
    • Symptoom: De Arduino-code leest de status van de knop en detecteert het indrukken door een statusverandering te detecteren (HIGH naar LOW of LOW naar HIGH). Bij één druk op de knop registreert de Arduino meerdere drukken in plaats van één.
    • Oorzaak: Door mechanische en fysieke eigenschappen schakelt de toestand van de ingangspin bij één druk snel meerdere malen tussen LOW en HIGH.
    • Oplossing: ⇒ Debounce. Dit wordt uitgelegd in de tutorial Arduino - Knop - Debounce.

    Het chattering fenomeen veroorzaakt alleen in sommige toepassingen problemen, namelijk wanneer het exacte aantal drukken moet worden gedetecteerd. In andere toepassingen is het onschadelijk.

    Hardware benodigd

    1×Arduino Uno R3
    1×USB 2.0 kabel type A/B
    1×Breadboard-montage knop met kap
    1×Breadboard-montage knop set
    1×Paneel-montage knop
    1×Drukknopmodule
    1×Breadboard (experimenteerprint)
    1×Jumper draden
    1×(Aanbevolen) Schroefklem Block Shield voor Arduino Uno
    1×(Aanbevolen) Breadboard-Shield voor Arduino Uno
    1×(Aanbevolen) Behuizing voor Arduino Uno
    1×(Aanbevolen) Prototyping Basisplaat & Breadboard Kit voor Arduino Uno

    Of u kunt de volgende kits kopen:

    1×DIYables Sensorkit (30 sensoren/displays)
    1×DIYables Sensorkit (18 sensoren/displays)
    Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.

    Over de knop

    De drukknop, ook wel pushbutton, tactiele knop of momentary switch genoemd, is een type schakelaar die sluit wanneer de knop wordt ingedrukt en vastgehouden en opent wanneer deze losgelaten wordt. Er zijn verschillende types drukknoppen, die globaal in twee groepen worden ingedeeld:

    • PCB-montage drukknoppen (breadboard-monteerbaar)
    • Paneel-montage drukknoppen
    Arduino Push button

    Pinout

    De PCB-monteerbare knoppen hebben meestal vier pinnen.

    Button Pinout

    Deze pinnen zijn intern in paren met elkaar verbonden. Daarom hoeven we maar twee van de vier pinnen te gebruiken, namelijk die pinnen die NIET intern verbonden zijn.

    Er zijn vier manieren (eigenlijk twee door symmetrie) om de knop aan te sluiten (zie afbeelding).

    How To Use Button

    ? Waarom kunnen we maar twee pinnen gebruiken terwijl de knop er vier heeft?

    ⇒ De extra pinnen zorgen ervoor dat de knop stevig staat op de PCB (printplaat) en bestand is tegen de drukkracht.

    De paneel-montage knoppen hebben meestal twee pinnen.

    two-pin push button Pinout
    image source: diyables.io

    De push button module bevat een ingebouwde pull-down weerstand, die ervoor zorgt dat de uitgang LOW blijft wanneer de knop niet is ingedrukt. Hij heeft drie pinnen:

    • GND: Verbind met aarde (ground).
    • VCC: Verbind met 5V of 3.3V voeding.
    • OUT: Verbind met een digitale ingang van de Arduino.

    Met deze configuratie is de uitgang LOW als de knop niet is ingedrukt, en HIGH wanneer de knop wél wordt ingedrukt.

    Hoe werkt het

    • Wanneer de knop NIET wordt ingedrukt, is pin A niet verbonden met pin B
    • Wanneer de knop wordt ingedrukt, is pin A verbonden met pin B
    How Button Works

    Arduino - Knop

    Één pin van de knop wordt verbonden met VCC of GND. De andere pin wordt verbonden met een Arduino-pin.

    Door de status te lezen van de Arduino-pin (ingesteld als input) kunnen we bepalen of de knop wel of niet is ingedrukt.

    Knopstatus en druktoestand

    De relatie tussen de knopstatus en of deze wordt ingedrukt hangt af van hoe de knop is aangesloten op de Arduino en hoe de Arduino-pin is ingesteld.

    Er zijn twee manieren om een knop te gebruiken met Arduino:

    1. Eén knop-pin is verbonden met VCC, de andere met een Arduino-pin via een pull-down weerstand
    • Als de knop wordt ingedrukt, is de Arduino-pin HIGH. Als de knop niet wordt ingedrukt, is de Arduino-pin LOW.
    • Er moet een externe weerstand worden gebruikt.
    1. Eén knop-pin is verbonden met GND, de andere met een Arduino-pin via een pull-up weerstand
    • Als de knop wordt ingedrukt, is de Arduino-pin LOW. Als de knop niet wordt ingedrukt, is de Arduino-pin HIGH.
    • Dit kan met een interne of externe weerstand. De interne weerstand is ingebouwd in de Arduino en kan via de code geactiveerd worden.

    ※ Notiz:

    Als u geen pull-down of pull-up weerstand gebruikt, dan zal de toestand van de input-pin “floating” (zwevend) zijn als de knop niet is ingedrukt. Dit betekent dat de toestand zowel HIGH als LOW kan zijn (onstabiel), wat leidt tot verkeerde detectie.

    • De slechtste aanpak: de Arduino-pin als input initialiseren (met pinMode(BUTTON_PIN, INPUT)) zonder een pull-down of pull-up weerstand te gebruiken.
    • De beste aanpak: de Arduino-pin als interne pull-up input initialiseren (met pinMode(BUTTON_PIN, INPUT_PULLUP)), dan is geen externe weerstand nodig.

    Om het voor beginners makkelijk te maken, gebruikt deze tutorial de simpelste methode: de Arduino-pin initialiseren als interne pull-up input zonder externe weerstand. Beginners hoeven dus niet na te denken over het aansluiten van pull-up of pull-down weerstanden. Ze hoeven alleen de Arduino-code te gebruiken.

    Bedradingsschema

    • Bedradingsschema tussen Arduino en PCB-montage knop
    Arduino Button Wiring Diagram

    This image is created using Fritzing. Click to enlarge image

    • Bedradingsschema tussen Arduino en paneel-montage knop
    Arduino two-pin push button Wiring Diagram

    This image is created using Fritzing. Click to enlarge image

    Arduino two-pin button Wiring Diagram

    Hoe programmeert u voor de knop

    • Initialiseer de Arduino-pin als interne pull-up input met de functie pinMode(). Bijvoorbeeld pin 7:
    pinMode(7, INPUT_PULLUP);
    • Lees de status van de Arduino-pin met de functie digitalRead().
    int buttonState = digitalRead(BUTTON_PIN);

    ※ Notiz:

    Er zijn twee veelgebruikte gebruiksscenario’s:

    • De eerste: Als de input HIGH is, voer dan een actie uit. Als de input LOW is, voer dan een andere actie uit.
    • De tweede: Als de input verandert van LOW naar HIGH (of HIGH naar LOW), voer dan een actie uit.

    Afhankelijk van de toepassing kiest u één van deze. Bijvoorbeeld bij het bedienen van een LED met een knop:

    • Wilt u dat de LED AAN gaat als de knop ingedrukt is en UIT als de knop niet ingedrukt is, gebruik dan de eerste methode.
    • Wilt u dat de LED telkens wisselt tussen AAN en UIT bij elke druk op de knop, gebruik dan de tweede methode.

    Hoe detecteert u een statusverandering van LOW naar HIGH

    // constante waarden veranderen niet. Ze worden hier gebruikt om pinnummers in te stellen: const int BUTTON_PIN = 7; // het nummer van de drukknop pin // Variabelen veranderen wel: int lastState = HIGH; // de vorige status van de input-pin int currentState; // de huidige lezing van de input-pin void setup() { // initialiseer seriële communicatie met 9600 bits per seconde: Serial.begin(9600); // initialiseer de drukknop pin als interne pull-up input // deze pin is HIGH wanneer de schakelaar open is en LOW wanneer gesloten pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // lees de status van de drukknop: currentState = digitalRead(BUTTON_PIN); if(lastState == LOW && currentState == HIGH) Serial.println("The state changed from LOW to HIGH"); // sla de laatste status op lastState = currentState; }

    Arduino Code

    Snelle stappen

    • Verbind Arduino met PC via USB-kabel
    • Open Arduino IDE, selecteer het juiste board en de juiste poort
    • Kopieer onderstaande code en open in Arduino IDE
    // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: int buttonState = digitalRead(BUTTON_PIN); // print out the button's state Serial.println(buttonState); }
    • Klik op de Upload knop in Arduino IDE om de code te uploaden naar Arduino
    Arduino IDE - How to Upload Code
    • Open de Seriële Monitor
    • Druk de knop meerdere keren in en laat los
    • Zie het resultaat in de Seriële Monitor:
    COM6
    Send
    1 1 1 0 0 0 0 0 0 1 1 1
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    1 betekent HIGH, 0 betekent LOW.

    Code uitleg

    Lees de regel-voor-regel uitleg in de commentaarregels van de code!

    Arduino Code aanpassen

    Laten we de code aanpassen om indrukken en loslaten te detecteren

    Snelle stappen

    • Pas de code aan zoals hieronder
    /* * Deze Arduino code is ontwikkeld door newbiely.nl * Deze Arduino code wordt zonder enige beperking aan het publiek beschikbaar gesteld. * Voor volledige instructies en schema's, bezoek: * https://newbiely.nl/tutorials/arduino/arduino-button */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) Serial.println("The button is pressed"); else if(lastState == LOW && currentState == HIGH) Serial.println("The button is released"); // save the the last state lastState = currentState; }
    • Klik op de Upload knop in Arduino IDE om de code te uploaden naar Arduino
    Arduino IDE Upload Code
    • Open de Seriële Monitor
    • Druk op de knop en laat los
    • Zie het resultaat in de Seriële Monitor
    COM6
    Send
    The button is pressed The button is released
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ Notiz:

    • Zelfs als u de knop slechts één keer indrukt en loslaat, kan de uitvoer in de Seriële Monitor meerdere druk- en loslaat gebeurtenissen tonen. Dit is normaal gedrag van de knop. Dit gedrag heet het “chattering” fenomeen. U kunt hier meer over lezen in de Arduino - Knop Debounce tutorial.
    • Om het nog makkelijker te maken voor beginners, zeker bij gebruik van meerdere knoppen, is er een library gemaakt genaamd ezButton. U kunt hier meer leren over ezButton library.
    • Gebruik pinMode(BUTTON_PIN, INPUT) voor de knop module. Deze geeft LOW wanneer niet ingedrukt en HIGH wanneer ingedrukt.

    Video Tutorial

    We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.

    Bekijk onze video-tutorial voor een visuele begeleiding bij dit project! De video biedt extra inzichten en helpt u stap voor stap door het proces.

    Daag uzelf uit

    • Zet een LED aan wanneer de knop wordt ingedrukt, en zet de LED uit wanneer de knop niet is ingedrukt.
    • Laat een LED wisselen tussen AAN en UIT elke keer dat de knop wordt ingedrukt.

    Extra kennis

    ? Wanneer moeten we wel of niet een pull-up of pull-down weerstand gebruiken bij een input-pin?

    • Als de sensor ofwel gesloten (verbonden met VCC of GND) óf open (niet verbonden met iets) toestanden heeft, heeft u een pull-up of pull-down weerstand nodig om die toestanden te forceren tot twee vaste niveaus: LOW en HIGH. Bijvoorbeeld bij drukknoppen, schakelaars, magneetschakelaars (deursensoren) ...
    • Als een sensor twee gedefinieerde spanningsniveaus heeft (LOW en HIGH), dan heeft u geen pull-up of pull-down weerstand nodig. Bijvoorbeeld bij bewegingssensoren, touch sensoren ...

    ※ ONZE BERICHTEN

    • U bent welkom om de link naar deze tutorial te delen. Gebruik onze inhoud echter niet op andere websites. We hebben veel moeite en tijd gestoken in het maken van de inhoud, respecteer alstublieft ons werk!