wtorek, 29 października 2013

Przeróbka lampki halogenowej na lampkę LED

Ostatnio nasza Córcia zaczęła bać się ciemności. Zdecydowanie woli zasypiać przy świetle lampki. Gdy czasami budzi się w nocy jest spokojniejsza, kiedy ma zapalone światło. Żona twierdzi że mam węża w kieszeni i być może coś w tym jest, ponieważ zacząłem się zastanawiać co zrobić, żeby całonocne świecenie lampki nie miało zbyt dużego odzwierciedlenia w rachunkach za energię :). Oczywiście można pójść na łatwiznę, iść do sklepu i kupić lampkę diodową, ale jako że po projekcie sterownika oświetlenia schodów zostało mi trochę taśmy LED zacząłem kombinować w jaki sposób można byłoby ją wykorzystać. Miałem taśmę, miałem stary, nieużywany zasilacz 12V od jakiegoś urządzenia, które już dawno wyzionęło ducha. Pozostała jedynie kwestia obudowy. Nijak nie mogłem wymyślić dobrego rozwiązania. W końcu nasunęło mi się rozwiązanie chyba najbardziej oczywiste - przeróbka  lampki z której dotychczas korzystaliśmy. Jest to chyba dość popularna lampka SKOJIG z Ikei:


Lampka co prawda standardowo pobiera stosunkowo niewiele energii - ma 20-watową żarówkę halogenową, ale skoro można jeszcze to ograniczyć, to dlaczego nie... :)

Na początku rozkręciłem lampkę, żeby zobaczyć jak to wszystko wygląda od środka. Lampka po rozkręceniu prezentuje się tak:


Miałem również zrobić zdjęcie klosza, ale Córcia go zwinęła i jak widać bawiła się przy przeróbce równie dobrze jak ja:

Po rozebraniu lampki odmierzyłem kawałek taśmy LED, który jak najlepiej wpasowałby się w dolny obwód klosza lampki. Oczywiście należy pamiętać,  że taśmę LED można ciąć tylko w miejscach oznaczonych. Moją taśmę dało się ciąć co trzy diody. Szczęśliwie po docięciu taśmy okazało się że pasuje ona prawie idealnie. Znalazłem kawałek białego przewodu (aby nie był zbyt widoczny na tle białych wykończeń lampki) i przylutowałem do taśmy. Taśma na zewnętrznej stronie ma warstwę samoprzylepną przy pomocy której przymocowałem ją do obwodu klosza. Po podłączeniu do zasilacza 12V klosz prezentował się następująco:


Pozostała jeszcze kwestia wyprowadzenia przewodu zasilającego. Wstępny plan zakładał że gniazdo zasilania będzie umieszczone w kloszu, ale byłoby to mało estetyczne. Zdecydowanie lepszym pomysłem było gniazdo w podstawie lampki. W tym celu wywierciłem otwór w stojaku lampy i przeciągnąłem przez niego przewód zasilający:


Na tym etapie można było już skręcić klosz. wcześniej przykleiłem przewód do klosza klejem na gorąco aby przy przypadkowym pociągnięciu nie oderwać taśmy LED:


W podstawie wyciąłem otwór:


W którym umieściłem przylutowane wcześniej do przewodu gniazdo zasilające:


Gniazdo od wewnątrz również zalałem klejem na gorąco. Podstawa po skręceniu wygląda następująco:


Nadszedł czas próby generalnej:


Lampka świeci całkiem fajnie. Delikatnie słabiej niż oryginalna żarówka, ale mamy teraz model hybrydowy, więc jeśli jest zbyt ciemno (np do czytania dziecku bajek) można podłączyć dodatkowe oryginalne zasilanie. Wtedy jest moc... :). Efekt uboczny rozwiązania to ciemny pasek wokół klosza, ale załóżmy że jak to mawiają programiści "to nie bug tylko feature" :)

Od spodu świecąca lampka wygląda tak:

Podsumowując:

po przeróbce otrzymałem lampkę hybrydową, która w trybie oszczędnym pobiera poniżej 3W energii dając moc świetlną wystarczającą dla spokojniejszego snu naszej Córki. Koszt całej przeróbki wyniósł mnie dokładnie zero złotych, ponieważ wszystkie części miałem pod ręką. Zdaję sobie sprawę że przeróbka jest prosta i nie wymaga zbyt dużych umiejętności, ale akurat w moim przypadku okazała się bardzo użyteczna.

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

