Kurs Raspberry Pi – #16 – PWM, wejścia, kamera w Pythonie

Kurs Raspberry Pi – #16 – PWM, wejścia, kamera w Pythonie

Dzięki znajomości Pythona można przygotować wiele ciekawych projektów na Raspberry Pi. Za pomocą skryptów łatwo wysterujemy piny GPIO i wykorzystamy przeróżne peryferia.

Tym razem zajmiemy się generowaniem PWM, obsługą wejść oraz kamery z poziomu Pythona.

Tematyka odcinka tego kursu powinna brzmieć już znajomo. Sprawdzaliśmy już raz jak generować PWM, obsługiwać wejścia oraz korzystać z kamery. Ćwiczenia takie wykonywaliśmy w 13. części kursu. Wtedy wykorzystywaliśmy skrypty powłoki. Tym razem sprawdzimy jak podobne ćwiczenia wykonać w Pythonie. Będzie to kolejny dowód na to, że Raspberry Pi jest bardzo uniwersalną platformą. Jedno zadanie można wykonać na kilka różnych sposób.

Generowanie sygnału PWM w Pythonie

Podobnie jak w 13. części kursu zacznijmy od prostego przykładu z jedną diodą. Podłączmy ją przez rezystor 1,2kΩ do pinu numer 12, zgodnie z poniższym schematem:

Schemat podłączenia diody do Raspberry Pi.

W praktyce układ ten będzie wyglądał następująco:

Przechodzimy do programu. W przypadku Pythona, gdy chcemy wygenerować sygnał PWM musimy zacząć od utworzenia instancji, do której przypiszemy informację na temat pinu oraz częstotliwości. Robimy to za pomocą następującej linijki:

Jeśli chcemy utworzyć instancję PWM o częstotliwości np. 50 Hz na pinie numer 12 nazwaną jako dioda to będzie to wyglądało następująco:

Następnie tworzymy zmienną wypelenienie, która jak sama nazwa wskazuje będzie zawierała informację o aktualnym wypełnieniu sygnału PWM (wartości od 0 do 100 - bez znaku %). Kolejny krok to uruchomienie PWM, jako argument tej funkcji podajemy oczekiwane wypełnienie.

Od teraz na pinie numer 12 będzie generowany sygnał PWM. Jego wypełnienie możemy cały czas zmieniać za pomocą następującej linijki:

Składając więc informacje z poprzednich części kursu w całość możemy stworzyć prosty program, który będzie w pętli zmieniał wypełnienie PWM. W praktyce będzie to oznaczało łagodne rozświetlanie się diody. Cały program może wyglądać następująco:

Pod koniec programu umieszczona została jeszcze jedna nowa linijka dioda.stop(), której chyba nie trzeba tłumaczyć. Oczywiście odpowiada ona za zatrzymanie "generatora" PWM na danym pinie. W trakcie działania programu możemy również regulować częstotliwość PWM. W tym celu należy skorzystać z następującego zapisu: dioda.ChangeDutyCycle(XXX).

Zestaw elementów do kursu

Gwarancja pomocy na forum Błyskawiczna wysyłka

Elementy niezbędne do wykonania wszystkich ćwiczeń z kursu podstaw Rasberry Pi dostępne są w formie gotowych zestawów!

Kup w Botland.com.pl

PWM na kilku pinach jednocześnie?

W 13. części kursu ostrzegaliśmy, że sprzętowy PWM działa jedynie na dwóch konkretnych pinach. Tym razem nie musimy się ograniczać. W Pythonie korzystamy z PWM generowanego programowo. Dzięki temu bez problemu możemy wygenerować ten sygnał na dowolnych pinach GPIO.

Do wcześniejszego układu dodajmy drugą diodę na przykład do pinu numer 21 Sprawdźmy teraz czy jesteśmy w stanie wygenerować sygnał PWM również na tym pinie. Schemat układu:

Schemat podłączenia diod do Raspberry Pi.

Przykład podłączenia w praktyce:

Program wygląda podobnie do poprzedniego. Dodana została tylko informacja o drugiej diodzie:

Po jego uruchomieniu powinniśmy zauważyć, że obie diody zwiększają swoją jasność z minimalnie różna prędkością (wypełnienie pierwszej zwiększamy za każdym razem o 5%, a drugiej o 2%). Wniosek z tego taki, że PWM sprzętowy faktycznie działa i możemy wykorzystywać go na dowolnych pinach!

Warto pamiętać, że bibliotek do obsługi PWM jest znacznie więcej, niektóre z nich mogą generować PWM w zupełnie inny sposób - np. wspomagając się sprzętowo DMA (dzięki temu przebieg PWM jest znacznie stabilniejszy). W kursie tym omawiamy tę jedną, najpopularniejszą metodę.

Wejścia Raspberry Pi w Pythonie

