Lustro z oprogramowaniem typu SmartHome oraz sztuczną inteligencją

Ostatnio bardzo zaciekawiło mnie rozwiązanie związane z tematyką SmartHome. Nie chodzi mi tutaj o gotowe rozwiązanie, a o projekt, który pozwoliłby mi krok po kroku zbudować coś, co spełni moje potrzeby.

Projekt, których opiszę w tym artykule dotyczy inteligentnego lustra, które pozwala mi zorganizować wyjście z domu – np. na spacer, do pracy. Lustra, które także intryguje mojego kilkuletniego syna i sprawia, że chętnie uczy się języka angielskiego.

Pierwotnie miało być to lustro z wyświetloną jedynie godziną, datą oraz informacją o pogodzie. Jednak z czasem koncepcja projektu uległa zmianie. Potem chciałem sprawdzić jaka jest temperatura na zewnątrz, żeby odpowiednio wyszykować dziecko, która jest godzina, modne teraz parametry dot. smogu. Chciałem też wiedzieć za ile minut przyjedzie autobus i czy trzeba się pospieszyć, aby zdążyć na przystanek (mieszkam w Warszawie i korzystam z transportu miejskiego). Każdy, kto korzysta z ZTM wie, jak się sprawdza rozkład umieszony na przystanku (50/50, albo przyjedzie albo nie).

Wydawało się, że temat lustra weneckiego (sama szyba) to nic trudnego, idę do sklepu i kupuję.

Okazało się, że to nie takie proste. Zanim znalazłem lustro o odpowiednich parametrach musiałem poznać zasadę działania luster weneckich, zwracając uwagę na przepuszczalność oraz odbicie światła. Wspomniane parametry są szczególnie ważne, szczególnie jeśli ukryty ekran nie pokrywa całego lustra. Tak było w moim przypadku. W dodatku przepuszczalność ma duże znaczenie przy umieszczeniu lustra w jasnych lub ciemnych pomieszczeniach. Znalazłem firmę, która dostarczyła mi lustro w odpowiednich dla mnie wymiarach oraz parametrach.

Lustro obudowałem w ramę, którą zaprojektowałem tak, aby wkomponowała się w wystrój przedpokoju. Rama musiała być solidna, aby utrzymać 6kg (najwięcej ważyła szyba). Dodatkowo ważne było, aby wyglądem wydawała się lekka.

Jako jednostkę obsługująca elektronikę wykorzystałem Raspberry Pi 3B+ z systemem Rasbian OS.

W międzyczasie znalazłem projekt z dość sporą społecznością, która rozwija produkt pod nazwą MagicMirror. Rozwiązanie ze względu na dużą modułowość, bardzo mi się spodobało.

W dodatku w projekcie istnieją już moduły odpowiedzialne za prezentację czasu, pogody, kalendarza, itp. Projekt jest oparty na Node.js.

Po zapoznaniu się z technologią, postanowiłem dodać kilka własnych modułów, które realizowałyby moje wcześniejsze założenia/potrzeby.

Potrzebowałem też większej interaktywności. Interaktywności na zasadzie np. Agenta Google,

gdzie mogę wydawać polecenia słowne. Klikanie po lustrze okazało się zbyt czasochłonne, a dotykanie palcami sprawiało, że pojawiały się smugi i lustro wyglądało nieestetycznie.

Dla wygody zakupiłem moduł Google AIY Voice Kit i zainstalowałem go jako rozszerzenie funkcjonalności lustra. Elektronika urządzenia Google’a AIY Voice Kit posiada wyprowadzone piny GPIO, pogrupowane, opisane. To jest i będzie pomocne przy dalszym rozwoju lustra.

