Rasbpberry Pi 3B+, Pi Camera, USB GPS/Glonass - Lepší vyzkoušet než studovat

Your Name
Přejít na obsah

Rasbpberry Pi 3B+, Pi Camera, USB GPS/Glonass

Archiv > Raspberry 3 B+



Vypínání Raspi pomocí skriptu
Vypínání Raspi se provádí podobně jako u Win (Start/Vypnout) anebo pomocí přílazu "sudo shutdown". Dost zásadní komplikací je však to, že i když Raspi vypneme pomocí příkazu shutdown, stále odebírá z napájení (v mém případě s periferiemi) kolem 250 mA.

Hledal jsem ale zapojení, které by fungovalo tak, že při zapnutí zapalování by se Raspi "nahodil" a při vypnutí zapalování by se řádně vypnul a odpojil od napájení. Vím, že existují řešení, speciální zdroje pro mobilní nasazení PC, stejně tak ale vím, že se dá podobný problém řešit víceméně softwarově.

Jeden ze způsobů, jak Raspi vypnout do stavu Shutdown je dole na obrázku. Nejprve pomocí vodičů přes rezistor s přibližnou hodnotou kolem 10 kiloohmů spojíme +3,3V napájení s pinem GPIO5. GPIO5 pak přes tlačítko připojíme na GND (zem, mínus) PIN39.
Pak si vytvoříme skript, který pojmenujeme třeba "shutdown.py". Skript vytvoříme buď přímo na Raspberry v programu Thonny Python IDE (nebo si tento program nainstalujeme ve Win verzi na PC).

#!/usr/bin/python
# shutdown/reboot Raspberry Pi mittels Taste

import RPi.GPIO as GPIO
import subprocess, time, sys, syslog, os

# GPIO-Port, an dem die Taste gegen GND angeschlossen ist
# GPIO 5, Pin 29 (GND waere daneben auf Pin 30)
PORT = 5

# Schwelle fuer Shutdown (in Sekunden), wird die Taste kuerzer
# gedruckt, erfolgt ein Reboot
T_SHUT = 3

# Entprellzeit fuer die Taste
T_PRELL = 0.05

uid = os.getuid()
if uid > 0:
 print ("Programm benoetigt root-Rechte!")
 sys.exit(0)

# GPIO initialisieren, BMC-Pinnummer, Pullup-Widerstand
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(PORT, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# Zeitdauer des Tastendrucks
duration = 0

# Interrupt-Routine fuer die Taste
def buttonISR(pin):
 global duration

 if not (GPIO.input(pin)):
   # Taste gedrueckt
   if duration == 0:
     duration = time.time()
 else:
   # Taste losgelassen
   if duration > 0:
     elapsed = (time.time() - duration)
     duration = 0
     if elapsed >= T_SHUT:
       syslog.syslog('Shutdown: System halted');
       subprocess.call(['shutdown', '-h', 'now'], shell=False)
     elif elapsed >= T_PRELL:
       syslog.syslog('Shutdown: System rebooted');
       subprocess.call(['shutdown', '-r', 'now'], shell=False)

# Interrupt fuer die Taste einschalten
GPIO.add_event_detect(PORT, GPIO.BOTH, callback=buttonISR)

syslog.syslog('Shutdown.py started');
while True:
 try:
   time.sleep(300)
 except KeyboardInterrupt:
   syslog.syslog('Shutdown terminated (Keyboard)');
   print ("Bye")
   sys.exit(0)
zdroj: Hochschule München, FK 04, Prof. Jürgen Plate und die Autoren
Shora uvedený skript tedy uložíme do adresáře /home/pi a spustíme ho příkazem

sudo python shutdown.py

Teď, když skript běží, zmáčkneme krátce tlačítko. Raspberry se zrestartuje (reboot)
Podržíme-li tlačítko déle jak 3 sec., Raspberry se vypne (shutdown).
Raspberry je však stále pod napětím a odebírá proud.
Nastartování Raspi provedeme obnovením napájecího napětí.

Pokud všechno funguje jak má, můžeme nechat skript startovat se systémem. Do terminálu napíšeme příkaz

sudo nano /etc/rc.local

a na konec souboru (avšak před "exit 0") vepíšeme

sudo python /home/pi/shutdown.py &

(& znamená, že skript poběží na pozadí)

Pomocí Ctrl+O a Enter soubor uložíme, pomocí Ctrl+X editor opustíme.

K aktivaci skriptu nedochází při stlačení tlačítka, nýbrž při jeho uvolnění (sestupná hrana signálu)
Návrat na obsah