Serwisy partnerskie:
Close icon
Serwisy partnerskie

Moduł uniwersalnego sterownika/alarmu GSM

Article Image
Elmax
Kiedy przeczytałem o zadaniu zbudowania układu współpracującego z telefonem komórkowym (Szkoła Konstruktorów 155), pomyślałem, że to coś dla mnie. Zwłaszcza że pomysł sterownika miałem już wcześniej, a zrodziła go, jak to zwykle bywa, potrzeba. Chodziło o kontrolę stanu oddalonego obiektu. Od razu muszę dodać, że prezentowany układ nie jest jeszcze w pełni funkcjonalnym sterownikiem, a tylko/aż, jak to zaznaczono w tytule, modułem uniwersalnego sterownika lub alarmu. Oznacza to tyle, że należy we własnym zakresie zaprojektować pewne elementy układu. Chodzi tu o zasilanie buforowe oraz izolację wejść i wyjść, ale o tym dalej.

Jeden rzut okiem na schemat (rysunek 1) i od razu wiadomo, że część sprzętowa jest prosta. Poskładanie na płytce testowej (tak jak układ modelowy) zajmie mniej niż 15 minut i po takim czasie mamy układ gotowy do testów. Układ sterownika składa się praktycznie z samego tylko procesora. Jeśli nie posiadamy akurat pod ręką czujnika temperatury, to nic wielkiego się nie stało – i tak zadziała. Bez LCD też zadziała, ale układ nie będzie już tak „komunikatywny”. Jak nietrudno się domyślić, port PA jest cyfrowym wejściem z wewnętrznym podciąganiem do VCC, natomiast port PC – wyjściem. Elementy podłączone do tych portów mają jedynie umożliwić nam przetestowanie sterownika. W normalnym użytkowaniu diody mogą pełnić funkcję sygnalizacyjną, natomiast przełączniki są zbędne.

Rysunek 1.

Na schemacie zaznaczono tylko linie sterujące LCD, ale wyświetlacz wymaga oczywiście zasilania i napięcia regulującego kontrast. Dioda LED D2, migając informuje o aktywności wejść alarmowych. Wejściami tymi są „Alarm_0” i „Alarm_1” podłączone do odpowiednich wejść przerywających procesora. Reagują one na opadające zbocze. Wejście „siec/bat” informuje procesor o źródle zasilania. Ponieważ układ ma też działać jako alarm, powinien być niezależny od sieci energetycznej i wyposażony w akumulator. Sposób zrealizowania zasilacza buforowego oraz optymalnego układu kontroli ładowania akumulatora jest dość szerokim problemem i nie podaję tu przepisu na rozwiązanie. W każdym razie „1” oznacza, że procesor jest zasilany z sieci, a „0” powinno być wymuszone na tym wejściu, gdy źródłem jest akumulator. W wersji bez akumulatora należałoby zewrzeć to wejście do VCC.

„Alarm on/off” jest wejściem, które umożliwia lokalne wyłączenie alarmu. Wyobraźmy sobie, że przyjeżdżamy na działkę i raczej nie mamy ochoty pisać SMS-a. Do tego wyprowadzenia powinien być podłączony zwykły przełącznik dwustabilny.

