Kurs Raspberry Pi – #14 – podstawy Pythona, GPIO

Kurs Raspberry Pi – #14 – podstawy Pythona, GPIO

Wiemy już jak korzystać z uniwersalnych pinów GPIO za pomocą linii poleceń oraz skryptów konsoli. Często okazuje się, że takie sterowanie nie jest jednak zbyt wygodne.

W tej części pokażemy jak korzystać z GPIO przy pomocy Pythona. Przy okazji poznamy podstawy tego popularnego języka programowania.

Dużą zaletą (która czasem jest wadą) malinki jest możliwość rozwiązywania tego samego problemu na wiele sposobów. W przypadku Arduino życie jest prostsze. W zdecydowanej większości przypadków mamy Arduino IDE, piszemy program w C++ i uruchamiamy go naciskając 1 przycisk. Raspberry Pi daje więcej możliwości, co czasem utrudnia wybór odpowiedniego rozwiązania. Warto jednak poznać różne metody wykonywania podobnych zadań na malince.

Python - co warto wiedzieć?

W tej części zajmiemy się niezwykle popularnym ostatnio językiem programowania, czyli Pythonem. Na początek dwa słowa wyjaśnienia. Po pierwsze, co dla wielu może być szokiem, nazwa tego języka nie ma nic wspólnego z wężami.  "Python" pochodzi od serialu Latający Cyrk Monty Pythona, jeśli ktoś go nie oglądał, to chyba najwyższy czas nadrobić zaległości!

Druga sprawa to wersje języka: obecnie używane są dwie główne - Python 2.x oraz 3.x. W największym skrócie, około dziesięć lat temu twórcy języka postanowili dokonać znacznych modyfikacji i wprowadzić nową wersję oznaczoną numerem 3. Niestety okazało się, że język jest już na tyle popularny, że gwałtowne zmiany nie są mile widziane. W efekcie zamiast zastąpienia wersji 2 przez nową wersję 3, nadal istnieją obie - niejako równolegle.

Warto jednak wiedzieć, że możemy zetknąć się z kodem oraz opisami odnoszącymi się do poprzedniej edycji. Więcej informacji o samym języku (oraz o jego wersjach) znajdziemy chociażby na Wikipedii.

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

Uruchomienie interpretera Pythona na Raspberry Pi

Python jest zaliczany do języków interpretowanych, działa więc podobnie tak jak skrypty shella bez potrzeby kompilacji. Do działania jest jednak konieczny interpreter języka. Używany przez nas Raspbian, podobnie jak wiele innych dystrybucji, domyślnie dostarcza interpreter Pythona.

Pora przejść do praktyki! Na początek łączymy się z RPi w wybrany przez nas sposób (np. przez SSH) i sprawdzamy, która wersja Pythona używana jest domyślnie. W tym celu wydajemy polecenie:

W naszym przypadku jest to wersja 2.7.13. Jeśli chcemy być pewni, że używamy wersji 2 to zamiast python powinniśmy uruchomić program python2, czyli:

Podobnie będzie dla wersji 3:

Sprawdzenie wersji Pythona.

Interaktywna praca z Pythonem

Jedną z zalet języków interpretowanych jest możliwość wpisywania i wykonywania komend pojedynczo. Zupełnie tak, jak w przypadku poleceń konsoli. Sprawdźmy teraz jak to działa. Uruchamiamy interpreter Pythona poleceniem python3:

Zobaczymy znak zachęty składający się z trzech znaków większości. To właśnie w tym miejscu możemy wpisywać polecenia, które zostaną potraktowane jako kod Pythona:

Interpreter Pythona na Raspberry Pi.

Na początek "nieśmiertelny przykład", czyli Hello world!:

Popularne "Hello World!" na Raspberry Pi w Pythonie.

Jak widzimy program odpowiedział wypisując komunikat. Za pomocą print można wypisywać również nieco bardziej skomplikowane wiadomości lub wyniki obliczeń:

Obliczenia matematyczne w Pythonie.

Sterowanie liniami GPIO w Pythonie

Niniejszy kurs nie koncentruje się na programowaniu, więc musimy odłożyć dokładne omówienie samego języka na inną okazję - teraz poznamy w praktyce tylko najważniejsze podstawy. Przejdźmy od razu do przykładu z wykorzystaniem linii GPIO.