poniedziałek, 21 października 2013

Raspberry Pi i strumieniowanie video

Na potrzeby projektu Zabawka dla Sierściucha, którego koncepcję opisałem w jednym z poprzednich wpisów potrzebuję strumieniowania video w czasie rzeczywistym, dodatkowo w postaci którą można w prosty sposób osadzić na stronie WWW i to bez użycia flash'a.

Pytałem Wujka Google co wie na ten temat, ale okazało się że spektrum możliwości niestety nie jest zbyt szerokie. Zależało mi żeby rozwiązanie działało w miarę płynnie, nie miało dużych opóźnień no i oczywiście żeby dało się je uruchomić na Raspberry Pi.

Chyba najsensowniejsze rozwiązanie które znalazłem to MJPG-streamer.
W uproszczeniu można napisać, że pobiera on z kamery statyczne obrazy i kopiuje je do pamięci. Wtyczki wyjściowe potrafią przesłać te obrazy do przeglądarki tworząc animację. Potrafi wykorzystać sprzętową kompresję wbudowaną w kamery. Dzięki temu nie zużywa dużo pamięci ani mocy procesora.

Nie mam dedykowanej kamery do Raspberry Pi, więc wykorzystałem zwykłą najtańszą kamerę USB, przechwytującą video z rozdzielczością do 640x480. Rozwiązanie jest na tyle uniwersalne że później można wymienić kamerę na lepszą :)

Jako że Raspberry Pi oparte jest o architekturę ARM, w większości przypadków programy które nie są zawarte w dystrybucji którą zainstalowaliśmy nie mają dedykowanych pakietów. Pozostaje zatem zbudowanie ich ze źródeł. Na szczęście nie stanowi to większego problemu.

Na RPI zainstalowałem dystrybucję Raspbian, która bazuje na Debianie. W tym przypadku kompilacja będzie wymagała następujących kroków (zakładam że użytkownik zalogowany jest np na koncie "pi" - lub dowolnym innym bez uprawnień administratora):

Na początek musimy zainstalować wymagane zależności. Zrobimy to następującymi poleceniami:

sudo apt-get install subversion 
sudo apt-get install libv4l-dev 
sudo apt-get install libjpeg8-dev 
sudo apt-get install imagemagick

Następnie pobieramy kod źródłowy mjpeg-streamer'a bezpośrednio z repozytorium SVN:

svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code 

Przechodzimy do katalogu w którym znajdują się pobrane źródła:

cd mjpg-streamer-code/mjpg-streamer 

i kompilujemy:

make USE_LIBV4L2=true clean all 

po miejmy nadzieję poprawnej kompilacji, trzeba zainstalować zbudowaną aplikację w systemie:

sudo make DESTDIR=/usr install 

tworzymy katalog dla obrazów:

sudo mkdir /var/www/mjpg_streamer
sudo chmod a+rw /var/www/mjpg_streamer

W tym momencie możemy już przetestować czy strumieniowanie działa.
Odpalamy polecenie:

mjpg_streamer -i "/usr/lib/input_uvc.so -d /dev/video0 -r 320x240 -f 15 -y" -o "/usr/lib/output_http.so -p 8090 -w /var/www/mjpg_streamer" 

które oznacza mniej więcej tyle, że rozpoczynamy strumieniowanie obrazu z urządzenia /dev/video0 (kamera usb) o rozdzielczości 320x240, z framerate 15 FPS używając kodeka YUYV (opcja -y), na porcie 8090 wykorzystując folder /var/www/mjpeg_streamer

W przypadku mojej kamery opcja -y była niezbędna -  kamera nie wspierała dekodowania MJPEG. W przypadku lepszych kamer powinno zadziałać bez tej opcji - co generalnie jest rozwiązaniem lepszym, ponieważ dekodowanie MJPEG jest podobno wydajniejsze od YUYV.

Żeby przetestować działanie strumienia trzeba spreparować sobie plik html w takiej postaci:

<html><body>
<img src="http://IP_RASPBERRY_PI:8090?action=stream">
</body></html>

I otworzyć go w przeglądarce. Okienko powinno zawierać obraz z kamery.

