Zrobiłem sobie zegar v2.2
01.10.2014 | aktual.: 04.11.2014 14:17
Miało być coś innego tym razem, ale drony poczekają do przyszłego roku, bo plany są na zrobienie takiego co będzie latało 20‑40 minut. Teorię mam, ale przetestować muszę. Tymczasem znów zrobiłem sobie zegar, sort of. Właściwie to kiedyś zrobiłem sobie zegar z zegarem (RTC) i złączką pozwalającą na podłączenie go do raspberry-pi, pełnił dwie funkcje - pokazywał godzinę i robił za źródło czasu dla rpi po jej włączeniu. Działało to na ATmega8, miało softwareowy multiplekser i miejscami nawet barometr.
Ale wyświetlacz i RTC to mało, juz nie mówiąc o tym, że to mogłoby działać samodzielnie (jakby miało przyciski). I tak powstała wersja 2.0, która w zasadzie... nie działała, ale po odcięciu oryginalnie zamontowanych MOSFETów i zastąpieniu ich specjalnym slacalaczkiem ożyła, na 5 minut, bo potem spaliłem kontroler. No ale, teraz mam wersję 2.2:
Nowa wersja w porównaniu do poprzedniej ma:
- Wyświetlacz, bardziej rozbudowany - bo sekundnik;
- Odbiornik podczerwieni, co znaczy ze no, jest na pilota (ze starego magnetowidu) a to znaczy, ze mpd na malince da się sterować (dowolnym) pilotem (a także zasilaniem głośników i oświetleniem);
- Buzzer (do hałasowania);
- 6 przycisków;
- 6 dodatkowych ledów (do przycisków), z czego dwa dwukolorowe;
- Osobny kontroler wyświetlacza;
- Osobny kontroler do przycisków;
- Nie ma dyskretnych tranzystorów;
- Podwójny układ zasilania (bo analogowa regulacja jasności, jest też cyfrowa);
- Opcjonalnie układ RTC i miejsce na ATtiny45;
- I pewnie coś o czym zapomniałem;
Złącza, są dwa. No trzy właściwie licząc ISP (do programowania kontrolera), poza tym dwa identyczne złącza w których znajdziemy 12V, I2C i sygnał przerwania. Dwa bo można tak podłączyć kaskadowo stary zegar i do czegoś wykorzystać (komunikacja działa na tej samej zasadzie). Wszystkie układy działają na 5V, wyświetlacze potrzebują > 6V (wygodniej zrobić konwersję z wyższego (jednego) napięcia niż dostarczać zasilanie w 3 wariantach). Stąd też dwa układy zasilania. Jeden dla scalaczków, drugi dla wyświetlacza.
Pierwszy zbudowany na LM7805:
Większego banału chyba się już nie dało zrobić, kondensatory filtrujące na wejściu są po stronie malinki. Jeden kondensator w ramach filtra na wyjściu 100uF. I układ zasilający wszystkie układy (poza wyświetlaczem) gotowy. Tutaj mała notka, wszystkie poziomy sygnałów na malince są LVTTL (3V3), dlaczego 5V a nie 3V3? Bo kontroler wyświetlacza nie działa na 3V, jeno na 5V, to samo z zegarem RTC. A poza tym płytka zapewniająca zasilanie dla tego układu zapewnia tez konwersję poziomów napięć za pomocą MOSFETów, w sumie wygodniej.
Drugi układ zasilania jest impulsowy, mógłbym oczywiście użyć jakiegoś liniowego, regulowanego regulatora napięcia (jak powyższy LM), ale mają one jedną zasadniczą wadę - jeśli czerpiemy z nich powyżej kilku/nastu mA prądu zaczynają się silnie grzać (i marnować prąd), grzanie oznacza potrzebę użycia radiatora, a ten by mi się nie wcisnął pod przedni panel. Dlatego zastosowanie ma tutaj układ LM2576T, prosty regulator impulsowy, wymaga tylko diody, cewki, 2 kondensatorów i 2 rezystorów. Za to się nie grzeje, ma względnie wysoką sprawność i zapewnia regulację jasności metoda analogową.
C1 i C2 = 470uF low ESR. L1 = 100uH (500mA), D1 - pierwsza z brzegu na 500mA. R1 = 1K6, a R2 to w zasadzie dwa elementy, rezystor 5K7 + 10K potencjometr. Takie zestawienie oporników pozwala na regulację napięcia bodaj od 4V do 12V. Główne wyświetlacze nie mają rezystorów ograniczających prąd, to tez lepiej nie odpalać układu na pełnym napięciu.
Przyciski obsługiwane są przez układ max7328. Jest to 8bitowy ekspander na I2C, który potrafi generować przerwanie kiedy tylko coś się na jego wejściach/wyjściach zmieni - idealny do klawiatur. Przerwanie jest połączone do INT1 ATmega8 włącznie z przerwaniem dostarczanym przez układ RTC (o ile jest zamontowany). ATmega decyduje czy posłać to przerwanie dalej do malinki czy nie, obecnie zawsze wysyła. Ale dlaczego tak nie bezpośrednio do malinki? Płytka jest tak zrobiona aby (opcjonalnie) mogła pracować samodzielnie (bez rpi), dlatego przerwanie z RTC i przycisków dostaje ATmega, która w takiej sytuacji byłaby głównym procesorem tego wszystkiego.
Odbiornik podczerwieni - kolejny banał, TSOP4837 podłączony do zasilania, a jego wyjście do INT0 ATmegi. Protokół pilota (Sharp) jest banalny opiera się na długości przerw pomiędzy impulsami, do zdekodowania wystarczy przerwanie i 8bitowy timer0. W gratisie jedna czerwona dioda LED sygnalizująca jego pracę podłączona przez rezystor (4K) do PD0. Poniżej LEDa możemy zaobserwować fotorezystor - mierzy natężenie światła w pomieszczeniu dzięki czemu można dostosować automatycznie jasność wyświetlaczy, kolejny banalna część układu:
Rezystor (1K) ciągnie napięcie na wejściu ADC7 ATmegi do napięcia zasilania, kiedy jest ciemno to nawet mu się to udaje. Kiedy robi się jaśniej LDR (fotorezystor) przejmuje inicjatywę ciągnąć zasilanie do masy, to dzielnik napięcia jest w zasadzie. Im jaśniej tym niższe napięcie na analogowym wejściu CPU, i tym większa jasność wyświetlacza. Jasność ta da się regulować w zakresie 0‑15. Idealnie zgrywa się to razem, = ((255 - ADC7) / 16);
Buzzer (taki piskliwy głośniczek, z generatorem tonu) jest po prostu wpięty miedzy, zasilanie a PB2. W zasadzie powinien być tam jeszcze tranzystor, który by zdjął te max 30mA z wyjścia ATmegi, ale z drugiej strony nie jest on przeznaczony do ciągłej pracy a to pipania przez ułamki sekund, uC przeżyje te momenty.
Wyświetlacz składa się z 4 1,8" 7‑segmentowych pomarańczowych wyświetlaczy LED (po 3 LEDy na segment), 2 1,5" 7‑segmentowych pomarańczowych wyświetlaczy LED (po dwa LEDy na segment) oraz 6 osobnych diód umieszczonych nad przyciskami. Całość kontrolowana jest przez sterownik max7219. Sterownik niestety nie dość, że może sterować segmentami o napięciu do poziomu napięcia zasilania (tutaj wyświetlacz potrzebuje więcej) to jeszcze obsługuje wyświetlacze ze wspólna katodą. Rozwiązanie? Zewnętrzne drivery, tutaj ULN2803A (sink driver w układzie darlingtona x8) oraz TD62783 (source driver z darlingtonami x8). ULN da się bezpośrednio wpiąć miedzy segmenty wyświetlacza a max7219, z układem toshiby jest gorzej. Oba drivery są aktywowane podaniem wysokiego poziomu na wejścia, ULN jest podłączony od strony anod, maxim podaje wysokie napięcia po to aby włączyć segmenty - ok, problem w tym, że od strony wyświetlaczy podaje niski stan aby je włączyć, a TD potrzebuje stanu wysokiego. Ale problemu brak, jest jeszcze 8x inwerterów w postaci 74HC540, który jest umieszczony między TD a maximem.
Jak wyżej napisałem, duże wyświetlacze nie mają ograniczników prądowych (poza kropkami, kropki składają się z jednego leda i potrzebują rezystora aby nie spłonąć, ewentualnie jak w moim wypadku diody zenera 3V6). Między duże wyświetlacze a mniejsze także wpięte są rezystory symulujące brakującą diodę (małe mają po dwa na segment, duże po trzy). Pojedyncze LEDy są podłączone przez rezystory do sekcji dużych wyświetlaczy. Rezystory dobrane "na oko" aby jasność ledów przycisków pokrywała się mniej więcej z jasnością wyświetlaczy. Niestety ledy dwukolorowe nie chcą być zbyt jasne, i zwiększanie na nich napięcia generalnie ich nie rozjaśnia (powyżej pewnego niskiego względnie poziomu) tylko je pali.
MAX7219 zapewnia cyfrową regulację jasności wszystkich LEDów (poza diodą wpięta do ATmegi).
Całość nawet ładnie wyszła. Pomijając to, że na początku wlutowałem zamiast max7219, max7221, które są prawie identyczne. Jak się jednak okazało "prawie" w tym wypadku robi wielką różnicę. Przy 7221 całość - nie działała. Znaczy świeciły się wszystkie segmenty, zawsze. Okazuje się bowiem, że 7221 kiedy akurat nie chce uaktywnić segmentu/wyświetlacza to ustawia wyjścia w tryb wysokiej impedancji, to znaczy mniej więcej tyle, że wyjścia nie mają stanu. Drivery są wtedy w stanie nieokreślonym więc mogą być włączone, mogą nie. Nie ma to znaczenia kiedy układ steruje wyświetlaczem bezpośrednio, aby ledy się paliły prad musi płynąć, jak nie ma dokąd płynąć - są zgaszone. Ale nie drivery, one sobie wrednie wzmocnia jakiekolwiek resztkowe napięcie na pinach jest (albo to jakie się tam indukuje od sąsiednich ścieżek).
Całość dostanie jeszcze przedni panel, podobnie jak poprzednik. Kawałek szarego pleksi o przepuszczalności ~50%. Ładnie zamaskuje wszystkie wnętrzności co sprawi, że nawet za dnia będzie wyglądało z większym sensem.
A tam powyżej wdać druga część układanki przymocowaną do malinki, zapewnia konwerter poziomów napięć, zabezpieczenie GPIO przed za wysokim napięciem, MOSFETa do starowania oświetleniem i kontroler USB device (a w tle zasilacz 5+12V).
Całość komunikuje się z malinką po szynie I2C oraz z użyciem jednego przerwania. Malinka oczywiście ma bug w kontrolerze I2C który nie pozwala na rozciąganie zegara przez atmegę, efekt jest taki że trzeba było obniżyć prędkość komunikacji ze 100kHz do 50kHz, do tego do protokołu komunikacji trzeba było dodać sumy kontrolne. A jakby tego było mało, stara wersja modułu od i2c w malince nie pozwala na wysłanie "rep-start" przy okazji wykonywania transakcji i2c (a w nowej trzeba to sobie ręcznie włączyć, nie wiem kto wpada na takie pomysły).
PCB jednostronne i upierdliwe do zrobienia w domowym zaciszu, głównie z powodu zmieniającego swoje wymiary pod wpływem temperatury papieru kredowego. Pomalowane z górnej strony matowym lakierem w sprayu (aby się bardziej wtapiało w czarność po instalacji przedniego panelu). Na przyciskach i ich ledach zainstalowany jest kolejny kawałek pleksi (kompletnie czarnej), nie pozwala on na podświetlanie się wzajemne sąsiadującym ze sobą diodom.
No ale no, działa. ;>