Wstęp
Najistotniejszą inspiracją do stworzenia tego projektu była próba odpowiedzi na pytanie - ile da się upchnąć w urządzenie wielkości zegarka naręcznego, tak w kwestii sprzętu jak i oprogramowania. Samo urządzenie jest niewiele większe niż zastosowany wyświetlacz. Do projektu wybrano wyświetlacz OLED ze względu na wyjątkowo cienką budowę (jedyne 1,5 mm) i brak konieczności użycia podsietlenia (backlighta) z uwagi na fakt że każdy piksel wyświetlacza wytwarza swoje własne światło. Wstępnie autor chciał zastosować wyświetlacz o przekątnej 0,96", jednakże finalnie zwiększył rozmiar do 1,3".
Sprzęt
Jeśli chodzi o sprzęt zegarek jest oparty o mikrokontroler ATmega328P firmy ATMEL, stabilizator 2,5 V, zegar czasu rzeczywistego DS3231M firmy Maxim, wyświetlacz OLED o przekątnej 1,3" i rozdzielczości 128x64 pikseli. Układ posiada także dwie diody LED (czerwoną i zieloną), buzzer i przełącznik o trzech pozycjach. Projektowany zegarek zasilany jest z akumulatora LiPo o pojemności 150 mAh, który ładowany może być z portu USB komputera osobistego. Os trony mechanicznej układ został oparty o dwie płytki drukowanej, ale jedna z nich służy tylko jako podstawa dla wyżwietlacza OLED. Poniżej znajduje się schemat elektryczny układu zegarka.
ATmega328P korzysta z wbudowanego oscylatora o częstotliwoci 8 MHz. Zasilana jest z liniowego stabilizatora napięcia 2,5 V. Pobór prądu wynosi około 1,5 mA podczas pracy i 100 nA w stanie uśpienia. Zegar czasu rzeczywistego DS3231 jest doskonałym układem tego typu. Zawiera on w sobie skompensowany termicznie rezonator wykonany w technologii MEMS, który poszczycić się może dokładnością 5 ppm (błąd maksymalny wynosi 2 minuty 40 sekund na rok). Wszystko to w niewielkiej obudowie o 8 wyprowadzeniach. Jedynie kondensator odsprzęgający i kilka rezystorów podciągających wymagane jest do jego pracy. Układ ten jest podłączony tak że zasilanie podłączone jest do układu nie poprzez pin VCC a Vbat, co redukuje pobór prądu z 100 do 2,5 mikroampera. Niestety jego wadą jest cena - ciężko kupić go w rozsądnej poza USA.
Układ ładowania baterii oparty jest o MCP73832 firmy Microchip, wraz z kilkoma dodatkowymi elementami, które umożliwiają przełączanie zasilania. Umożliwia to ładowanie baterii w urządzeniu bez używania jej do zasilania zegarka w tym samym czasie. Jak łatwo zauważyć diody LED podłączone są do pinów bez oporników. Wewnętrzny MOSFET znajdujący się w mikrokontrolerze ma opór około 40 Ω, co daje przy zasilaniu 2,5 V prąd około 20 mA. Niestety taka aplikacja oznacza że nie można użyć tutaj niebieskiej diody LED ponieważ spadek napięcia na takiej diodzie wynosi zazwyczaj 3 V lub więcej, a to oznacza konieczność stosowania wyższego napięcia zasilania. Jako że mikrokontroler zasilany jest z napięcia 2,5 V napięcie baterii musi być ograniczone aby móc wykorzystać wewnętrzny przetwornik ADC do pomiaru jej napięcia. Zrealizowano to z wykorzystaniem prostego dzielnika napięcia, jednakże wpięcie go na stałe w układ oznaczałoby stratę 350 µA prądu, płynącego stale przez ten element. Aby wyeliminować tą marnotrawność do układu dodano MOSFET z kanałem P (i szereg elementów pozwalający załączać go napięciem z wyprowadzenia mikrokontrolera) w celu odłączenia dzielnika napięcia od zasilania gdy nie jest on wykorzystywany do pomiarów.
Jako stabilizator napięcia zasilania wykorzystano XC6206 firmy Torex. Układ ten wybrany został z uwagi na bardzo niski pobór prądu, wynoszący zaledwie 1 µA. Dlaczego regulator liniowy a nie impulsowy? Przetwornice impulsowe charakteryzują się bardzo dobrą efektywnością 80% i więcej, jednakże jest to mierzone zazwyczaj dla dużego obciążenia, na przykład 2 mA. Jednakże efektywność takiego układu spada drastycznie gdy zmniejsza się obciążenie i dochodzi do około 50% przy obciążeniu 0,1 mA. Jako że układy w zegarku pobierają zaledwie około 2..3 µA w stanie uśpienia stabilizator impulsowy charakteryzowałby się niesamowicie niską efektywnością w porównaniu do stabilizatora liniowego. Takowy charakteryzuje się efektywnością około 60% przy zasilaniu 4,2 V i aż do 83% przy zasilaniu 3 V.
Oprogramowanie
Zatem mamy do dyspozycji wyświetlacz OLED i 32 KB pamięci programu do naszej dyspozycji. Chyba w takiej konfiguracji jesteśmy w stanie robić więcej niż tylko pokazywać czas i datę?
Po pierwsze - wszystko jest animowane. Sporo czasu zostało poświęcone optymalizacji kodu renderującego grafikę, który w dużym skrócie ogranicza się do kopiowania bitmap z pamięci flash do bufora ramki w pamięci RAM i wysyłanie bufora z pamięci operacyjnej do wyświetlacza OLED poprzez interfejs SPI. Finalnym rezultatem jest osiągnięcie ponad 100 klatek na sekundę w większości obszarów wyświetlacza przy taktowabiu 8 MHz. Jednakże z uwagi iż większość animacji oparty jest o ramki i nie jest czasowozależna prędkość wyświetlania ograniczona została do 60 klatek na sekundę w celu oszczędzania baterii. Animowane są, między innymi:
*Animacja CRT podczas wchodzenia i wychodzenia z stanu uśpienia układu (podobnie jak animacja w Androidzie).
*Tykanie zegara.
*Menu zawarte w programie posiadają opcje przewijania w prawo i w lewo z animacją. Dodatkowo po kliknięciu na obiekt w menu przejście jest animowane.
Alarmy - ustawić można do 10 alarmów różnego rodzaju. Liczbę dostępnych alarmów ogranicza pojemność pamięci EEPROM i RAM. Każdy alarm opisany jest czasem wystąpienia i dniem tygodnia kiedy ma wystąpić.
Gry
Aplikacje
Duża ilość opcji ustawień
* Trzy kanały głośności, osobno dla alarmów, cogodzinnych sygnałów oraz interfejsu użytkownika.
* Timeout uśpienia.
* Animacje.
* Regulacja jasności wyświetlacza.
Oszczędzanie energii elektrycznej
W trybie 'aktywnym' mikrokontroler próbuje jak najdłużej znajdować się w trybie uśpienia. Procesor jest wybudzany co milisekundę w celu sprawdzenia czy cokolwiek wymaga odświeżenia, jeśli nie układ powraca do trybu uśpienia, cały proces zajmuje zazwyczaj mniej niż 100 mikrosekund, jeśli wyświetlacz nie wymaga odświeżenia. W tym trybie pracy pobór prądu wynosi od 0,8 mA do 2 mA, zależnie od czasu potrzebnego na odświeżenia/narysowanie ramki wyświetlacza (szybsze rysowanie = więcej czasu w uśpieniu).
W trybie 'uśpienia' mikrokontroler wyłącza wyświetlacz OLED i wchodzi w tryb głębokiego uśpienia, gdzie może zostać obudzony jedynie przez naciśnięcie przycisku, alarm z układu zegara czasu rzeczywistego lub poprzez podłączenie porty USB do komputera. Pobór prądu w tym stanie to jedynie około 100 nA.
Zużycie mocy
W trybie uśpienia całkowity pobór prądu wynosi około 6 µA. W trybie aktywnym wynosi od 2 mA do nawet 70 mA. Typowy pobór prądu wynosi 10 mA podczas pracy układu.
Czas pracy układu z baterią o pojemności 150 mAh
| Minimalny (stan uśpienia) | Typowy(wyświetlanie czasu) | Wysoki (latarka) | 6 µA - 2,85 roku | 10 mA - 15 godzin | 64 mA - 2 godziny, 20 minut |
Jeśli zegarek jest w stanie aktywnym średnio minutę dziennie (z timeoutem usypiania zegarka ustawionym na 5 sekund oznacza to sprawdzenie czasu 12 razy dziennie), a poziom głośności wszystkich kanałów ustawiony jest na minimum bateria wbudowana w zegarek powinna wystarczyć na 30 dni bez ładowania.
Zużycie prądu przez poszczególne komponenty
| Element | Prąd | ATmega328P (uśpiona / aktywna) | 100 nA / 1,5 mA | OLED (uśpiony / aktywny) | 500 nA / 8,5 mA | Zegar czasu rzeczywistego DS3231M | 2,5 µA | Schottky diode (D1) (upływ prądu) | 1uA | Stabilizator | 1uA | Inne (tranzystory MOSFET, upływ kondensatorów etc) | 1 µA | Suma (uśpienie / aktywny) | 6,1 µA / 10 mA |
Źródła:
http://blog.zakkemble.co.uk/diy-digital-wristwatch/
Fajne? Ranking DIY
