Raspberry Pi voorzien van een shutdown-knop

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.

shutdown schakelaar raspberry pi afsluiten

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.

10 gedachten over “Raspberry Pi voorzien van een shutdown-knop”

  1. 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

    Beantwoorden
  2. 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

    Beantwoorden
  3. 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.

    Beantwoorden
  4. 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.

    Beantwoorden
  5. 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+

    Beantwoorden

Plaats een reactie