Witam. Chciałem dzisiaj przedstawić kolejny projekt z cyklu "inni mają - mam i ja"
Tym razem jest to miniaturowy sterownik ethernetowy - "uWebServer". Układ zbudowany został w oparciu o mikrokontroler Cortex-M3 - STM32F103C8T6, do tego kontroler ethernetu "znany i lubiany" - ENC28J60. Całość pracuje pod kontrolą systemu FreeRTOS oraz stosu TCP-IP uIP v1.0. Chcąc uniknąć głosów "hejterów", że tego typu układy "nie mają sensu" dodam, że układ został wykonany bez jakiegoś konkretnego zastosowania - tylko i wyłącznie w celach edukacyjno-rozwojowych oraz dla satysfakcji własnej autora
Mimo niewielkich rozmiarów (4x5cm) i zasobów sprzętowych możliwości wykorzystania jest sporo.
Główna funkcjonalność tego układu to WebServer. Jednym z założeń było stworzenie układu umożliwiającego w łatwy sposób sterowanie liniami GPIO oraz monitoringu danych z czujników. W projekcie do wykorzystania jest 8 lini GPIO - 4 skonfigurowane jako wejścia oraz 4 jako wyjścia. Dodatkowo na złączu goldpin dostępna jest magistrala 1-Wire oraz UART (obsługiwany przez bootloader - można przez niego wgrywać firmware). Z poziomu WebServera mamy możliwość ustawiania stanu dowolnej lini GPIO oraz odczyt stanu linii wejściowych. Linie wyjściowe wykorzystać można do sterowania np. przekaźnikiem, a tym samym odbiornikami większej mocy. Dodatkowo na płytce znajdują się dwie diody LED - można nimi również sterować z poziomu przeglądarki lub mogą być wykorzystane jako źródła informacji o zdarzeniach. Kolejną funkcjonalnością jest odczyt oraz monitoring temperatury. W tym celu zaimplementowano obsługę magistrali 1-Wire. Obsługa standardowa "bit-banging" na jednej z linii GPIO. Nie jest to rozwiązanie optymalne, jednak sprawdza się bezproblemowo. Dzięki algorytmowi wykrywania podpiętych czujników system jest skalowalny dla większej ich ilości. W chwili obecnej obsługiwany jest tylko jeden - jednak nic nie stoi na przeszkodzie, żeby tą ilość zwiększyć w miarę potrzeby. W przeglądarce generowany jest interaktywny (możliwość dynamicznego podglądu data-pointów) wykres dla aktualnej temperatury. Wykorzystałem w tym celu "Google Chart Tools". W tej chwili przesyłane próbki są buforowane w RAM'ie, co powoduje dość spore ograniczenie ich ilości. Docelowo chciałbym wykorzystać do tego celu kartę uSD z systemem plików oraz generować również wykresy historyczne (lub przynajmniej z szerszego zakresu czasu niż obecnie). Do pozostałych opcji WebServera można zaliczyć monitoring stanu wątków uruchomionych w systemie (Task Stats), czasu procesora zużywanego przez poszczególne wątki wraz z wykresem kołowym (Run Time Stats), statystyki protokołu TCP-IP (TCP Stats), statystyki połączeń (TCP Connections), obsługa GPIO i LED (IO COntrol) oraz odczyt temperatury. Cała zawartość systemu plików przechowywana jest w pamięci flash mikrokontrolera.
Dodatkowo w systemie zaimplementowana została obsługa konsoli telnetu oraz funkcja klienta. Obydwie z tych opcji są uruchomione i przetestowane, jednak na chwilę obecną nie są wykorzystywane. Klient łączy się z darmowym serwerem "COSM" ("internet of things") i przesyła dane z czujnika temperatury - dzięki czemu można je udostępnić poza sieć lokalną, bez wykorzystywania zewnętrznego IP (którego nie posiadam). Konsola Telnet obsługuje podstawowe komendy z dema uIP - docelowo chciałbym dołożyć obsługę czasu NTP oraz wykorzystać Telnet jako konsolę "debug".
Słów kilka o sprzęcie ...
Całość umieszczona została na płytce dwustronnej o wymiarach 5x4cm. Jak już wspominałem wcześniej - sercem układu jest mikrokontroler STM32F103C8T6 taktowany częstotliwością 72MHz, oferujący 64kB pamięci flash oraz 20kB pamięci RAM. Nad pracą układu czuwa darmowy system operacyjny czasu rzeczywistego - FreeRTOS 7.0.1.W chwili obecnej wykorzystane jest ~50kB pamięci flash - dużą jej część stanowi system plików WebServera oraz około 15kB pamięci RAM. Oprogramowanie napisane zostało w języku C z wykorzystaniem darmowych narzędzi - Eclipse + CodeSourcery G++. Układ może być zasilany z portu USB lub poprzez dowolny zasilacz 5-9V poprzez gniazdo zasilania DC. Dalej znajduje się stabilizator 3.3V - SP6203. Napięcie filtrowane jest poprzez dwa kondensatory tantalowe 22uF/100nF oraz koralik ferrytowy. Stan zasilania sygnalizowany jest poprzez świecenie diody LED. Aplikacja układu ENC28J60 jest zgodna z zaleceniami producenta. Rezystor "BIAS" powstał z równoległego połączenia rezystorów 4.7k, co w wyniku dało ~3.35k. Początkowo miałem problemy z komunikacją Ethernet - winowajcą okazało się gniazdo niewiadomego pochodzenia. Zostało ono wymienione na HR911105A firmy Hanrun - tanie i łatwo dostępne na zagranicznych serwisach aukcyjnych. Komunikacja z układem ENC28J60 oparta została na zdarzeniach - przerwanie generowane przez układ w momencie otrzymania pakietu danych ustawia semafor, który powoduje wybudzenie wątku odpowiedzialnego za obsługę stosu TCP-IP. W celu debugowania pracy mikrokontrolera wykorzystany jest interfejs SWD dostępny na PCB. Po stronie bottom płytki znajduje się gniazdo karty uSD, na warstwie top natomiast - miejsce do wlutowania pamięci serial flash. Projekt zakłada wykorzystanie jednego z tych elementów - dzielą wspólne linie interfejsu SPI - włącznie z linią CS.
Mam kilka kompletów elementów i PCB, więc jeśli ktoś byłby zainteresowany rozwojem projektu to zapraszam na PW
Fajne? Ranking DIY