Pokazywanie postów oznaczonych etykietą sterownik. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą sterownik. 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



poniedziałek, 28 października 2013

Sterownik oświetlenia schodów na ATMEGA328P

EDIT: Po 10 latach powstała nowa wersja płytki. Możesz też kupić gotowe PCB nowej wersji, i zbudować sterownik samemu. Więcej szczegółów w tym wpisie: Sterownik oświetlenia schodów. Ciąg dalszy po prawie 10 latach :)

Jakiś czas temu natrafiłem na youtube na film, który pokazywał oświetlenie schodów za pomocą taśm LED. Spodobało mi się i stwierdziłem że w nowo budowanym domu też chcę coś takiego. Niestety autor filmu nie podał schematu, ani żadnych wskazówek. Trzeba zatem wymyślić coś samemu.

Zasada działania jest następująca:
Każdy stopień ma podklejoną około metrową taśmę LED. Do sterowania służą trzy włączniki dzwonkowe - jeden na górze, jeden na półpiętrze, jeden na dole.
Wciśnięcie przycisku na dole spowoduje płynne zapalanie się taśm od dołu do góry. Pojedyncze taśmy również powinny zapalać się płynnie, a nie na zasadzie stanu 0/1.
Po zapaleniu się taśm na wszystkich stopniach światło powinno palić się określoną ilość czasu (np minutę), po tym czasie stopnie powinny same płynnie się wygasić również od dołu do góry.

Układ powinien analogicznie zachowywać się po wciśnięciu przycisku na górze, z tym że kolejność zapalania i gaszenia stopni powinna być odwrotna - od góry do dołu. Przycisk na półpiętrze ma zapalać stopnie jednocześnie i w górę i w dół rozpoczynając od środka (w uproszczeniu - realnie będzie 5 stopni w górę a 13 w dół).

Jako że ostatnio trochę bawiłem się z Arduino stwierdziłem że będzie to dobry początek projektu.

Płynne rozjaśnianie można osiągnąć wykorzystując kanały typu PWM (Pulse Width Modulation).
Arduino UNO którym dysponowałem posiada jedynie 6 wyjść PWM. Do projektu potrzebowałem co najmniej 18.

Natrafiłem na układ TLC5940, który w bardzo prosty sposób można podłączyć do arduino. Poświęcając jedynie 5 cyfrowych pinów otrzymujemy 16 kanałów PWM, którymi możemy dowolnie sterować. Dodatkowo układy TLC5940 można łączyć ze sobą otrzymując kolejne kanały. Mnie wystarczyło połączenie dwóch układów. Dało mi to 32 kanały PWM, czyli dużo więcej niż potrzebowałem.

Dokładny opis i sposób połączenia arduino z TLC5940 można znaleźć na stronie

http://starter-kit.nettigo.pl/2012/01/tlc5940-czyli-co-najmniej-16-dodatkowych-pinow-pwm-w-arduino/

Złożenie układu na zwykłych diodach jest stosunkowo proste. Mogą działać na napięciu 5V, które standardowo mamy na wyjściach arduino.
Problem pojawia się gdy chcemy podłączyć taśmy LED, które do działania potrzebują napięcia 12V i sporo większego prądu, niż ten który arduino jest w stanie zapewnić. W tym przypadku do zasilania taśm będzie potrzebny odrębny zasilacz - 12V. Dodatkowo aby wysterować poszczególne taśmy niskim napięciem potrzebujemy tranzystorów oraz rezystorów podciągających ponieważ wyjścia układu TLC5940 są typu “otwarty kolektor” i przekazują tylko albo stan niski, albo nieustalony.

Nie pozostało zatem nic innego jak złożenie prototypu na zwykłych diodach LED - na początek na jednym układzie TLC5940:

Jak widać, działa całkiem sprawnie.

Po wstępnym sukcesie ze zwykłymi diodami zbudowałem prototyp już z taśmami LED. Tu już potrzebny był większy prąd. Do zasilania wykorzystałem zasilacz ATX przerobiony na zasilacz warsztatowy :)

Działało pięknie, ale podłączenie takiego "pająka" z przewodów do schodów byłoby mało praktyczne. Jedyną sensowną opcją było pozbycie się arduino i zbudowanie całego układu na jednej płytce drukowanej.  Trzeba przyznać że było to dla mnie spore wyzwanie. Był to mój pierwszy w życiu układ tego typu. Przerobiłem kilka tutoriali do Eagle'a w którym tworzyłem schemat i płytkę. W międzyczasie pojawiło się sporo innych problemów - chociażby zrobienie reduktora napięcia z 12V zasilających cały układ do 5V wymaganych przez ATMEGA328P i TLC5940. Wyzwaniem okazało się też zaprogramowanie ATMEGI. Kupiłem układy bez wgranego bootloadera co również okazało się dodatkową komplikacją. Ostatecznie stanęło na tym że wykorzystałem programator USBasp, do którego przygotowałem specjalną płytkę z podstawką pod ATMEGę dzięki którym teraz dość prosto mogę wgrywać zarówno bootloader jak i program docelowy (swoją drogą to chyba temat na odrębny wpis na blogu, ponieważ znalezienie kompletnych informacji na ten temat graniczy z cudem).


Poświęciłem sporo czasu zanim udało mi się osiągnąć w miarę sensowny wynik końcowy. W każdym razie oto rezultat:



Płytkę robiłem tzw. "metodą żelazkową", też pierwszy raz w życiu. Udało się za czwartym podejściem :D. Nie jest to cud techniki, pewnie elektronicy puryści będą na to patrzeć z lekkim ironicznym uśmiechem, ale jako że to mój pierwszy w życiu układ tego typu, jestem z niego dumny :).
Dom jeszcze nie jest gotowy, więc nie mogę zainstalować w miejscu docelowym. Jak tylko się uda, nie omieszkam podzielić się rezultatem :)

Jeśli ktoś chciałby odtworzyć taki układ, poniżej przedstawiam schemat elektroniczny, schemat płytki drukowanej, oraz kod źródłowy.
Kod jest w wersji roboczej, chwilowo na zasadzie "proof of concept". Docelowy kod powstanie już gdy układ zostanie zamontowany "produkcyjnie". Myślę że nie ma sensu dokładniejszego opisywania schematu. Jeśli ktoś będzie zainteresowany szczegółami, zapraszam do komentowania.


EDIT:

Wynik działania można zobaczyć tutaj: http://technika-laika.blogspot.com/2014/09/sterownik-oswietlenia-schodow-na.html