
Cześć!
Pewnie część czytelników jest już znużona ilością tematów o zegarach nixie, ale nic nie poradzę na to, że ja także poddałem się magii tych cudownych wyświetlaczy minionej epoki.

Początki, założenia
Najważniejszy cel, jaki sobie postawiłem, to zapakowanie całości w jakąś klimatyczną obudowę. Niewiele we mnie duszy artysty, ale akurat pod tym względem uważam, że lampy to nie wszystko. Plastikowe obudowy uniwersalne czy stare pobrudzone aluminium zdecydowanie odpadały. W poszukiwaniu inspiracji natrafiłem na stronę użytkownika ConsciousFlesh i od razu wiedziałem, że to było to - mahoń i mosiądz w połączeniu z ciepłym światłem nixie...
Jeśli chodzi o lampy, zdecydowałem się na IN-12 - bardzo mnie urzekły swoimi niewielkimi wymiarami, a do tego są tanie (jak na nixie). Zamarzyłem sobie również dwie malutkie żaróweczki do sygnalizowania kilku rzeczy. W kwestii elektroniki, starałem się używać łatwo dostępnych i tanich części.
Oczywiście tak jak zawsze, przy realizacji tego projektu chciałem zdobyć trochę doświadczenia w jakimś ciekawym temacie. Nie miałem jeszcze okazji używać w praktyce odbiorników podczerwieni i zewnętrznych układów RTC, a przetwornice były dla mnie czarną magią. Była to też doskonała okazja do zgłębienia tajników bootloaderów i wypróbowania KiCada ^^. W zasadzie nauczyłem się jeszcze wielu fajnych rzeczy (głównie w tematyce obróbki/wykończenia elementów), ale tak to już zazwyczaj jest jak się coś robi pierwszy raz.
Nadajnik





Zanim przejdziemy do zegara, najpierw parę słów o pilocie. Całość oparta jest o ATtiny13 taktowaną 1.2MHz i zasilaną z baterii 3V oraz zwykłą diodę podczerwoną. Przyciski ułożone są w matrycę rezystancyjną, a określanie wciskanego przycisku odbywa się przez ADC. Rezystory są tak dobrane, że w stanie spoczynku na pinie ADC odkłada się pełne napięcie zasilania, a przy wciśniętym przycisku napięcie wynosi od 0 do 27% napięcia zasilania, co zawsze zapewnia logiczny stan niski. W normalnej sytuacji procesor jest uśpiony i pobiera poniżej 1uA - wybudzany jest dopiero przez przerwanie PCINT na pinie klawiatury (gdy jakiś przycisk zostanie wciśnięty). Po wybudzeniu pin ustawiany jest jako wejście ADC, następuje pomiar napięcia i określenie wciśniętego klawisza. Chciałbym w tym miejscu podziękować koledze Krauser z forum.atnel.pl, który zaproponował mi koncept przedstawionej powyżej matrycy klawiszy.

Wysyłanie danych odbywa się w standardzie Sony SIRC (do poczytania tutaj) ze względu na prostotę implementacji. Dioda nadawcza podłączona jest do pinu OC0A, ponieważ do generowania nośnej wykorzystałem wbudowany timer0. Pin OC0A działa na zmianę jako zwykły stan niski i wyjście "toggle on compare match" timera, co skutkuje sygnałem takim jak na powyższej stronie. Co prawda generowana nośna nie jest idealnie dostosowana do odbiornika (37.5 zamiast 36kHz), ale zasięg i tak jest dobry - całość spokojnie działa w obrębie pokoju.
Do zrobienia obudowy wykorzystałem zwykły laminat szklano-epoksydowy 1.5mm. Jest wytrzymały i łatwy w obróbce, a elementy można łączyć na luty. Całość oklejona jest fornirem w kolorze czereśni amerykańskiej. Mosiężne etykietki zostały wytrawione w chlorku żelaza - wgłębienia pokryłem markerem i starłem naddatek. Końcówki na przyciski są wybite z blachy 0.1mm i wypolerowane na błysk, dzięki czemu fajnie się komponują z matowymi etykietami.