Wraz z modułem AYI Voice Kit dostajemy Agenta Google z zaimplementowaną sztuczną inteligencją. W związku z tym, po instalacji oprogramowania ze strony producenta (dostępne ze strony https://github.com/google/aiyprojects-raspbian) mogłem „porozmawiać” z lustrem. Zintegrowałam urządzenie z oprogramowaniem tak, aby na moje polecenia lustro potrafiło wykonać zdefiniowane wcześniej czynności (np. zapala i gasi światło, opowiada żarty, itp.). Takie proste czynności prezentuję na poniższym filmie, który nagrałem w czasie pierwszych moich testów lustra.

 

Przez pierwsze kilka tygodni syn dość intensywnie eksploatował moduł Agenta Google, ćwicząc swój angielski (element edukacyjny lustra). Dużym plusem było to, że Agent jak czegoś nie rozumiał, to komunikował to i syn musiał skonstruować zdanie/pytanie w taki sposób, aby było ono zrozumiałe.

Cała pierwotna instalacja wewnątrz wyglądała następująco (obecnie znacznie zredukowałem ilość przewodów):

 

 

Kolejną rzecz jaką chciałem poprawić to zużycie energii (miesięczne zużycie ok 6kWh). Lustro działało w dzień i w nocy. W czasie dnia nie było to zauważalne, jednak wieczorami czasem przeszkadzała poświata. Używanie przycisków do włączania i wyłączania ekranu nie było praktyczne.

Na stronie projektu MagicMirror znalazłem oprogramowany moduł do obsługi czujnika ruchu na podczerwień (PIR). Jednak umieszczenie czujnika na zewnątrz lustra nie wyglądało estetycznie, zaś umieszczenie czujnika za lustrem sprawiało, że czujnik nie działał. Powłoka zamontowana na szybie skutecznie zaciemniała obraz jaki trafiał do czujnika. Jak się okazało - lustro nie przepuszczało podczerwieni. Trzeba było poszukać innego rozwiązania. Znalazłem w Internecie czujnik mikrofalowy XYC-WB-DC o małym poborze prądu, w dodatku posiadający interfejs identyczny z tym, jaki jest w w/w czujniku ruchu działającym na podczerwień (3 wyjścia: GND, Vcc, Data). Zatem kilka modyfikacji w oprogramowaniu czujnika sprawiło, że lustro włączało się, gdy byłem w pobliżu, zaś gdy oddalałem się - wyłączało się po kilku sekundach. Niestety to rozwiązanie posiada pewną wadę, której nie przewidziałem. Zamontowany czujnik ruchu ma zasięg 6-9m, a ściana czy szafka nie stanowi dla niego przeszkody. Za ścianą jest mieszkanie sąsiadów. Gdy pojawią się w zasięgu, to lustro automatycznie włącza się.

Kolejna rzecz to zarządzanie oświetleniem mieszkania. Wychodząc z domu chciałem tylko powiedzieć: switch off i światła wyłączają się w całym domu. Aby to osiągnąć, podłączyłem nadajnik radiowy RF 433MHz FS1000A (nadający na częstotliwości 433MHz) poprzez GPIO do Raspberry Pi oraz napisałem moduł komunikujący się przez ten nadajnik z wyłącznikami światła (kod źródłowy mojego modułu dostępny jest pod adresem: https://github.com/stelmik/MMM-Livolo).

Pierwsze testy włączania i wyłączania światła można zobaczyć na nagraniu (od minuty 1:45):

 

 

Kolejna sprawa to transport miejski. Obecnie najczęściej wykorzystywana przeze mnie funkcjonalność. Znalazłem serwis udostępniający API z informacją o lokalizacji pojazdów. Dokonałem rejestracji, założyłem konto, zawnioskowałem o klucz do usługi (apiKey), a gdy go otrzymałem - rozpocząłem pisanie oprogramowania pod nowy moduł. Moduł oparłem go na mapie OpenStreetMap. Kod źródłowy modułu wraz z opisem jest dostępny pod adresem https://github.com/stelmik/MMM-Warsaw-Transport. Sam moduł działa w następujący sposób: wczytywana jest mapa, następnie pobierana jest lista z lokalizacją przystanków i na koniec nanoszona jest pozycja autobusów i tramwajów wraz ze wskazaniem kierunku ich jazdy. Zatem wiem w jakiej lokalizacji jest/był dany pojazd oraz w jakim kierunku jedzie. Dodatkowo wiem kiedy nastąpiło ostatnie odświeżenie lokalizacji pojazdów, co jest ważne np. w przypadku problemów z połączeniem sieciowym, bo będę wiedział, że lokalizacja jest nieaktualna i nie należy się nią sugerować.

Lustro posiada też czujniki tj. temperatura otoczenia, wilgotność, ciśnienie, informacje o czystości powietrza pobierane z serwisu Airly dla mojej lokalizacji. Wewnątrz lustra zainstalowałem także wentylator, aby w razie zbyt wysokiej temperatury mógł się załączyć i na podstawie doboru obrotów zmniejszyć temperaturę panującą w środku obudowy.

Obecnie obraz prezentowany na lustrze zawiera następujące informacje:

 

 

W międzyczasie testowałem moduł rozpoznawania twarzy i nawiązywanie w związku z tym interakcji, ale to póki co nie sprawdziło się, bo czasem lustro załączało się bez zrozumiałego dla mnie powodu. Obecnie próbuję napisać moduł wykorzystujący sztuczną inteligencję tak, aby rozpoznawał moje niektóre czynności jakie robię przed lustrem i odpowiednio na nie reagował. Dla mnie to ciekawe wyzwanie. Mam nadzieję, że wkrótce opiszę jak to zrobiłem i jak to działa.


Krzysztof

Starszy Programista Java

Powrót