Pora do naszej układanki dodać kolejny element - obsługę GPIO w trybie wejść. Twórcy bibliotek zadbali, aby również ta operacja była łatwa. Podłączamy układ zgodnie z poniższym schematem: dioda przez rezystor do pinu numer 12, a przycisk do masy oraz do pinu numer 26.

Schemat podłączenia diody i przycisku.

Podłączenie w praktyce:

Zaczynamy od deklaracji wejścia z podciągnięciem do dodatniej szyny zasilania (pull-up):

Następnie wystarczy sprawdzać wartość zwracaną przez zapis GPIO.input(26), jeśli w wyniku wywołania tej operacji otrzymamy 0 (stan niski) to będzie oznaczało, że przycisk jest wciśnięty.

Program włączający diodę w momencie wciśnięcia przycisku będzie więc wyglądał następująco:

Oczekiwanie na wciśnięcie przycisku

Biblioteka, z której korzystamy została wyposażona w wygodne "narzędzie", które pozwala wstrzymać program do momentu wykrycia danego zbocza (nas interesuje wciskanie przycisku, czyli zbocze opadające), co zapisujemy następująco: GPIO.wait_for_edge(26, GPIO.FALLING).

Poniższy program skonfiguruje piny i będzie czekał na wciśnięcie przycisku. Gdy tak się stanie dioda zostanie włączona na 2 sekundy, a następnie zgaśnie.

Obsługa kamery w Pythonie

Ostatnim krokiem, który powinniśmy odtworzyć z 13. części kursu jest obsługa kamery. To również możemy wykonać za pomocą odpowiednich bibliotek - nie musimy korzystać z raspistill. Zaczynamy od podłączenia wszystkiego w następujący sposób:

  • pin numer 21 - moduł buzzera,
  • pin numer 12 - dioda podłączona przez rezystor 1,2kΩ,
  • pin numer 26 - przycisk,
  • dodatkowo, do dedykowanego złącza podłączamy oczywiście kamerę.
Kurs Raspberry Pi – #10 – kamera, zdjęcia, transmisja obrazu
Kurs Raspberry Pi – #10 – kamera, zdjęcia, transmisja obrazu

Do tej pory omówiliśmy najważniejsze tematy związane z instalacją i… Czytaj dalej »

Schemat podłączenia:

Schemat podłączenia wszystkich elementów.

Nasza "plątanina" kabli w praktyce:

Pora przejść do programu tym razem pomocna będzie bardzo rozbudowana biblioteka PiCamera. Na szczęście jej podstawowe wykorzystanie nie wymaga od nas studiowania całej dokumentacji. Program w najprostszej postaci będzie wyglądał tak jak poniżej (niezbędne wyjaśnienia w komentarzach):

Przypominam, że nasz moduł buzzera działa w "logice odwrotnej" dlatego ustawiając stan HIGH wyłączamy dźwięk, a stan LOW go uruchamia. Jak widać używanie kamery z opisywaną biblioteką jest bardzo proste, wydaje się wręcz łatwiejsze od obsługi przez raspistill.

W praktyce po uruchomieniu programu włącza się dioda. Wciśnięcie przycisku powoduje jej wyłączenie i włączenia buzzera (na 5 sekund). Po tym czasie buzzer jest wyłączany, a kamera robi nam zdjęcie.

Symulacja działania naszego aparatu.

W powyższym programie zdjęcie jest zawsze zapisywane z nazwą "foto.jpg". Oczywiście lepiej byłoby, aby nazwy były unikalne. W tym celu możemy dodać do nazwy pliku timestamp (informacja o czasie zrobienia zdjęcia), w praktyce wygląda to następująco:

Wyjaśnienia może wymagać fragment "str(int(time.time()))". Idąc od środka: najpierw za pomocą time.time() uzyskujemy aktualny timestamp, ale niestety jest on zwracany jako float (ma wartość po przecinku, która w tym przypadku jest problematyczna). Dlatego za pomocą int(), konwertujemy wartość do liczby całkowitej, a następnie do stringa (tekstu) za pomocą str(). Tak zamieniona wartość trafia do nazwy pliku:

Nazwa pliku z dodanym znacznikiem czasu.

Podsumowanie

Za nami kilka przykładów wykorzystania Pythona, które (mam nadzieję) przekonały większość z Was, że język ten jest całkiem przyjazny dla początkujących. W ramach ćwiczeń dodatkowych zachęcam do sprawdzenia dokumentacji biblioteki PiCamera można tam znaleźć wiele ciekawych informacji. Warto eksperymentować np. z rozdzielczością plików, filtrami oraz innymi ustawieniami obrazu. Dajcie znać w komentarzach, która z metod przypadła Wam bardziej do gustu - skrypty powłoki czy Python?

Nawigacja kursu

Autor: Damian Szymański
Przykłady, ilustracje: Piotr Adamczyk

GPIO, kamera, kurs, kursRaspberryPi, Python