Idėja susikonstruoti unikalų sieninį laikrodį mano galvoje kirbėjo gan seniai, tačiau iki šiol niekaip iki to „nepriėjo“ rankos. Be to, internetas yra pilnas kuo įvairiausių „nixie“, LED’inių, mechaninių, pneumatinių, hidraulinių ir kitokių laikrodžių, o man norėjosi kažko įdomesnio. Taip pat kaip ir kiekvienas tikras inžinierius esu didelis tinginys, todėl nenorėjau per daug vargti su mandromis konstrukcijomis ir kitokiais velniais, todėl ilgai laukiau reikiamo momento kol į rankas paklius kas nors, iš ko būtų galima pasidaryti laikrodį. Šis momentas atėjo buvusiame darbe, kai į mano rankas pakliuvo elektromechaninė (angl. flip-dot) švieslentė.
Schema ir PCB
Laikrodžio valdikliui iš principo panaudojau tą patį, šiek tiek ankščiau aprašytą, flip-dot valdiklį, su kuriuo tyrinėjau elektromechanines švieslentes. Vienintelis skirtumas tas, kad šį kartą prie jo papildomai prijungiau Dallas DS1307 RTC laikrodį. Tuo pačiu linijinį įtampos stabilizatorių 7805 pakeičiau impulsiniu nekaistančiu LM2574n-5 su atitinkamu apkabinimu. Schemos stabilumui užtikrinti, papildomai ant AtMEGA16 Reset kojos užkabinau supervizorių MCP100T-475I, kuris neleidžia atmegai startuoti, kol jos maitinimo įtampa nepakilo aukščiau 4,75 V.
Šią valdiklio versiją papildžiau aibe naujų jungčių. Išvedžiau vieną iš ADC pinų. Numačiau jungtį rotorinio enkoderio ar išorinių mygtukų prijungimui. Valdiklio darbo statuso šviesos diodus irgi iškėliau ant papildomos jungties. Įprojektavau galimybė prijungti papildomą lauktranzių grandinę (schema viršuje, dešinėje), skirtą laikrodžio apšvietimo komutavimui.
Tiesa, tuos lauktranzius teko iškelti ant atskiros plokštelės, nes į nemokamo Eagle langą jie tiesiog gražiai nebetilpo. Na bet kokiu atveju, abi PCB gavosi gan šaunios:
Surinkimas
Šiek tiek išrinkau turimos švieslentės korpusą ir pradėjau ieškoti vietos elektronikai. Vietos radau ant galinio švieslentės skydelio, šalia į korpusą įmontuotos dienos šviesos (CCFL) lempos inverterio.
Būdamas didelis tinginys, daugelį aukščiau aprašytų pakeitimų padariau lituokliu ant egzistuojančios plokštės ir negaminau naujos PCB. Tiesa, tai kainavo šiek tiek nervų.. Taip daryti tikrai niekam nerekomenduočiau, bet dėl sprendimo per daug nesigailiu, nes pakeitimų nebuvo labai daug.
Valdiklio ir švieslentės maitinimui panaudojau kinietišką DC-DC modulį iš ebay... Iš senų laikų turėjau likusį RTC moduliuką, o ir „netyčia” iš pat pradžių valdiklio PCB buvau įprojektavęs I2C jungtį.. Žodžiu, pakoreguotas valdiklis atrodė taip:
Dalis, prie PCB prilituotų laidų eina į laikrodžio nustatymo mygtukus. Kiti į lauktranzių plokštelę. Lauktranzių plokštelės PCB, kaip supratote, irgi negaminau, o tiesiog greituoju surinkau ant „nulinės” plokštės:
Tiek valdiklį, tiek dc-dc, tiek ir lauktranzių plokštelę pritvirtinau varžtais ir sujungiau visus laidus:
Laikrodis valdomas dviem mygtukais. Vienas įjungia/išjungia laiko nustatymo režimą. Kitas nustato laiką ir junginėja apšvietimą (apie tai vėliau). Iš senų laikų turėjau nusipirkęs neracionaliai brangius mygtukus su šviesos diodais. Juos irgi sulitavau ant „nulinės plokštės”. Pačia plokštelę pritvirtinau taip, kad mygtukai būtų prieinami iš išorės.
Kitame švieslentės šone sumontavau maitinimo jungtį ir saugiklį. Papildomai apsaugai nuo neteisingo pajungimo įmontavau peraugusį šotki diodą:
Surinktas laikrodis atrodo taip:
Softas
Tai sudėtingiausia projekto dalis. Valdiklio programos kodas, ne toks sudėtingas ir ilgas, kaip LEDCtrl atveju, tačiau ne mažiau painus. Kodas painus todėl, kad projekto įgyvendinimas užtruko porą metų. T. y. valdiklis ir „basic” valdymo programa buvo sukurta maždaug 2012 metais, rašant magistrinį darbą. Visas kitas funkcionalumas suprogramuotas 2014 m. pabaigoje (pagaliau įkvėpimas atsirado). Kodo tvarkingumui tikrai nepadėjo ir tai, kad ūpui pakelti dažnai nevengiau buteliuko alaus ar viskio šlakelio. 😀 Na bet yra kaip yra. Gal vienas kitas bugas ir liko, bet daiktas veikia, atlieka savo funkcijas ir nelūžta.
Programos kodo per daug nekomentuosiu, tačiau ateities kartoms šiek tiek aprašysiu priimtus programinius ir AtMEGA16 hardware išnaudojimo sprendimus. Pirmiausia apie softą. Apie flip-dot švieslentės valdymo mechanizmą užsiminiau įraše apie elektromechanines švieslentes. Ten nieko sudėtingo, tiesiog switch-case konstrukcija, atitinkamai sukomutuojanti švieslentės valdymo dešifratorius. Įdomesnis to praktinis pritaikymas, nes norint atvaizduoti skaičius (laiką), teko sukurti nuosavą „šriftą”.
Nusprendžiau naudoti 5×3 taškų dydžio skaičius (didesni tiesiog gražiai netilpo į mano turimą 13×28 matricą). Mano turima elektromechaninė švieslentė yra taip jau sutverta, kad stulpelius yra valdyti daug patogiau nei eilutes, todėl kiekvieną skaitmenį sudaro 3 baitai stulpelių. Kiekviename baite yra saugoma informacija apie kiekvieną stulpelio tašką: 0 – juoda spalva, 1 – geltona. Skaitmens stulpeliai yra skaitomi iš „apačios į viršų”. Taip atrodo visas 11 simbolių (skaitmenys 0–9 ir simbolis „:”) šrifto masyvas:
static uint8_t fdfont[] = { 0x1F, 0x11, 0x1F, //0 0x09, 0x1F, 0x01, //1 0x17, 0x15, 0x1D, //2 0x15, 0x15, 0x1F, //3 0x1C, 0x04, 0x1F, //4 0x1D, 0x15, 0x17, //5 0x1F, 0x15, 0x17, //6 0x10, 0x17, 0x18, //7 0x1F, 0x15, 0x1F, //8 0x1D, 0x15, 0x1F, //9 0x00, 0x0A, 0x00 // : };
Skaičius atvaizduoja funkcija print_number(number,pst,peil), kuriai reikalingi 3 argumentai: number – norimas atvaizduoti skaitmuo; pst ir peil – atvaizduotino skaitmens apatinio kairiojo kampo koordinatės (skaičiuojama nuo matricos apatinio kairiojo kampo). Ši funkcija atitinkamai išsikviečia funkciją print_column, kuri nuskaito šrifto masyvą ir su funkcija segmentas atitinkamai, bitas po bito perverčia matricos skydelius. Kaip greitai (dar net ne maksimalus greitis) veikia laikrodis, galite pamatyti čia:
Laiko „rodymas” yra realizuotas TIMER0_OVF_vect pertrauktimi. Čia kelis kartus per sekundę yra tikrinama, ar nepasikeitė laikas. Jeigu laikas pasikeitė, yra patikrinama, kurie skaitmenys būtent pasikeitė ir tik jie yra perpiešiami. Vizualiai tai atrodo maždaug taip:
Laikrodžio nustatymai keičiami tiek per USART sąsają, tiek ir valdymo mygtukais. Mygtuku, prijungtu prie INT1 (PD3), galima įjungti ir išjungti laikrodžio apšvietimą. Labai knietėjo pabandyti laikrodį apšviesti UV šviesos diodų juosta, todėl suprogramavau galimybę įsijungti CCFL arba UV apšvietimą:
Mygtuku, prijungtu prie INT0 (PD2), yra aktyvuojamas rankinis laiko nustatymo režimas. Aktyvavus šį režimą, mygtukas „INT1” didina pasirinktą skaičių, o mygtukas „INT0” – šoliuoja per skaitmenis. Pasirinktas skaitmuo yra indikuojamas brūkšneliu po skaitmeniu. Perėjus per visus skaitmenis, nustatytas laikas yra išsaugomas. Žinoma, yra suprogramuota papildoma apsauga nuo durniaus, neleidžianti išsaugoti nerealaus laiko (>23:59), bei išeinanti iš rankinio laiko nustatymo režimo, jei jis užtrunka per ilgai (kažkas pradėjo nustatinėti laikrodį ir pamiršo). Pastaroji apsauga yra realizuota pertrauktimi TIMER1_COMPA_vect, kuri nuolat tikrina ar nebuvo viršytas nustatytas laiko intervalas. Intervalas yra „įhardkodintas” parametre set_time_timeout. Parametro reikšmė – maksimalus laiko tarpas sekundėmis tarp atliktų veiksmų. Viršijus šį laiką (nespėjus išsaugoti naujo nustatyto laiko), nustatymai yra anuliuojami ir yra gražinamas senas laikas. Pats rankinis nustatymas atrodo taip:
Laiką ir datą galima nustatyti ir per USART sąsają (9600 Boud, 8 bitų su 1 Stop bitu). USART sąsaja taip pat galima įjungti ir išjungti laikrodžio apšvietimą. USART meniu atrodo taip:
USART sąsaja yra pritaikyta žmogui. T. y. nustatant laiką ar datą valdiklis gražiai paprašo įvesti valandas, minutes ir sekundes (metus, mėnesį dieną), pasitikslina ar norime įvestus duomenis išsaugoti ir tik tada atlieka realius pakeitimus. Apšvietimas komutuojamas irgi panašiai, tik čia iš naudotojo gavus darbo režimo nustatymą jis yra vykdomas iš karta, nieko daugiau neklausiant.
Įdomu tai, kad prijungus HC05 bluetooth moduliuką, visi nustatymai yra puikiausiai pasiekiami iš Android telefono, naudojant „BlueTerm” programėlę:
Manau, daug kam kyla klausimas, kam iš vis tas valdymas per USART, jeigu yra valdymo mygtukai? Atsakymas yra dvigubas: pirmiausia, USART sąsają kūriau dėl sportinio intereso ir dėl galimybės automatiškai atnaujinti/sinchronizuoti laiką. Taip taip, mano laikrodį galima sinchronizuoti su PC laikrodžiu per USART. Tam pasiskolinau Noah Coad programos „SerialPort Terminal” kodą ir jį šiek tiek patobulinau pagal savo poreikius.
Programoje pridėjau 3 mygtukus. Mygtukas „About” gražina laikrodžio techninę informaciją, o mygtukai „SyncTime” ir „SyncDate” atitinkamai sinchronizuoja flip-dot laikrodžio RTC su kompiuterio laikrodžiu (dėl lėto USART galima kelių sekundžių paklaida):
Atsisiutimai
Valdiklio schemą, PCB rasite čia: flip-dot_controller_V2.rar
Valdiklio programinę įrangą ir patobulintą „SerialPort Terminal” versiją galite atsisiųsti iš čia: flip-dot_clock.zip
Perfect!
Atgalinis pranešimas: Flip-Dot Clock laiko sinchronizavimas su Aviete per bluetooth | Paulius Bautrėnas