Urządzenia Internetu Rzeczy (IoT) to układy, które są wyposażone w czujniki zbierające dane. Jeżeli to konieczne, mają również wbudowane funkcje sterowania. Elementem niezbędnym jest też łącze radiowe zapewniające połączenie z aplikacją odbierającą i przetwarzającą dane. Z racji wykonywanych funkcji wymaga się, by urządzenia IoT miały kilka podstawowych cech:

Jednym z głównych problemów w implementacji urządzeń IoT jest zapewnienie odpowiedniego połączenia radiowego, szczególnie w obszarach mało zamieszkanych, gdzie nie ma niezbędnej infrastruktury. Dlatego rozwijane są systemy takie jak LoRaWAN pozwalające małym kosztem uzyskiwać zasięgi nawet ponad 20 km. LoRaWAN do przesyłania danych do aplikacji chmurowych wymaga specjalnych koncentratorów (gateway) połączonych z Internetem. Niestety, przynajmniej u nas, technologia ta nie jest popularna, nie ma rozbudowanej sieci koncentratorów i dość trudno jest ją stosować.

Sieć Wi-Fi w aplikacjach IoT

Spora część urządzeń IoT stosowanych w domach, fabrykach czy biurach jest w zasięgu lokalnej sieci Wi-Fi. Ta sieć może zapewniać bezpośredni dostęp do Internetu i odpowiedni poziom bezpieczeństwa transmisji radiowej przy stosowaniu szyfrowania WPA2. Jest też ze względu na dużą popularność relatywnie tania, ale ma ograniczony zasięg.

Wi-Fi rozwiązuje problemy z łącznością, ale jednocześnie stawia spore wymagania sprzętowe i programowe urządzeniom IoT, które jak wiemy powinny być proste i tanie. Połączenie z Internetem wymaga stosowania protokołów TCP/IP i trzeba mieć na pokładzie moduł radiowy pracujący w pasmach wykorzystywanych przez Wi-Fi. Niezależnie od szyfrowania standardu musimy zapewnić algorytmy szyfrowania swoich danych używanych potem w aplikacjach chmurowych. Przykładem gotowego rozwiązania sprzętowego i programowego spełniającego wymagania urządzenia IoT pracującego w sieci Wi-Fi jest moduł firmy Microchip AVR-IoT WArysunek 1.

Rysunek 1. Moduł Microchip AVR-IoT WA

Płytka rozwojowa Microchip AVR-IoT WA

Moduł AVR-IoT WA jest platformą demonstracyjną opartą o architekturę 8 bitowych mikrokontrolerów AVR, zaprojektowaną do testowania rozwiązań IoT wykorzystujących technologię Wi-Fi.

Zastosowane rozwiązania sprzętowe można podzielić na trzy główne bloki:

Możliwość testowania funkcji czujników zapewniają dwa wbudowane elementy:

Dzięki umieszczonemu na płytce złączu mikroBUS pozwalającemu dołączyć jeden z spośród 450 modułów rozszerzeń Click oferowanych przez firmę MikroElektronika, można w prosty sposób rozszerzać funkcjonalność AVR-IoT WA na przykład o dodatkowe czujniki. Wybór jest naprawdę spory: od czujników gazu, smogu, ciśnienia, temperatury czy wilgotności poprzez czujniki (mierniki) prądu, pola magnetycznego, żyroskopów, przyspieszenia i wiele innych.

Moduł jest standardowo zasilany z magistrali USB, ale ma możliwość pracy bateryjnej. Z napięcia 5 V magistrali USB zasilany jest układ Microchip MCP73871 przeznaczony do ładowania i nadzoru nad ogniwem Li-Ion/LiPo o maksymalnym napięciu +4,2 V. Ogniwo zasila moduł przy zaniku napięcia z USB.

Rysunek 2. Rozmieszczenie elementów na płytce modułu AVR-IoT WA

Mikrokontroler ATmega4808