Wcześniej sterowaliśmy już diodą (z linii poleceń), warto zacząć od takiego samego ćwiczenia. Podłączamy identyczny obwód, z którego korzystaliśmy w części o sterowaniu GPIO. Diodę świecącą podłączamy do pinu numer 40 (oznaczonego jako GPIO21). Pin ten znajduje się w narożniku złącza, a jego bliskim "sąsiadem" jest pin numer 39 (GND).

Schemat podłączenia diody do Raspberry Pi.

W praktyce układ może wyglądać następująco:

Do sterowania pinami potrzebujemy odpowiedniej biblioteki. Właściwie zawsze pisząc programy w Pythonie wykorzystujemy jakieś biblioteki. Trzeba przyznać, że w porównaniu z innymi językami Python pozwala na łatwe i przyjemne używanie gotowych rozwiązań.

Nie inaczej jest w naszym przypadku - tym co potrzebujemy jest biblioteka RPi.GPIO. Sama biblioteka jest już zainstalowana (pakiet python3-rpi.gpio), co możemy sprawdzić poleceniem:

Teraz wystarczy ją zaimportować. W przypadku Arduino import nowej biblioteki wymaga użycia myszki, w Pythonie po prostu piszemy:

Moglibyśmy napisać samo "import RPi.GPIO", ale wtedy za każdym razem musielibyśmy podawać przedrostek "RPi." przed nazwą wywoływanej funkcji. Mieszanka małych i wielkich liter w nazwie to programistyczny koszmar. Za pomocą dopisku "as GPIO" wprowadzamy naszą lokalną nazwę GPIO, co znacznie ułatwia pracę z biblioteką.

Jak pamiętamy z wcześniejszych odcinków, obsługa pinów na Raspberry obarczona jest pewnym bałaganem numeracyjnym. W Pythonie ten bałagan również istnieje. Zanim użyjemy pinów musimy wybrać sposób numeracji. Chcemy używać pinu GPIO21, więc piszemy:

Teraz nasza dioda będzie miała numer 21. Moglibyśmy wykorzystać inną numerację pisząc na przykład "GPIO.setmode(GPIO.BOARD)", wtedy użyty byłby fizyczny numer pinu na złączu. Zgodnie z tym opisem nasza dioda byłaby wtedy podłączona do pinu numer 40.

Zostajemy jednak przy naszej numeracji (BCM). Podobnie jak poprzednio, na początku ustawiamy tryb linii jako wyjście. W tym celu piszemy:

Czas wreszcie włączyć diodę. W tym celu musimy ustawić na linii GPIO21 stan wysoki:

Diodę wyłączymy stanem niskim, czyli:

Na zakończenie zabawy pinami powinniśmy po sobie "posprzątać", czyli przywrócić używane przez nasz program piny do ich domyślnej konfiguracji. Służy do tego polecenie:

Aby wyjść z interpretera Pythona możemy posłużyć się znaną nam już konfiguracją CTRL+Z.

Tworzenie skryptów w Pythonie

Pobawiliśmy się w trybie interaktywnym - jest to świetna metoda na poznanie bibliotek oraz samego języka. Jednak wpisywanie za każdym razem od nowa poleceń bywa męczące, spróbujemy więc napisać skrypt, czyli kod programu, który będziemy mogli wykonywać wielokrotnie.

W przypadku Pythona pisanie skryptów jest bardzo proste. Uruchamiamy nasz ulubiony edytor tekstu i tworzymy nowy plik - tym razem z rozszerzeniem "py" jak Python.

W jego wnętrzu wpisujemy następującą zawartość:

Na końcu skryptu nie ma wywołania GPIO.cleanup() ponieważ sprzątanie wyłączyłoby diodę. To w sumie racjonalne rozwiązanie, ale w tym przypadku byłoby niewygodne. Niestety zostawienie kodu bez sprzątania przy kolejnym użyciu pinów generuje ostrzeżenia (ang. warnings). Więc, aby nie widzieć tych ostrzeżeń wyłączamy takie komunikaty wywołaniem GPIO.setwarnings(False). Nie jest to całkiem eleganckie rozwiązanie, ale w tym przypadku spokojnie możemy tak postąpić.