Gdy już mamy działający strumień, możemy przekonfigurować system aby strumieniowanie uruchamiało się automatycznie przy starcie.

W tym celu tworzymy plik stream.sh:

 sudo nano /usr/bin/stream.sh 

i dodajemy do niego polecenie uruchamiające strumień, czyli ponownie:

mjpg_streamer -i "/usr/lib/input_uvc.so -d /dev/video0 -r 320x240 -f 15 -y" -o "/usr/lib/output_http.so -p 8090 -w /var/www/mjpg_streamer" 


i zapisujemy plik. Nadajemy mu uprawnienia wykonywalne:

 sudo chmod a+x /usr/bin/stream.sh

i tworzymy dowiązanie symboliczne w /etc/init.d

 sudo ln -s /usr/bin/stream.sh /etc/init.d/stream.sh

Dodajemy utworzony skrypt do automatycznego startu poleceniem:

 sudo update-rc.d stream.sh defaults 94 6

W tym momencie po restarcie systemu strumień powinien być automatycznie dostępny.
Docelowo w projekcie to Raspberry ma serwować stronę WWW z obrazem wideo. Dlatego musimy zainstalować na malince Apache + PHP.

Wystarczy polecenie:
 sudo apt-get install php5 

Serwer Apache jest w zależnościach PHP więc zainstaluje się automatycznie.

Chcemy aby nasza strona docelowo była generowana dynamicznie, zatem zamieniamy statyczny plik index.html:

sudo rm /var/www/index.html

na plik /var/www/index.php o następującej zawartości:

Odpalenie w przeglądarce adresu:
http://IP_RASPBERRY_PI

powinno wyświetlić serwowane przez Malinkę wideo.

Z wstępnych testów wynika że przy strumieniowaniu przez WIFI obraz w rozdzielczości 320x240 przy 15 FPS działa praktycznie bez żadnych opóźnień. Strumień 640x480 przy 15FPS ma około 2-3 sekundy opóźnienia - co w praktyce może okazać się akceptowalnym wynikiem. Nie badałem jeszcze skąd te opóźnienia. Przyczyn może być kilka - wolne WIFI, słaba kamera bez obsługi MJPEG...
W każdym razie obciążenie CPU w Raspberry Pi jest praktycznie niezauważalne.

Jeśli macie lepsze propozycje przesyłania strumienia, chętnie się o nich dowiem - temat jest ciągle otwarty :)

środa, 16 października 2013

Spring i transakcje bazodanowe

Dzisiaj będzie trochę o programowaniu.

Spring to świetny framework.

Transakcyjność obsługiwana przez niego jest nie do przecenienia.... pod warunkiem że wszystko działa i nie trzeba debugować tych wszystkich początków i końców transakcji, commitów i rollbacków :)

Przykład z życia wzięty (oczywiście w uproszczeniu):

mamy jakiś serwis springowy. Załóżmy że nazywa się BusinessLogicService:

Konfigurację transakcji mamy zdefiniowaną za pomocą aspektów następująco:

Oczywiście konfiguracja jest niekompletna - poglądowa. Zakładamy że metoda doLogic()nie działa w kontekście transakcyjnym.

Co w takim razie stanie się gdy w innym miejscu kodu zrobimy wywołanie:

BusinessLogicService s = ctx.getBean("businessLogicService");
s.doLogic();

Zdrowy rozsądek podpowiada (przynajmniej mnie podpowiadał :) ), że nietransakcyjna metoda doLogic() wywoła metodę doTransactionalLogic(). Jako że w konfiguracji określiliśmy że ta metoda wymaga nowej transakcji powinna ona zostać w tym momencie utworzona. Dane zostaną zapisane do bazy przez metodę saveDataToDatabase(), a następnie zostanie rzucony wyjątek, który wycofa zmiany zapisane przez saveDataToDatabase().

Tym razem jednak mój zdrowy rozsądek się mocno mylił :)
Otóż w tym przypadku ŻADNA transakcja nie zostanie utworzona. Zmiany zapisane przez saveDataToDatabase() zostaną od razu zacommitowane do bazy i wyjątek RuntimeException nie wycofa żadnych modyfikacji!

Sporo czasu zajęło mi dojście do odpowiedzi dlaczego tak się dzieje, chociaż wyjaśnienie jest dość oczywiste.

Spring zarządza transakcjami za pomocą obiektów Proxy, które opakowują prawdziwe serwisy.
Aby transakcja została utworzona wywołanie MUSI przejść przez Proxy.
W tym wypadku funkcja doLogic() woła BEZPOŚREDNIO publiczną metodę doTransactionalLogic(). Wywołanie nie przechodzi przez Proxy - czyli nie ma transakcji.

Jakie są rozwiązania? Jest ich co najmniej kilka.
Przykładowo można przerobić serwis aby wyglądał tak:


W metodzie doLogic() pobieramy serwis z kontekstu spring'owego i w tym wypadku otrzymamy Proxy tego obiektu, a co za tym idzie wywołanie doTransactionalLogic() zadziała poprawnie!

Można również przenieść metodę doTransactonalLogic() do odrębnego serwisu, który następnie należy wstrzyknąć do BusinessLogicService. Wtedy wywołanie doTransactionalLogic() również zadziała poprawnie.

Oczywiście wszystkie te informacje można znaleźć w dokumentacji Spring'a, ale kto by tam czytał dokumentacje ;)

niedziela, 13 października 2013

Minix Neo X5 - modyfikacja WI-FI

Jakiś czas temu szukałem taniego urządzenia które mogłoby mi posłużyć za namiastkę Smart TV. Generalnie zależało mi żeby urządzenie pobierało mało energii (miało być cały czas włączone) i mieć możliwość odtwarzania filmów w FullHD 1080p. Pojawiło się wtedy sporo urządzeń z androidem, opartych na architekturze ARM, które teoretycznie powinny spełniać te wymagania.

Mój wybór padł na urządzenie MINIX NEO X5. Zamówiłem je na AliExpress, kosztowało wtedy około 100$. 
Jak tylko urządzenie do mnie dotarło zabrałem się do konfiguracji. Okazało się że rzeczywistość nie jest już taka różowa :). Urządzenie owszem, wykonane całkiem starannie, małe, zgrabne:


Ewidentnie Chińczycy wzorowali się na appleTV :)

Po ściągnięciu XBMC dla Androida okazało się że jest ono jeszcze mało funkcjonalne (wczesna beta) , a o odtwarzaniu 1080p można zapomnieć - sprzętowa akceleracja była dostępna jedynie w wybranych player'ach, do których XBMC niestety nie należało :). Nie działało także AirPlay na które dość mocno liczyłem.

W każdym razie, po aktualizacji firmware'u, przeczytaniu kilku forów na temat XBMC na androidzie udało się skonfigurować urządzenie tak aby działało całkiem sprawnie z większością filmów. Postawiłem urządzonko pod telewizorem, podłączyłem kabelkiem do routera, i dla dziecka do odtwarzania bajek z dysku sieciowego było jak znalazł :)

Jakiś czas później zdecydowałem się na zakup nettop'a, który zastąpił domowy serwer linuksowy i właśnie Minix'a -  który trafił na półkę.

Ostatnio jednak kiedy dziecko okupowało telewizor a ja akurat chciałem coś obejrzeć postanowiłem wrócić do tematu i podłączyć MINIX'a do monitora stojącego w pokoju obok. Okazało się jednak że sygnał wifi z routera stojącego w sąsiednim pomieszczeniu (jakieś 5 metrów odległości) jest dramatycznie słaby. Był problem nawet z odtwarzaniem filmów z Youtube w najniższej rozdzielczości. O odtwarzaniu jakichkolwiek filmów z dysku sieciowego mogłem zapomnieć. Okazało się że za antenę wifi służy kilkunastocentymetrowy fragment przewodu ukryty wewnątrz urządzenia. 

Zastanawiałem się co z tym fantem zrobić. Przez myśl przeszedł mi nawet zakup zewnętrznej karty sieciowej na USB z dodatkową anteną, ale obawiałem się czy model który wybiorę będzie poprawnie obsługiwany przez androida. Czytałem trochę na forach że można to zrobić, ale trzeba sporo kombinować, root'ować urządzenie, dłubać w plikach konfiguracyjnych. Szczerze mówiąc nie bardzo chciało mi się to robić :).

Zdecydowałem się na rozwiązanie dużo prostsze, i tańsze - dorobienie zewnętrznej anteny do wbudowanej karty wi-fi.
Zamówiłem na allegro antenę z wtykiem SMA, oraz gniazdo SMA i zabrałem się za rozmontowanie urządzenia.

Okazało się to bardzo proste. Wystarczy cienkim nożykiem lub śrubokrętem delikatnie podwadzić obudowę od spodu i dolna plastikowa jej część zdejmuje się bez problemu. Następnie trzeba odkręcić 5 malutkich śrubek, którymi płytka urządzenia przykręcona jest do obudowy i można delikatnie ją wyjąć. Płytka po wyjęciu wygląda tak:


Ten szary przewód po prawej stronie to właśnie antena wi-fi.

Po wyjęciu płytki przyjrzałem się dokładnie obudowie i wybrałem miejsce w którym można przymocować antenę. W ruch poszła wiertarka, szlifierka i obudowa była gotowa na zamontowanie gniazda anteny:


Następnie zabrałem się do montażu gniazda antenowego. Okazało się że zamówiłem złe gniazdo. Powinienem zamówić gniazdo montażowe, a zamówiłem takie do zaciskania na przewodzie koncentrycznym. Przewód koncentryczny jest dużo grubszy od tego w MINIX'ie. Dodatkowo nie było możliwości przykręcenia gniazda do obudowy.
W każdym razie przylutowałem przewód do gniazda (osobno masa i sygnał).  Aby bolec sygnałowy z gniazda nie wcisnął się do środka przy przykręcaniu anteny (gniazdo przeznaczone było na koncentryk który domyślnie dociska bolec - w przypadku tak cienkiego przewodu bolec pozostawał luźny) wcisnąłem do gniazda kawałek plastikowej tulejki - dość prowizoryczne ale skuteczne rozwiązanie:

Nie pozostało nic innego jak ponowne zmontowanie urządzenia. Gniazdo nie było przykręcone do obudowy, zatem pomiędzy anteną a obudową zastosowałem dodatkową plastikową podkładkę aby przykręcenie anteny docisnęło gniazdo.

Całe urządzenie po złożeniu wygląda tak:

Trzeba przyznać że 38-centymetrowa antena przy tak niewielkim urządzeniu wygląda dość komicznie :). W każdym razie po uruchomieniu okazało się że może nie jest zbyt estetycznie, ale za to bardzo skutecznie! Siła sygnału wzrosła z "Słaba" do "Bardzo dobra", oglądanie filmu 1080p w XBMC wczytywanego z dysku sieciowego po sambie działa bardzo płynnie - nie ma praktycznie żadnych przycięć. Zatem cel został osiągnięty i to bardzo niewielkim kosztem. Antena i gniazdo to razem  około 20 zł.

Przy okazji okazało się że sporo zmieniło się w XBMC dla androida od czasu kiedy ostatnio je testowałem. Przetestowałem wersję stworzoną na potrzeby konsoli Ouya -  wg mnie obecnie jest to najlepsza wersja dla MINIX'a. Sprzętowa akceleracja działa znakomicie, większość filmów 1080p które sprawdziłem odtwarza się bez problemu, strumieniowanie AirPlay działa bez zarzutu, większość wtyczek dla XBMC działa również bezproblemowo (w tym SD-XBMC na której bardzo mi zależało).

Generalnie jestem zadowolony :)

Wersję NEO-X5 można obecnie kupić w cenie poniżej 70$, co jest chyba bardzo dobrą ceną, aczkolwiek za 80$ można obecnie dostać wersję NEO-X7 z czterordzeniowym procesorem.

Na forum minix'a można znaleźć również informacje że udało się uruchomić linux'a na tym sprzęcie - razem z serwerem X. Podobno działa bardzo dobrze (niestety na razie bez obsługi VPU). Osobiście jeszcze nie próbowałem. Może kiedyś :)


sobota, 12 października 2013

Zabawka dla Sierściucha

Od jakiegoś czasu chodzi mi po głowie projekt zabawki dla kota.
Inspiracja przyszła stąd:

http://antyweb.pl/koniec-demolowania-mieszkan-nadchodzi-petcub/

Pomysł ciekawy, nasz Sierściuch co prawda mieszkania nie demoluje, ale siedzi cały dzień sam, więc można by go trochę rozruszać :).

Stwierdziłem że na łatwiznę nie pójdę i spróbuję zrobić coś podobnego sam :)
Obudowy pewnie takiej ładnej nie wykombinuję, ale przynajmniej spróbuję osiągnąć podobną funkcjonalność.

