Witajcie!
Chciałbym przedstawić Wam moją ostatnią konstrukcję, jaką jest stylowy zegar zrealizowany na lampach Nixie. Zegarek powstawał przez ostatnie 2 miesiące, głównie popołudniami ze względu na pracę.
Ze względu na sporą ilość materiału postanowiłem podzielić opis budowy na dwie części. Pierwsza (którą właśnie czytacie) skupiać się będzie na opisie schematu oraz programu. Drugą część poświęcę wykonaniu obudowy i końcowym montażu.
Ogólny opis
Za część wizualną zegara odpowiada 6 lamp Z573M. Są to dość popularne lampy, przez co często są używane w tego typu konstrukcjach. Moje lampy są używane i pochodzą ze starego sprzętu pomiarowego, ale są w stu procentach sprawne. Część logiczna jest oparta na mikrokontrolerze ATMega8 taktowanym zegarem 8MHz. Zegar wyposażony jest w dobrze znany moduł WiFi ESP8266, którego używa przede wszystkim do synchronizacji czasu z Internetu poprzez protokół NTP, czas można też ustawiać ręcznie za pomocą przycisków. Zegar może wyświetlać godzinę, datę, a w planach jest również wyświetlanie dowolnych liczb z Internetu np. temperatury, liczby nieprzeczytanych maili i nie tylko.
UWAGA! W trakcie pracy zegara na płytkach występują napięcia groźne dla życia i zdrowia człowieka! Przy uruchamianiu układu należy zachować szczególną ostrożność, nie dotykać płytek ani przewodów.
Schemat
Schemat ideowy przygotowany został w Eaglu
Całość została podzielona na 2 płytki. Na płytce górnej znajdują się lampy, dekodery 74LS141 i prostownik dla napięcia anodowego. Na dolnej mikrokontroler, przerzutniki 74LS377 oraz zasilacz niskiego napięcia. Poza płytką znalazł się transformator i bezpiecznik sieciowy.
Zegar zasilany jest z transformatora sieciowego, który posiada 2 uzwojenia wtórne – 200V i 12V prądu zmiennego. Pierwsze napięcie jest prostowane na prostowniku B1 i trafia przez rezystory R1 – R6 na anody lamp. W obwodzie napięcia anodowego nie ma żadnego kondensatora wygładzającego napięcie, ale nie jest on potrzebny – Podobnie jak żarówki, czy żarniki w lampach elektronowych, lampy nixie rozżarzają się, więc nie ma efektu migotania.
Drugie napięcie trafia natomiast na mostek B2, jest wygładzane przez kondensator C5 i trafia na wejście stabilizatora IC13 (7805), który zbija je do napięcia 5V. To napięcie zasila mikrokontroler, przerzutniki, dekodery – słowem większość układów scalonych na płytce. Następnie za pomocą stabilizatora IC14 (LD33) generowane jest napięcie 3,3V które zasila moduł Wi-Fi ESP8266.
Mikrokontroler ATMega8 odpowiada za liczenie czasu, obsługę przycisków, obsługę lamp i komunikację z ESP8266 przez interfejs UART. ESP odpowiada zaś za łączenie się z Wi-Fi, pobieranie czasu z serwera NTP oraz formatowanie go. Dokładny opis działania mikrokontrolera oraz modułu Wi-Fi omówię przy okazji omawiania programu.
Mikrokontroler wystawia sygnały do wejść czterech 8-bitowych przerzutników D 74LS377. Trzy z nich obsługują cyfry na lampach nixie (godziny, minuty i sekundy), a czwarty odpowiada za kropki. W przypadku trzech pierwszych sygnał z wyjść trafia na dekodery 74LS141 (po jednym na lampę), które zamieniają 4-bitowy kod binarny na kod „1 z 10”. Wyjścia od 0 do 9 podawane są na katody lamp Z753M. Wyjścia czwartego przerzutnika trafiają przez rezystory 2,2k na bazy tranzystorów BC337, które odpowiadają za „zaświecanie” kropek. Kropek jest 5 (ostatnia cyfra nie używa kropki). pozostałe 3 wyjścia są wolne i mogą być użyte w przyszłości.
Kropki (oprócz oczywistej roli oddzielania cyfr) mają jeszcze jedną rolę. Otóż gdy chcemy, by któraś z lamp nie wyświetlała w danej chwili żadnej liczby, wystarczy podać na dekoder liczbę większą od 10, wtedy żadne z wyjść nie będzie aktywowane. Niestety powoduje to pojawianie się „duszków”, czyli świecenia się wszystkich cyfr lekką poświatą – jest to dobrze widoczne na zdjęciu poniżej. Zaświecenie kropki w takiej lampie niweluje ten efekt.
Budowę zegarka dałoby się uprościć przez zastosowanie jednego dekodera oraz multipleksowanie (wyświetlanie tylko jednej cyfry na jednej lampie, ale zmienianie ich w bardzo krótkim czasie). Moja konstrukcja, choć rozbudowana pod względem elektroniki, ma wiele zalet – zastosowanie przerzutników odciąża mikrokontroler, ułatwia programowanie, a same lampy świecą jaśniej i nie ma efektu świecenia się kilku cyfr na raz.
Płytka
Całość została wykonana na dwóch płytkach uniwersalnych. Nie jest to najbardziej elegancka metoda, ale jak na prototyp wymyślany „w locie” – praktyczna. Ponieważ nie jest to konstrukcja z żadnego schematu, a z „głowy” nie zawsze było wiadome, czy połączenie czegoś w taki, a nie inny sposób, zadziała. Połączenia wykonywałem za pomocą drutu ze starych skrętek sieciowych.
Zacząłem od zasilania lamp. Następnie wlutowałem pierwszą lampę, potem dekoder i sprawdziłem czy wszystko działa prawidłowo. Po dobraniu odpowiednich rezystorów anodowych dolutowałem kolejne lampy, potem przerzutniki i szynę danych, a potem poszło z górki. Obyło się bez większych problemów. W przyszłości planuję jednak wytrawić płytki z prawdziwego zdarzenia.
Dolutowałem również diodę LED, która w zasadzie nie ma żadnej większej roli (w aktualnej wersji programu świeci się przy odbieraniu danych ESP). Można zamiast niej dolutować buzzer, dopisać parę linijek kodu i używać zegarka jako budzika.
Na płytce nie ma interfejsu USB, mikrokontroler programowany jest za pomocą programatora ISP. Ponieważ pełnowymiarowe złącze ISP nie weszło na płytkę, wlutowałem 6-pinowe gniazdo i przygotowałem na kawałku płytki uniwersalnej odpowiednią przejściówkę.
Do połączenia płytek użyłem wykonanych przez siebie złączek typu BLS (po jednym na lampę).
Program
Jak już wspominałem za większość operacji związanych stricte z pracą zegarka odpowiada ATMega8. Ta została zaprogramowana w języku C w dość starym, ale nadal użytecznym środowisku WinAVR i był to pierwszy raz, gdy udało mi się ukończyć program właśnie w „czystym” C. Program zajmuje niecałe 4 kilobajty z 8, które daje nam do dyspozycji ten mikrokontroler.
Jak na konstrukcję liczącą czas przystało, program opiera się głównie o przerwania generowane przez system co określoną ilość czasu. Przerwanie INT0 jest wywoływane co około 10ms i obsługuje przyciski oraz miganie kropkami. Przerwanie INT1 pracuje w trybie CTC, jest wywoływane równo co sekundę i odpowiada za liczenie czasu. Wykorzystane jest również przerwanie URXC które następuje po odebraniu danych z UART i (jak łatwo się domyślić) odpowiada za odbiór danych. Główna pętla programu służy jedynie transmitowaniu danych z bufora. Oprócz funkcji „przerwaniowych” jest też sporo funkcji dodatkowych, między innymi:
Send() – wysyła dane do przerzutnika, a co za tym idzie – do lamp,
SendDigits() – konwertuje liczbę na BCD i wysyła do przerzutnika,
Clock() – odpowiada za obsługę zegara (czyli po 60 sekundach dodaje jedną minutę, po 60 minutach jedną godzinę itd.) w trakcie normalnej pracy zegara oraz przy ustawianiu czasu,
ComputeDayNum() – Oblicza liczbę dni w miesiącu na podstawie miesiąca i roku,
ShowDate(), ShowYear(), ShowClock(), ShowText(), – Pokazują na ekranie różne dane.
Program do ESP8266 został napisany w środowisku Arduino i na razie odpowiada wyłącznie za aktualizację czasu. Ponieważ zegarki Nixie są zwykle zasilane z sieci, powinny posiadać układ albo podtrzymujący ustawienia czasu, albo synchronizujący czas po włączeniu. Z początku zastanawiałem się nad odbiornikiem sygnału DCF77 (niemieckiego wzorca czasu), ale zdecydowałem się na synchronizację przez Internet z użyciem NTP (Network Time Protocol).
Rozwiązanie to ma jednak sporą wadę: Wszystkie serwery NTP przekazują czas w formacie bardzo podobnym do formatu Unix, czyli jako liczbę sekund która minęła od 1 stycznia 1900 roku i jest to czas UTC. Oznacza to, że ciężar przeliczenia czasu na formę „kalendarzową” oraz dopasowania strefy czasowej wraz z uwzględnieniem „przestawiania zegarków” spoczywa na kliencie. Na szczęście istnieją gotowe biblioteki zarówno obsługujące NTP, konwersję czasu oraz strefy czasowe. W moim zegarku używam biblioteki NTPClient.h, standardowej biblioteki Time.h oraz dodatkowej biblioteki timezone.h (https://github.com/JChristensen/Timezone) która odpowiada za dopasowanie strefy czasowej.
Jak już wspominałem w przyszłości planuję rozszerzyć możliwości zegara o wyświetlanie np. temperatury pobranej z sieci. Program na ATMegę już jest przygotowany na tą ewentualność i przewiduje możliwość wyświetlania informacji odebranych przez ESP8266, przechowywania ich w pamięci i wyświetlania ich przez określoną liczbę sekund. Program pod ESP na razie jednak tego nie wspiera. Aby skomunikować oba moduły napisałem prosty protokół komunikacyjny. Na razie wysłanie przez ATMegę polecenia
1 |
ti? |
pobiera czas z NTP i odsyła w formie tekstu np.
1 |
ti=2017-10-09-10-09-23. |
Każde polecenie kończy znak nowej linii \n. Polecenia są dwuliterowe, dodanie znaku zapytania oznacza zapytanie, zaś znaku = odpowiedź.
Ogólne rzecz biorąc program był pisany tak, by zegar mógł pracować bez włożonego ESP8266 więc nic nie stoi na przeszkodzie, by z niego nie zrezygnować. Zachęcam do zapoznania się z kodem źródłowym obu modułów, gdzie w komentarzach jest wszystko w miarę wyjaśnione.
Obsługa
Zegar posiada 3 przyciski. Przytrzymanie środkowego powoduje wejście do ustawień zegara, gdzie możemy ustawić po kolei: rok, miesiąc, dzień, godzinę i minutę. Przyciskami lewym i prawym odejmujemy lub dodajemy ustawianą liczbę. Przytrzymując przyciski możemy szybko przewijać liczby.
Poza ustawieniami wciśnięcie przycisku prawego zmienia aktualnie wyświetlaną wartość (aktualnie po wciśnięciu na 5 sekund pojawia się data), zaś przytrzymanie przycisku lewego synchronizuje zegarek z NTP. Próba synchronizacji odbywa się również po włączeniu zegara do zasilania. Trwa to z reguły kilka sekund.
To tyle jeśli chodzi o pierwszą część. W najbliższym czasie pojawi się część druga, w której opiszę wykonanie drewnianej obudowy. Gdy takowa się pojawi wrzucę odpowiedni link.
EDIT: Druga część jest już dostępna tutaj.
W Wasze ręce oddaje również kody źródłowe do ATMegi i ESP8266 oraz schemat w formacie Eagle.
Trzymajcie się ciepło!
Hubert.
Projekt dobry, pomyślałbym tylko nad ograniczeniem wykorzystywanej powierzchni obudowy na np. biurku? Myślę że proporcjonalnie lampy są małe do całej konstrukcji zegara. Ale to tylko moja subiektywna opinia.
Masz rację, wielka kobyła :)
Na szczęście zegar stoi na komodzie w moim pokoju i nie zajmuje miejsca na i tak zagraconym biurku.
Fajny i ciekawy pomysł no i praktyczny.Jedyne do czego można mieć zastrzeżenia to do wyglądu obudowy do tego wszystkiego.
przydało by się inaczej front zrobić. zamiast zapewne to sklejka dociąć górę i boki mniejsze i wstawić do środka a czołową to wszystko zakryć na mocny klej do drewna wkrętów. stylistycznie było by wtedy ok.
Bardzo podoba mi się zastosowanie przerzutników zamiast multipleksowania, naprawdę fajne rozwiązanie. Dobrze widzę że wszystkie porty uC zajęte? To się nazywa dobre wykorzystanie :D Wielki + za zbudowanie tego jak ja to nazywam “od zera” zamiast kupienia Arduino i wsadzenia go na płytkę uniwersalną. Stąd też się chyba wzięła ta jedna gorsza ocena ;) bo projekt jest naprawdę dopracowany i świetnie udokumentowany. Mógłbym się przyczepić do jednej rzeczy która mnie zabolała, otóż wlutowanie lamp bezpośrednio w płytkę. Dlaczego nie podstawka? Jak któraś Ci w końcu padnie, to bez podstawki wymiana jest znacznie bardziej upierdliwa. A patrząc ogólnie na projekt to obudowa faktycznie bez szału, ale jeżeli taka Ci się podoba to super ;) Czekam na drugą część.
Masz rację, też wolałbym żeby lampy były w podstawkach, bo podobnie jak zwykłe lampy elektronowe nie są długowieczne. Niestety lampy Z573M mają wyprowadzenia w postaci cienkich drucików które nie nadają się do jakiejkolwiek podstawki :(. Dlatego tu, jak i w większości innych aplikacji wlutowuje się je bezpośrednio w płytkę. Dzięki za dobre słowo! Druga część pojawi się w najbliższym czasie.
Witam.
Bardzo mi się podoba ten projekt. Posiadam kilka lamp ze starego miernika i zastanawiam się, czy zamiast 6 sztuk można podłączyć tylko 4, tak aby wyświetlał godziny i minuty? Czy konieczne będzie wtedy modyfikowanie oprogramowania lub schematu sterowania? Dziękuję za odpowiedź. Pozdrawiam
Pingback: Samoregulujący się zegar z serwera NTP – LinuxSystems – Wszystko o Linuxie oraz branży IOT