74 views

Shutdown Headless Raspberry Pi

Pin It


Ready4Prod

Een modern Operating System (OS) vindt het niet prettig als het niet netjes wordt afgesloten voordat de computer wordt uitgezet. Voor computers met een beeldscherm en toetsenbord is dat niet zo’n probleem. Bij een systeem met een grafische interface is het vaak zelfs een kwestie van “op de juiste knop klikken“.
Als de computer echter geen beeldscherm en/of toetsenbord heeft, zoals een Raspberry Pi (RPi) die als server ergens in een donker hoekje zijn ‘ding doet‘, wordt het een stuk lastiger. De enige manier is dan om met SSH in te loggen en het “shutdown -h now” (of gewoon het “halt”) commando in te toetsen.

Here you will find an English translation.

In deze post beschrijf ik een manier om met twee drukknopjes, vier weerstandjes, één LED en een stukje software, de RPi netjes af te sluiten of eventueel te resetten.

Voor dit ‘projectje‘ wordt gebruik gemaakt van twee General Purpose Input/Output (GPIO) poorten van de RPi. Dit zijn poorten die, via een softwarematige instelling, kunnen worden ingesteld als een Input óf als een Output poort. De RPi heeft een aantal van dit soort poorten. Deze bevinden zich op de P1 connector, maar er zitten er op het Rev.2 board ook vier (GPIO28, 29, 30 en 31) op de P5 connector. De P5 connector moet je dan zelf nog even op de RPi solderen. Omdat ik van plan ben de P1 connector nog voor andere uitbreidingen te gaan gebruiken heb ik ervoor gekozen om een connector op de P5 plek te solderen en die te gebruiken. Wil je dat niet doen dan moet je in de software aangeven welke GPIO poorten je wél wilt gebruiken.

RaspberryPi
Op de Rev.2 boards van de RPi is er ook plaats voor een connector waarmee de RPi ge-reset kan worden of waarmee hij, na een ‘shutdown -h now’ commando, weer gestart kan worden. Hiervoor moet een P6 connector op de RPi worden gesoldeerd. Door pin 1 (het ‘vierkante’ eilandje op het plaatje) ‘laag’ te maken (verbinden met ‘aarde’) zal de RPi opnieuw opstarten.


GPIO_IN

Er zijn twee manieren om een schakelaar op een als Input gedefinieerde GPIO poort aan te sluiten. In het linker voorbeeld hiernaast is de rust toestand van de gebruikte GPIO poort ‘hoog’ (oftewel +3.3V). Dit komt door de weerstand van 10K ohm die de poort naar +3.3V trekt (dit is een zgn. Pull-Up weerstand). Wordt op de schakelaar gedrukt, dan wordt de poort ‘laag’ (GND). De extra weerstand in serie met de GPIO poort is strikt genomen niet nodig, maar zorgt ervoor dat een, per ongeluk als Output poort gedefinieerde GPIO poort, niet direct de geest zal geven.
In het rechter voorbeeld is de rust toestand van de gebruikte GPIO poort ‘laag’ (oftewel GND, 0V). Dit komt door de weerstand van 10K ohm die de poort naar GND trekt (dit is een zgn. Pull-Down weerstand). Wordt op de schakelaar gedrukt, dan wordt de poort ‘hoog’ (+3.3V). Ook hier dient de extra weerstand in serie met de GPIO poort als extra beveiliging voor het geval deze als Output poort gedefinieerde is.


Schema01

Hiernaast het schema waarmee, met wat software, de RPi netjes kan worden afgesloten. Bij mij heeft de waarschuwing: “Pas op: Niet op deze knop drukken” altijd het effect dat ik juist wél op die knop wil drukken. Daarom heb ik de reset knop in serie met de Shutdown knop geschakeld en heb ik voor de GPIO-Input poort de “in rust ‘hoog’” variant gebruikt. Pin 1 van P6 wordt dan alleen ‘laag’ als de twee drukknoppen gelijktijdig worden ingedrukt.

Omdat je niet wilt dat de RPi bij het ‘per ongeluk indrukken‘ van de Shutdown knop direct het ‘Shutdown -h now’ commando uitvoert, wordt dit commando pas na het voor langere tijd ingedrukt houden van de knop uitgevoerd (in de software instelbaar, standaard tussen de vier en zes seconden).

Test01a

Tijdens het testen van deze schakeling merkte ik dat het ontbreken van feedback over het functioneren van de schakeling en de software niet prettig is. Door een LED, die door de software wordt aangestuurd, in de schakeling op te nemen is het mogelijk om te zien in welke toestand de software zich bevindt. In rust en als de software ‘loopt’ knippert de LED met een frequentie van 1 maal per twee seconden. Wordt de Shutdown knop ingedrukt, dan wordt de frequentie 4x per seconden. Is het Shutdown commando gegeven, dan brandt de LED constant.


Dit is het definitieve schema:
GPIOshutdown

Ik heb de onderdelen op een stukje experimenteer printplaat gesoldeerd (waarbij ik er achter kwam dat experimenteer printplaat met dubbelzijdige en door-gemetaliseerde eilandjes een stuk handiger werkt dan de enkelzijdige die ik gebruikt heb) waarbij het printje direct over de gebruikte rij pinnen van P5 en P6 valt.

Proto01b Proto01a

Ready2Test2 Ready2Test1

Dit is het programma om het één en ander aan te sturen:

Plaats deze code in “/usr/local/bin/GPIOshutdown.sh” en maak het executable:
sudo chmod +x /usr/local/bin/GPIOshutdown.sh

Om het programma automatisch te starten bij het opstarten van je RPi zijn er verschillende mogelijkheden. Ik vind het prettig om het programma als ‘daemon’ te draaien. Wil je dat ook, dan moet je de volgende code in “/etc/init.d/GPIOshutdown” zetten:

Vergeet niet dit bestand execute rechten te geven:
sudo chmod +x /etc/init.d/GPIOshutdown
Om de daemon te starten tik je in:
sudo /etc/init.d/GPIOshutdown start
De LED zal nu met een frequentie van 0.5Hz gaan knipperen. Als je de Shutdown knop indrukt dan zal binnen twee seconden de LED met een frequentie van 4Hz gaan knipperen. Laat je de knop binnen vier seconden weer los, dan gaat de LED weer met 0.5Hz knipperen en blijft de RPi ‘draaien’. Hou de de Shutdown knop lang genoeg ingedrukt, tot de LED continu gaat branden, dan wordt de RPi netjes afgesloten (uiteindelijk blijft er nog slechts één intern LEDje op de RPi branden).
Als je de beide knoppen tegelijkertijd even indrukt, zal de RPi weer opstarten en zal, als je de service goed hebt geïnstalleerd de LED weer gaan knipperen.
Let op: Druk je beide knoppen gelijk in terwijl de RPi gewoon draait, dan Reset de RPi zichzelf.

Je kunt de daemon stoppen met het commando:
sudo /etc/init.d/GPIOshutdown stop
De LED gaat nu uit.

Om de daemon automatisch te starten bij iedere reboot van de RPi moet je de service installeren met het commando:
cd /etc/init.d
sudo insserv GPIOshutdown

Wees niet bang dat dit script teveel tijd van je beperk aanwezige processor capaciteit op slokt. Het ‘sleep’ commando gebruikt nagenoeg geen processor tijd!


Let op: de P5 connector is bedoeld om aan de onderkant van de RPi te solderen. Omdat ik dat voor dit project niet handig vind heb ik hem aan de bovenkant (component side) gesoldeerd. Hierdoor is de pin-nummering echter omgedraaid. De vierkante eilandjes op de printplaat geven altijd pin 1 aan. Ik heb alleen de even pin-nummers gebruikt waarbij de +3.3v aan de buitenkant van de RPi zit!

P5_Header P1_Header

Test02a

Dit bericht is geplaatst in Computer. Bookmark de permalink.

3 reacties op Shutdown Headless Raspberry Pi

  1. Patrick van der Poel schreef:

    Geweldig artikel. Het werkt allemaal prima op mijn Raspberry Pi 2 met Rasbian.
    Ik moest een kleine aanpassing doen overigens.
    NAME=checkKeyPress moet zijn NAME=GPIOshutdown

    Het enige wat ik nu nog niet voor elkaar krijg, en waar jij hopelijk een antwoord voor hebt, is om de boel werkend te krijgen in openelec.
    Het lijkt erop dat daar GPIO helemaal niet te gebruiken is.
    Ook bestaan een aantal directories niet, waardoor ik het o.a. neit voor elkaar krijg de boel als daemon te starten. Weet jij hoe ik het onder openelec ook aan de gang kan krijgen?

    • Willem schreef:

      Hoi Patrick,

      Ik heb geen ervaring met openELEC, maar wat ik er van gelezen heb is dat het OS geen standaard Linux is. Of de libraries om GPIO aan te sturen beschikbaar zijn weet ik niet. Misschien op een openELEC forum navragen?

      Ik vond deze link op het openElec forum.

  2. Pingback: Shutdown Headless Raspberry Pi (English) | Willem's Website

Reacties zijn gesloten.