Kursy • Poradniki • Inspirujące DIY • Forum
Symulacja świateł drogowych na Raspberry Pi
Zanim przejdziemy do nowych zagadnień czas na krótką powtórkę z poprzedniego odcinka. Kto z Was spróbował napisać skrypt, który będzie symulował działanie świateł drogowych?
Oto nasza wersja tego zadania. Diody zostały podłączone przez rezystory 1,2kΩ do pinów numer: 16 (czerwona), 20 (żółta) oraz 21 (zielona). Schemat połączeń był więc bardzo prosty:
W praktyce układ prezentował się następująco:
Kolejnym krokiem było przygotowanie skryptu, który powstał na bazie poprzedniej części kursu. Na początku ustawiamy 3 piny jako wyjścia, a następnie w pętli zapalamy lub gasimy poszczególne diody:
#!/bin/bash
gpio -g mode 16 out
gpio -g mode 20 out
gpio -g mode 21 out
while true
do
gpio -g write 16 1
gpio -g write 20 0
gpio -g write 21 0
sleep 1
gpio -g write 20 1
sleep 1
gpio -g write 16 0
gpio -g write 20 0
gpio -g write 21 1
sleep 1
gpio -g write 20 1
gpio -g write 21 0
sleep 1
done
W efekcie otrzymaliśmy prosty sygnalizator, który na zmianę wyświetla poszczególne kombinacje:
"Zadanie domowe" za nami - pora przejść do czegoś nowego!
Gotowe zestawy do kursów Forbota
Komplet elementów Gwarancja pomocy Wysyłka w 24h
Elementy niezbędne do wykonania wszystkich ćwiczeń z kursu podstaw Rasberry Pi dostępne są w formie gotowych zestawów!
Zamów w Botland.com.pl »Generowanie sygnału PWM na Raspberry Pi
Malinka potrafi generować sygnał PWM, który najczęściej wykorzystywany jest do zmiany jasności świecenia diod (w tym taśm LEDowych). Jest on również przydatny, gdy chcemy sterować prędkością silników lub pozycją serw modelarskich.
Więcej na ten temat znajduje się w kursie elektroniki II – #6 – sterowanie sygnałem PWM.
W naszym przypadku najłatwiej będzie zacząć od diody świecącej. Podłączmy ją przez rezystor 1,2kΩ do pinu numer 12, zgodnie z poniższym schematem:
Następnie wydajemy poniższe polecenie, które odpowiednio skonfiguruje pin. Polecenie można wpisać bezpośrednio w konsoli lub stworzyć skrypt (tak jak robiliśmy to w poprzedniej części kursu).
gpio -g mode 12 pwm
Poprzednio do zmiany stanu pinu wykorzystywaliśmy słowo kluczowe write, tym razem będzie to pwm. Oprócz numeru pinu musimy podać również parametr, który będzie określał wypełnienie sygnału PWM. Parametr ten przyjmuje wartości z zakresu 0-1024, gdzie 1024 oznacza 100% wypełnienia.
Przykładowo, aby dioda świeciła z pełną jasnością wydamy polecenie:
gpio -g pwm 12 1024
Aby ją wyłączyć wpiszemy:
gpio -g pwm 12 0
Jeśli argumentem będzie inna liczba (np. 800) to dioda będzie świeciła z mniejszą jasnością. Najlepiej poeksperymentować w tym miejscu testując kilka różnych wartości np.: 300, 400, 800.
Niestety opisywany mechanizm nie działa na każdym pinie. PWM sprzętowy jest dostępny tylko na GPIO12 i GPIO18. Pozostałe piny mogą generować sygnał PWM tylko programowo, ale nie będziemy się tym teraz zajmować.
Uniwersalne wejścia w Raspberry Pi
Potrafimy już sterować wyjściami malinki, czas odczytać sygnał z zewnątrz. W tym celu podłączmy jedno wyprowadzenie przycisku do pinu numer 26, a drugie do masy (GND).
Nie odłączamy poprzednio używanej diody, ponieważ jeszcze nam się przyda.
Jak wiemy, domyślnie wszystkie piny są wejściami, jednak możemy być zaskoczeni próbując odczytać wartość z pinu 26 - ciągle będzie tam zero. Nie mamy rezystora podciągającego na płytce, ale tak jak w przypadku mikrokontrolerów, możemy go aktywować w procesorze.
W tym celu ustawiamy tryb up (od pull-up):
gpio -g mode 26 up
Teraz możemy odczytać stan pinu pisząc:
gpio -g read 26
Powinniśmy uzyskać wynik "1", a po naciśnięciu przycisku "0".
"Zero" uzyskamy tylko, gdy podczas wydawania polecenia przycisk będzie wciśnięty.
Działanie przycisku w praktyce widoczne jest na poniższym zrzucie ekranu:
Odczytywanie stanu wejścia w przerwaniu
Ciągłe odczytywanie wartości może być męczące zarówno dla nas, jak i dla procesora. Dlatego znacznie lepiej wykorzystać mechanizm przerwań. Poniższe polecenie sprawi, że program zatrzyma się do chwili, gdy naciśniemy przycisk (zbocze opadające sygnału, czyli falling):
gpio -g wfi 26 falling
To polecenie wykorzystuje przerwania, więc nie marnujemy czasu procesora na "aktywne czekanie" i ciągłe sprawdzanie stanu tego wejścia.
Po wydaniu powyższego polecenia program się zatrzyma (co widać na lewym zrzucie ekranu), a po wciśnięciu przycisku wykona się do końca. W tym wypadku oznacza to zakończenie działania skryptu, bo składał się on tylko z jednej linijki:
Za chwilę wykorzystamy mechanizm przerwań w praktyce - wtedy wszystko się wyjaśni.
Raspberry Pi jako aparat fotograficzny
Wiemy już jak pisać skrypty i sterować portami GPIO w podstawowym zakresie. Pora wykorzystać to do zbudowania czegoś praktycznego. Napiszemy skrypt, który zmieni malinkę w aparat fotograficzny.
Będzie on wyposażony dodatkowo w przycisk, diodę i buzzer. Zdjęcie będzie robione po wciśnięciu przycisku, a pozostałe elementy będą sygnalizowały (światłem i dźwiękiem) stan aparatu. Dzięki temu każdy będzie mógł zrobić zdjęcie malinką.
Do wcześniej złożonego układu dodajemy moduł buzzera, a do Raspberry Pi podłączamy dedykowaną kamerę. Aktualnie używane piny to:
- pin numer 21 - moduł buzzera,
- pin numer 12 - dioda podłączona przez rezystor 1,2kΩ,
- pin numer 26 - przycisk.
W praktyce będziemy musieli okiełznać małą plątaninę kabli:
Zacznijmy pisać skrypt. Na początku konieczna jest konfiguracja GPIO. Do pinu 21 podłączamy buzzer, pin 12 będzie sterował diodą, a do pinu numer 26 podłączamy przycisk:
# konfiguracja pinow
gpio -g mode 21 out #Buzzer
gpio -g mode 12 pwm #LED
gpio -g mode 26 up #Przycisk
Następnie damy znać użytkownikowi (włączając diodę), że aparat jest gotowy i oczekuje na wciśnięcie przycisku. Wyjście, do którego podłączyliśmy diodę zostało skonfigurowane jako PWM, więc możemy sterować jasnością naszego sygnalizatora. Gdy użytkownik naciśnie przycisk program ruszy dalej:
# wlacz diode i poczekaj na przycisk
gpio -g pwm 12 800
gpio -g wfi 26 falling
Teraz wyłączymy diodę i włączymy buzzer, który zasygnalizuje robienie zdjęcia:
# zgaszenie diody, uruchomienie buzzera
gpio -g pwm 12 0
gpio -g write 21 0
Kolejny, najważniejszy krok, to wykonanie zdjęcia. W tym celu wykorzystujemy dobrze nam znany program raspistill. Dla przypomnienia wystarczy jedna linijka:
raspistill -t 200 -n -o 'zdjecie-%d.jpg' -dt
Na koniec wyłączamy buzzer:
# wyciszenie buzzera
gpio -g write 21 1
Ostatecznie skrypt aparat.sh ma więc postać:
#!/bin/sh
# konfiguracja pinow
gpio -g mode 21 out #Buzzer
gpio -g mode 12 pwm #LED
gpio -g mode 26 up #Przycisk
# wlacz diode i poczekaj na przycisk
gpio -g pwm 12 800
gpio -g wfi 26 falling
# zgaszenie diody, uruchomienie buzzera
gpio -g pwm 12 0
gpio -g write 21 0
# zdjecie :)
raspistill -t 200 -n -o 'zdjecie-%d.jpg' -dt
# wyciszenie buzzera
gpio -g write 21 1
Na koniec nadajemy odpowiednie uprawnienia (szczegóły omówiliśmy poprzednio):
chmod +x aparat.sh
Teraz uruchamiamy "aparat fotograficzny":
./aparat.sh
Po starcie programu włączy się dioda, która poinformuje użytkownika o gotowości aparatu. Wciśnięcie przycisku wyłączy diodę i uruchomi buzzer. Dźwięk ucichnie, gdy zdjęcie zostanie zrobione. Działanie programu przedstawione jest graficznie na poniższej animacji:
Wykonane zdjęcia możemy podejrzeć np. przez WinSCP:
Podsumowanie
Podczas tego artykułu uzupełniliśmy informacje na temat wykorzystywania GPIO. Stworzyliśmy również skrypt, który łączył uniwersalne porty wejścia/wyjścia z innymi peryferiami (kamerą). Opisane tutaj podstawy są wystarczające do wykonania wielu przydatnych skryptów. W dalszej części kursu zajmiemy się pisaniem prostych programów w Pythonie. Dzięki temu korzystanie z GPIO będzie jeszcze łatwiejsze, szczególnie, gdy będziemy chcieli podłączyć bardziej skomplikowane peryferia.
Nawigacja kursu
Autor: Piotr Bugalski
Testy, ilustracje: Piotr Adamczyk
Redakcja: Damian Szymański
Powiązane wpisy
GPIO, kursRaspberryPi, malinka, PWM, rpi
Trwa ładowanie komentarzy...