
Wstęp
Główną przyczyną powstania tej konstrukcji była nuda oraz chęć zweryfikowania, jak poczciwa ATmega8 radzi sobie z software'ową realizacją PWM na wielu wyjściach jednocześnie. Żeby nie było nudno, postanowiłem, że urządzenie powinno mieć śladowe oznaki użyteczności - wybór padł więc na zegar pseudoanalogowy.
Opis konstrukcji
Urządzenie, jak już wspomniałem wcześniej, zostało oparte na mikrokontroler ATmega8. Dwanaście diod (osiem diod czerwonych i cztery zielone) służą do wyświetlania aktualnego czasu w następujący sposób:
- dioda, która świeci się stałym mocnym światłem, wskazuje aktualną godzinę,
- dioda, która miga z częstotliwością ok. 0,5 Hz, oznacza aktualną minutę (przeskok z jednej diody na drugą oznacza upływ pięciu minut),
- pozostałe diody lekko się jarzą, co ułatwia odczyt czasu w nocy.
Realizacja poziomu jasności realizowana jest za pomocą modulacji PWM.
Zielone diody wyróżniają godziny będące wielokrotnością liczby 3 (3, 6, 9 i 12). Na schemacie można zauważyć, że do podłączenia ich do mikrokontrolera zastosowałem rezystory o mniejszej wartości (4k7) niż do diod czerwonych (10k). Spowodowane jest to faktem, że oko ludzkie jest bardziej wrażliwe na światło czerwone, a więc żeby uzyskać wrażenie równomiernego świecenia wszystkich diod, diody zielone powinny świecić z większą mocą.
Warto też wspomnieć o miłym dodatku w postaci wyświetlania krótkich animacji w przypadku wystąpienia nowej godziny - to taki wizualny odpowiednik kukułki w zegarze z kukułką. W chwili obecnej zaimplementowanych jest pięć różnych animacji - wszystkie w mniejszym lub większym stopniu korzystają z dobrodziejstw PWM.
ATmega8 wykorzystuje wewnętrzny oscylator RC pracujący na częstotliwości ok. 8 MHz. Wiadomo, że oscylator RC nie nadaje się do bycia wzorcem czasu. W projekcie wzorcem jest kwarc 32 kHz podłączony do układu RTC DS1307. Układ ten zapewnia również ciągłe odmierzanie czasu w przypadku utraty głównego zasilania urządzenia. Zasilaniem zastępczym jest bateria litowa 3V.
Firmware został napisany w języku C. Starałem się stworzyć w miarę ogólne API, które pozwalałoby na zmianę rozstawu pinów na poziomie hardware'u bez znacznej ingerencji w software. Ucierpiała na tym jednak wydajność całego programu - w chwili obecnej program nie spełnia swoich zakładanych funkcji, o ile nie jest skompilowany z opcją -O3 (toolchain avr-gcc), co wymusza od kompilatora maksymalny poziom optymalizacji.
Zarówno schemat ideowy urządzenia, jak i kod źródłowy firmware'u, dostępne są w postaci załączników.


Podsumowanie
Koszt wykonania całego projektu nie powinien przekroczyć 50 zł:
- ATmega8 - ok. 10zł
- 12 LEDów - ok. 3zł
- uniwersalne PCB - ok. 15zł
- pudełko - ok. 10 zł
- DS1307 - ok. 7zł
- drobnica w postaci odrobiny termokleju do klejenia diod do obudowy, cyny, itp. jest trudna do oszacowania, ale raczej nie nadwyręży domowego budżetu
Z konstrukcji jestem raczej zadowolony, trochę mniej z firmware'u. Doszedłem do smutnego wniosku, że w przypadku embedded nie ma często miejsca na pisanie zgeneralizowanego i abstrakcyjnego kodu.
Cool? Ranking DIY