Pokazywanie postów oznaczonych etykietą sterowanie przekaźnikiem. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą sterowanie przekaźnikiem. Pokaż wszystkie posty

niedziela, 26 października 2014

OpenHab, arduino i mqtt binding

Klon arduino możesz zakupić tanio  na aliexpres. Poniższy link to link afiliacyjny. Skorzystanie z niego Ciebie nic dodatkowo nie kosztuje a ja otrzymam niewielką prowizję która wspomoże rozwój tego bloga. Dzięki!

http://ali.pub/2hk8rp

Jak już pisałem wcześniej komunikacja arduino z OpenHab za pomocą TCP nie sprawdziła się w praktyce. Za to z czystym sumieniem mogę stwierdzić że komunikacja za pomocą MQTT działa znakomicie.

Przy takim rozwiązaniu dochodzi jednak dodatkowa warstwa pośrednia - broker.
W uproszczeniu można powiedzieć że broker zajmuje się rozprowadzaniem komunikatów do zainteresowanych klientów.

Rozwiązanie to działa na zasadzie mechanizmu Publish - subscribe.
Odpowiednie urządzenia mogą publikować (Publish) komunikaty w danym temacie (TOPIC). Klienci podłączają się do brokera informując go że są zainteresowani (subscribe) komunikatami z danego tematu.

Przenosząc to na płaszczyznę automatyki domowej ja zastosowałem następującą architekturę:

Na Raspberry PI zainstalowałem broker MQTT. Najpopularniejszym brokerem obecnie jest chyba Mosquitto.

Aby zainstalować mosquitto należy wykonać następujące polecenie:

sudo apt-get install mosquitto mosquitto-clients

Po instalacji pojawi się katalog:

/etc/mosquitto

w którym znajduje się plik konfiguracyjny brokera

mosquitto.conf

Wystarczy bardzo prosta konfiguracja:

Jak widać z powodu bezpieczeństwa wyłączyłem anonimowy dostęp do brokera. W tym przypadku należy utworzyć plik

 /etc/mosquitto/password_file

,w którym zapiszemy login i hasło do brokera z którego  będą korzystać Arduino i OpenHab.
Plik powinien zawierać wpis w postaci:

login:hasło

Teraz należy zrestartować broker poleceniem:

/etc/init.d/mosquitto restart

Następnie można przetestować działanie brokera. Dostępne są dwa programy:

mosquitto_sub 

do obsługi subskrypcji oraz

mosquitto_pub 

do obsługi publikowania.

Na początku należy uruchomić polecenie:


mosquitto_sub -h localhost -u login -P hasło -t /house

co oznacza że utworzyliśmy klienta który podłączył się do brokera na serwerze localhost przy użyciu loginu "login" i hasła "hasło" (zdefiniowanych w pliku password_file). Klient subskrybował wszystkie wiadomości w temacie (TOPIC) /house.

Po wykonaniu polecenia klient oczekuje na komunikaty.

W drugiej konsoli należy uruchomić polecenie:

mosquitto_pub -h localhost -u login -P hasło -t /house -m test

Oznacza to że na brokerze pod adresem localhost opublikowaliśmy wiadomość o treści "test" w temacie /house

Jeśli wszystko wykonaliśmy poprawnie na konsoli na której uruchomiliśmy mosquitto_sub powinna pojawić się zawartość wiadomości, czyli "test"

Dla eksperymentu można uruchomić kilka klientów mosquitto_sub nasłuchujących dany "topic". Na wszystkich jednocześnie powinna pojawić się treść opublikowanego komunikatu


Mając działający broker można przystąpić do konfiguracji OpenHab.

W tym celu należy przekopiować plik jar o nazwie

org.openhab.bindings.mqtt-1.5.0.jar (numer wersji może być inny)

 do katalogu addons serwera openhab.
W pliku konfiguracyjnym

configuration/openhab_default.cfg

należy dopisać następujące linie:


Załóżmy że chcemy sterować halogenem. W tym przypadku plik

configurations/items/house.items

powinien wyglądać następująco:

Oznacza to że w naszej konfiguracji mamy jeden przełącznik odpowiadający za załączanie halogena.
Załączenie przełącznika OPUBLIKUJE wiadomość o treści "halogen#1" na brokerze mqtt w topic'u "/house". Wyłączenie przełącznika OPUBLIKUJE wiadomość o treści "halogen#0" na brokerze mqtt również w topic'u "/house"
Dodatkowo obsługa tego przełącznika SUBSKRYBUJE topic /houseIn na tym samym brokerze.
W pliku

transform/halogen.map 

powinno znaleźć się mapowanie treści otrzymanej wiadomości na stan przełącznika.
Plik powinien mieć następującą zawartość:

halogen#1=ON
halogen#0=OFF