ATmega4808 to mikrokontroler wyposażony w szybki 8-bitowy rdzeń AVR z układem mnożenia sprzętowego. Może być taktowany z częstotliwością do 20 MHz i ma wbudowane 48 kB pamięci programu Flash, 6 kB pamięci danych SRAM i 256 bajtów pamięci EEPROM. Wyposażenie w układy peryferyjne nie odbiega od standardu przyjętego w produktach Microchipa. Należy tu wspomnieć o 10-bitowym przetworniku analogowo cyfrowym z własnym źródłem napięcia referencyjnego, komplecie interfejsów komunikacyjnych (UART, SPI, I2C), układach CMP (Capture/Compare/PWM) i odpowiedniej ilości liczników. Układ może być zasilany szerokim zakresem napięć od 1,8 do 5V i ma wbudowane 3 tryby oszczędzania energii: Idle, Stand-by i Power Down.

Moduł Wi-Fi ATWIN1500

Układ ATWINC1500 firmy Microchip jest zintegrowanym kontrolerem przeznaczonym do pracy w sieci IEEE 802.11 b/g/n (Wi-Fi) Według zapewnień producenta zoptymalizowano go do pracy w urządzeniach IoT. Jest to idealne rozwiązanie dla małych układów mikroprocesorowych, które potrzebują funkcji sieciowych. ATWINC1500 łączy się poprzez interfejs SPI z dowolnym mikrokontrolerem. Posiada w pełni zintegrowany wzmacniacz mocy (PA), niskoszumny wzmacniacz LNA, switch, moduł zarządzania energią, oraz zintegrowaną antenę umieszczoną na płytce drukowanej. Dostępna jest też wersja z mikro złączem RF co-ax (U.FL) do podłączenia zewnętrznej anteny. ATWINC1500 wyposażono w wewnętrzną pamięć Flash o pojemności 4 MB do przechowywania oprogramowania systemowego Atmel Software Framework. Oprogramowanie jest darmowe i można go pobrać/uaktualniać na przykład poprzez framework MPLAB Harmony. Firmware wspiera protokoły: DHCP, DNS, TCP/IP (IPv4), UDP, HTTP i HTTPS. Układy wyposażone w ten moduł i tanie mikrokontrolery 8-bitowe mogą bez problemu pracować z protokołami sieciowymi i realizować połączenia internetowe.

Układ ATECC608A CryptoAuthentication

ATECC608A CryptoAuthentication™ to układ firmy Microchip z zaawansowanymi funkcjami kryptografii krzywej eliptycznej (ECC). Dzięki wbudowanym funkcjom ECDH i ECDSA urządzenie to jest idealne dla szybko rozwijającego się rynku IoT, ponieważ zapewnia pełny zakres zabezpieczeń, na który składają się: poufność, integralność danych i uwierzytelnianie. Może być stosowany w systemach z MCU lub MPU z algorytmami szyfrowania/deszyfrowania. Podobnie jak wszystkie produkty Microchip CryptoAuthentication, nowy ATECC608A wykorzystuje bardzo bezpieczne sprzętowe przechowywanie kluczy kryptograficznych i kryptograficzne środki zaradcze, które eliminują potencjalne backdoory związane ze słabymi punktami oprogramowania.

Do komunikacji z mikrokontrolerem zastosowano standardowy interfejs I2C. ATECCC608A zapewnia niskie zużycie energii i pracuje w dość szerokim zakresie napięcia zasilania od 2 do 5,5V.

Na płytce modułu AVR-IoT WA umieszczono także programator/debuger PICkit ™ On-Board (PKOB nano) zapewniający pełną obsługę programowania pamięci programu Flash i debugowania przez programy IDE Microchip Studio lub Microchip MPLAB IDE. Debugger również działa jako urządzenie interfejsu pamięci masowej, umożliwiając uproszczone programowanie przez przeciąganie i upuszczanie plików.

Wbudowany PICkit On-Board ma zaimplementowane kompozytowe urządzenie USB, które zawiera standardową klasę urządzeń komunikacyjnych (CDC) widziane przez hosta USB jako wirtualny port szeregowy. CDC może służyć do strumieniowego przesyłania dowolnych danych w obu kierunkach między komputerem-hostem a MCU na płytce – rysunek 3. CDC można używać do konfiguracji sieci Wi-Fi, ale też do innych celów na przykład przy debugowaniu kodu, czy jako kanał do przesyłania danych z aplikacji.

Rysunek 3. CDC wbudowany w debugger

Testy modułu – pierwsze kroki

Moduł dystrybuowany z wgraną aplikacją demonstracyjną jest po skonfigurowaniu sieci Wi-Fi gotowy do testów. Jak już wspomniałem programator/debugger ma wbudowaną funkcję pamięci masowej. Po połączeniu kablem z portem USB komputera system operacyjny powinien wykryć moduł AVR-IoT WA jako dysk pamięci masowej z zapisanymi plikami o nazwie Curiosity– rysunek 4.

