
Met een drukknop een GPIO-poort HOOG en LAAG schakelen is geen probleem, maar sinds de softwarematige toggle-functie op de Pico beschikbaar kwam zocht ik naar een stabiele flipflop functie in Python voor de Raspberry Pi. Bijkomstigheid was dat ik daarmee de hotelschakeling opnieuw uitvond.
De meeste flipflop schakelingen werken wel, maar zijn erg onbetrouwbaar. Simpelweg doordat sommige scripts te weinig rekening houden met het zgn. bouncing-effect van mechanische schakelaars. Deze dender of contactstuiter is met name te wijten aan fysieke schakelaars en drukknoppen. Na enige tijd zoeken in de diverse forums heb ik een pythonscript gevonden dat tot nu toe het meest stabiel is.
Ik heb op basis van de standaard flipflop schakeling twee varianten ontwikkeld waarmee de flipflop functie meerdere toepassingen kent. In deze tutorial stel ik er drie beschikbaar.
- Eén led in- en uitschakelen met één knop
- Eén led in- en uitschakelen met twee of meer knoppen (hotelschakeling)
- Twee leds in- en uitschakelen met twee knoppen
Hieronder laat ik de scripts zien en hoe je de componenten aansluit.
Daar gaan we…
Ik ga ervan uit dat je inmiddels weet hoe je onderstaande script naar een editor in Raspberry Pi OS kopieert, opslaat en vervolgens opstart. Zo niet laat het me weten door hieronder een reactie te geven.
Voorbereiding script 1
Sluit de knop (button) aan op GPIO21. Aangezien het script de interne pull-up weerstand oproept gebruiken we geen fysieke pull-up weerstand. Wil je dit wel? Kijk dan hier hoe je dit doet.
De led sluit je met een serieweerstand aan op GPIO20. Omdat de GPIO een spanning van 3,3V heeft voldoet een weerstand tussen de 150 – 270Ω. Wil je meer weten over de led en zijn serieweerstand? Kijk dan hier!
Script 1 – Eén led in- en uitschakelen met één knop
Onderstaand script heeft één knop als input en één led als output.
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
print ("\nSTOP het programma met Ctrl-c\n")
button = 21 # Pin 40
led = 20 # Pin 39
GPIO.setup(led,GPIO.OUT)
GPIO.output(led,GPIO.LOW) # start met een uitgang LAAG
GPIO.setup(button, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Interne weerstand
def toggleLEDcallback(channel):
if (GPIO.input(led) == True):
GPIO.output(led, False)
else:
GPIO.output(led, True)
GPIO.add_event_detect(button, GPIO.RISING, callback=toggleLEDcallback, bouncetime=100)
while True:
time.sleep(1)
GPIO.cleanup()Voorbereiding script 2
Sluit de knoppen (buttons) aan op GPIO12 en GPIO21. Aangezien het script de interne pull-up weerstand oproept gebruiken we geen fysieke pull-up weerstand. Wil je dit wel? Kijk dan hier hoe je dit doet.
De led sluit je met een serieweerstand aan op GPIO20. Omdat de GPIO een spanning van 3,3V heeft voldoet een weerstand tussen de 150 – 270Ω. Wil je meer weten over de led en zijn serieweerstand? Kijk dan hier!
Script 2 – Eén led in- en uitschakelen met twee of meer knoppen (hotelschakeling)
Voor degene die het niet weet; met behulp van een hotelschakeling schakel je met minimaal twee knoppen één led. Je vindt dit soort schakelingen vaak in trappenhuizen en gangen van hotels en flats.
Onderstaand script heeft twee knoppen als input en één led als output.
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
print ("\nSTOP het programma met Ctrl-c\n")
button1 = 12 # Pin 32
button2 = 21 # Pin 40
led1 = 20 # Pin 39
GPIO.setup(led1,GPIO.OUT)
GPIO.output(led1,GPIO.LOW) # start met een uitgang LAAG
GPIO.setup(button1, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Interne pull-up weerstand
GPIO.setup(button2, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Interne pull-up weerstand
def toggleLEDcallback(channel):
if (GPIO.input(led1) == True):
GPIO.output(led1, False)
else:
GPIO.output(led1, True)
GPIO.add_event_detect(button1, GPIO.RISING, callback=toggleLEDcallback, bouncetime=100)
GPIO.add_event_detect(button2, GPIO.RISING, callback=toggleLEDcallback, bouncetime=100)
while True:
time.sleep(1)
GPIO.cleanup()
Voorbereiding script 3
Sluit de knoppen (buttons) aan op GPIO12 en GPIO21. Aangezien het script de interne pull-up weerstand oproept gebruiken we geen fysieke pull-up weerstand. Wil je dit wel? Kijk dan hier hoe je dit doet.
De leds sluit je met een serieweerstand aan op GPIO18 en GPIO20. Omdat de GPIO een spanning van 3,3V heeft voldoet een weerstand tussen de 150 – 270Ω. Wil je meer weten over de led en zijn serieweerstand? Kijk dan hier!
Script 3 – Twee leds in- en uitschakelen met twee knoppen
Op zich geen spannend script als je de bovenste twee bestudeerd hebt. Ik wil hiermee laten zien hoe simpel de onderdelen in het script op te nemen zijn.
Naast de vertrouwde microswitch heb ik een zgn. aanraak schakelaar gebruikt. De schakelaar heeft geen last van ‘dender’, maar kan soms al schakelen als je je vinger er boven houdt.
import time
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
print ("\nSTOP het programma met Ctrl-c\n")
button1 = 12 # Pin 32
button2 = 21 # Pin 40
led1 = 18 # Pin 39
led2 = 20 # Pin 39
GPIO.setup(led1,GPIO.OUT)
GPIO.output(led1,GPIO.LOW) # start met een uitgang LAAG (= uit)
GPIO.setup(led2,GPIO.OUT)
GPIO.output(led2,GPIO.LOW) # start met een uitgang LAAG (= uit)
GPIO.setup(button1, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Interne pull-up weerstand
GPIO.setup(button2, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Interne pull-up weerstand
def toggleLEDcallback1(channel):
if (GPIO.input(led1) == True):
GPIO.output(led1, False)
else:
GPIO.output(led1, True)
def toggleLEDcallback2(channel):
if (GPIO.input(led2) == True):
GPIO.output(led2, False)
else:
GPIO.output(led2, True)
GPIO.add_event_detect(button1, GPIO.RISING, callback=toggleLEDcallback1, bouncetime=100)
GPIO.add_event_detect(button2, GPIO.RISING, callback=toggleLEDcallback2, bouncetime=100)
while True:
time.sleep(1)
GPIO.cleanup()Conclusie
Als je de scripts test merk je dat het basisscript erg stabiel is en geen dendereffect kent. Althans, ik heb het nog nooit bij dit script gezien.
In mijn labopstelling maak ik gebruik van een microswitch, geen knop met de constructie van een ouderwetse vonkende deurbel. Daarnaast maak ik gebruik van een zgn. aanraakschakelaar. Deze is contactloos en levert een stabiele GPIO input.
Door in het script met de bouncetime te experimenteren zal je zien dat dit effect heeft op het denderen.
Hoe mooi zou het zijn als de Pi, net als de Pico in microPython, een toggle-functie voor Python zou hebben. We zullen het voorlopig nog met de standaard routines moeten doen. Wellicht komt dit in de nabije toekomst beschikbaar.
Veel plezier ermee! Mocht je vragen of opmerkingen hebben, laat dan hieronder een reactie achter.
Have A Nice Day!

Laat een reactie achter