Nasłuchiwanie służy do aktualizacji stanu przełącznika. Pamiętajmy że halogen można zapalić również zwykłym przełącznikiem na ścianie. Wówczas OpenHab powinien się o tym dowiedzieć aby wyświetlić odpowiedni stan przełącznika.

To cała konfiguracja po stronie OpenHab. Należy tylko zrestartować usługę.

Pozostaje jeszcze obsługa po stronie mikrokontrolera.
Bibliotek do obsługi mqtt na arduino jest kilka. Ja wykorzystałem bibliotekę PubSubClient którą znalazłem pod adresem:
http://knolleary.net/arduino-client-for-mqtt/

Poniżej przedstawiam fragmenty kodu które obrazują zasadę działania:
Nie jest to kompletny kod, ponieważ całość wraz z obsługą wszystkich przekaźników które mam obecnie jest zbyt duża żeby wklejać je na bloga. Większe fragmenty publikowane były już w poprzednich wpisach. Myślę że osoby obeznane z tematem bez problemu powinny poradzić sobie z wykorzystaniem podanych fragmentów. W przypadku pytań  piszcie w komentarzach.

Jedyny fragment który sprawiał problemy to okolice wiersza 45. Po  pewnym czasie od momentu restartu arduino przy wciskaniu przełączników sprzętowych przestawały dochodzić potwierdzenia do OpenHab. Okazało się że z jakichś nieokreślonych powodów było zrywane połączenie między Arduino a MQTT. Dodanie sprawdzania stanu i ponownego połączenia w przypadku gdy połączenie nie było aktywne rozwiązało problem.

Po tych zmianach cały układ działa bardzo stabilnie i myślę że można stwierdzić że można go z powodzeniem wykorzystywać w warunkach produkcyjnych



niedziela, 6 kwietnia 2014

Arduino - sterowanie przekaźnikiem za pomocą przełącznika lub przez sieć



Opisane w poniższym wpisie elementy możesz zakupić na aliexpres. Poniższe linki to linki afiliacyjne. Skorzystanie z nich Ciebie nic dodatkowo nie kosztuje a ja otrzymam niewielką prowizję która wspomoże rozwój tego bloga. Dzięki!

Przekaźnik: http://ali.pub/2hk8br
Klon Arduino mega: http://ali.pub/2hk94c
Ethernet shield: http://ali.pub/2hk97n

poprzednim wpisie opisałem mój pomysł na stosunkowo wygodne podłączenie do arduino przekaźników oraz przełączników. Tym razem pokażę jak takie połączenie można wykorzystać w praktyce. Jak pewnie zauważyliście na zdjęciach, dołączyłem do mojego arduino ethernet shield dzięki któremu będzie możliwe sterowanie urządzeniami za pośrednictwem sieci ethernet.

Przykład który pokażę pozwala na załączenie lub wyłączenie przekaźnika za pomocą przycisku dzwonkowego, lub za pomocą pakietu TCP o odpowiedniej treści.
Jeśli będziemy potrafili załączyć przekaźnik pakietem TCP, będziemy mogli sterować nim z poziomu dowolnego urządzenia - z komputera, telefonu, tabletu...

Przypuśćmy że chcemy sterować przekaźnikiem załączającym oświetlenie LED w salonie.

Program sterujący dla przejrzystości podzieliłem na 3 pliki:

1. _01_homeController.ino
Jest to główny plik zawierający funkcję inicjującą oraz pętlę główną
2.  _02_salon_led.ino
W tym pliku zawarta jest obsługa przycisku oraz przekaźnika
3. _03_network.ino
W tym pliku zawarta jest obsługa połączenia sieciowego
Wydaje mi się że kod jest dość przejrzysty i czytelny. Nie będę zatem opisywał go linia po linii.

Zwróćcie uwagę na nazewnictwo plików które zastosowałem. Arduino IDE sortuje zakładki w projekcie w sposób alfabetyczny. Na początku nazwałem pliki

salon_led.ino
network.ino

zakładka z plikiem network.ino ustawiła się przed zakładką salon_led.ino

otrzymywałem wtedy błąd "SALON_LED_REMOTE_COMMAND was not declared in this scope" w linii 55'tej pliku network.ino.
Nie pomaga tutaj żadne include'owanie plików. Jedyne co pomogło to przeorganizowanie zakładek. Dziwne... Ale tak jest :).
Podłączony układ wygląda następująco:

Działanie całego układu najlepiej zobrazuje poniższy film:

Komunikację sieciową z Arduino trochę ławiej byłoby zrobić za pomocą pakietów UDP, chciałem jednak żeby ten wpis był wstępem do sterowania urządzeniami poprzez OpenHab a niestety natrafiłem na problemy z połączeniem OpenHab i Arduino za pośrednictwem UDP.

sobota, 5 kwietnia 2014

Inteligentny dom sterowany za pomocą Arduino - podłączanie przewodów do mikrokontrolera