Rysunek 4. Dysk pamięci masowej Curiosity

Po kliknięciu na plik click-me.htm, w przeglądarce internetowej otwiera się strona https://avr-iot.com/avr-iot/aws/ przeznaczona do konfigurowania i testowania modułu. Pierwszą rzeczą, którą powinniśmy zrobić jest aktualizacja firmware modułu do najnowszej wersji (rysunek 5). Po kliknięciu na przycisk Get the latest Firmware zostaniemy przeniesieni na stronę GitHub z plikiem AVR-IoT-WA-4.1.1.hex, zawierający skompilowany kod najnowszej dostępnej wersji oprogramowania przeznaczonej do łączenia się a chmurą Amazon AWS – rysunek 6.

Rysunek 5. Inicjowanie pobierania najnowszego firmware

Po kliknięciu na AVR-IoT-WA-4.1.1.hex zostanie on pobrany i zapisany na dysku komputera. Na tej stronie jest też dostępny spakowany program źródłowy (Source code), który można pobrać w taki sam sposób. Wykorzystamy go później do prezentacji dostosowywania programu do własnych potrzeb.

Rysunek 6. Strona GitHub z plikiem AVR-IoT-WA-4.1.1.hex

Pobrany plik przeciągamy i upuszczamy na dysk Curiosity. Proces aktualizacji przebiega dalej automatycznie, bez potrzeby wykonywania żadnych dodatkowych czynności.

Konfiguracja połączenia z Wi-Fi

Kolejny krok to konfiguracja połączenia z siecią Wi-Fi. Można go wykonać na kilka sposobów. Jednym z nich jest wykorzystanie do tego celu witryny internetowej https://avr-iot.com/avr-iot/aws/ otwieranej po kliknięciu na click-me.htm. W lewym dolnym rogu wyświetla się okno konfiguracji sieci. Wpisujemy tu SSID sieci, wybieramy rodzaj szyfrowania, a także zgodny z nim klucz (hasło). Po wpisaniu tych danych klikamy na przycisk Download Configuration. Witryna generuje plik wifi.cfg, który potem automatycznie przesyła do folderu pobierania (Pobrane). Ten plik należy przenieść i upuścić na dysk Curiosity. Pokazano to na rysunku 7.

Rysunek 7. Konfiguracja połączenia Wi-Fi

Przykładowa zawartość pliku WiFi.cfg pokazano na rysunku 8.

Rysunek 8. Przykładowa zawartość pliku wifi.cfg

Jeżeli konfiguracja jest poprawna, to moduł powinien się połączyć z ruterem Wi-Fi, który przydzieli mu adres IP w sieci lokalnej LAN. Proces nawiązywania połączenia z siecią Wi-Fi trwa kilkadziesiąt sekund, co sygnalizuje miganie niebieskiej diody na płytce. Po nawiązaniu połączenia dioda świeci się światłem ciągłym.

Rysunek 9. Moduł z przydzielonym adresem w sieci lokalnej LAN

Inne metody konfiguracji

Taki sposób konfiguracji jest szybki, wygodny i łatwy. W dokumentacji modułu opisano jeszcze dwa kolejne sposoby. Pierwszy wykorzystuje wirtualny port COM (CDC) programatora/debugera płytki modułu. Niezbędny tu jest pogram terminala znakowego. Na rysunku 10 pokazano ekran terminala PuTTY z komendą konfiguracji połączenia Wi-Fi. Za pomocą terminala można też sprawdzić wersję softu, wykonać restart, nawiązać ponowne połączenie Wi-Fi itp.

Rysunek 10. Ustawianie parametrów połączenia WI-Fi za pomocą wirtualnego portu COM i terminala znakowego PuTTY

Ostatnią metodą łączenia się z Wi-Fi jest zaawansowany tryb Software Access Point (Soft AP), wbudowany w moduł ATWINC. Ta metoda jest dobra, jeśli użytkownik korzysta tylko z urządzenia mobilnego, takiego jak telefon komórkowy lub tablet zamiast laptopa lub komputera. W tryb Soft AP można wejść naciskając i przytrzymując przycisk SW0.

Połączenie z chmurą AWS

