Ludzie coraz chętniej kupują nowoczesne zabawki elektroniczne, takie jak autonomiczne drony. Często tylko po to, by nagrywać z ich użyciem wideo. Jednocześnie coraz więcej rzeczy jest połączonych z Internetem, tworząc Internet of Things, czyli po polsku – Internet Rzeczy. Monitorujemy w ten sposób stan maszyn, położenie pojazdów, warunki panujące w inteligentnych budynkach itp. Monitorowanie własnego kota może przy tym wydawać się pomysłem absurdalnym, ale już proste rozwinięcie omawianej aplikacji może przynosić realne korzyści posiadaczom.
IoT Kitteh nie jest najbardziej przemyślanym projektem, ale w naszym przekonaniu może stanowić łatwą w realizacji podstawę do dalszych eksperymentów. Całość jest bardzo łatwa w przygotowaniu i opiera się na niezmiernie popularnym minikomputerze – Raspberry Pi. Autor zastosował model RPI 2B i doposażył go w kartę sieciową Wi-Fi na USB, ale obecnie polecalibyśmy po prostu użycie nowszego Raspberry Pi 3, z wbudowaną łącznością bezprzewodową. To jednak nie wszystko. Jak wiadomo, koty chodzą własnymi drogami i trzeba się liczyć z tym, że wyjdą poza zakres domowego Wi-Fi. Dlatego IoT Kitteh dostał też modem GSM w postaci płytki Adafruit FONA 808, w której główną rolę odgrywa pokazany na fotografii 1 moduł SimCOM SIM808. 4-zakresowy moduł pozwoli kontrolować poczynania kota, niemal niezależnie od tego, dokąd zawędruje, a zintegrowany odbiornik GPS umożliwia faktyczne śledzenie naszego podopiecznego.
Istnieje duża szansa, że kot wejdzie do jakiejś „dziury”, która ogranicza propagację fal radiowych. Stąd wypada sięgnąć po adekwatne anteny. Autor wybrał niewielką antenę o zysku energetycznym 3 dBi dla sieci GSM. Jej grubość to jedynie 2 mm. Użyta antena GPS jest kostką o wymiarach 9 mm×9 mm×6,5 mm i waży zaledwie 2,4 g.
Niemal 10 razy większe obciążenie dla kota będzie stanowić niezbędny akumulator. Tu wybór padł na ogniwo litowo-polimerowe o pojemności 1200 mAh i napięciu znamionowym 3,7 V. Przy pełnym naładowaniu napięcie to dochodzi do 4,2 V, co w praktyce przekłada się na ok. 4,5 Wh pojemności. Producent tego akumulatora zaleca ładowanie stałym prądem, nie większym niż 500 mA (ewentualnie do 0,5×C), gdyż ogniwo nie ma wbudowanego termistora. Prąd ten z łatwością można uzyskać z klasycznego złącza USB. Nie jest to jednak jedyne wymagane źródło energii. Potrzebny będzie też dowolny powerbank z gniazdem USB do zasilania samego Raspberry Pi, ponieważ wspomniany wcześniej akumulator posłuży tylko do zasilania modułu GSM/GPS.
Modem GSM w projekcie ma jeszcze dodatkowe zastosowanie – chodzi o sterowanie kotem. Jednakże jest to możliwe tylko przy założeniu, że zwierzę reaguje na komendy głosowe. Autor wykorzystuje łącze komórkowe nie tyle do danych, co do komunikacji głosowej. Dlatego niezbędnym elementem projektu jest zestaw słuchawkowy. Pozostałe komponenty to: płytki i przewody do wykonania połączeń, a w tym interfejs USB –> TTL. Potrzebna jest też karta micro SD na system operacyjny, uprząż do założenia na zwierzę i przede wszystkim sam kot (choć na psie system też powinien się sprawdzać). Jeśli chodzi o oprogramowanie, zastosowano usługi Amazon Web Services AWS IoT i bazę DynamoDB, o której także warto napisać kilka słów.
Projekt IoT Kitteh ma w gruncie rzeczy bardzo ograniczony zestaw funkcji, ale wykorzystane w nim mechanizmy można bez problemu rozbudować o kolejne zastosowania – prawdopodobnie nawet znacznie bardziej przydatne. Niemniej twórca zdecydował, że zależy mu przede wszystkim na lokalizacji kota oraz przywoływaniu go. Wbudowany odbiornik GPS pozwala monitorować aktualne położenie zwierzęcia. Gdy kot jest gdzieś schowany, nie trzeba też go wołać ani nawet iść w jego kierunku. Zastępuje to funkcja przywoływania głosowego, opartego właśnie na telefonii komórkowej. Tu autor natrafił na jeden problem techniczny. O ile do modemu z modułem SimCOM SIM808 można bez problemu wykonywać połączenia, to niestety kot nie umie ich samemu odbierać. W związku z tym projektant zastosował odwrotną procedurę. Połączenie głosowe jest inicjowane przez modem na kocie, który automatycznie wybiera numer telefonu swojego właściciela. Dzieje się to wtedy, gdy Raspberry Pi odbierze odpowiednie polecenie z Internetu. Inaczej mówiąc – właściciel klika w przeglądarce na przycisk połączenia, komputer na kocie wykonuje otrzymaną komendę i nawiązuje połączenie, a właściciel odbiera telefon. Dwukierunkowa komunikacja pozwala mu wydawać kotu polecenia i słyszeć ewentualne reakcje. Choć skuteczność pomysłu może wydawać się wątpliwa, doświadczenia twórcy IoT Kitteh pokazują, że metoda świetnie się sprawdza i kot faktycznie przybiega po zawołaniu go.
Montaż projektu
Połączenia pomiędzy większością komponentów są oczywiste. Na szczególną uwagę zasługuje sposób podłączenia modemu GSM. Użyty kabel USB –> TTL ma cztery żyły: RX, TX oraz dodatnie i ujemne bieguny zasilania. Należy je podłączyć odpowiednio do wyprowadzeń TX, RX VIO i GND modułu FONA808. Ponadto pin GND modułu należy połączyć z jego pinem KEY. Następnie do modułu dołączamy dwie anteny, zestaw słuchawkowy i akumulator. Wszystkie te wyprowadzenia są jednoznacznie opisane.
Tymczasem do Raspberry Pi należy dołączyć kartę Wi-Fi na USB (chyba że korzystamy z RPI 3), wtyczkę USB kabla USB –> TTL i źródło zasilania. Oczywiście potrzebna będzie też karta pamięci z wcześniej wgranym oprogramowaniem: Raspbianem Jessie i kodem programu. Całość została umieszczona w odblaskowej uprzęży dla kota, jak na fotografii 2, a same płytki autor ochronił za pomocą kartonowych pudełek. To mało eleganckie rozwiązanie, ale na etapie prototypowania może wystarczyć.
Zastosowane aplikacje
Dla doświadczonego elektronika omawiany projekt od strony sprzętowej jest bardzo prosty i jego realizacja nie wiąże się z praktycznie żadnymi wyzwaniami – być może z wyjątkiem problemu namówienia kota do współpracy. Znacznie ciekawiej IoT Kitteh prezentuje się od strony oprogramowania. Stanowi świetny przykład wykorzystania protokołów i narzędzi, których nigdy dotąd nie omawialiśmy na łamach EP, a które zostały zaprojektowane właśnie z myślą o IoT. Użyte techniki są nowoczesne i dawniej byłyby uznane za niekonwencjonalne, ale obecnie warto je poznać, by móc lepiej przygotowywać aplikacje Internetu Rzeczy.
Przede wszystkim autor napisał kod programu w JavaScripcie. Nie jest długi – źródło zajmuje jedynie 157 linijek! Sekret polega na wykorzystaniu gotowych bibliotek oraz narzędzi do zarządzania nimi. Kod uruchamiany jest na serwerze Node.js, włączonym na Raspberry Pi, na kocie. Program komunikuje się z chmurą firmy Amazon – AWS IoT, dokąd przekazuje i skąd pobiera dane. AWS IoT jest w stanie zapewnić dwukierunkową, bezpieczną komunikację w oparciu na „lekkach” protokołach. Zbierane dane są natomiast gromadzone w tzw. nieSQL-owej bazie Amazon DynamoDB. Wymiana danych odbywa się z użyciem protokołu MQTT, który bazuje na formacie json i jest wspierany przez AWS IoT. Za zapewnienie bezpieczeństwa odpowiadają certyfikaty zgodne ze standardem x509, a więc oparte na kluczu prywatnym i publicznym. Korzysta z nich zarówno aplikacja w JavaScripcie, działająca na Node.js na RPI, jak i terminal wykorzystywany do przesyłania poleceń do kota. Autor w tym celu użył narzędzia MQTT.fx – napisanego w Javie klienta protokołu MQTT (rysunek 3).
Zaletą użytych narzędzi jest fakt, że da się ich wszystkich użyć bezpłatnie. Dostęp do serwera AWS IoT jest obecnie bezpłatny przez pierwsze 12 miesięcy użytkowania, z tym że z miesięcznym limitem 250 tysięcy przesyłanych komunikatów. Natomiast baza DynamoDB jest bezterminowo udostępniana bezpłatnie, o ile tylko ilość przechowywanych w niej danych nie przekracza 25 GB. Naturalnie darmowe są też serwer Node.js oraz program MQTT.FX.
Struktura programu
Kod programu javascriptowego, uruchomionego na Node.js, a więc i główny element całej aplikacji został zaprezentowany na listingu 1. Auto skorzystał z dwóch głównych bibliotek i jednej pomocniczej:
AWS-IoT-Device-SDK to biblioteka przygotowana przez Amazona, przystosowana do obsługi chmury AWS IoT za pomocą kilku komend. Jest lekka i w razie potrzeby można znaleźć jej odpowiedniki dla innych języków programowania.
SimCom to biblioteka Javascriptowa przygotowana do obsługi modułu GSM firmy SimCom.
Loadash to biblioteka Javascriptowa ułatwiająca posługiwanie się JavaScriptem – autor używa jej praktycznie tylko do uproszczenia funkcji pobierania atrybutów z obiektów i nie ma ona realnego znaczenia dla implementacji projektu.
Program sprowadza się do konfiguracji chmury AWS IoT i połączenia z modemem GSM, po czym następuje przypisanie akcji do zdarzeń, takich jak nadejście wiadomości, błąd modemu GSM czy otrzymanie polecenia z chmury. Działanie systemu jest właśnie oparte na zdarzeniach. Dodatkowo autor przyjął zasadę, że właściwie wszystko, co dzieje się po stronie kota, jest przekazywane do chmury w postaci prostych komunikatów, które otrzymuje dowolny subskrybujący je na serwerze administrator. W ten sposób polecenia kotu można przesyłać z więcej niż jednego urządzenia jednocześnie i na wielu urządzeniach naraz monitorować ruch zwierzaka.
W momencie nadejścia komunikatu z chmury program kota analizuje go i rozpoznaje komendę. Dostępne polecenia to:
- Nawiązanie połączenia ze wskazanym numerem.
- Rozłączenie połączenia.
- Sprawdzenie poziomu sygnału komórkowego.
- Sprawdzenie napięcia na akumulatorze.
- Wysłanie SMS na wskazany numer.
- Włączenie odbiornika GPS.
- Wyłączenie odbiornika GPS.
- Sprawdzenie, czy odbiornik GPS jest włączony.
- Pobranie danych z odbiornika GPS.
Polecenia te są tłumaczone na odpowiednie komendy AT i przesyłane od modułu SimComa, a odpowiedź jest automatycznie przekazywana do chmury – poprzez połączenie internetowe.
Podsumowanie
Projekt, choć może wydawać się żartem, jest bardzo zgrabnie napisany i naprawdę niewiele trzeba, by go odtworzyć. Co więcej, stanowi świetny wzór dla innych aplikacji tego typu, które mogą działać na identycznej zasadzie, ale w bardziej szczytnych celach. W podobny sposób można by było np. zrealizować system wspomagający ludzi starszych. Z łatwością można też przygotować jego inne wersje, oparte na innych językach programowania, a nawet przygotować analogiczny program dla urządzenia bez systemu operacyjnego. Kluczowe jest tylko zdobycie odpowiednich bibliotek dla modułu GSM/GPS oraz przygotowanie zestawu funkcji do obsługi komunikacji z chmurą. Ta natomiast – ze względu na wykorzystanie MQTT – jest bardzo prosta, więc lekka rozbudowa powszechnie dostępnych bibliotek do komunikacji HTTP przez sieć powinna wystarczyć. Drobnym problemem może być wymuszenie szyfrowania i autoryzacji, ale i z tym można sobie poradzić.
Biorąc pod uwagę wielkość programu i elementy potrzebne do jego realizacji, można zdecydowanie polecić go jako przykład (trening) dla wszystkich czytelników, którzy chcieliby zacząć tworzyć systemy Internetu Rzeczy.
Marcin Karbowniczek, EP
Dodatkowe informacje:
Aplikacja została opisana przez Jeremy’ego Walla pod adresem https://goo.gl/1aqdJ4, a kod źródłowy wraz plikami konfiguracyjnymi można znaleźć pod adresem https://goo.gl/H7t5Z6. Wideo z praktycznych testów zostało opublikowane na YouTube pod adresem https://goo.gl/dFaCoh.