Może to też być kontaktron ukryty w takim miejscu, aby można było postawić obok niego magnes. Sterownik po włączeniu zasilania zapamiętuje stan tego wejścia i uruchamia czuwanie. Każda zmiana stanu wejścia powoduje włączanie i wyłączanie czuwania systemu, co skutkuje też wysłaniem informacji SMS do użytkownika/ów. Taki sposób sterowania może wydać się troszkę dziwny, ale dzięki temu układ może być kontrolowany niezależnie od pozycji przełącznika przez SMS. Załóżmy, że już magnes został postawiony pod kontaktronem i alarm jest wyłączony. Po naszym pobycie zamykamy drzwi i odjeżdżamy, ale ktoś zapomniał znów włączyć alarm, czyli odstawić ten magnes. W tym momencie wystarczy wydanie komendy SMS-em. Jest to podobne do wyłącznika schodowego umożliwiającego zapalanie i gaszenie światła niezależnie z dwóch miejsc. Ostatnią rzeczą, potrzebną do uruchomienia sterownika, jest telefon komórkowy obsługujący komendy AT. Najlepiej użyć taniego i dobrego Siemensa C35(i). Telefon komunikuje się z procesorem używając zwykłej transmisji po RS232. Na schemacie znajdują się dziwnie włączone elementy R2 i D1. Jako D1 została użyta dioda świecąca (czerwona) zamiast diody Zenera, akurat nie było pod ręką odpowiedniej wartości. Chodzi o to, aby obniżyć napięcie poziomu „1” procesora poniżej 3,3V. Podanie napięcia wyższego na telefon może spowodować jego uszkodzenie, a już na pewno spowoduje zgubienie zasięgu. Procesor poprawnie rozpoznaje stany logiczne generowane przez telefon. Na schemacie podano numery pinów gniazda C35. Wtyczkę łatwo zdobyć, demontując stary zestaw słuchawkowy. Należy wspomnieć o kolejnym problemie do rozwiązania. Również i w tym miejscu nie zaprojektowano układu ładowania baterii telefonu.

Fotografia

Sterownik oczekuje, że telefon, który służy tu tylko za terminal do sieci GSM, jest zawsze włączony. Brak komunikacji z telefonem skutkuje przekroczeniem czasu oczekiwania i resetem sterownika przez układ watchdog. Czas, po jakim układ się resetuje, to blisko 2s od momentu wykrycia takiej sytuacji. W modelu wyprowadziłem przewody bezpośrednio z ogniw baterii i ładuję je niejako bez wiedzy telefonu i jego wewnętrznego układu kontroli. DS18B20 to scalony termometr 1-wire, który może być umieszczony w pewnej odległości od reszty sterownika pod warunkiem wykorzystania dodatkowego przewodu zasilającego (magistrala 3-przewodowa). Czujnik zapewnia pomiar w zakresie –55...+125°C.

W każdym przypadku potrzebny jest terminal, czyli telefon z aktywną kartą. W modelu wykorzystano C35i, powinny nadawać się wszystkie modele akceptujące standardowe polecenia AT. Układ dynamicznie pobiera numer centrum usług, więc nie powinno być problemu z wyborem operatora. Przed podłączeniem telefonu należy koniecznie usunąć wszystkie wiadomości ze skrzynki nadawczej i odbiorczej, ponieważ sterownik zakłada że są one puste, oraz że nigdy nie pojawi się na raz więcej niż 9 wiadomości SMS. Przetworzone wiadomości SMS są automatycznie kasowane.

Wypadałby jeszcze napisać o możliwości/konieczności zapewnienia separacji galwanicznej opisywanego układu sterownika od reszty sterowanego systemu. Wyjścia można zrealizować jako przekaźnikowe, a do izolacji wejść mogą być wykorzystane transoptory. Jeśli nasz sterownik nie będzie miał zbyt ambitnych zadań, można w ogóle zrezygnować z izolacji.

Oprogramowanie

Program został napisany w C za pomocą darmowego środowiska WinAVR współpracującego z AVR Studio – można go ściągnąć z Elportalu. Cały program oparty jest na kolejce komunikatów, która została zrealizowana w bardzo prosty sposób. Kolejka ta składa się z tablicy struktur „KOMUNIKAT”. Szczegóły można znaleźć na listingu 1.

Listing 1
typedef struct
{
uint8_t Nast_w_kolejce; 
uint8_t Wiadomosc;
uint8_t Parametr;
} KOMUNIKAT;

#define max_kolejka 14  //max dlugosc kolejki

volatile uint8_t ilosc_w_kolejce;	
volatile uint8_t pierwszy_w_kolejce;
volatile uint8_t ostatni_w_kolejce;
volatile KOMUNIKAT kolejka[max_kolejka];