Zegar - część elektroniczna




Tu myślę, że wypada zacząć od kwestii zasilania nixie. Nie miałem wcześniej do czynienia z przetwornicami, więc postanowiłem zdać się na typowe aplikacje MC34063, kalkulatory i rady innych. Pewnie można by coś poprawić, ale temat odszedł w niepamięć, bo po wielu próbach przetwornica zaczęła sensownie działać. Od siebie dodałem tylko rezystory R41 i R42, dzięki którym procek może zmieniać napięcie wyjściowe (jasność lamp). Nie wiem, czy tak się to powinno robić, ale tak to sobie wykoncypowałem i póki co działa.

Sterowanie anodami odbywa się przez multipleksowanie przy pomocy wysokonapięciowych tranzystorów BTA42 i BTA92. Katody są zwierane do masy przez BTA42 sterowane z dekodera 4028. Dzięki temu zaoszczędziłem trochę pinów, a obsługa mocno się uprościła. Separator wykonany jest z dwóch neonówek połączonych szeregowo, również sterowanych z pojedynczego BTA42.
Na przedni panel wyprowadzony jest odbiornik podczerwieni TSOP2236 oraz fototranzystor LTR4206, używany do automatycznej zmiany jasności na podstawie pomiaru oświetlenia (można ją też zmieniać pilotem). Oprócz nich zamontowane są także żaróweczki do sygnalizowania stanu zegara. Jedna się świeci, gdy ustawiony jest budzik, a druga, gdy wprowadzane są dane (np. ustawianie czasu). Żarówki sterowane są przez PWM, a ich jasność zmienia się razem z jasnością lamp.
Na pokładzie znajduje się również buzzer z generatorem działający jako budzik, a także standardowa aplikacja układu PCF8563 do odmierzania czasu. Dzięki zewnętrznemu RTC możliwe jest wyświetlanie nie tylko czasu, ale i daty, a bateria umożliwia działanie zegara również po odłączeniu zasilania. Trochę trwało zanim dobrałem odpowiedni kondensator dla kwarcu, ale ostatecznie udało się osiągnąć dokładność rzędu 2 sekund na tydzień (przynajmniej tyle mi wychodziło jak to mierzyłem ^^). Na zdjęciach zauważyć można miedziane ekranowanie przetwornicy i okolic - siała tak bardzo, że bez tego jakiekolwiek kombinowanie z RTC nie miało sensu.
Wszystkimi wyżej wymienionymi peryferiami steruje ATmega88/168 taktowana wewnętrznym rezonatorem 8MHz. Oprócz tego zajmuje się też odbieraniem komend przez UART. Komunikacja odbywa się w oparciu o prosty protokół - początek i koniec ramki jest definiowany przez znaki specjalne (u mnie 0x00 i 0x0A), a pomiędzy nimi znajdują się dane wysłane w postaci tekstowo-heksadecymalnej (np. bajt 76 jest wysyłany jako znaki "4C"). Na dane składa się kod rozkazu, opcjonalne argumenty, kontrola parzystości i długość ramki. Przy pomocy prostej aplikacji na PC można wysyłać pojedyncze komendy ręcznie lub ustawić bieżący czas i datę na podstawie czasu systemowego.
Wyprowadzenie do komunikacji jest dwupinowe (masa i linia odbioru), jednak dzięki zastosowaniu przejściówki (widoczna na dole schematu) możliwe było zaimplementowanie prostego bootloadera. Ale o tym za chwilę.
Zegar - obudowa
Obudowa została wykonana w podobny sposób co pilot - części z laminatu lutowane do siebie i oklejone fornirem (tym razem mahoniowym). Oprócz mosiężnych etykiet, na krawędziach dodane są blaszki zasłaniające łączenia. Ścianki górna i dolna wykonane zostały z balsy potraktowanej bejcą mahoniową i lakierem akrylowym. Wybór tego rodzaju drewna może dziwić, ale potrzebowałem czegoś, co można łatwo obrobić. Spód obudowy i płytki PCB są montowane na śrubach, żeby w razie czego można było coś poprawić.
Obudowa wbrew pozorom jest dość skomplikowana - dużo czasu zajęło mi zarówno wykonanie, jak i samo zaprojektowanie jej. Projekt powstał na komputerze jako model 3D, bo ilość zależności była przytłaczająca i uwzględnianie tego wszystkiego w locie byłoby niemożliwe. Poniżej kilka zdjęć z procesu budowy.