Pierwszy plan zakładał że urządzenie powstanie w oparciu o Arduino, do którego będzie podłączony ethernet shield (bo akurat mam jeden na zbyciu ;) ).

Takie podejście miałoby jednak kilka wad:

- dwa przewody: zasilający i sieciowy + konieczność umieszczenia w pobliżu routera, żeby można było podłączyć urządzenie do sieci.
- brak możliwości podłączenia wideo - obsługa przez Arduino jest mocno skomplikowana.

Byłoby to zatem rozwiązanie połowiczne.

Po głębszym przemyśleniu tematu doszedłem do wniosku że akurat w tym przypadku lepszym rozwiązaniem będzie wykorzystanie Raspberry Pi.

Jako że na Malince można zainstalować Linuksa mamy dużo większe pole manewru. Zatem ostateczna koncepcja jest taka:

- bierzemy Raspberry Pi.
- po USB podłączamy dowolną kamerkę internetową (zgodną z linuksem, ale to na szczęście jest coraz prostsze)
- instalujemy serwer WWW z PHP
- uruchamiamy streaming video z kamery internetowej
- podłączamy dwa połączone ze sobą serwomechanizmy - jeden poruszający się wg osi Y, drugi połączony z nim, poruszający się wg osi X. Do drugiego serwomechanizmu montujemy moduł laserowy
- podłączamy dwa kolejne niezależne serwomechanizmy w analogiczny sposób. Do drugiego mocujemy kamerę internetową
- wszystkie cztery serwomechanizmy i moduł laserowy podłączamy do złącza GPIO Malinki
- piszemy oprogramowanie pozwalające sterować w dowolny sposób wszystkimi serwomechanizmami oraz na włączanie/wyłączanie modułu laserowego
- tworzymy stronę internetową pozwalającą na wydawanie poleceń laserowi oraz serwomechanizmom, zawierającą również obraz z kamery wideo.
- do Raspberry PI podłączamy kartę wifi na USB i konfigurujemy aby przy starcie poprawnie logowała się do sieci lokalnej (DHCP), oraz poprawnie uruchamiała streaming video i serwer WWW.


Jeśli uda się zrealizować te założenia, będzie można sterować zabawką z komputera lub telefonu z sieci lokalnej.  Docelowo pewnie będzie potrzebne przekierowanie portów na routerze albo VPN aby można było wkurzać Sierściucha zdalnie :)

Plusem takiego podejścia do tematu będzie to że do podłączenia zabawki będzie potrzebny tylko jeden przewód - zasilający.

Problem pojawia się taki, że serwomechanizmów nie będzie można zasilić z Raspberry PI - komputerek potrafi dać tylko 700mA prądu co jest wartością zdecydowanie za małą do obsłużenia serwomechanizmów. Prawdopodobnie będę musiał zaprojektować malutką płytkę do której podłączony będzie zasilacz, serwomechanizmy, laser oraz Malinka.

Na razie zamówiłem trochę części (gniazda zasilające, taśmy, złącza). Moduł laserowy i serwomechanizmy właśnie lecą z Chin. Jak wszystko skompletuję, ciąg dalszy nastąpi :)

Tytułem wstępu.

Cześć,

założyłem tego bloga trochę za namową Żony, a trochę z powodu potrzeby dokumentowania swoich działań, tak aby za jakiś czas przypomnieć sobie o co w ogóle mi chodziło :)

Na początek kilka słów o sobie. 
Z zawodu jestem programistą, na co dzień programuję w javie, więc spodziewajcie się że raz na jakiś czas posty związane z tym tematem będą się pojawiały.

Hobbystycznie interesuję się oprogramowaniem OpenSource i wszystkim co jest z tym związane.
Dodatkowo ostatnio zacząłem się interesować elektroniką, głównie dlatego że w moje ręce wpadło Arduino i Raspberry Pi.

Generalnie będzie to blog o wszystkim i o niczym :). Trochę programowania, trochę Linuksa, trochę elektroniki.

W wielu aspektach które będę opisywał jestem kompletnym laikiem (stąd też tytuł bloga)  więc zbytnio się nimi nie sugerujcie :)

Może cześć z Was znajdzie tu coś ciekawego. Zapraszam :)