Obsługa kolejki w skrócie wygląda następująco. Elementy „Wiadomość” i „Parametr” są polami użytkowymi, przez które różne części programu porozumiewają się ze sobą. Pole „Nast_w_kolejce” przechowuje informację, pod jakim numerem w tablicy „kolejka” należy szukać następnego komunikatu. Pobranie aktualnego komunikatu sprowadza się do przepisania z tablicy komunikatu wskazywanego przez „pierwszy_w_kolejce”, a następnie przypisaniu w rodzaju „pierwszy_w_kolejce”=„KOMUNIKAT.Nast_w_kolejce” oraz zmniejszeniu wartości zmiennej „ilosc_w_kolejce” o ten 1 właśnie pobrany. Dozwolone wartości pola „Wiadomość” leżą w zakresie 0–0xFE. Pobrany komunikat jest usuwany z kolejki przez wpisanie wartości 0xFF do pola „Wiadomość”. Zajmowane przez niego miejsce jest uważane za zwolnione. Dorzucenie komunikatu jest nieznacznie bardziej skomplikowane. Jeśli kolejka jest pusta tzn. „ilosc_w_kolejce”=0, oznacza to, że pierwszym i ostatnim w kolejce komunikatem jest ten właśnie teraz dodawany. Czyli nie musimy nawet szukać wolnego miejsca i śmiało pakujemy komunikat na pozycję 0. Jeśli jest inaczej, najpierw należy znaleźć wolne miejsce w tablicy przechowującej komunikaty. Tablica ta jest przeglądana od początku i w pierwsze wolne miejsce wrzucany jest komunikat. Cała pętla główna opiera się na cyklicznym sprawdzaniu, czy w kolejce są jakieś komunikaty, a jeśli są, pobieraniu ich i wykonywaniu odpowiednich działań. Taka realizacja pętli głównej może wydać się nazbyt skomplikowana. Okazuje się, że zastosowanie kilku flag nie spełni swojego zadania z kilku powodów. Program musi reagować oddzielnie na różne zdalne żądania niezależnych użytkowników, poza tym konieczna jest obsługa zdarzeń przychodzących lokalnie do procesora. Przykładowo czasem, kiedy zachodzi potrzeba wysłania SMS-a i „puszczenia strzałki”, telefon jest zajęty i dodatkowo upływa czas timera watchdoga. Takie sytuacje są rozwiązywane tak, że komunikat, który nie może być obsłużony w danej chwili, jest przerzucany na koniec kolejki. Żadna informacja nie jest tracona. Podczas pisania oprogramowania bardzo pomocny był kurs z EP 3/2004 pana Jacka Bogusza traktujący o odbiorze i doręczeniu SMS-a w trybie PDU. Procedury kodowania i dekodowania SMS-a są wzorowane na tym artykule.

Obsługa 

Załóżmy, że układ jest połączony jak na schemacie, ponadto do portu RS podłączony jest telefon (C35i) z aktywną kartą, zalogowany do sieci GSM. Po włączeniu zasilania wyświetlacz powinien wyglądać tak jak na rysunku 2. 

Rysunek 2.

„OK” jest widoczne, kiedy układ nawiązał komunikację i telefon został poprawnie skonfigurowany. Jeśli nie, układ watchdog restartuje uC po 2 sekundach i próba połączenia i konfiguracji się powtarza. Jeśli sterownik jest włączany po raz pierwszy, w pamięci EEPROM nie znajdują się żadne nastawy i dodatkowo zostaną wyświetlone komunikaty z rysunku 3.

Rysunek 3.

„eH” – w pamięci EEPROM nie znaleziono poprawnie zapisanego hasła SMS, więc zapisano domyślne „1234”. Każdy, kto zna numer telefonu-terminalu, może w każdej chwili zmienić hasło, ale aby to zrobić, potrzebna jest znajomość starego hasła. Więc po pierwszej konfiguracji nasze urządzenie jest już bezpieczne. Hasło może zawierać cyfry bądź litery A-Z. Wielkość liter nie ma znaczenia, są traktowane jak wielkie.

„eP” – w pamięci nie znajdowała się wartość, ostatnio wpisana na port wyjściowy, dlatego wystawiane są same zera. Po każdej zmianie stanu portu nowa wartość jest zapamiętywana i automatycznie przywracana po zaniku zasilania.

