Poniższy projekt przedstawia zastosowanie układu STM32F100RB w aplikacji realizującej obsługę prostego serwera HTTP. Jak wiadomo powyższy układ nie realizuje obsługi warstwy MAC ani PHY sieci Ethernet. W związku z czym w poniższym projekcie należało zastosować dodatkowy układ, który realizowałby obie funkcje. Wybór padł na układ ENC28J60, który posiada zintegrowaną warstwę MAC oraz warstwę PHY wspierającą standard 10BASE-T. Na fotografii 1 przedstawiono widok zmontowanego urządzenia.

 

Fot. 1. Wygląd serwera HTTP z wykorzystaniem mikrokontrolera STM32F100RB

Fot. 1. Wygląd serwera HTTP z wykorzystaniem mikrokontrolera STM32F100RB

 

Podstawowym zadaniem przedstawionej aplikacji jest odpowiedź na zapytania HTTP poprzez transmisję strony WWW do klienta. Z poziomu strony WWW istnieje możliwość sterowania wyjściami mikrokontrolera oraz odczytywanie aktualnej temperatury z podłączonego czujnika temperatury w postaci układu DS18B20. Na rysunku 2 przedstawiony został zrzut z przeglądarki prezentujący stronę WWW. Dodatkowo aplikacja realizuje takie funkcje jak:

  • rejestracja temperatury z czujnika DS18B20 na karcie SD zgodnie z ustalonym interwałem,
  • obsługa terminala przez port RS232 z rejestracją komend do pliku na karcie SD oraz zabezpieczeniem w postaci konieczności logowania przy użyciu hasła,
  • odczyt aktualnego czasu z serwera czasu NTP (Network Time Protocol),
  • zapis  adresu IP bramy na serwerze zewnętrznym w celu umożliwienia dostępu do aplikacji z sieci Internet,
  • sterowanie diodą RGB podłączoną do mikrokontrolera.

Rys. 2. Zrzut z przeglądarki internetowej prezentujący stronę WWW

Rys. 2. Zrzut z przeglądarki internetowej prezentujący stronę WWW

W przedstawionym projekcie głównymi elementami są: zestaw uruchomieniowy STM32VLDISCOVERY  oraz moduł Ethernetowy modENC28J60. Połączenie zestawu uruchomieniowego i modułu z pozostałymi elementami został przedstawiony na rysunku 3.

Rys. 3. Schemat połączeniowy poszczególnych elementów serwera

Rys. 3. Schemat połączeniowy poszczególnych elementów serwera

W projekcie został użyty gotowy stos TCP/IP Tuxgraphics, który został przygotowany pod mikrokontrolery charakteryzujące się małą liczbą dostępnej pamięci RAM i Flash.

Obsługa terminala została oparta o tablicę zawierającą rozpoznawane komendy oraz funkcje przypisane do poszczególnych rozkazów. Odczyt danych z portu szeregowego jest wykonywany w ramach obsługi przerwania i buforowany z zastosowaniem buforu kołowego. Dane zapisane w buforze są przetwarzane dopiero w pętli głównej programu.

Na początku połączenia z aplikacją, przy wykorzystaniu terminala, należy dokonać logowania. Proces ten realizowany jest poprzez podanie hasła w postaci komendy enable kuba, gdzie hasłem jest kuba. Po zalogowaniu można normalnie korzystać z terminala. Informacje o interpretowanych przez aplikację komendach można uzyskać poprze użycie polecenia help. Wszystkie wprowadzane komendy, nawet te niepoprawne, są zapisywane do pliku cmd.log na karcie SD.

Do obsługi partycji na karcie SD wykorzystana została biblioteka FatFS. Po uruchomieniu aplikacji następuje montowanie karty SD. Przy każdorazowym zapisie danych na karcie SD sprawdzana jest poprawność działania karty. W przypadku niepowodzenia operacji w terminalu wyświetlany jest odpowiedni komunikat.

Należy zwrócić uwagę na bardzo ciekawe rozwiązanie aktualizowania adresu IP bramy dostępowej na zewnętrznym serwerze. Na serwerze został umieszczony przygotowany skrypt PHP, który zapamiętuje adres IP urządzenia odwiedzającego zadany adres WWW. W momencie wysłania zapytania GET przez aplikację do tego skryptu następuje zapisanie adresu IP bramy wyjściowej do pliku na serwerze hostingowym. Do pełnego działania potrzebny jest drugi skrypt PHP, który odczytuje zapisane IP na serwerze hostingowym i przekierowuje użytkownika odwiedzającego stronę na zapisany adres IP. Przy wykorzystaniu takich dwóch prostych skryptów nie ma potrzeby stosowania zewnętrznych serwerów świadczących takie funkcje. Aktualizacja adresu IP wykonywana jest zgodnie z harmonogramem.

W przypadku obsługi czujnika temperatury – układ DS18B20 – w transmisji wykorzystywany jest prosty protokół 1-Wire. Odczyt danych realizowany jest z wykorzystaniem automatu stanów sterowanego przez zegar RTC.

Kolejną funkcją, realizowaną przez przedstawioną aplikacje, jest sterowania podłączoną diodą LED RGB. Regulacja sterowania jasnością diody LED RGB zrealizowana jest z użyciem jednego z liczników mikrokontrolera STM32, generującego na 3 kanałach sygnał prostokątny o zmiennym współczynniku wypełnienia. Kontrola wartości wypełnienia poszczególnych sygnałów realizowana jest przy wykorzystaniu Ethernetu poprzez podanie zapytania do serwera w jednej z postaci:

  • http://ip_serwera/?setR=X,
  • http://ip_serwera/?setG=X,
  • http://ip_serwera/?setB=X,

gdzie X jest liczbą z zakresu od 0 do 2000.

Ostatnią funkcją zaimplementowaną w mikrokontrolerze jest wysyłanie zapytania do serwera czasu NTP o zadanym w kodzie adresie IP w celu pobrania aktualnego czasu. Po odebraniu danych następuje aktualizacja licznika RTC.

Wstępnie planowane było wykonanie dedykowanej płytki PCB. Jednak w zestawie uruchomieniowym STM32VLDISCOVERY jest dołączona uniwersalna płytka do lutowania. Umożliwia ona szybkie przygotowanie i testowanie tworzonych projektów w związku z czym została wykorzystana jako podstawa do montażu projektu. Zamontowano na niej: konwerter poziomów do obsługi RS232 (MAX232), kartę SD, czujnik DS18B20 oraz diodę LED RGB.

Projekt został przygotowany z użyciem zestawu aplikacji:

  • Yagarto – kompilator,
  • Eclipse – środowisko edycji kodu programu,
  • OpenOCD – aplikacja debugująca i programująca.

Jakub Zbydniewski