Po prawidłowym połączeniu się z siecią Wi-Fi moduł nawiązuje połączenie z chmurą Amazon AWS. Jeżeli to połączenie się powiedzie, to następuje przesyłanie danych pomiarowych – temperatury i natężenia oświetlenia – do aplikacji chmurowej, gdzie można je przetwarzać, a także wyświetlić.

Na stronie https://avr-iot.com/avr-iot/aws/, uruchamianej po kliknięciu na plik click-me.htm, wyświetlany jest interaktywny wskaźnik faz działania aplikacji składający się z elementów sygnalizacyjnych:

Poprawnie działająca aplikacja powinna sygnalizować poprawność każdego z etapów tak, jak to na rysunku 11.

Rysunek 11. Wskaźnik poprawności działania aplikacji

Pod wskaźnikiem wyświetlają się wykresy wartości pomiarów temperatury, a także natężenia światła przesyłanych do chmury on-line co 1 sekundę. Zaprezentowano to na rysunku 12.

W czasie testowania modułu wykonałem aktualizację firmware i konfigurację połączenia Wi-Fi. Moduł połączony z Wi-Fi połączył się z chmurą i przesyłał dane do aplikacji chmurowej. Jedyną wątpliwość budziły pomiary temperatury zawyżone o ok 10°C. W temperaturze otoczenia ok. 21°C aplikacja wyświetlała temperaturę ok. 33*C. W czasie ogrzewania czujnika palcem wykres reagował wzrostem temperatury do ok. 34°C. Również czujnik natężenia oświetlenia reagował na zmiany, chociaż w tym przypadku trudno było określić czy prawidłowo mierzył jego poziom.

Rysunek 12. Wykresy wielkości pomiarowych z aplikacji chmurowej

Co dalej?

Wszystkie płytki rozwojowe AVR-IoT WA są wstępnie zarejestrowane na koncie Sandbox AWS Cloud firmy Microchip. Konto skonfigurowano wyłącznie do celów testowych i demonstracyjnych. Wszyscy, którzy zakupili firmowe moduły i testują technologię Microchipa, mogą z niego korzystać bez ograniczeń. Jednak nie ma możliwości gromadzenia danych i ich obróbki w dowolnym czasie. Pełne możliwości aplikacji chmurowej można wykorzystywać po migracji na własne prywatne konto utworzone w chmurze AWS.

Programy demonstracyjne dostarczane przez producentów sprzętu są atrakcyjne, ale często trudne do praktycznego wykorzystania. Główną przeszkodą jest brak dokumentacji i przewodników niezbędnych do dostosowania dla własnych potrzeb. Łatwiej jest napisać wszystko od nowa niż wkładać mnóstwo pracy w zrozumienie jak działa czyjś program. W tym przypadku jest inaczej. Microchip zadał sobie wiele trudu, żeby umożliwić projektantom łatwe tworzenie i testowanie własnych aplikacji. Pierwsze kroki można stawiać we wspomnianym już testowym koncie Sandbox AWS Cloud. Krótki samouczek jak się do tego zabrać jest na dole strony https://avr-iot.com/avr-iot/aws/rysunek 13.

Rysunek 13. Modyfikacja projektu

Pobieranie, otwieranie i kompilacja kodów źródłowych

Jak już wcześniej wspomniałem spakowany kod źródłowy source code.zip można pobrać z GitHub. Do pracy z tym kodem będzie nam potrzebne środowisko projektowe i kompilator. Użytkownicy mikrokontrolerów AVR często używali środowiska Atmel Studio, a także kompilatora AVR GCC. Microchip po przejęciu Atmela konsekwentnie integruje swoje programy narzędziowe i środowisko MPLAB X IDE z mikrokontrolerami AVR i SAM. Jest co prawda możliwość używania Atmel Studio, które teraz nazywa się Microchip Studio, ale nie wiadomo, czy to środowisko będzie dalej rozwijane. Dlatego użyjemy środowiska projektowego MPLAB X IDE w wersji v5.30 i najnowszej dostępnej wersji kompilatora XC8 w wersji bezpłatnej. Source code zawiera gotowy projekt dla MPLAB IDE i pozostaje tylko jego otwarcie i skompilowanie.

Pierwszą modyfikacją będzie możliwość przesyłania dodatkowej informacji, którą będzie stan przycisku SW0. Zaczynamy od odnalezienia funkcji sendToCloud() w pliku application_manager.clisting 1.