„eT” – nie znaleziono tablicy z numerami użytkowników autoryzowanych do korzystania ze sterownika. Zostaje zapisana domyślna tablica z dwoma identycznymi numerami tj. „000 000 000”. Tablica z numerami użytkowników określa, kto ma prawo otrzymywać informacje o stanie urządzenia. Sposób funkcjonowania tego mechanizmu jest bardzo uproszczony ze względu na formę komunikacji sterownik <-> użytkownik. Jeśli w tablicy znajdują się 2 identyczne numery, uC uważa, że istnieje tylko 1 użytkownik. Jeśli natomiast numery są różne, wtedy np. komunikaty o alarmach wysyłane są pod 2 różne numery. Dlatego przy pierwszej konfiguracji, jeśli planujemy sami korzystać ze sterownika, należy wpisać swój numer na obie pozycje.

Warto dodać, że wyświetlacz jest sterowany tak, aby napisy były przewijane w górę, tzn. linijka z dołu jest „przepychana” na górę, robiąc miejsce na napisy na dole. W ten sposób na wyświetlaczu widoczny jest zapis tego, co się działo ze sterownikiem przez ostatni czas.

Domyślnie, po włączeniu, alarm jest aktywny, czuwanie sygnalizowane jest miganiem diody D2. Zapamiętywana jest pozycja przełącznika on/off jako aktywna. Zmiana pozycji wywoła wyłączenie czuwania. 

W tym momencie, aby sterownik był gotowy do pracy, potrzebna jest jeszcze drobna konfiguracja. Ponieważ sterownik nie ma klawiatury, konfigurację przeprowadza się odpowiednimi poleceniami wydawanymi przez SMS. Najlepiej jest wykonać te polecenia w kolejności tu przedstawionej. Wszystkie polecenia zaczynają się znakami kreski i ukośnika: -/, dalej jest hasło, następnie właściwe polecenie. Na końcu zawsze: /-. Program jest odporny na pomyłki, zawsze sprawdza składnię wiadomości. 

-> dodanie numeru użytkownika 

Polecenie, które należy wysłać za pomocą SMS-a, nie zapominając o kreskach i ukośnikach:

 -/1234/0/886396XXX/-

gdzie kolejne pola to:

  • 1234  – domyślne, pierwotne hasło
  • 0 – numer w tablicy użytkowników, dozwolone są tylko 0 lub 1. Polecenie zawsze nadpisuje numer będący wcześniej na tej pozycji. Usunięcie użytkownika odbywa się poprzez wpisanie na pozycję numeru usuwanego, numeru użytkownika, który „zostaje przy władzy”. Obaj użytkownicy mają identyczne prawa, więc kto pierwszy, ten lepszy:). Przy pierwszej konfiguracji, jak to zostało powiedziane wyżej, zaleca się wpisać własny numer na 2 pozycje. 
  • 886396XXX – przykładowy, zawsze 9-cyfrowy numer telefonu, który chcemy dodać do tablicy

Poprawne wykonanie komendy, sterownik potwierdzi odpowiednim SMS-em wysłaną na numer, spod którego przyszła komenda. Na nieznane numery (niebędące w tablicy numerów) potwierdzenia nie są wysyłane. Jeśli użytkownik wpisał sam siebie, a sterownikowi ten numer był wcześniej nieznany, to w momencie wysyłania potwierdzenia istnieje już w tablicy, dzięki czemu potwierdzenie zostanie wysłane. Wygląd wyświetlacza po wykonaniu tej komendy przedstawia rysunek 4.

Rysunek 4.

-> zmiana hasła SMS
-/1234/A69Z/A69Z/-

Znaczenie kolejnych pól:

  • 1234 – stare hasło
  • A69Z – przykładowe nowe hasło
  • A69Z – powtórzenie hasła

Ustawiane hasło musi być 4-znakowe (litery, cyfry). Jeśli wszystko przebiegło poprawnie, wysyłane jest potwierdzenie. Od tej pory sterownik reaguje już tylko na nasze prywatne hasło i zna tylko nasz numer – rysunek 5.

Rysunek 5.

-> ustawienie czasu
-/A69Z/ 20:22/-

Znaczenie pól:

  • A69Z – hasło
  • 20:22 – godziny i minuty w formacie 24-godzinnym. Po poprawnym ustawieniu czasu przysyłane jest potwierdzenie – rysunek 6.
Rysunek 6.

- zdalne włączanie/wyłączanie czuwania
-/A69Z/ON/-
-/A69Z/OFF/-

Znacznie pól jak powyżej. Potwierdzenie zmiany trybu pracy wysyłane jest do obydwu autoryzowanych użytkowników. Zmiana trybu pracy przez SMS-a jest niezależna od przełącznika. Oznacza to, że zmiana pozycji przełącznika spowoduje taki sam efekt jak wysłanie kolejnego SMS z żądaniem ustawienia trybu przeciwnego do obecnego. Na rysunku pokazano 2 warianty wykonania tego polecenia – rysunki 7 i 8.

Rysunek 7.
Rysunek 8.

-> zdalne sterownie urządzeniami poprzez port wyjściowy
-/A69Z/0,1/1,1/2,0/3,0/6,n/7,x/-

  • A69Z - hasło
  • 0,1 – wystawienie stanu ‘1’ na bit 0 portu
  • 1,1 – wystawienie stanu ‘1’ na bit 1 portu
  • 2,1 – wystawienie stanu ‘0’ na bit 2 portu
  • 3,0 – wystawienie stanu ‘0’ na bit 3 portu
  • 6,n – negacja stanu na bicie 6 portu 
  • 7,x – pozostawienie stanu na n.7 bez zmian.

Ostatnie polecenie ma taki sam skutek jak pominięcie tego polecenia. Znak ignorowania został wprowadzony dla wygody. Ogólnie cała komenda może zawierać tylko jedno polecenie np. negacji stanu na odpowiedniej nóżce, np.:

-/A69Z /5,x/-

Również kolejność wymienianych w poleceniu nóżek portu nie jest istotna. Jeśli odwołanie do jednej nóżki portu wystąpi w jednej komendzie kilka razy, ostatnie „wygrywa” – rysunek 9.

Rysunek 9.

-> informacja o numerach użytkowników 
-/A69Z/?/-

Znaczenie jak wyżej. Komenda ta spowoduje przesłanie do telefonu wysyłającego ją tablicy z numerami użytkowników autoryzowanych. Aby taką wiadomość otrzymać, trzeba samemu znajdować się w tej tablicy – rysunek 10.

Rysunek 10.

W przypadku, gdy sterownik otrzyma SMS-a, którego formatu nie umie rozpoznać, lub która zawiera błędne hasło, żadne potwierdzenie nie jest wysyłane, natomiast pozostaje informacja na wyświetlaczu. Zapewnia to 100% odporność na reklamy oraz bardzo dużą na ew. próby włamania. Nawet jeśli ktoś zna format poleceń, złamanie hasła byłoby bardzo kosztowne i czasochłonne – rysunek 11.

Rysunek 11.

Konfigurację przeprowadza się tylko raz, wszystkie ustawienia zostają zapamiętane w pamięci EEPROM.

Wiadomości wysyłane przez sterownik

Aby zapewnić dwustronną komunikację sterownik musi mieć możliwość wysyłania SMS-ów, dlatego ważne jest, aby karta SIM telefonu był aktywna i miała wystarczającą ilość środków. Poniżej przedstawione zostały SMS-y jakich możemy się spodziewać po wykonaniu odpowiednich poleceń

-> potwierdzenie pomyślnego wykonania polecenia – rysunek 12. 

Rysunek 12.

Efekt na wyświetlaczu jest widoczny obok. Cyfra po literce „p” to indeks numeru, na który wysyłane jest potwierdzenie.

Otrzymany SMS wygląda następująco:

#1 ← numer porządkowy wiadomości
20:23 ← godzina wysłania potwierdzenia
-----
OK

Oczywiście wyświetlacz w rzeczywistym urządzeniu będzie się różnił od przykładowego rysunkowego. Prawdopodobnie potwierdzenia zostaną wysłane wcześniej, choć sam czas, kiedy to nastąpi, zależy od wielu czynników (zajętości telefonu, obciążenia sieci itp.) 

-> informacja o numerach użytkowników znanych sterownikowi – rysunek 13.

Rysunek 13.

Tak jak poprzednio, cyfra oznacza indeks numeru, na który wysłana jest wiadomość.

#2  
20:24 ← jak wyżej
-----
886396XXX ← numery autoryzowane
603705XXX ← numery autoryzowane
-> informacja o stanie sterownika – rysunek 14.

Rysunek 14.