Analogicznie tworzymy skrypt do wyłączania diody:

Jego zawartość będzie praktycznie identyczna (zmieniamy jedynie stan pinu):

Tak napisane skrypty uruchamiamy za pomocą polecenia:

lub:

W przypadku skryptów napisany w Pythonie, przed uruchomieniem programów, nie musimy zmieniać uprawnień plików tak, jak miało to miejsce w przypadku skryptów pisanych w shellu.

Pętle i opóźnienia w Pythonie

Przejdźmy do kolejnych elementów nowego języka, napiszmy program, który będzie migał diodą. Aby miganie było widoczne musimy wprowadzić opóźnienia. W tym celu wykorzystamy bibliotekę time. Ona również jest już domyślnie zainstalowana i wystarczy ją zaimportować.

Tym razem wykorzystamy inną postać instrukcji importującej:

Teraz wszystkie funkcje zawarte w "time" będą dostępne w naszym programie bez konieczności pisania nazwy biblioteki na początku. To nieco mniej eleganckie, ale czasem wygodniejsze rozwiązanie.

W zaimportowanej bibliotece znajdziemy funkcję sleep(). Jak łatwo się domyślić usypia ona program na wybrany okres czasu. Parametrem jest czas w sekundach - ale można używać ułamków, więc jeśli chcemy uśpić program na 200 ms wystarczy napisać:

Aby dioda mogła migać potrzebna będzie jeszcze pętla. Podobnie jak w C mamy w Pythonie pętlę while, która wykonuje się dopóki jej parametr jest prawdziwy.

Pętlę nieskończoną zapisujemy więc tak:

Co ciekawe Python nie używa instrukcji typu begin/end lub nawiasów klamrowych { } do definiowania bloków kodu. To wcięcia definiują kolejne bloki programu. Dzięki temu programy pisane w Pythonie muszą być ładnie formatowane - inaczej nie zadziałają.

Ciężko powiedzieć jednoznacznie, czy to zaleta języka, czy brak umiejętności programowania jego twórców. Dawne języki też wymagały starannego dbania o pozycjonowanie instrukcji i jakoś nikt nie traktował wtedy tego jako zalety...

Korzystając z opisanych tutaj elementów Pythona można stworzyć skrypt np. blink.py:

Po jego uruchomieniu dioda będzie migać:

Skrypt migający diodą w praktyce.

Światła drogowe w Pythonie

Dla dalszego treningu warto odtworzyć układ świateł drogowych opisywany w poprzedniej części kursu. Tym razem napiszemy analogiczny program w Pythonie. Tak jak poprzednio diody podłączamy przez rezystory 1,2kΩ do pinów numer: 16 (czerwona), 20 (żółta) oraz 21 (zielona).

Schemat podłączenia diod do Raspberry Pi.

W praktyce układ prezentował się następująco:

Kod gotowego programu będzie wyglądał następująco:

Efekt działania powinien być identyczny jak poprzednio:

Działanie sygnalizatora świateł drogowych w praktyce.

Podsumowanie

W tej części kursu zobaczyliśmy jak można pisać skrypty wykorzystując język Python. Jest to bardzo prosty i popularny ostatnimi czasy język. Jego zaletą jest nieco wyższa wydajność programów niż w przypadku skryptów powłoki, ale co ważniejsze większa czytelność kodu.

W kolejnej części kursu zajmiemy się kolejnymi podstawami Pythona, co pokaże jeszcze więcej zalet tego języka. Między innymi wykorzystamy cyfrowy czujnik temperatury - porównamy jak wygląda odczyt temperatury z użyciem skryptów shella, a jak w Pythonie. Jeśli już teraz nabraliście ochoty na naukę Pythona (nie tylko w kontekście malinki) to łatwo znajdziecie wiele książek o tej tematyce. Przy wyborze materiałów do nauki trzeba tylko pamiętać o wyborze odpowiedniej wersji Pythona.

Nawigacja kursu

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

kurs, kursRaspberryPi, Python, RaspberryPi

Komentarze

Komentarze do tego wpisu są dostępne na forum: