sterowanie GPIO Raspberry Pi z poziomu przeglądarki internetowej (strony www)

Raspberry Pi posiada 8 dowolnie programowalnych linii I/O + UART (port szeregowy) + I2C + SPI (do wykorzystania również jako zwykłe piny IO). Wszystko (wraz z liniami zasilającymi oraz masy) wyprowadzone na złącze P1 (jest jeszcze kilka linii I/O na innych portach, ale o nich kiedy indziej + nie do wszystkich jest łatwy dostęp).

Ponieważ dostęp do w/w linii jest bezpośredni, to można (i jest nawet wskazane) podłączać różne urządzenia do tego portu, zaś sterowanie rozwiązać np.: poprzez stronę internetową.

Oczywiście dla wytrawnych programistów dostępnych jest cała gama języków programowania + biblioteki umożliwiające prosty dostęp do I/O. Zaś dla osób mniej obeznanych (oraz takich jak ja, czyli dopiero wchodzących w świat języków wysokiego poziomu) na początek zaleca się skorzystanie z gotowych lub pół-gotowych rozwiązań.

I tutaj przychodzi na ratunek WEBIOPI, czyli framework oraz aplikacja webowa pozwalająca na kontrolowanie liniami GPIO z poziomu przeglądarki internetowej.

Instalacja jest bardzo prosta. Konfiguracja również. Pozostaje tylko ustawienie własnego portu, na którym można apkę wypuścić na świat + przekierowanie na routerze i można się bawić.

Bardziej rozbudowany opis webiapi można znaleźć na stronie: http://pccode.pl/raspberry-pi-i-zestaw-duzego-masterkowicza/, gdzie jest przy okazji opis jak podłączyć diody LED poprzez układ ULN.

Pełen opis portów oraz przykłady kodów sterujących nimi dostępny jest tutaj: http://elinux.org/Rpi_Low-level_peripherals. Co ciekawe, przykładowe kody rozpisane są na języki (i powłokę) sh, C, Perl, C#, Ruby i Basic.

Kolejnym ciekawym rozwiązaniem jest podłączenie RPi i zarządzanie nim poprzez port szeregowy. Opis można znaleźć tutaj: http://elinux.org/Rpi_Low-level_peripherals. W sumie port RS można wykorzystać również w drugą stronę (i o ile nie mamy innego portu RS w domu), to przy pomocy tego z RPi odratować na przykład router, który po „update” przestał odpowiadać po protokole http.

RPi to nie tylko 3 w/w interfejsy. Wystarczy chwilę pokombinować i już mamy 1Wire, a na nim zegary RTC, pamięci eeprom, czujniki temperatury i inne gadżety od Dallas… tfu… Maxim Integrated. W projekcie: http://techfreak.pl/nettemp/ wykorzystanych zostało kilka czujników DS18B20, które nie wymagają kalibrowania i posiadają względnie dobrą dokładność.

Na koniec jeszcze opis kolegi Spychalskiego: http://www.spychalski.info/2013/01/12/obsluga-magistrali-i2c-raspberry-pi z manualem do obsługi magistrali I2C. Co prawda w projekcie wykorzystany jest jakiś przetwornik A/C, ale nic nie stoi na przeszkodzie, żeby podłączyć kilka PCF8574, który da nam n x 8 (każdy układ to expander i2c na 8bit) portów I/O dodatkowo.

narzędzia (kilka kabelków) też trzeba mieć

W wolnej chwili postanowiłem zmontować trochę kabelków, które niewątpliwie przy uruchamianiu mi się przydadzą. Ponieważ jakiś czas temu zaopatrzyłem się w uniwersalne płytki stykowe, to i dokupiłem do nich odpowiednie przewody. Problem jednak miałem z tymi (płytkami), które kiedyś sam robiłem „starą” metodą, czyli z goldpinami. Ten sam problem pojawił się przy wyświetlaczach LCD mających złącze goldpinowe (część dwurzędowe, część jednorzędowe). Skoro włączyłem lutownicę i wyjąłem wszystkie akcesoria, to zmontowałem z lekkim zapasem różne kombinacje. W zasadzie na zdjęciach wszystko widać.

Ale nie samymi kabelkami człowiek żyje. Gdy lutowanie tego samego zestawu: kabelek-złączka stawało się usypiające, to przepinałem się na arduino i IDE. Pod ręką miałem kilka DS18B20 (laserowo kalibrowany cyfrowy czujnik temperatury na magistralę 1Wire). Podłączyłem, trochę poprogramowałem i… wszystko działało.

Z ciekawszych komend:

LiquidCrystal lcd(5, 6, 7, 9, 10, 11, 12); – konfiguracja podłączenia LCD

#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS); – definicja i konfiguracja interfejsu 1Wire

cała reszta to proste funkcje i instrukcje, żeby śmigało. Program przy okazji napisałem tak, że jednocześnie śle info na LCD (temperatura w st. C) i RS232 (temperatura w st. C i F, info o ilości czujników oraz ich adresach 1Wire). Jakby ktoś bardzo chciał, to mogę udostępnić kod – jest tak paskudny, że publicznie raczej pokazywać go nie chcę:)

[nggallery id=2]