KursyPoradnikiInspirujące DIYForum

Kurs Raspberry Pi – #13 – PWM, wejścia, skrypty z kamerą

Kurs Raspberry Pi – #13 – PWM, wejścia, skrypty z kamerą

Za nami podstawy GPIO i pierwsze skrypty. Tym razem przetestujemy w praktyce generowanie sygnału PWM. Wykorzystamy również piny jako wejścia naszego układu.

Na zakończenie napiszemy skrypt, który połączy GPIO oraz dedykowaną kamerę. Dzięki temu zamienimy Raspberry Pi w aparat fotograficzny.

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:

Schemat podłączenia diod do Raspberry Pi.

Schemat podłączenia diod do Raspberry Pi.

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:

Działanie sygnalizatora świateł drogowych w praktyce.

Działanie sygnalizatora świateł drogowych w praktyce.

"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.

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:

Schemat podłączenia diody do pinu nr 12.

Schemat podłączenia diody do pinu nr 12.

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.

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). 

Podłączenie przycisku do Raspberry Pi.

Podłączenie przycisku do Raspberry Pi.

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". 

Działanie przycisku w praktyce widoczne jest na poniższym zrzucie ekranu:

Odczytanie stanu przycisku.

Odczytanie stanu przycisku.

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

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.
Podłączenie wszystkich niezbędnych elementów do Raspberry Pi.

Podłączenie wszystkich niezbędnych elementów do Raspberry Pi.

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:

Graficzne

Graficzne "opis" działania aparatu.

Wykonane zdjęcia możemy podejrzeć np. przez WinSCP:

Widok zdjęć zapisanych na Raspberry Pi przez nasz skrypt aparatu.

Widok zdjęć zapisanych na Raspberry Pi przez nasz skrypt aparatu.

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.

Czy wpis był pomocny? Oceń go:

Średnia ocena 4.9 / 5. Głosów łącznie: 103

Nikt jeszcze nie głosował, bądź pierwszy!

Artykuł nie był pomocny? Jak możemy go poprawić? Wpisz swoje sugestie poniżej. Jeśli masz pytanie to zadaj je w komentarzu - ten formularz jest anonimowy, nie będziemy mogli Ci odpowiedzieć!

Nawigacja kursu

Autor: Piotr Bugalski
Testy, ilustracje: Piotr Adamczyk
Redakcja: Damian Szymański

GPIO, kursRaspberryPi, malinka, PWM, rpi

Trwa ładowanie komentarzy...