Odroid C2 – obsługa GPIO i pierwszy program w języku C
Odroid C2 to najnowszy jednopłytkowiec od Hardkernela. Podobnie jak w większości tych urządzeń, do dyspozycji użytkownika przekazano linie GPIO procesora, które mogą służyć do sterowania poziomami logicznymi, jak i do analizowania sygnałów. Każda z linii GPIO może pełnić rolę wejścia lub wyjścia, a część z nich dodatkowo pozwala na sprzętowe generowanie sygnałów magistralowych (np. I2C, UART).
Od strony technicznej, Odroid C2 ma wyprowadzone linie GPIO na złącze szpilkowe o czterdziestu stykach i rastrze 2,54 milimetra. Oprócz tych sygnałów, na złączu występują również napięcia 3,3 V oraz 5 V, mogące posłużyć do zasilania nakładanych modułów rozszerzających (tzw. shieldów). Rozwiązanie to jest od dawna stosowane w komputerach jednopłytkowych i najczęściej kojarzone jest z serią komputerów Raspberry Pi.
Do sterowania liniami GPIO koniecznie jest załadowanie systemu operacyjnego. Ma to oczywiście szerego korzyści, do obsługi linii GPIO można użyć wtedy terminala lub stworzyć aplikację do ich sterowania, zaś potrzebne biblioteki da się pobrać z Internetu przy pomocy prostych komend. W przykładowej wersji Linuxa Ubuntu 16.04 zainstalowany jest zestaw kompilatorów GCC.
W tym przykładzie, do obsługi linii GPIO posłużyliśmy się gotową biblioteką wiringPi (dostępną tu: https://github.com/hardkernel/wiringPi). Jak widać, biblioteka zamieszczona została na GitHubie, a więc warto na początek zainstalować w systemie program „Git” – w tym celu należy wykonać w terminalu komendy:
sudo apt-get update sudo apt-get install git
Po zakończeniu instalacji GIT’a wykonujemy polecenie:
git clone https://github.com/hardkernel/wiringPi
– pozwoli ono na skopiowanie folderu z podanej ścieżki WWW na pamięć Odroida. Bibliotekę wiringPi należy następnie skompilować przy użyciu następujących komend:
cd wiringPi ./build
W tym momencie mamy na komputerze zainstalowany program, pozwalający na obłsugę GPIO bezpośrednio z linii komend. Warto zapoznać się z możliwościami wiringPi – na przykład wywołująć komendę gpio readall (z folderu /home/odroid/wiringPi/gpio). Otrzymamy graficzną ilustrację konfiguracji i stanów dostępnych linii, podobną do przedstawionej na rysunku 1. Jak widać, z tabeli można odczytać nazwy portów, ich tryby pracy czy obecne stany logiczne W tym przypadku będą nas interesowały numery w rubryce wPi.
Przy użyciu komendy gpio read x (gdzie x – numer linii wPi) możliwe jest odczytanie stanu logicznego na linii, poleceniem gpio mode x ustawiamy trybu pracy linii jako wejście lub wyjście, zaś przy pomocy gpio write x możemy zapisać nowy stan logiczny dla linii x.
W przykładzie do linii GPIO.225 (numer wPi: 11) podłączamy diodę zieloną katodą do masy, zaś anodą, poprzez rezystor ograniczający (o wartości 330Ω) do GPIO.225 (fizycznie jest to pin 26 złącza). Można w tym celu użyć pojedyńczych kabelków, jednakże producent Odroida wyszedł naprzeciw potrzebom klientów, wprowadzając do oferty zestaw „C Tinkering Kit” (link: https://kamami.pl/akcesoria-odriod-c1/559055-zestaw-do-tworzenia-projektow-na-odroid-c1.html).
Po pierwszych, niezbyt przyjemnych próbach dołączenia diody z rezystorem z użyciem pojedyńczych kabelków żeńsko-żeńskich, sięgnęliśmy po ten właśnie zestaw od Hardkernela – efekt widać na rysunku 2.
Następnie, komendą:
gpio read 11
odczytujemy stan linii; program zwraca wartość binarną. W tym przypadku jest to logiczne”0″, a podłączona do tej linii dioda nie świeci. Ustawiamy więc tryb pracy portu jako wyjście przy użyciu komendy:
gpio mode 11 OUT
Żeby zaświecić podłączoną diodę, wystarczy teraz wystawić na linię logiczną jedynkę:
gpio write 11 1
Dioda świeci, a ponowne wywołanie gpio read 11 zwróci wartość logiczną 1.
Warto dodać, że za pomocą komendy:
gpio read 11
odczytać można również stan linii, na której wymuszamy napięcie z zewnątrz (np. przy pomocy przycisku). W tym przypadku jednak, linia musi być ustawiona w tryb wejścia komendą:
gpio mode 11 IN
Rysunek 3 przedstawia rezultaty wykonywanych powyżej komend.
Aplikacja sterująca GPIO w C
Do obsługi diody, podłączonej do linii GPIO wykorzystamy tym razem kod napisany w języku C. Z założenia program ma wyświetlić napis w terminalu i wysterować diodę tak, by migała w rytmie 3 mignięcia – przerwa. Kod wykorzystuje bibliotekę wiringPi, dzięki czemu jest przejrzysty i łatwy w zrozumieniu. Program powtarzany jest pętli, a więc jego zatrzymanie możliwe będzie dopiero po wciśnięciu kombinacji Ctrl+C.
Na początku programu zdefiniowane zostały użyte bilbioteki i linia, która będzie sterowana. Podobnie jak w poprzednim przykładzie, numer interesującej nas linii odczytujemy z kolumny „wPi” komendy gpio readall – w tym przypadku jest to linia 11. Dyrektywa #define LINIA 11 przypisuje jej nazwę LINIA, po czym rozpoczyna się podprogram główny main(); znajduje się w nim instrukcja wyświetlania napisu oraz konfiguracja parametrów wiringPi. Biblioteka ta jest inicjowana, a tryb pracy linii 11 zmieniany jest na wyjście. Rozpoczyna się nieskończona pętla while(1) w której, przy pomocy instrukcji for, trzykrotnie powtarzana jest sekwencja mignięć (poprzez zwiększanie zmiennej i o jeden przy każdym przejściu, dopóki jest ona mniejsza od 3). W ciele instrukcji for znajdują się instrukcje wystawiające stan wysoki: digitalWrite (x, HIGH) oraz niski: digitalWrite (x,LOW), a także opóźnenia o wartości około 200 milisekud (Delay(200)). Po zakończeniu działania instrukcji for ma miejsce kolejna, jedno-sekundowa przerwa w działaniu programu, po czym następuje powrót na początek ciała warunku while(1). Komenda Return 0 kończy podfunkcję main(), lecz kod programu nigdy jej nie wykona.
Podany kod z listingu 1 należy skompilować. Warto w tym momencie stworzyć oddzielny folder dla naszego programu; w terminalu wprowadzamy kolejno:
cd /home/odroid mkdir przyklad cd przyklad
W stworzonym właśnie folderze uruchamiamy edycję tekstową nieisntiejącego jeszcze pliku o dowolnej nazwie (w tym przykładzie nazwany został „migaj”), zakończonej rozszerzeniem .c – wykonujemy komendę:
sudo nano migaj.c
i wprowadzamy do automatycznie stworzonego pliku treść kodu programu z listingu 1. Należy zapisać zmiany w pliku (kombinacja klawiszy Ctrl+O oraz potwierdzenie nazwy).
Po zapisaniu treści programu w pliku „migaj.c”, rozpoczynamy kompilację programu – wprowadzamy do terminalu następującą komendę:
sudo gcc -o migaj migaj.c -lwiringPi -lwiringPiDev -lpthread
Proces kompilacji powinen przebiec bez błędów (o ile poprawnie wykonaliśmy poprzednie kroki). Stworzony został nowy plik o nazwie „migaj” – możemy przystąpić do jego uruchomienia za pomocą komendy:
sudo ./migaj
W efekcie dioda na płytce stykowej powinna migać w ustalonym tempie, a na ekranie powinien pojawić się napis: „Migająca dioda GPIO”. Program będzie pracował w pętli, a więc w celu zakończenia jego działania trzeba użyć kombinacji klawiszy Ctrl+C. Cały proces kompilacji i uruchomienia kodu ukazany został na rysunku 4.
Listing 1. Przykładowy kod powodujący miganie diody
#include <stdio.h> #include <wiringPi.h> #define LINIA 11 int main (void) { printf ("Migajaca dioda GPIO\n") ; wiringPiSetup () ; pinMode (LINIA, OUTPUT) ; while(1) { for(int i=0;i<3;i++) { digitalWrite (LINIA, HIGH) ; delay (200) ; digitalWrite (LINIA, LOW) ; delay (200) ; } delay(1000); } return 0 ; }
Oficjalnym dystrybutorem Odroida jest KAMAMI.pl |