Muziek over ons netwerk deel 5: De Pi aan en uit zetten….

De Raspberry Pi heeft geen knop om hem netjes aan en uit te zetten zoals een normale computer heeft. Aan zetten doe je eenvoudig door de voeding (micro-usb) aan te sluiten. Wil je de Pi uit zetten, dan moet je in de software aangeven dat je hem wilt stoppen (sudo halt) om vervolgens de voeding te ontkoppelen. Dit is voor een headless toepassing zeer onhandig, terwijl het eenvoudig loskoppelen van de voeding een grote kans geeft op een defecte SD-kaart.

Om dit probleem op te lossen heb ik een kleine schakeling gemaakt en een stukje software geschreven.

De schakeling

Zoals bij zo veel uitdagingen voor de Pi ben je niet de enige en is de kans groot dat iemand al iets verzonnen heeft. Zo ook voor dit probleem. Op deze site staat een schema voor een schakeling de die Pi aanzet en door deze schakeling te verbinden met de Pi de schakeling ook aan houdt. Dit gebeurt via één van de GPIO pennen op het bordje. Ik gebruik GPIO4. smdDit is fysiek pin 7. Deze pin is, als je de Pi aan zet, een input en geeft een kleine spanning af. Deze wordt door de schakeling gebruikt om de Pi aan te houden.

Ik heb de schakeling omgezet naar strokenprint. In plaats van een IRF7319 Dual Mosfet gebruik ik een SI4562DY. Deze doet het zelfde en was goedkoper via Ebay te koop.

Gesoldeerde schakelingOrigineel schemaSchema op strokenprint

 

 

 

 

De software

De software die deze schakeling aanstuurt bestaat uit twee delen. De uitdaging is om de pin aan te sturen terwijl de Pi niets meer doet. Ik heb dit opgelost door eerst te schakelen naar runlevel 1 (single-user mode) je zet dan nagenoeg alle services uit. Eenmaal in runlevel 1 aangekomen zet ik de swap uit en herkoppel alle partities van de SD kaart in alleen lezen. Vervolgens stuur ik een signaal naar de schakeling en de Pi gaat uit.

1) Monitorscript

In rc.local zet ik de volgende verwijzing

(sleep 5;python /home/pi/shutdown/shutdown.py)&

Dit start het volgende python script

#!/usr/bin/env python

import subprocess 
from time import sleep 
import RPi.GPIO as GPIO 

GPIO.setmode(GPIO.BOARD) 
GPIO.setup(7, GPIO.IN) 
GPIO.setup(12, GPIO.OUT) # aan deze pin komt later een print om de versterker aan te zetten

GPIO.add_event_detect(7, GPIO.FALLING)  # maak een interrupt voor een rising edge op pin7
GPIO.output(12, 1) # dit commando gebruik ik later om de versterker aan te zetten

def stoppen():
         GPIO.output(12, 0) # zet de versterker uit
         command = "/sbin/telinit 1"
         process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
         output = process.communicate()[0]
         print output

while True:
         if GPIO.event_detected(7):
                 print('Button pressed')
                 GPIO.remove_event_detect(7)
                 GPIO.setup(7, GPIO.OUT)
                 GPIO.output(7, 1)
                 stoppen()
                 break
         else:
                 sleep(5)

Hiervoor moet wel RPi.GPIO module geïnstalleerd zijn.

Check dit met

sudo apt-get install python-rpi.gpio

Als het geïnstalleerd is, dan zie je dat vanzelf op het scherm. Als dit niet geïnstalleerd is, dan wordt dit gelijk gedaan.

2) Uitzetscript

Dit is een shell-script. Dit script maakt gebruik van het programma Wiringpi. Installeer dit eerst zoals op de site staat.

Het scritt staat in /etc/inittab. Zet vlak voor ~~:S wait:/sbin/sulogin de regel:

# What to do in single-user mode.
~~:S:wait:/home/pi/shutdown/shutdown.sh
~~:S:wait:/sbin/sulogin

Zet het script in /home/pi met de naam shutdown.sh. Zorg dat dit uitvoerbaar is (sudo chmod +x shutdown.sh)

#!/bin/bash

echo swap uit 
swapoff -a 
echo afsluiten 
mount -o remount,ro / 
mount -o remount,ro /boot 
echo stuur signaal naar pin 
/usr/local/bin/gpio -g mode 4 out 
/usr/local/bin/gpio -g write 4 0

knopAls alles goed aangesloten is kun je nu de Pi aan en uit zetten via een eenvoudige drukknop. Ik heb er zelf een knopje met ledje op aangesloten 🙂