niedziela, 16 czerwca 2019

Raspberry Pi - Przycisk włączania/wyłączania

W tym poście chciałbym przedstawić sposoby obsługi przycisku włączania/wyłączania Raspberry Pi.

Sposób 1 - GPIO 3:


Sposób ten pozwala nam na wprowadzenie Raspberry pi w stan uśpienia. Przez kliknięcie tego samego przycisku istnieje także możliwość ponownego uruchomienia układu. Co jest niestety niemożliwe w przypadku innych pinów.

Dodatkowo należy pamiętać, że ta linia obsługuje linię zegara I2C. Oznacza to, że nie ma możliwości włączania/wyłączania urządzenia z tego pinu gdy wykorzystujemy linię I2C do innych celów.

Zwarcie GPIO3 z masą powoduje "wyłączenie systemu" natomiast ponowne kliknięcie przycisku uruchamia urządzenie.

  1. sudo nano /boot/config.txt

  2. //Do pliku należy wpisać: 
  3. dtoverlay=gpio-shutdown,gpio_pin=3

Można też ustawić inny pin tak aby przedstawiał aktualny stan RPI.

  1. dtoverlay=gpio-poweroff,gpiopin=27,active_low=1

Aby ten sposób wyłączania Raspberry Pi działał należy wyłączyć interfejs I2C w urządzeniu.

Sposób 2 - Dowolny pin:


Ten sposób dotyczy uruchomienia skryptu działającego w tle, który sprawdza stan na wybranym pinie. 

W poniższym kodzie zastosowałem wywołanie instrukcji wyłączenia Raspberry po 10 sekundach. Tutaj można wprowadzić inny czas bądź inną instrukcję np. reboot.

Można też uruchomić kilka skryptów z różnymi funkcjami np. pod jednym przyciskiem wyłączanie, pod drugim restart itp.

Całość skryptu jest dosyć prosta i wygląda następująco.

Najpierw definicja bibliotek:

  1. from gpiozero import Button
  2. import time
  3. import os

Teraz należy stworzyć dwie zmienne jedna z przypisanym odpowiednim pinem zdefiniowanym jako przycisk, w moim przypadku będzie to GPIO 21 (Można użyć dowolnego natomiast pin 21 czy 26 znajdują się blisko GND i nie posiadają żadnych specjalnych funkcji). Druga zmienna będzie zliczać ilość sekund po której nastąpi wywołanie komendy.

  1. connectedButton= Button(21)
  2. countValuesToShutdown = 0

Teraz pętla while w której właściwie sprawdzamy tylko czy został wciśnięty przycisk, jeśli tak to co sekundę ponownie sprawdzam stan przycisku po czym zwiększam dane dla zmiennej przechowującej czas wciśnięcia. W przypadku przerwania wciśnięcia przycisku przed odliczeniem do wyłączenia nastąpi zresetowanie odliczania czasu.

  1. while True:
  2.         if stopButton.is_pressed:
  3.                 time.sleep(1)
  4.                 if stopButton.is_pressed:
  5.                         checkValue = checkValue + 1
  6.                 else:
  7.                         checkValue=0
  8.                 if checkValue==10:
  9.                         checkValue=0
  10.                         os.system("sudo shutdown now -h")
  11.         if checkValue==0:
  12.                 time.sleep(1)

Cały skrypt dla Python2 oraz Python3:

  1. from gpiozero import Button
  2. import time
  3. import os
  4. connectedButton = Button(21)
  5. countValuesToShutdown = 0
  6. while True:
  7.         if connectedButton.is_pressed:
  8.                 time.sleep(1)
  9.                 if stopButton.is_pressed:
  10.                         countValuesToShutdown = countValuesToShutdown + 1
  11.                 else:
  12.                         countValuesToShutdown =0
  13.                 if countValuesToShutdown ==10:
  14.                         countValuesToShutdown =0
  15.                         os.system("sudo shutdown now -h")
  16.         if countValuesToShutdown ==0:
  17.                 time.sleep(1)

Tutaj podobnie jak w przykładzie pierwszym można wybrać jeden z pinów, który będzie służył do przekazywania informacji o statusie działania systemu. Można to wykonać przez dodanie linijki w pythonie lub wykonać instrukcję jak w przypadku 1.

Uruchomienie skryptu:


W celu wprowadzenia skryptu do uruchamiania przy starcie systemu należy przygotować odpowiedni skrypt .sh. Poniżej krótka instrukcja:

Najpierw w katalogu domowym użytkownika tworzymy plik .sh:

  1. cd /home/pi
  2. sudo nano btnLauncher.sh

Następnym krokiem jest wpisanie instrukcji do pliku launcher'a:

  1. cd /
  2. cd home/pi/btn_turn_off
  3. sudo python btn_turn_off.py
  4. cd /

Zapisuje zmiany i zamykam plik. Następnie należy zmienić uprawnienia przypisanie do pliku oraz odpalić skrypt w celu weryfikacji poprawności działania:

  1. chmod 755 btnLauncher.sh
  2. sh btnLauncher.sh

Teraz należy przejść do folderu home. Gdzie stworzonony zostanie folder przechowujący logi błędów dla Crontab'a.

  1. mkdir logs          //Stworzenie folderu z logami
  2. sudo crontab -e     //Otwarcie okna crontaba
  3. @reboot sh /home/pi/btnLauncher.sh >/home/logs/cronlog 2>&1 //Wprowadzenie uruchamiania sktyptu

Teraz po wpisaniu sudo reboot skrypt zostanie wykonywany. Aby podglądnąć ewentualne błędy należy wejść do folderu logs i otworzyć plik cronlog.