De Raspberry Pi is niet voorzien van een aan-uit schakelaar, je kunt deze alleen veilig afsluiten met behulp van het shutdown commando. Het simpelweg verwijderen van de netstroom is niet aan te bevelen omdat hierdoor het bestandssysteem op de SD kaart corrupt kan geraken. Na het uitvoeren van het shutdown commando is dit geen probleem omdat het systeem in ‘halt’ modus is geplaatst.
Met hulp van een drukschakelaar en twee verbindingsdraden is het mogelijk om een Raspberry Pi te voorzien van een shutdown schakelaar. Een drukschakelaar aangesloten op de GPIO pinnen kan gebruikt worden om een python script te activeren die op zijn beurt Raspbian veilig laat afsluiten.
Componenten voor dit project
1x drukschakelaar
2x Dupont verbindingskabels (female/female)
Aansluitschema shutdown schakelaar
Raspberry Pi A+/B+, 2 en 3
Het aansluitschema is vrij simpel verbind de twee pinnen van de drukschakelaar met de Raspberry Pi op pin 5 (GPIO3) en pin 6 (GND). We maken gebruik van GPIO3 (is pin 5) omdat deze een pull-up weerstand heeft, die eenvoudig kan worden uitgelezen met python.
Python script
Nadat de drukschakelaar is aangesloten hebben we het onderstaand python script nodig om de status van de schakelaar uit te lezen. Het script plaatsen we in de home folder van gebruiker ‘pi’.
nano /home/pi/shutdown.py
Kopieer de onderstaande code in de nano editor:
#!/usr/bin/python import RPi.GPIO as GPIO import time import subprocess GPIO.setmode(GPIO.BOARD) # set pin 5 to input, and enable the internal pull-up resistor GPIO.setup(5, GPIO.IN, pull_up_down=GPIO.PUD_UP) oldButtonState1 = True while True: buttonState1 = GPIO.input(5) if buttonState1 != oldButtonState1 and buttonState1 == False : subprocess.call("init 0", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) oldButtonState1 = buttonState1 time.sleep(.1)
Bewaar de wijzigingen (ctrl X, y, enter).
Script toevoegen aan cron
Om de status van de drukknop te kunnen detecteren moeten we het python script op de achtergrond actief maken en automatisch starten na een herstart. Dit doen we met behulp van crontab:
crontab -e
Plaats onderaan het bestand de onderstaande regel:
@reboot sudo python /home/pi/shutdown.py
Het script en crontab zijn nu ingesteld, herstart hierna de Raspberry Pi.
sudo shutdown -h 0
Werking schakelaar testen
Na de herstart, kunnen we onze drukschakelaar gaan testen. Druk op de schakelaar, je zult zien dat de groene led op de Rapsberry Pi 5x zal knipperen. Hierna zal de groene led blijven branden, de shutdown heeft plaatsgevonden en je kunt nu zonder problemen de netstroom verwijderen.
Heldere uitleg, hier heb ik wat aan.
Nu nog uitvoeren.
Dank
Je kan hiernaast dus gewoon andere scripts laten draaien? Deze worden dan oom correct afgesloten?
Inderdaad bij het afsluiten wordt alles afgesloten.
Hallo Richard,
Ik heb zelf een arcadekast gemaakt, deze draait op een Pi3 met Retropi en een custom image.
Kan ik een dergelijke button ook gebruiken om dit systeem netjes af te sluiten?
Zodat de pi netjes afgesloten wordt en minder kans heb dat mijn 128gb sd kaart corrupt raakt. Nu gooi ik hard mijn power switch om, dit lijkt me niet wenselijk.
Gr Alwin
Yep! voor dat soort dingen is het uitermate geschikt!
Hallo Richard,
Vanavond jou handleiding gevolgd.
De knop werkt perfect.
Bedankt voor je beknopte, maar zeer duidelijke handleiding.
Gr Alwin
Hoi Richard,
Bedankt voor de goede uitleg. Nu zit ik nog met een vraag, wat gebeurt er als de knop ingedrukt wordt als de raspberry pi vastgelopen is om de een of andere reden. Kan het dan geen kwaad omdat dan mogelijk de pull-up niet gezien wordt?
groeten,
Ernie
Kan ik de afsluitknop ook in Libreelec/Kodi gebruiken en wat worden dan de paden voor home en pi.
Nu werkt de knop zonder script, enkel om de Pi vanuit standby, aan te zetten.
Vanavond mee gestoeid op een Raspberry Pi 4CM met IO board welke in een Mini ITX case is ingebouwd. Ik wilde de power en reset buttons aan de voorkant laten werken. De Pi 4 CM/IO board ondersteund de GPIO.BOARD mode niet, maar GPIO.BCM wel. Alleen komt de pin nummering niet overheen, maar dat was zo gefixt.
Een ietwat late reactie maar bij mij geeft de regel:
subprocess.call(“initshell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
een foutmelding:
subprocess.call(initshell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
File “/usr/lib/python3.7/subprocess.py”, line 323, in call
with Popen(*popenargs, **kwargs) as p:
TypeError: __init__() got an unexpected keyword argument ‘initshell’
Ik heb de dubbele quote weggelaten, dat hielp niet.
Het draait op een RPi3b met PiOS:
Operating System: Raspbian GNU/Linux 10 (buster) Kernel: Linux 5.10.103-v7+