Flip-Dot Clock

IMG_7319

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

flip_dot_controller_V2-sch
fet_board_sch

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:

flip_dot_controller_V2-brd
fet_board_brd

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.

IMG_6960
IMG_6982

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:

IMG_6988
IMG_6987

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:

IMG_6985
IMG_6986

Tiek valdiklį, tiek dc-dc, tiek ir lauktranzių plokštelę pritvirtinau varžtais ir sujungiau visus laidus:

IMG_6991
IMG_7001

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.

IMG_6983IMG_6984
IMG_7697

Kitame švieslentės šone sumontavau maitinimo jungtį ir saugiklį. Papildomai apsaugai nuo neteisingo pajungimo įmontavau peraugusį šotki diodą:

IMG_6994
IMG_6995

Surinktas laikrodis atrodo taip: IMG_7317

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ą“.

octagon_fontas

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:

Clipboard01USART 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.

Clipboard03
Clipboard05
Clipboard06

Įdomu tai, kad prijungus HC05 bluetooth moduliuką, visi nustatymai yra puikiausiai pasiekiami iš Android telefono, naudojant „BlueTerm“ programėlę:

IMG_7023

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.

Clipboard08

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):

Clipboard12
Clipboard13

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

2 komentarai

  1. Atgalinis pranešimas: Flip-Dot Clock laiko sinchronizavimas su Aviete per bluetooth | Paulius Bautrėnas

Parašykite komentarą

El. pašto adresas nebus skelbiamas.