RPi: podstawy – sterowanie GPIO i przekaźnikami

Niedawno dostaliśmy pytanie od jednego klienta – jak sterować przekaźnikami z Raspberry Pi. Ponieważ nie było to pierwsze pytanie takiego typu, postanowiłem napisać kilka słów tutaj.

W ofercie Nettigo mamy już kilka różnych modułów przekaźników. Różnią się ilością przekaźników, napięciem zasilającym oraz sposobem sterowania. Niektóre z nich mają (w uproszczeniu – te czerwone) możliwość wyboru, który stan logiczny (niski czy wysoki) będzie oznaczał że przekaźnik jest włączony. Ponieważ każdy przekaźnik ma trzy wyjścia (wspólne, normalnie wyłączone i normalnie włączone) da się dobrać właściwe podłączenie niezależnie od tego jak sterujesz przekaźnikiem. Może mieć to wpływ tylko na wygodę programowania oraz na pobór prądu – wskazane jest by przekaźnik był raczej wyłączony niż włączony. Zużywa wtedy mniej prądu a i cewka się nie grzeje. Warto to mieć na uwadze, bo np moduł 8-mio kanałowy, jeśli włączymy wszystkie 8 przekaźników będzie pobierał ponad 500 mA. To już całkiem sporo.

No dobra, gadamy o jakiś niuansach, ale Ciebie pewnie interesuje jak, cholera włączyć ten przekaźnik z Twojego RPi. Ok, przejdźmy do rzeczy. Zakładam, że masz Raspberry z Raspbianem. Pokaże Ci jak podłączyć do niego moduł przekaźnika i korzystając z Pythona włączyć go i wyłączyć.

RPi steruje przekaźnikiem
RPi steruje przekaźnikiem

Użyliśmy modułu 8-mio kanałowego, ale sterujemy tylko jednym. Podłączenie jest proste, wyjścia 5V i GND na Raspberry podłączamy do Vcc i GND na module. Wyjście na RPi oznaczone na przejściówce do płytki stykowej enigmatycznym #4 to nic innego jak GPIO4. Ten sygnał podłączamy do pinu sterującego wybranego przekaźnika.

Teraz pozostaje napisać skrypt demonstrujący jak się włącza i wyłącza przekaźnik. Oto cały, przyznam skomplikowany kod:

import RPi.GPIO as GPIO
import time


rel = 4
GPIO.setmode(GPIO.BCM)
GPIO.setup(rel,GPIO.OUT, initial=GPIO.HIGH)

while True:
        GPIO.output(rel,GPIO.LOW)
        time.sleep(5) 
        GPIO.output(rel,GPIO.HIGH)
        time.sleep(15)





Kolejno: import w dwóch pierwszych liniach pozwala korzystać z biblioteki GPIO oraz funkcji sleep by opóźnić działanie programu.

rel = 4 to zapisanie numeru GPIO w zmiennej. Jeśli zmienimy pin do którego dopięliśmy przekaźnik, to wystarczy wtedy zmienić tylko w jednym miejscu jego numer.

Nim rozpoczniemy ustawiać GPIO w naszym skrypcie, to najpierw ustalamy zasady numeracji tychże. Robi to: GPIO.setmode(GPIO.BCM). Są dwa tryby GPIO.BCM i GPIO.BOARD. Pierwszy oznacza,  że liczba 4 to GPIO4, a np 13 to GPIO13. W trybie BOARD nr który podamy to będzie numer fizycznego pinu na złączu GPIO w Raspberry. I tak GPIO4 jest na fizycznym pinie 7, a GPIO13 na 33. Rozpiskę bez trudu znajdziecie, ale na razie – korzystajcie po prostu z trybu BCM.

Jak już ustalimy jak gadać z biblioteką byśmy o tych samych GPIO mówili, zostaje ustawienie trybu pracy konkretnego GPIO. Ponieważ chcemy sterować modułem przekaźnika to potrzebujemy trybu OUT. O dziwo, mamy do wyboru jeszcze tryb IN, który służyć nam może do odczytu stanu GPIO, ale to nie tym razem. Robimy to komendą setup: GPIO.setup(rel,GPIO.OUT, initial=GPIO.HIGH) Pierwszy argument to nr GPIO rozumiany zgodnie z konwencją ustaloną przez setmode. Jak pamiętacie, rel ma wartość 4, także ustawiamy GPIO4 (bo tryb jest BCM a nie BOARD) w tryb wyjścia. Trzeci argument mówi jaką wartość logiczną ma mieć pin nim go ustawimy. Domyślnie jest stan niski (LOW). Tutaj chcemy by „bez niczego” nasz moduł przekaźnika był wyłączony, a stan niski go włącza. Dlatego każemy Raspberry użyć trybu HIGH na GPIO, gdy nic nie ustawimy.

Ale nie będziemy czekać, tylko od razu wchodzimy do wiecznej pętli (czyli wykonującej się do czasu wyłączenia RPi lub naciśnięcia Ctrl+C) while True: Tu uwaga, jeżeli to jest Twoje pierwsze starcie z Pythonem – wiedz, że formatowanie kodu programu ma ogromne znacznie i do wcięć trzeba używać TAB a nie spacji.

Całość kodu w pętli to włączenie przekaźnika  przez ustawienie stanu LOW: GPIO.output(rel,GPIO.LOW), odczekanie 5 sekund, ustawienie stanu HIGH: GPIO.output(rel,GPIO.HIGH) i odczekanie 15 sekund. I tak w nieskończoność.

Tyle na początek. Lista użytych elementów:

Obudowa jest warta polecenia, Raspberry mocuje się za pomocą wkrętów – solidnie siedzi i żadne operacje z taśmą GPIO czy portami USB go nie poruszy: