Miesięczne archiwum: Październik 2010

Hackerspaces

Były próby uruchomienia hackerspace w Warszawie, na razie jednak nie ma żadnego tutaj (ogólnie, w Polsce nie ma).

A czym się zajmują hackerspaces tam gdzie są? A to na przykład obejrzyjcie sobie te dwa filmiki (kolejne wkrótce):

Jak ktoś więcej chce zobaczyć, niech odwiedzi stronę PumpingStation: One (HS w Chicago)

Arduino UNO jako joystick

Musiało nadejść. Jednym z nowych ficzerów Arduino UNO jest reprogramowalny układ odpowiedzialny za komunikację przez USB.

Joystick

Wirtualny joystick CC by http://www.flickr.com/photos/jon_knox/4711705430/

No, i na forum Arduino pojawił się przepis jak wgrać własny firmware na ten układ, na przykładzie joysticka. Czyli po wgraniu tego firmware Arduino po podłączeniu do komputera zostanie wykryte nie jako port szeregowy a jako joystick.

Chcę więcej wyjść cyfrowych!

Arduino oferuje sporo wyjść cyfrowych, ale czasem chciałoby się ich mieć więcej… Jak podłączysz klawiaturę oraz LCD to dużo wolnego nie zostaje…

Dziś natknąłem się na proste rozwiązanie – EZ Expanedr shield. Shield korzysta z dwóch rejestrów przesuwnych 74HC595 aby ‚rozmnożyć’ wyjścia cyfrowe. Oczywiście rozmnożone wyjścia cyfrowe będą do użycia tylko i wyłącznie jako wyjścia (nie ma odczytu z takiego ekstra wyjścia).

EZ Expander CC by http://nootropicdesign.com/ez-expander/

Shield jak shield, ale jeżeli potrzebujesz więcej wyjść (diody LED?) to możesz wykorzystać samą bibliotekę EZ Expandera i dowolne rejestry przesuwne (74HC595 jak najbardziej może być :) ). Czyli podpiąć rejestry i z nich korzystać wysyłając wartości przez proste digitalWrite – zobacz dokumentację w sekcij ‚Advanced API usage’. Tego advanced nie należy się za bardzo bać :)

A z innych ciekawostek od nootropic to trzeba wymienić platformę video na Arduino – Hackvision. Korzysta ona z TVout – biblioteki do generacji obrazu przez AVRy (czyli Arduino też). A jeżeli chcesz się przekonać jak generować obraz z Arduino to zajrzyj do Sprae, który temat bardzo dokładnie opisał (Arduino jako karta graficzna – szukaj tam postów o takim temacie – w tej chwili 4 części) – na swoim kodzie nie od TVout.

Co właściwie mierzy analogRead() ?

Kable, kable...

Kable, kable...

Widzicie to kłębowisko? To się oficjalnie nazywa stanowisko testowe LCD kitów. Po prostu – po zlutowaniu partii, każdy trzeba podłączyć aby sprawdzić czy świeci i wyświetla jak należy. Mógłby to być jakiś głupawy tekst, ale to byłoby zbyt proste.

Dlatego wśród kłębu kabli jest ukryty czujnik temperatury MPC9700 (a raczej dwa) i na LCD wyświetla się po prostu odczyt z niego. Wczoraj w nocy jakoś mnie zaintrygowało temperatura jaką wyświetlało Arduino. Była za wysoka, zdecydowanie. Różnicę między 21 a 24 każdy z nas dobrze zauważy (zdjęcie zrobiono w innych warunkach termicznych :) ). A zrzucić tego na niedokładność pomiaru trudno, bo czujnik ma przecież dokładność +/- 2 st.

Ponadto, raz czy dwa w rozmowie z klientami słyszałem takie opinie, że pokazuje za dużo (czujnik, czujnik :) ). Dlatego zacząłem grzebać i próbować różnych rzeczy.

Jak działa przetwornik napięcia?