Listing 1. Funkcja SentToCloud() przed modyfikacją

Funkcja jest odpowiedzialna za przesyłanie danych z czujników do chmury AWS. Wartość zmiennych rawRemperature (temperatura z czujnika) i light (natężenie światła z czujnika) jest formatowana przez funkcję sprintf, a następnie umieszczana w tablicy json – listing 2.

Listing 2. Zapisywanie tablicy json wartościami temperatury i natężenia światła

Dodanie przesyłania stanu przycisku SW0

Żeby wysyłać stan przycisku SW0 trzeba zmodyfikować fragment pokazany na listingu 2 tak, jak to pokazano na rysunku 14.

Rysunek 14. Zmodyfikowana funkcja SentToCloud

Dodajemy definicję zmiennej uint8_t sw0 = SW0_GetValue() != 0; i modyfikujemy zapisywanie tablicy json:

Po skompilowaniu kodu i zaprogramowaniu pamięci powinniśmy zobaczyć dodatkowy wykres Switch 0 pokazujący stany SW0 (zwarty/rozwarty) – rysunek 15.

Rysunek 15. Działanie zmodyfikowanego programu

Sterowanie diodą LED z chmury

Kolejna modyfikacja pozwoli na sterowanie zielonej diody LED umieszczonej na module z poziomu strony internetowej https://avr-iot.com/avr-iot/aws/. Zielony LED płytka wykorzystuje do sygnalizacji nawiązania poprawnego połączenia z chmurą. Najpierw wyłączamy tą sygnalizację. W pliku application_manager.c odszukujemy funkcję MAIN_dataTask() i komentujemy fragment odpowiedzialny za sterowanie zeloną diodą LED – listing 3.

Listing 3 Wyłączenie sterowania zieloną diodą LED

W funkcji receivedFromCloud() zostały przygotowane wszystkie mechanizmy odbierania polecenia toggle i nic tam już nie trzeba robić. Funkcja getToggle zwraca wartość 0 lub 1 po każdym odebraniu polecenia z chmury. Na końcu funkcji MAIN_dataTask() dodajemy fragment zapalający lub gaszący zieloną diodę LED zależnie od tego co zwróci funkcja getToogleState()listing 4.

Listing 4. Fragment funkcji MAIN_dataTask() zapalający lub gaszący zieloną diodę LED

Panel sterujący diodą został pokazany na rysunku 16.

Rysunek 16. Sterowanie diodą LED z poziomu chmury

Podsumowanie

Moduł Microchip AVR-IoT WA to kompletne rozwiązanie sprzętowo – programowe przeznaczone do aplikacji IoT korzystających z łączności Wi-Fi. Dane z czujników są przesyłane do chmury AWS (Amazon), gdzie mogą być wizualizowane i ewentualnie archiwizowane, a także przetwarzane. Producent zrobił bardzo wiele, żeby zaproponowane rozwiązania można było wdrożyć tak szybko jak to możliwe. Do dyspozycji mamy kompletny moduł i przykładowy program z kodami źródłowymi. Do stawiania pierwszych kroków, testowania wbudowanych funkcji i modyfikacji aplikacji, Microchip udostępnia swoją bezpłatną usługę w chmurze AWS. Wykorzystując te możliwości jesteśmy w stanie w relatywnie krótkim czasie skonfigurować połączenie Wi-Fi, przetestować funkcje przesyłania danych pomiarowych, a potem zmodyfikować samodzielnie program tak, by wysyłał dane i odbierał polecenia z chmury.

Te testy można traktować jako wstęp do pełnego wykorzystania modułu. Na portalu GitHub umieszczono samouczki pokazujące jak założyć własne konto w chmurze AWS i przystosować moduł do własnych celów bez ograniczeń stawianych przez konto Microchipa. Wszystko to pokazuje, że producent zaoferował nam znacznie więcej niż tylko moduł z programem demonstracyjnym. Kody źródłowe oraz kopalnia wiedzy na GitHub pozwalają wejść w świat chmurowych aplikacji IoT i wykorzystywać je bez ograniczeń.

Microchip oferuje tez wersję modułu z mikrokontrolerem rodziny PIC24 (PIC-IoT WA) oraz wersje firmware przeznaczoną do połączenia się z chmurą Google (AVR-IoT WG oraz PIC-IoT WG).