środa, 17 kwietnia 2013

Arduino i wyświetlacz LCD sterowany przez UART

Być może niektórzy z Was pamiętają mój moduł wyświetlacza sterowany przez port szeregowy. Fajna rzecz - jeśli wolno mi się w ten sposób pochwalić - pozwalająca ocalić cenne wyprowadzenia mikrokontrolera od "zajęcia" przez sterownik wyświetlacza zgodny z HD44780 i wysyłać dane do prezentacji na ekraniku LCD przez zaledwie dwie linie (w tym tylko jedno wyprowadzenie mikrokontrolera - TxD; druga linia to masa).
Odchodząc na chwilę od Noduino (choć właściwie można by pokombinować z wyświetlaczem i w tym kierunku - o ile Noduino na to pozwoli) postanowiłem sprawdzić, jak Leonardo poradzi sobie z moim wyświetlaczem. W tym celu pozwoliłem sobie zmodyfikować jeden z załączonych do IDE Arduino programów przykładowych i przygotować małe demko, którego kod źródłowy prezentuję poniżej:


Zadaniem programu jest wyświetlanie kolejnych znaków ze zbioru podstawowego ASCII oraz ich kodów w systemie dziesiętnym, szesnastkowym i binarnym. Kod odrobinę udziwniony, ponieważ musiałem go dostosować do posiadanego wyświetlacza alfanumerycznego - jeden wiersz, szesnaście znaków, ale w logicznym podziale na dwa wiersze po osiem...

Projekcik oczywiście elegancko zadziałał, z czego wnioskuję, że mój moduł wyświetlacza z łączem UART jest zgodny z platformą Arduino :-)

Arduino ready ;D

Arduino Leonardo i Noduino - kilka poprawek w kodzie i wszystko pięknie działa.

Tak, wbrew deklaracjom zaopatrzyłem się jednak w płytkę prototypową Arduino - wybór padł na wersję Leonardo z ATmegą 32u4 na pokładzie i wysokim profilem (czyli z wlutowanymi złączami).
Pierwszą rzeczą, jaką zrobiłem, było oczywiście podłączenie urządzonka do peceta i sprawdzenie, czy działa - program testowy, domyślnie wgrany do Leonarda, zaczął elegancko zaśmiecać bufor portu szeregowego. Czyli wszystko OK. Potem odbyła się próba migania dostępną na płytce diodą LED - również bez problemów. Można więc zaczynać zabawę.
Mimo zakupu Arduino nadal twierdzę - żeby nie było nieporozumień - że umiejętność wykorzystywania w projektach "czystych" mikrokontrolerów daje dużo więcej możliwości, wspartych i ograniczonych jedynie naszą kreatywnością. Problem może wystąpić tylko w przypadku, gdy brakuje gotowych bibliotek (dla C czy BASCOMa) do obsługi konkretnych układów (np. wyświetlaczy) lub dostarczających określonych, "wysokopoziomowych" funkcjonalności. Pod tym względem właśnie Arduino jest lepiej wyposażoną i ciągle prężnie rozwijaną platformą.
Jedną z ciekawostek, którą miałem zamiar wypróbować, jak tylko któreś Arduino (lub jego klon) wpadnie mi w ręce (początkowo chciałem zmontować samodzielnie takiego klona, ale średnio by się to opłaciło - zarówno czasowo, jak i finansowo), jest projekt Noduino, pozwalający na sterowanie płytką prototypową, podłączoną do komputera przez łącze USB, za pomocą przeglądarki WWW i protokołu HTTP. No, może nie tak patetycznie - po prostu jest to interaktywny interfejs webowy dla Arduino.
Jeśli chodzi o instalację Noduino, postępujemy zgodnie z opisem na stronie http://semu.github.io/noduino/ (czasem nie działa, więc zajrzyjmy do pliku https://github.com/semu/noduino/blob/master/examples.snippet).
Z instalacją nie ma problemu (pamiętajmy o załadowaniu wsadu do Arduino - znajdziemy go w pliku https://github.com/semu/duino/blob/master/src/du.ino, oczywiście jeśli wszystko zainstalujemy zgodnie ze wskazówkami na stronie, to plik mamy dostępny lokalnie), jednak w przypadku mojego komputera (płytki Arduino?) i posiadanej wersji Node.js musiałem do kodu Noduino wrzucić kilka poprawek.
Przede wszystkim mój egzemplarz Arduino widoczny jest w systemie jako urządzenie

/dev/ttyACM0

dlatego też w pliku https://github.com/semu/duino/blob/master/lib/board.js (lokalnie: /[katalog_nadrzędny]/noduino/duino/lib/board.js) musiałem zmienić linijkę 80:

child.exec('ls /dev | grep usb', function(err, stdout, stderr){

na

child.exec('ls /dev | grep ttyACM', function(err, stdout, stderr){

oraz w pliku https://github.com/semu/noduino/blob/master/srv.web.js (lokalnie: srv.web.js w katalogu głównym Noduino) linijkę 17:

console.log("Listening on http://%s:%d", kickstart.conf().name, router.address().port);

na

console.log("Listening on http://localhost:8080");

Ostatnia zmiana dotyczyła błędu, z którym wyskakiwał Node.js przy próbie wykonania tego kodu - nie wnikałem w szczegóły ze względu na czysto kosmetyczne znaczenie tej linijki (może jej w ogóle nie być).

Po tych zmianach Leonardo elegancko zaczął współpracować z przeglądarką, będzie więc trochę inna zabawa, niż w przypadku moich elektronicznych, AVR-owskich kocków wspieranych BASCOMem.

A czy warto inwestować siły i środki w Noduino? Nie wiem, przekonam się. I coś oczywiście o tym napiszę.

poniedziałek, 1 kwietnia 2013

Midnight hacking, czyli jak z powrotem udźwiękowić pewne rozszerzenie do Chromium.


Zapewne wielu użytkowników Google+ i przeglądarki Chrome/Chromium ma zainstalowany dodatek Replies and more for Google+.
Jedną z ciekawszych moim zdaniem funkcjonalności jest wizualne i dźwiękowe powiadamianie o hm... powiadomieniu G+:


Okazało się, że gdy zmigrowałem z Chrome do Chromium (ponieważ Chrome już mi wyświetla komunikat o zakończeniu publikowania aktualizacji dla mojej wersji ubunciaka - owszem, muszę zaktualizować system do kolejnego LTS-a, ale chwilowo nie dysponuję wolnym czasem, a tego typu komunikaty mnie denerwują) wspomniany plugin przestał dźwięczeć...
Wystarczyła jednak poprawka w pliku:
~/.config/chromium/Default/Extensions/<identyfikator rozszerzenia Replies and more for Google+>/<numer wersji>/background.js
gdzie wiersz:
        audio.src = chrome.extension.getURL("chime.mp3");
zamieniłem na:
        audio.src = chrome.extension.getURL("chime.ogg");
i wszystko wróciło do normy, czyli powiadomienia wyskakiwały z dźwiękiem.
Autor rozszerzenia oczywiście dostarczył zarówno plik mp3, jak i ogg.
Być może (nie sprawdzałem) podmianka potrzebna tylko wtedy, gdy mamy zainstalowany pakiet chromium-codecs-ffmpeg (tzw. wolne kodeki dla znaczników <audio> i <video> HTML5). Jeśli tak, to w celu uniknięcia grzebania w kodzie rozszerzenia wystarczy zainstalować pakiet chromium-codecs-ffmpeg-extra, który dostarcza komponenty wspierające "zamknięte" formaty.