Przetwornik analogowo cyfrowy ADC jest dokładnie opisany w nocie katalogowej ATmega328 strona 250. W dużym skrócie: napięcie AREF jest napięciem zasilającym przetwornik DAC (podzielnik napięcia sterowany cyfrowo) którego wyjście jest podłączone do komparatora porównywającego je z napięciem wejściowym na danym wejściu analogowym. Napięcie z przetwornika DAC ‚startuje’ od zera i jest zwiększany aż osiągnie maksimum lub komparator wykaże przekroczenie poziomu sygnału badanego. Dzięki temu wiadomo jaką wartość ma badany sygnał.

Od razu rzuca się w oczy co wpływa na dokładność takiego pomiaru. Pierwsza rzecz to rozdzielczość (w bitach) przetwornika DAC – inaczej z jakim krokiem zwiększane jest napięcie do porównywania. ATmega328 ma 10-cio bitowy.

Druga wartość to napięcie AREF. Jeżeli liczba kroków jest określona (1023 bo 10 bitów) to wiadomo jakie napięcie przypada na krok. Jest to AREF/rozdzielczość. ATmega może korzystać z 3 różnych źródeł napięcia AREF. Może to być wewnętrzne źródło 1.1V (nie wiem jakiej dokładności), napięcie zasilania (około 5V) lub wartość podana na pin AREF.

Znajomość tej wartości jest konieczna tak aby móc przeliczyć odczyt cyfrowy z przetwornika na rzeczywistą wartość napięcia. Pomińmy na razie opcje korzystania z wewnętrznego źródła 1.1V oraz z podawania AREF własnoręcznie. Skupmy się na domyślnej wartość AREF – 5V.

Teraz kłania się nam podstawowa informacja o czujniki MCP9700 – czyli czułość. Wynosi ona 10mV/st C – dlatego jeżeli chcemy odczytywać dokładnie to co podaje czujnik to musimy znać dokładną wartość AREF.

Może na przykładzie

Odczyt z analogRead() dał nam 150. Myślimy że napięcie odczytane to 5/1024*150 = 0.7324 V. Jest to prawda, jeżeli AREF faktycznie wynosi 5V. A jeżeli ma naprawdę 4.9V? To wówczas prawdziwa wartość jaką oznacza odczyt 150 to: 0.7178V. Różnica – 14.6 mV. Dla czułości 10mV/C – prawie 1.5 stopnia!

A ile wynosi dokładnie ten AREF w domyślnym ustawieniu? Niby 5V, ale tak naprawdę Vcc (napięcie zasilania) podane na ATmega328.

Zaraz, powie ktoś, przecież Arduino ma na sobie regulator napięcia na 5V, więc taka duża różnica nie powinna występować. Prawda. Ale tylko jeżeli zasilamy Arduino przez gniazdo zasilania, a nie przez USB!

Jak wiadomo, standard USB mówi, że napięcie zasilania wynosi 5V, więc regulator napięcia nie działa, napięcie z kabla USB idzie prosto do ATmega. A regulator napięcia nie działa, bo żeby dostarczyć regulowane 5V to musi dostać więcej aby mieć z czego regulować, więc nie ma technicznej (prostej) możliwości regulacji zapewniającej 5V jeśli napięcie zasilania to też 5V.

Inaczej mówiąc jesteśmy zdani na to co komputer podaje na USB. I tutaj właśnie zostałem zaskoczony, bo mój notebook na porcie USB najwyraźniej podaje 4.9 V zamiast równych 5V.

Finalnie – przez to odczyt w moim przypadku był zawyżony o te 1.5 stopnia.

Ale, jeżeli skorzystać z analogReference(INTERNAL); to rezygnujemy z górnych zakresów odczytu (bo maksymalny odczyt to 1.1V czyli po przeliczeniu na temperature (1.1-0.5)/0.01 = 60 stopni) na rzecz zwiększenia dokładności odczytu (1.1/1024 = ok 1mV, tj 0.1 C) . Jeszcze raz uwaga – zwiększenie dokładności odczytu nie pomiaru :)