Opisane w poniższym wpisie elementy możesz zakupić na aliexpres. Poniższe linki to linki afiliacyjne. Skorzystanie z nich Ciebie nic dodatkowo nie kosztuje a ja otrzymam niewielką prowizję która wspomoże rozwój tego bloga. Dzięki!

Przekaźnik: http://ali.pub/2hk8br
Klon Arduino mega: http://ali.pub/2hk94c
Ethernet shield: http://ali.pub/2hk97n


Jak pisałem w poprzednim wpisie zwykłe podłączenie czujników do Arduino za pomocą pojedynczych przewodów jest bardzo podatne na przypadkowe rozłączenia. Przy połączeniu dwóch czy trzech elementów nie ma to większego znaczenia. Ja szacuję że będę wykorzystywał około 20 cyfrowych pinów. W przypadku gdybym musiał odłączyć arduino (a nastepnie podłączyć ponownie) o pomyłkę byłoby bardzo prosto. Okazałoby się wtedy że na przykład przełącznikiem od światła w salonie włączam nawadnianie ogrodu... Mało kusząca wizja, szczególnie dla osoby która akurat wtedy leżałaby na trawniku :)

Jedynym sensownym rozwiązaniem które mi przyszło do głowy jest zaprojektowanie odpowiedniej płytki która odseparuje błędogenne połączenia od samego mikrokontrolera.

U mnie najwięcej będzie połączeń typu - jeden pin do przekaźnika i jeden do przełącznika który nim będzie sterował. Pod tym kątem projektowałem płytkę. Powstała ona w programie Eagle i wygląda następująco:


Do połączeń przewodów sygnałowych wykorzystałem złącza ARK. Do połączenia płytki z Arduino wykorzystałem 20-żyłową taśmę IDC.

Płytka po wytrawieniu wygląda tak:



Nie jest to jeszcze wersja finalna. Krawędzie nie zostały wyrównane i wyszlifowane, ale na to przyjdzie jeszcze czas.
Po podłączeniu do Arduino całość wygląda tak:

Na płytce znalazło się 9 kanałów. Każdy kanał to:
 +5V
GND
Sygnał do przekaźnika
Sygnał do przełącznika (poprzez rezystor podpięty do masy).

Do każdego z kanałów będzie podpięta jedna skrętka od jednego urządzenia którym będę sterował.

Problem pojawił się z połączeniem taśmy z Arduino. Nie znalazłem niestety gniazda IPC z męską końcówką. Postanowiłem zatem wykorzystać zwykłe goldpiny z których powyjmowałem bolce i powkładałem je w odpowiednie wejścia w Arduino. Przed podłączeniem wtyczki wygląda to tak:


Wbrew pozorom całe połączenie trzyma się dość stabilnie i działa bez zarzutu. Jeśli macie inny pomysł na takie połączenie proszę o informację :).
Niestety przy projektowaniu płytki nie udało mi się uniknąć błędów. Planowałem że taśma zostanie podłączona do Arduino od skrajnej lewej strony patrząc z tyłu płytki, zaczynając od dwóch pinów z masą. Dlatego też dwa skrajne piny na mojej płytce są podpięte do masy. Takie rozwiązanie pozwalało mi w przyszłości w razie potrzeby podłączyć obok drugą podobną płytkę. I wszystko działa świetnie dopóki nie podłączam do Arduino Ethernet Shielda, który jak się później dowiedziałem blokuje piny 50, 51, 52, 53. Przy takim połączeniu tracę zatem możliwość sterowania dwoma z dziewięciu przekaźników. Dlatego zdecydowałem się na wpięcie taśmy od prawej strony Arduino (zaczynając od pinu 22) nie podłączając dwóch ostatnich pinów (GND). Minusem tego rozwiązania jest to że masę pomiędzy Arduino a płytką muszę podłączyć  odrębnym przewodem. Nie jest to większy problem ponieważ przewidziałem dodatkowe złącze ARK na +5V i GND. Plusem natomiast jest to, że mamy dostępne wszystkie 9 kanałów zaprojektowanych na płytce - możemy więc sterować 9-cioma urządzeniami.

Na chwilę obecną takie połączenie jest dla mnie wystarczające. Jeśli będzie taka potrzeba, konieczne będzie wykonanie drugiej płytki z wyeliminowanym błędem.

Podsumowując:
Dzięki wykorzystaniu takiej płytki skrętki wpięte  będą do złącz typu ARK, które zapewniają trwałe i solidne połączenie. Połączenie z Arduino będzie wykonane za pomocą jednej taśmy (i masy - co da się w razie potrzeby wyeliminować). Ewentualna wymiana mikrokontrolera powinna zatem odbyć się w sposób szybki i bezproblemowy co w środowisku "produkcyjnym" jest bardzo istotne :).