Żądanie otrzymania takiej informacji następuje przez „puszczenie sygnału” do układu. „T0” informuje, że połączenie przychodzi od użytkownika zapisanego w tablicy numerów na pozycji 0. Sterownik odrzuca wszystkie połączenia przychodzące.

Jeśli dzwoni znany użytkownik, odrzucenie połączenia następuje po 2s, jeśli ktoś przypadkowy – natychmiast. W takim wypadku na wyświetlaczu dodatkowo pojawi się „T?”. Rysunek 15 „r” – sygnalizuje moment odrzucenia.

Rysunek 15.

Rysunek 16 przedstawia wyświetlacz po nadaniu wiadomości do użytkownika o indeksie 0. Ponadto jeśli zmieniono tryb pracy, wiadomość taka zostanie wysłana do obydwu użytkowników.

Rysunek 16.

Oto wiadomość otrzymana:

#3  
20:25  
-----
I: 11111111 ← kolejne bity portu wejściowego MSB-LSB
O: 11000010 ← jw. dla portu wyjściowego 
-----
tryb: bierny ← jeśli czuwanie jest włączone, będzie „aktywny”
zasil: 230 ← jeśli „siec/bat”=0, to pojawi się tu napis „bat”
23,3*C ← temperatura odczytana z czujnika
-----
-> powiadomienie o alarmie „A1” – rysunek 17.

Rysunek 17.

Kiedy układ jest w stanie czuwania, aktywacja wejścia „Alarm 1” (opadające zbocze) powoduje wysłanie wiadomości do obydwu użytkowników – rysunek 18.

Rysunek 18.

Należy pamiętać, że SMS nie jest usługą czasu rzeczywistego i może dotrzeć do adresata ze znacznym opóźnieniem. Aby uniknąć wielokrotnego wysyłania SMS-ów, spowodowanego odbiciami styków (również np. trzaskaniem drzwiami przez złapanych właśnie włamywaczy) kolejne wyzwolenie alarmu może nastąpić dopiero po upływie trzech minut. Identyczna zasada została przyjęta dla alarmu A0. 

Tekst wiadomości:

#4  
20:27  
-----
Alarm!
-> powiadomienie o alarmie „A0”

Wejście „Alarm 0” działa podobnie, ale ma wyższy priorytet. Powiadomienie o jego aktywacji następuje przez próbę połączenia z obydwoma użytkownikami. Układ dzwoni do każdego z nich przez ok. 30s, a następnie się rozłącza, oczywiście użytkownik może połączenie odrzucić wcześniej. Rezultat takiej właśnie sytuacji przedstawiono na wyświetlaczu – rysunek 19. 

Rysunek 19.

Po wystąpieniu alarmu A0, sterownik dzwoni pod numer o indeksie 0, po czym sam się rozłącza, co oznacza, że przez 30s nie było reakcji. Natomiast drugi użytkownik wcześniej odrzucił połączenie. Odebranie takiego telefonu spowoduje zestawienie zwykłego połączenia. Przez 30s będzie można posłuchać, co dzieje się dookoła telefonu. Po upływie tego czasu, sterownik automatycznie się rozłączy.

Epilog 

Podczas normalnego użytkowania trzeba pamiętać o uzupełnianiu środków na karcie telefonu-terminalu. 

Ponieważ układ sterownika odlicza czas programowo, może się po kilku dniach okazać, że zegar ma odchyłkę. W takim przypadku należy zastosować trymer i wyregulować okres zegara taktującego procesor.

Prezentowany układ może stanowić ciekawy moduł do wykorzystania, należy jednak ostrożnie i z rezerwą podchodzić do powierzania mu dorobku życia. Do tego służą profesjonalne systemy alarmowe, ale altanka, czemu nie?

Firma:
Tematyka materiału: Moduł uniwersalnego sterownika/alarmu GSM
AUTOR
Źródło
Elektronika dla Wszystkich grudzień 2010
Udostępnij
Zobacz wszystkie quizy
Quiz weekendowy
Edukacja
1/10 Jak działa rezystor LDR?
UK Logo
Elektronika dla Wszystkich
Zapisując się na nasz newsletter możesz otrzymać GRATIS
najnowsze e-wydanie magazynu "Elektronika dla Wszystkich"