Skip to main content

Drukknop

Een drukknop heeft twee pootjes. Druk je hem in, dan zijn die met elkaar verbonden. Laat je los, dan niet meer. Met een knop laat je je robot bijvoorbeeld pas rijden als jij erop drukt.

Materiaal​

  • Nano op het shieldArduino Nano RP2040 Connect op het Leaphy Murphy ShieldHet Leaphy Murphy Shield, de groene printplaat waar de Nano in past
  • DrukknopMet twee pootjesEen zwarte drukknop met een ronde rode knop en twee pootjes

Verder: 2× jumperdraden

Een knopje met vier pootjes

Heeft jouw knopje vier pootjes? Die zitten in twee paren, en de twee pootjes van één paar zijn altijd met elkaar verbonden. Gebruik twee pootjes die schuin tegenover elkaar zitten: die horen zeker niet bij hetzelfde paar.

Aansluiten​

Aansluitschema: het ene pootje van de drukknop met een blauwe draad op D7, het andere met een zwarte draad op GND, allebei op het rijtje van D7

Op het shield heeft elke pin van de Nano een eigen rijtje van drie pinnen. De binnenste, naast de Nano, is de pin zelf (bijvoorbeeld D7). De middelste is 3V3 en de buitenste is GND. Sluit een onderdeel aan op het rijtje van zijn pin: dan zitten signaal, 3V3 en GND naast elkaar, en past er een stekker van drie pinnen op. In het schema zegt de legenda welke draad op welke pin komt.

  • het ene pootje aan de pin D7 (binnenste rij)
  • het andere pootje aan een GND-pin (buitenste rij)

Welk pootje waar komt, maakt niet uit: een knop heeft geen plus en geen min. De 3V3 in het midden gebruik je hier niet.

Code​

from machine import Pin
from time import sleep

knop = Pin("D7", Pin.IN, Pin.PULL_UP)

while True:
print(knop.value())
sleep(0.2)

In de Shell verschijnt steeds een 1. Houd je de knop ingedrukt, dan wordt het een 0.

  • Pin("D7", Pin.IN, ...) maakt van D7 een ingang, net als bij de digitale IR-sensor.
  • Pin.PULL_UP zet binnen in de chip een weerstand van D7 naar de plus. Zolang de knop los is, is D7 daardoor 1. Druk je, dan verbindt de knop D7 met GND, en dan is hij 0.
Controlevraag

Waarom leest de pin een 0 als je de knop indrukt, en niet een 1?

Antwoord

De knop verbindt D7 met GND, de min, en een pin aan de min leest 0. Laat je los, dan houdt Pin.PULL_UP de pin aan de plus: 1.

Iets doen als je drukt​

Zolang je de knop indrukt, brandt het rode lampje op de Nano.

from machine import Pin
from time import sleep

knop = Pin("D7", Pin.IN, Pin.PULL_UP)
led = Pin('LED_RED', Pin.OUT)

while True:
if knop.value() == 0:
led.value(0) # aan
else:
led.value(1) # uit
sleep(0.05)

Bij het RGB-lampje op de Nano is value(0) aan en value(1) uit, zie Het ingebouwde lampje.

Opdracht: tel hoe vaak je drukt

Print bij elke keer drukken hoe vaak je in totaal gedrukt hebt: Gedrukt: 1 keer, Gedrukt: 2 keer, enzovoort. Houd je de knop lang in, dan telt dat als één keer.

Tip

Onthoud in een variabele wat de knop de vorige keer was. Je drukt precies op het moment dat de knop de vorige keer 1 was en nu 0 is.

Oplossing
from machine import Pin
from time import sleep

knop = Pin("D7", Pin.IN, Pin.PULL_UP)
vorige = 1
teller = 0

while True:
nu = knop.value()
if vorige == 1 and nu == 0:
teller = teller + 1
print(f"Gedrukt: {teller} keer")
vorige = nu
sleep(0.02)

Zolang je de knop vasthoudt, zijn vorige en nu allebei 0, en telt het programma niet verder.

Er gaat iets mis​

De waarde springt tussen 0 en 1, ook als ik niets doe

Oorzaak: Pin.PULL_UP staat er niet bij. Zolang de knop los is, hangt D7 dan nergens aan, en vangt de pin elk klein stroompje op.

Oplossing: schrijf Pin("D7", Pin.IN, Pin.PULL_UP).

De waarde blijft 1, ook als ik druk

Oorzaak: de knop verbindt D7 niet met GND. Er zit een draad op de middelste rij (3V3) in plaats van de buitenste, of op een ander rijtje. Bij een knopje met vier pootjes kunnen beide draden ook aan hetzelfde paar zitten.

Oplossing: vergelijk je draden met het schema: één op D7 (binnen), één op GND (buiten), en bij vier pootjes twee pootjes die schuin tegenover elkaar zitten.

Eén keer drukken telt als twee of drie keer

Oorzaak: het metaal in de knop stuitert een paar duizendste seconde als je drukt. Leest je programma heel snel, dan ziet het de knop een paar keer aan en uit gaan.

Oplossing: wacht tussen twee metingen even, met sleep(0.02) zoals in de oplossing van de opdracht.