Do tej pory w poświęconym automatyce domowej cyklu Infinity został opisany najbardziej złożony element systemu, mianowicie serwer stron www. Rozumiem, że było i jest to spore wyzwanie dla tych Czytelników, którzy z poruszoną tematyką spotykają się po raz pierwszy. Często w rozmowach pozwalam sobie na taki żarcik: Rzeczy proste to można kupić w kiosku, nam do zbudowania pozostały rzeczy złożone. Ta złożoność jest pojęciem relatywnym, gdyż jak coś poznamy w wystarczającym stopniu, to okazuje się, że nie taki diabeł straszny.
Kolejne części będą bardziej „luzackie”, tym bardziej, że wszystkie pozostałe elementy systemu automatyki bazują na popularnej rodzinie mikrokontrolerów, jakimi są AVR-y. Biorąc pod uwagę fakt, że mój system powstawał na przestrzeni wielu lat, na jego początkach nie było specjalnie innej oferty. Mam na myśli nie tylko to, czy można było wtedy zakupić inne mikrokontrolery: istotny był (nawet może najbardziej) dostęp do bezpłatnych narzędzi pozwalających na tworzenie oprogramowania.
Do mikrokontrolerów z rodziny ATMEGA dostępne jest na stronach firmy ATMEL (która obecnie stała się częścią firmy Microchip) oprogramowanie narzędziowe. Wszystkie moje moduły, bazujące na mikrokontrolerach z rodziny AVR, mają program oparty na oprogramowaniu narzędziowym AVR STUDIO w wersji 4 (nie jest to wersja najnowsza, pogoń za najnowszym oprogramowaniem narzędziowym nie zawsze jest celowa).
Standard RS485 - opis działania
Jak było już wspomniane, serwer www jest „zasilany” informacjami poprzez port szeregowy. Wszelkie dane serwowane dla przeglądarki mają swoje źródło w wielu dedykowanych modułach pomiarowych lub sterujących. W standardzie RS232 nie istnieje możliwość prostego równoległego łączenia. Konieczne staje się znalezienie innego rozwiązania.
Nie trzeba jednak szukać daleko. Istnieje coś, co nazywa się RS485 (literki „RS” w nazwie pochodzą od „Recomended Standard”). Ów standard pozwala na równoległe dołączenie wielu modułów do wspólnej linii. Jest to możliwe dzięki temu, że wyjścia mogą zostać postawione w stan wysokiej impedancji (logicznie stają się odłączone).
Transmisja pełnodupleksowa i transmisja półdupleksowa - na czym polegają?
Z pracą interfejsu szeregowego (tego układu do konwersji napięć) RS485 wiążą się dwa pojęcia: transmisja pełnodupleksowa oraz transmisja półdupleksowa. W pierwszym przypadku (pełny dupleks) oznacza to, że dane mogą być jednocześnie nadawane i odbierane (jak typowo dzieje się to w przypadku RS232) lub (półdupleks) dane mogą być nadawane albo odbierane, a nie jest możliwe jednoczesne nadawanie i odbieranie.
W moich urządzeniach został zastosowany układ scalony o symbolu SN75176, który zawiera w sobie pojedynczy interfejs komunikacyjny, który może spełniać funkcję nadajnika lub odbiornika (rysunek 1). Jest to zależne od wysterowania linii DE (pin 3) oraz RE (pin 2). Często obie linie są łączone razem i wtedy uzyskuje się funkcję odbiornika (dla stanu zera logicznego na liniach DE+RE) lub nadajnika (w sytuacji odwrotnej). Dane są nadawane jako T+/ R+ oraz T–/R–.
Warto tu zauważyć, że wyjście jest „dwudrutowe” bez potencjału odniesienia (bez masy GND). Wysterowanie układu do funkcji nadajnika oznacza, że sygnał przechodzi z wejścia D (pin 4) na parę różnicową (T+/R+ i T–/R–). Przy wysterowaniu do funkcji odbiornika, poza przejściem samego nadajnika do stanu wysokiej impedancji, by nie wnosić zakłóceń na liniach transmisyjnych, sygnał przechodzi z pary różnicowej na wyjście R (pin 1).
Typowe „przypięcie” tego układu do mikrokontrolera polega na połączeniu wyjścia danych szeregowych (z mikrokontrolera) na wejście D w SN75176, wejścia danych szeregowych (w mikrokontrolerze) z wyjściem R w SN75176 i połączeniu równoległym sygnału DE i RE z dowolnym pinem jakiegokolwiek portu do przełączania funkcji układu na nadajnik/odbiornik.
Obsługa transmisji pełnodupleksowej (czyli przykładowo z wykorzystaniem interfejsu RS232) jest wystarczająco szczegółowo opisana w różnych publikacjach. Pewnego komentarza wymaga obsługa transmisji z użyciem interfejsu RS485 w trybie półdupleksowym. Jej ideę pokazuje rysunek 2, gdzie dane są albo nadawane, albo odbierane. Wszystkie linie transmisyjne (linia T+/R+ i T–/R–) połączone są ze sobą równolegle.
Takie rozwiązanie sprawia wrażenie, że w układzie występuje konflikt logiczny, gdyż jak można się spodziewać, jednoczesne nadawanie kilku interfejsów może się wzajemnie zakłócać. By nie dopuścić do zaistnienia takiej sytuacji, należy zadbać, by w danej chwili mogło nadawać najwyżej jedno urządzenie. W spoczynku każdy z interfejsów może odbierać dane, co przy okazji generuje pewien drobny problem sprzętowy, gdyż w przypadku, gdy „wszyscy słuchają”, żyły linii mają nieokreślone potencjały. Ten problem rozwiązuje się w ten sposób, że jeden, wybrany interfejs rezystorami wymusza określony poziom napięć w żyłach linii (cisza transmisyjna).
Jeżeli jakieś urządzenie ma potrzebę wysłania swoich danych, to po prostu przełącza swój interfejs RS485 na nadawanie i realizuje transmisję. Po jej zakończeniu wraca do funkcji odbierania. Wysłane informacje docierają do wszystkich urządzeń przyłączonych do wspólnej linii transmisyjnej. Ta prosta koncepcja niesie dość istotny problem zagwarantowania, żeby najwyżej jedno urządzenie nadawało.
Możliwym rozwiązaniem jest technika, którą można określić jako „krążący żeton”. W takiej minisieci przekazywany jest umowny żeton i jeżeli posiadasz żeton, to możesz wysłać swoje dane. Można zaproponować wiele rozwiązań związanych z synchronizacją dostępu urządzenia do magistrali.
Zastosowane w moim rozwiązaniu sprowadza się do tego, że jedno wybrane urządzenie jest wyróżnione, na rysunku 2 nazwane MASTER, oraz występuje szereg urządzeń podpiętych do wspólnej magistrali, które określone są SLAVE 1...SLAVE N. To taki król (MASTER) i jego poddani (SLAVE). Z powodu wyjątkowości urządzenia MASTER to ono zawiera wspomniane rezystory wymuszające określone potencjały spoczynkowe na przewodach oraz jest tym „władcą”, który rozdaje żetony.
Polega to na tym, że w trakcie pracy sterownik z funkcjonalnością MASTER cyklicznie wysyła do poszczególnych sterowników SLAVE zezwolenie na wysłanie swoich danych. Z punktu widzenia elektrycznego oznacza to, że MASTER na czas wysyłania danych przełącza swój interfejs RS485 do funkcji nadawania (wprowadza na linie magistrali własny sygnał).
Po jej zakończeniu interfejs jest przestawiony do funkcji odbierania, dając w ten sposób możliwość wybranemu, zaadresowanemu sterownikowi SLAVE na aktywny dostęp do magistrali komunikacyjnej. Na tę operację jest zarezerwowany określony interwał czasu, po upłynięciu którego MASTER powtarza te czynności w stosunku do kolejnego modułu SLAVE. Ta idea wymaga znajomości listy elementów typu SLAVE przyłączonych do wspólnej magistrali.
Czytelnicy, którzy spotkali się ze standardem MODBUS lub pokrewnymi, łatwo zauważą, że nie jest on tu wykorzystywany. Ja proponuję inny sposób działania.
Każdy z modułów przyłączonych do magistrali RS485 musi mieć możliwość stwierdzenia, czy dana informacja przesyłana szeregowo jest adresowana do niego. Dlatego każdy moduł ma przydzielony unikalny identyfikator (numer, adres). Przesyłane komunikaty mają następujący format:
<identyfikator adresata>:<identyfikator nadawcy>:<polecenie>.<parametr><CR>
gdzie:
- "identyfikator adresata" – identyfikator sterownika będącego miejscem docelowym przesyłanych danych jest ciągiem liter oraz cyfr
- "identyfikator nadawcy" – identyfikator sterownika będącego źródłem przesyłanych danych jest ciągiem liter oraz cyfr
- "polecenie" – identyfikator polecenia (ciągu składającego się z liter)
- "parametr" – parametr lub ciąg parametrów rozdzielonych znakiem kropki, w przypadku, gdy polecenie nie zawiera parametrów, część nie występuje (łącznie ze znakiem kropki będącej separatorem pomiędzy identyfikatorem polecenia a listą parametrów),
- "CR" – znak kontrolny (CR) o kodzie 0D w zapisie szesnastkowym jako znak kończący całe polecenie.
Jako identyfikatora adresata można użyć słowa „GENERAL” oznaczającego „każdy” (to forma trybu rozgłoszeniowego do wszystkich). Ponieważ poleceniami wymieniają się sterowniki lub odpowiednie oprogramowanie w komputerze PC, analizator poleceń jest mocno uproszczony. Jest wrażliwy na pisownię małymi oraz wielkimi literami (polecenia mają być zapisane dokładnie tak, jak wymaga tego adresat; we wszystkich przypadkach występuje pisownia wielkimi literami).
Co dość istotne, nie jest zrealizowana funkcjonalność znaku Backspace. Oznacza to, że prowadząc dialog ze sterownikiem poprzez emulator terminalu, choćby w fazie testów lub elementarnej konfiguracji, należy wpisać dane starannie, bez pomyłek. Innym rozwiązaniem ułatwiającym konfigurowanie modułu jest opracowanie uruchamianego w komputerze PC specjalizowanego programu pozwalającego na dialog z modułem (i taką możliwość zaproponuję Ci, drogi Czytelniku, do wykorzystania, można go będzie pobrać w przyszłym miesiącu jako materiały dodatkowe z Elportalu).
Do funkcji synchronizacji dostępu do magistrali RS485 stosowane są dwa polecenia (właściwie to jedno polecenie i jedna odpowiedź). Jest to:
<identyfikator SLAVE>:<identyfikator MASTER>:REPLY<CR>
Powyższe polecenie jest przekazaniem żetonu do określonego sterownika SLAVE, jako zezwolenie na aktywny jego dostęp do magistrali RS485, ma identyczną strukturę jak wszystkie polecenia i jest prośbą modułu MASTER (identyfikowanego przez "identyfikator MASTER" ), by moduł SLAVE (identyfikowany przez "identyfikator SLAVE") się „odezwał”. W przypadku gdy moduł SLAVE ma coś do wysłania poprzez magistralę RS485, to po prostu wysyła swoje dane. W sytuacji przeciwnej wysyła stwierdzenie, że „nie ma nic do powiedzenia”. Wygląda to następująco:
<identyfikator MASTER>:<identyfikator SLAVE>:NODATA<CR>
Moduł określony przez "identyfikator SLAVE" informuje moduł zarządzający identyfikowany przez "identyfikator MASTER" (gdyż to on jest nadawcą polecenia REPLY), że nie ma nic do wysłania.
Omówione wyżej dwa komunikaty przesyłania magistralą RS485 są używane do synchronizacji dostępu do niej. Nie wyczerpuje to wszystkich możliwości. Kompletny zestaw poleceń można powiedzieć, że... nie istnieje, bo zawsze można dobudować kolejny funkcjonalnie odmienny moduł posiłkujący się własnym zestawem poleceń.
W tej całej mojej koncepcji istotnych jest jedynie kilka szczegółów: każdy moduł musi dostosować się do parametrów transmisji szeregowej obowiązującej na magistrali RS485 (jest to 38400 – prędkość transmisji i N81 – transmisja 8-bitowa bez bitu parzystości z jednym bitem stopu), formatu poleceń (wysyłać i odbierać polecenia „trzymające” wyżej wymienioną postać) i obsługiwać „wspólną część” poleceń (polecenie REPLY).
Każdy z modułów przyłączany do całości dysponuje swoim indywidualnym zestawem poleceń, jednak wiele z nich realizuje identyczną funkcjonalność, toteż nie widzę powodu, by coś, co oznacza to samo, dla innego moduły miało inną nazwę. Wymusza to istnienie grupy poleceń o tym samym identyfikatorze i realizującą tę samą operację. Polecenia specyficzne dla danego modułu mogą mieć unikalne nazwy.
Przekazywanie danych od grupy modułów do serwera www
Wracając do koncepcji przekazywania danych od grupy modułów do serwera www: zajmuje się tym specjalizowany moduł określany jako procesor komunikacyjny (będący jednocześnie sterownikiem MASTER). Obsługuje on dwa interfejsy szeregowe, jeden jako RS232 łączy się z serwerem, drugi jako RS485 zarządza komunikacją w obrębie tej magistrali. Schemat jednostki centralnej pokazuje rysunek 3.
Użyty jest mikrokontroler AVR zawierający dwa niezależne kontrolery obsługujące asynchroniczną transmisję szeregową o symbolu ATMEGA164 (U201). Taktowany jest sygnałem z rezonatora kwarcowego (X101). Kolejne elementy tworzą złącze do programowania mikrokontrolera w aplikacji (P101) oraz obwód do generowania sygnału reset w momencie włączenia zasilania dla mikrokontrolera, składający się z diody (D101), rezystora (R101) oraz kondensatora (C101).
Obwód jest uzupełniony mikroprzyciskiem pozwalającym na resetowanie procesora w dowolnym momencie. Wybrane piny portu A są przeznaczone do sterowania lampkami LED, które służą do sygnalizacji określonych stanów oraz czynności realizowanych przez procesor. Kanał szeregowy USART0 służy do komunikacji via interfejs RS232 (układ U202, rysunek 4).
Ponieważ zastosowany układ umożliwia obsługę 4 linii (2 sygnały nadawane oraz 2 sygnały odbierane), dwie linie (z punktu widzenia elektronicznego dowolne) są przeznaczone do pracy jako linie modemowe, jako dodatkowe sygnały w złączu RS232 (serwer www udostępnia wszystkie linie modemowe, więc istnieje możliwość wykorzystania tej cechy w oprogramowaniu). Drugi kanał transmisji szeregowej jest poprzez układ interfejsu RS485 (U401, rysunek 5) wykorzystany do komunikacji za pośrednictwem magistrali RS485.
Rozwiązanie sprzętowe interfejsu RS232
Rozwiązanie sprzętowe interfejsu RS232 (rysunek 4) jest typowe. Zastosowany układ MAX232 jest użyty zgodnie z jego dokumentacją (ma przyłączone niezbędne do pracy cztery kondensatory: C203, C204, C205 i C206). Sygnały, wraz z liniami modemowymi, są udostępnione na zewnątrz poprzez 9-pinowe złącze żeńskie typu D-SUB (P201). Łącze szeregowe w standardzie RS232 jest niesymetryczne (zawiera trzy linie wyjściowe oraz pięć linii wejściowych), więc użyty wariant w procesorze komunikacyjnym odpowiada funkcji „wyposażenia modemowego”.
Oznacza to, że do połączenia z serwerem www (który odpowiada „wyposażeniu komputerowemu”, zawiera złącze D-SUB męskie) wymagany jest przewód zakończony złączem męskim oraz żeńskim zawierający wszystkie żyły bez przeplotów (typowy przewód do połączenia z modemem). Jeżeli zrezygnujemy z funkcjonalności linii modemowych, przewód łączący serwer www z opisywanym procesorem komunikacyjnym może zostać zredukowany do 3-żyłowego (zawierającego sygnał Rx, Tx i GND).
Rozwiązanie sprzętowe interfejsu RS485
Drugi interfejs (RS485) jest pokazany na rysunku 5. Sam układ (U401) jest użyty zgodnie z wyżej określoną sugestią, oba wejścia sterujące (sygnał DE, pin 3 oraz sygnał RE, pin 2) są połączone razem i połączone (jako sygnał DIR) z określonym wyprowadzeniem mikrokontrolera, poprzez które będzie przełączany kierunek transmisji. Linie te są wstępnie podciągnięte do VCC przez rezystor (R402), którego zadaniem jest utrzymanie określonego, stabilnego stanu, zanim mikrokontroler nie skonfiguruje właściwie swoich portów do pracy w wymaganym środowisku, zapobiega to stanom nieustalonym na magistrali RS485.
Również linia danych odbieranych jest podciagnięta do VCC, wymuszając stan pasywny („ciszy transmisyjnej”) na linii danych odbieranych (należy pamiętać, że sygnał wyjściowy R, pin 1 w sytuacji przełączenia układu do pracy jako nadajnik, jest w stanie wysokiej impedancji, czyli nie jest źródłem sygnału). Wyjście interfejsu, sygnał T+/R+ (na schemacie oznaczone jako A) oraz T–R– (na schemacie oznaczone jako B) jest spolaryzowane rezystorami R403, R404 i R405 do stanu pasywnego dla magistrali RS485 i poprzez złącze P401 jest udostępnione na zewnątrz modułu. Jest to 6-pinowe złącze typu Micro Fit, które jednocześnie doprowadza do modułu napięcie zasilające (+12V).
Wspomniane wyżej lampki LED (zamontowane na małej płytce PCB pełniącej rolę frontpanelu) są przyłączone do procesora komunikacyjnego przez złącza P301 i P302 (rysunek 6).
Jedna lampka (D805) sygnalizuje zasilanie modułu (jest włączona na stałe), pozostałe są sterowane przez program. Ich znaczenie jest następujące: D801 – mrugająca lampka statusu (sygnalizuje „rytm serca”), D802 – lampka sygnalizująca transmisję (nadawanie oraz odbiór) poprzez interfejs RS232, D803 – lampka sygnalizująca transmisję (nadawanie oraz odbiór) poprzez interfejs RS485, D804 – lampka sygnalizująca zapis danych konfiguracyjnych do pamięci EEPEOM oraz D805 – lampka sygnalizująca pracę w trybie konfiguracyjnym (stan connect opisany w dalszej części).
Zasilanie modułu komunikacyjnego (magistrala RS485)
Moduł może być zasilany ze źródła napięcia o wartości od 8V do 40V. Dzięki zastosowanemu impulsowemu stabilizatorowi napięcia (rysunek 7) ma wysoką sprawność przetwarzania energii. Biorąc pod uwagę, że moduł jest przeznaczony do pracy ciągłej, warto zadbać o minimalizację strat energii.
Przed stabilizatorem zastosowana dioda D501 zabezpiecza układ przed niewłaściwą polaryzacją (w wyniku pomyłki, bo człowiek to istota omylna i czasami może przez nieuwagę narobić sobie problemów). Samo rozwiązanie układowe stabilizatora napięcia jest zgodne z dokumentacją producenta (dla zainteresowanych Czytelników opracowałem dodatkowy dokument opisujący możliwości zastosowanego układu, który można pobrać jako materiały dodatkowe ze strony Elportalu). Wypracowane napięcie wyjściowe poprzez zworkę P502 jest udostępnione do zasilania całego modułu.
W drugiej części artykułu opisane zostanie montaż, uruchomienie i oprogramowanie.