To tyle w dużym skrócie jeżeli chodzi o to co naprawdę mierzy analogRead. Ażeby wyjaśnić czemu na zdjęciu jeden odczyt to 18 stopni a drugi 20 – nie jest to jakaś magia związana z analogRead – jeden z czujników MCP to wersja A a drugi bez A w numerku. Ten z A (dołączony do Starter Kitu jak i sprzedawany samodzielnie) ma dokładność odczytu +/i 2 a bez A +/- 4 stopnie).

Globalny spis shieldów

Przeglądając linki, które wpadły w czasie weekendu właśnie zauważyłem ciekawą stronę, która może się stać wkrótce bardzo przydatna, dla każdego kto używa Arduino.

Mowa o Arduino Shield List, które jest tym co tytuł zapowiada. Czyli zbiorem informacji o shieldach – kto produkuje, które piny są używane.

Obserwujcie, bo na razie dane nie są kompletne, ale jeśli zostaną uzupełnione, to może to stać się niezłym centralnym spisem tego co można dostać gotowego do Arduino.

Magiczna rękawica

W świecie Arduino trafia się od czasu do czasu projekt, który po prostu zwala z nóg. Każdego co innego się podoba, ale to jest coś co ma za sobą głęboki sens.

Rękawica

Rękawica i cały układ zmonotowany (c) http://www.flickr.com/photos/45901891@N07/

W pierwszej chwili można pomyśleć – kolejna rękawica do VR, czy do sterowania jakąś konsolą.

Niezupełnie…

Jest to automatyczny tłumacz z języka migowego. Dzięki akcelerometrowi oraz czujnikom ugięcia (tensometry) Arduino Mega potrafi odczytać dzięki filtrowi Bayesowskiemu znak i tłumaczy to na tekst na LCD oraz korzystając z VoiceBox Shield syntezuje wyraz. Czapki z głów.

Więcej o projekcie można poczytać tutaj.

Separacja galwaniczna czyli transoptor aka optocoupler

Na pewno słyszeliście wiele razy hasło separacja galwaniczna. W skrócie – chodzi o to, aby jakiś źródło sygnału odseparować od mikrokonrolera, tak aby nasz układ był bezpieczny w razie nieprzewidzianego skoku napięcia, ale można było sygnał odczytywać.

Służą ku temu transoptory z angielska zwane optocouplerami. W zamkniętej obudowie siedzi jakiś fotoemiter (dioda LED) i fotodetektor (fotorezystor lub fotodioda).

Jak z tego wynalazku można korzystać? Na blogu tronixstuff australijskiego hackera znajduje się tutorial wyjaśniający co to jest optocoupler (wybaczcie wolę angielską nazwę) i jak czytać jego parametry.

I2C trochę inaczej

W Arduino IDE dostępna jest biblioteka Wire, obsługująca protokół I2C (można o jej użyciu poczytać na stronach Arduino, w niezastąpionym dziale Playground).

I2C

I2C - Boarduino i BlinkM spięte via I2C. CC by http://www.flickr.com/photos/ladyada/

Todd Kurt na swoim blogu poinformował, że w ramach różnych projektów związanych z BlinkM udostępnił kod nowej biblioteki do I2C – SoftI2CMaster.

Czym się ona różni od Wire?

Po pierwsze – jest to implementacja programowa, nie korzysta z wbudowanego modułu I2C. Jako rezultat – działa tylko w trybie Master (może tylko nadawać), ale nie jest przywiązana do pinów A4 i A5 jak jest to z wbudowanym modułem. Może wykorzystywać dowolne wejścia/wyjścia cyfrowe. Ponadto biblioteka jest napisana tak, aby radzić sobie lepiej z zakłóceniami i szumem na linii. Dzięki temu może pracować na większe dystanse.

Na pewno znajdzie się dla niej dobre zastosowanie w Waszych projektach :)