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ć.
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:
- Raspberry z Raspbianem (może od razu taki starter kit)
- płytka stykowa i adapter do płytki stykowej
- moduł 8 przekaźników
- przewody męsko-żeńskie
- obudowa do RPi z wycięciami na GPIO
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:
„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.”
Spacje działają doskonale, tylko trzeba być konsekwentnym.
@pm
Racja, skrót myślowy. Dzięki za zwrócenie uwagi.
To jakiś dziwny python albo edytor zamienia taby na spacje. W pythonie używa sie SPACJI do wcięć!
A czy jest jakiś poradnik jak wysterować 24 przekaźniki?
@Sylwek
Najprościej byłoby połączyć 8-mio kanałowe przekaźniki z modułami PCF, powinno dać radę: https://nettigo.pl/products/modul-pcf8574-8-bitowy-port-sterowany-i2c ale jak mówię nie mamy chyba gotowego przykładu.
kurde w cholerę nie rozumiem tego sterowania stanem wysokim/niskim. Skoro przekaźnik ma 2 stany otwarty i zamknięty. Jeżeli wiem że w ciągu doby coś ma być włączone albo wyłączone przez tylko 5 minut to wybieram tak podłączenie do przekaźnika aby głównie był w „trybie czuwania” i był to jego stan domyślny. Jeśli zabraknie prądu i przekaźnik się zresetuje to i tak ma stan który chce. Samo programowanie jakie ma znaczenie skoro to tylko HIGH/LOW. Sam kupiłem przekaźniki sterowane wysokim st. i nie mogłem sie na poączątku połapać o co kurła chodzi.