Zegar w akcji



To lekkie miganie cyfr wynika z krótkiego czasu naświetlania - w rzeczywistości nic takiego nie występuje. Poza tym niestety nie udało mi się uchwycić idealnie koloru i nasycenia cyfr, ale fakt faktem że urok nixie można w pełni podziwiać tylko na żywo...
Bootloader
Po wykonaniu zegara stwierdziłem, że warto liznąć ten temat i wyposażyć projekt w możliwość aktualizacji softu. Głównym problemem (oczywiście poza tym, że nigdy nie używałem żadnego bootloadera) był fakt, że potrzebna jest dwukierunkowa transmisja, a linia TXD zegara była zajęta. Ostatecznie więc wyprowadzona na obudowę linia RXD używana jest do sprzętowego odbioru danych, a w razie potrzeby UART jest odłączany i linia działa jako zwykły pin nadający dane w sposób programowy. Aby uniknąć efektu "echa" po stronie komputera, należy użyć odpowiedniej przejściówki. Ja wykonałem sobie coś takiego i spisuje się wyśmienicie. Sama transmisja przebiega z szybkością 100kbaud i wygląda raczej standardowo - po resecie mikrokontroler wysyła trochę danych (sygnaturę, taktowanie, wielkość strony itp.), a następnie czeka na ciąg rozpoczynający ładowanie softu. Jeśli w ciągu sekundy nic nie odbierze, wykonuje się skok do normalnego programu. W przeciwnym wypadku zaczyna się transmisja - dane wysyłane są w paczkach wielkości strony (dla ATmegi168 jest to 128 bajtów), po czym komputer czeka na informację o zakończeniu zapisu danych i dopiero później wysyła kolejne. Każda paczka zawiera ponadto bajt kontroli parzystości na wypadek przekłamań transmisji. Program jest tak napisany, by uniemożliwić zawieszenie się w przypadku braku nadchodzących danych. Bootloader pod koniec pracy zwraca kod błędu, który może pomóc zdiagnozować ewentualne problemy.
Cały kod bootloadera zajmuje niecały 1kB (512 słów). Jest to dość dużo, ale po wielu dniach spędzonych nad pisaniem kodu nie miałem już ochoty bawić się w optymalizację, szczególnie że byłby to dla mnie całkiem nowy temat. Bootloader ten był moim debiutem i jest to raczej wersja beta - jeśli kiedyś będę miał pisać coś bardziej uniwersalnego, na pewno nie pominę optymalizacji. Z czystej ciekawości zerknąłem w kod wynikowy i na same nieużywane wektory przerwań marnuje się przeszło 100 bajtów, tak więc na pewno można go jeszcze mocno ścisnąć.
Poniżej poglądowe zrzuty z programu obsługującego bootloader oraz komunikację z zegarem. Obie aplikacje popełniłem w Visual C#.


Podsumowanie, koszta
Jestem zadowolony że to już koniec, bo bądź co bądź projekt powstawał prawie 8 miesięcy. Niemniej uważam, że było warto.

Na koniec jeszcze trochę liczb. Przy maksymalnej jasności lamp zegar pobiera średnio 65mA (bez włączonych żarówek - każda to dodatkowe 11mA), co daje niecały 1W.
W kwestii kosztów prezentuje się to mniej więcej tak:
- lampy nixie, neonówki, żarówki: 45 zł
- laminat, fornir, mosiądz, balsa: 29 zł
- elektronika do zegara: 27 zł
- pilot: 13 zł
SUMA: 114 zł (w praktyce jakieś 2-3 razy więcej: testy i prototypy są okropnie drogie...)
Okej, tego by było na tyle. Mam nadzieję, że nie przynudzałem zbytnio.

Pozdrawiam
mopsiok