Arduino

Hodiny pro astronomická pozorování


*** AKTUÁLNĚ ***

Na žádost několika zájemců jsem nechal vyrobit malou sérii plošných spojů, takže už není nutné to bastlit na univerzální desce.
Pokud byste si tyto hodiny také chtěli postavit, nabízím zbylé plošné spoje za výrobní náklady (60Kč + 20Kč poštovné).
Detaily zde:
astrohodiny-pcb.htm

 

Úvod

Při nočním pozorování oblohy si občas potřebuji zaznamenat přesný časový okamžik nějaké události (například záblesk meteoru, nebo přelet nějaké družice). Dříve jsem musel vyndat z kapsy mobil, zapnout ho (to mě oslnilo) a pak jsem si musel zaznamenat čas na kus papíru.

Pomocí těchto astronomických hodin stačí vychýlit joystick, který je umístěný na krabičce. Tím se aktuální čas zaznamená do paměti.

Další využití hodin je v tom, že si do nich mohu nahrát alarmy (například upozornění, že za 5 minut poletí ISS, nebo že nastane zákryt některého z Jupiterových měsíců.)
Hodiny pak při nastaveném čase začnou pípat a zobrazí popis události.

Všechny tyto funkce je sice možné realizovat různými programy v mobilním telefonu, ale jeho nevýhoda je v tom, že i při minimální úrovni jasu podsvětu displeje telefon oslňuje.
Na těchto hodinách je možné nastavit jas podsvětu i na pouhé 1%, nebo lze podsvět vypnout úplně.

Arduino jsem volil hlavně kvůli výrazně nižší spotřebě, než má Raspberry Pi (celková spotřeba včetně displeje je asi 50mA). 
Mimo to je i o hodně menší (použil jsem variantu Arduino Nano V3.0)


Popis všech funkcí

- Čas je zobrazen velkými znaky, takže je displej čitelný i z větší vzdálenosti (hodiny mohou být zavěšeny někde na noze od dalekohledu).

- Zobrazeny jsou i sekundy.

- Možnost jemně nastavit jas podsvětu displeje (až k úplnému zhasnutí), aby při astronomickém pozorování hodiny neoslňovaly.

- Jako vstupní zařízení je použitý joystick. Umožňuje procházení v menu a nastavování různých parametrů v terénu - přímo v hodinách.

- Při pohnutí joystickem v normálním režimu zobrazování času dochází k záznamu aktuálního datumu a času do paměti (včetně směru vychýlení joysticku a času trvání vychýlení od 0,1 do 25,5 sekundy)
Takovýchto záznamů je možno pořídit až 999.

Ukázka jednoho zaznamenaného času
"dir" udává směr vychýlení joysticku
"dur" je doba, po kterou byl joystick vychýlený

- Možnost nastavit až 99 alarmů (budíků). Alarmy se připravují v PC a do hodin se pak nahrávají přes USB komunikaci.
Každý takto připravený alarm může obsahovat i textový popis (až 56 ASCII znaků).
U všech nahraných alarmů je možné měnit datum a čas spuštění přímo v hodinách (v hodinách není možné měnit textový popis).
Každý alarm může být také nastaven do neaktivního stavu (datum, čas i popis se nemění, ale alarm se v nastaveném čase nespustí).
V hodinách sice není možné zakládat nové alarmy, ale 5 alarmů je "nesmazatelných", takže jsou k dispozici pro editaci v terénu i po smazání celé paměti "továrním resetem"

Ukázka zobrazení jednoho z alarmů
[A] = značka že je alarm aktivní
i = index alarmu
zbytek displeje zaplňuje textový popis alarmu.
Editace jednoho z "nesmazatelných" alarmů
Je možné upravit datum a čas, ale není možné změnit text.

- Měření teploty je prováděno pomocí přesného I2C čidla LM92. Naměřenou teplotu je možné v pravidelných intervalech (1 až 999 sekund) zaznamenávat do přídavné SRAM paměti. Teplota je zobrazena na displeji i v případě, že se do paměti neukládá. V první variantě jsem měl čidlo umístěné na boku krabičky. To se ale neosvědčilo, protože elektronika krabičku trochu ohřívala. Ve druhé variantě jsem tedy čidlo umístil na krátký kablík. Teploměr se teď připojuje do konektoru a měření je přesnější.
Když není teplotní čidlo připojené do konektoru, informace o teplotě se nezobrazuje.

Teploměr v konektoru ve spodní části krabičky

- Kromě teplot je možné měřit a zaznamenávat ještě další 2 napěťové kanály (10-bitové).

- Pro ukládání naměřených hodnot jsem vytvořil v SRAM jednoduchý souborový systém, kdy je každý blok měření označen hlavičkou (něco jako "FAT"), která udává čas prvního záznamu, adresu paměti s prvním záznamem, počet a typ měřených kanálů, rychlost ukládání naměřených hodnot a celkový počet zaznamenaných vzorků. Samotná data se pak už ukládají úsporně bez dalších informací o datumu a času, protože tyto informace jsou dopočítatelné z hlavičky. Při přerušení měření (například vstupem do menu, nebo vypnutím napájení) se blok uzavře a při dalším spuštění měření se vytvoří nová hlavička pro další blok měřených dat.

- Na displeji se zobrazuje informace o počtu aktivních alarmů, počtu záznamů časových okamžiků a velikosti volné paměti pro naměřené hodnoty teploty a napětí.
Ve spodní informační řádce cykluje informace o:
  - teplotě
  - datumu nebo času příštího aktivního alarmu 
  - stavu nabití vnitřní 9V baterie
  - při zvoleném ukládání hodnot napěťových kanálů se zobrazují i aktuální hodnoty napětí na těchto kanálech.

A=počet aktivních alarmů
Z=počet zaznamenaných časů
M=velikost volné paměti
ve spodní řádce je teplota

Inverzní M=probíhá měření
A=datum příštího alarmu

 U1= měřené napětí na prvním
         vstupu
BAT=úroveň nabití baterie

 

- SRAM paměť pro zaznamenané časové okamžiky, alarmy a naměřené hodnoty je (stejně jako RTC obvod) zálohovaná vlastní 3V baterií. Celková velikost paměti je 64kB (z toho je asi 9kB vyhrazeno pro záznam 999 časových vzorků, 6kB je pro 99 alarmů, 3kB pro "FAT", něco přes 40kB je pro záznam naměřených hodnot a zbytek je pro systémové proměnné).

- Nastavení času je možné buď ručně přímo v hodinách (to je ale nepřesné), nebo je možné čas nastavit přesně podle PC přes USB komunikaci. (Pro DCF ani GPS nastavování času už nezbylo ani místo v krabičce, ani žádný prostor ve FLASH paměti pro obslužný program.)

Přímo v hodinách je možné pomocí joysticku:
 - nastavit jas podsvětu
 - listovat v alarmech, editovat jejich datumy a časy a případně je přepínat do aktivního(/neaktivního) stavu
 - listovat zaznamenanými časy (nebo je všechny smazat)
 - nastavit jemnou korekci frekvence krystalu v RTC obvodu
 - vybrat kanály, jejichž hodnota se bude ukládat do paměti (Teplota, Napětí 1, Napětí 2)
 - zvolit periodu ukládání naměřených hodnot (1 až 999 sekund)
 - nastavit pískák na:
   1) Pípnutí každou hodinu ("H").
   2) Zvukové upozornění při alarmu ("A")
         (bez nastavení zvukového upozornění se zobrazí pouze text alarmu).
   3) Pípnutí při pohnutí joystickem ("J") - při zaznamenávání času.
   4) Pípnutí při každém uložení naměřené hodnoty (teploty, nebo napětí) do paměti ("S").

 - V servisním menu je pak možné: 
    - Nastavit kontrast displeje.
    - Nastavit komunikační rychlost pro přenos dat mezi hodinami a PC.
    - Smazat z paměti pouze naměřené hodnoty (Teplota, Napětí 1, Napětí 2) - položka "Format FAT".
    - Uvést hodiny do "Továrního nastavení" - včetně vymazání všech údajů v paměti (záznamy, alarmy, naměřené hodnoty, RTC)
    (servisní menu je přístupné pouze při resetu nebo zapnutí napájení za současného ohnutí joysticku nahoru)

Hlavní menu Podmenu "Nastavení" Servisní menu

Víc už se mi do 32kB FLASH v Arduinu nevešlo. Musel jsem dokonce i smazat bootloader.
I přes maximální snahu o optimalizaci kódu mi zbylo asi 200 bajtů volné FLASH paměti.
EEPROM jsem využil také téměř celou pro grafickou definici fontů a některých textů v menu (zbyly nevyužité 4 bajty z 1024).
Jen vnitřní 2kB RAM je docela v pohodě - tu využívám zhruba z poloviny.

 


Program pro PC

Pro PC jsem vytvořil VisualBasicovský program, který umí:
- stáhnout data z hodin (zaznamenané časy, naměřené hodnoty, nastavené alarmy, systémové proměnné)
- připravit alarmy (buď ručním zadáním do tabulky, nebo importem z .VCS souborů - "vCalendar files")
- přesně synchronizovat čas mezi hodinami a PC
- zjistit rozdíl v časech mezi PC a RTC obvodem v hodinách (s přesností na setiny sekundy)
- zpracovat stažená data do textových (.CSV) souborů - dále použitelných třeba v Excelu
- ručně upravovat systémové proměnné v hodinách 
      (kontrast displeje, komunikační rychlost, jemná kalibrace frekvence krystalu RTC obvodu, ...)
- odeslat připravené alarmy a systémové proměnné z PC do hodin

Ukázky záložek programu pro PC

Hlavní informační záložka s ovládáním komunikace a nastavením času. Záložka se zaznamenanými časovými vzorky. Záložka s nastavováním alarmů. Záložka s přístupem k naměřeným hodnotám teploty a dvou napěťových vstupů.


Elektronika

Základem je Arduino Nano, ke kterému je pomocí 6 digitálních pinů připojený modul displeje NOKIA 5110.
Další částí je RTC obvod M41T81M6, který komunikuje s Arduinem přes dva I2C piny.
Na stejné  I2C komunikační lince visí i teplotní čidlo LM92, které je vyvedeno přes konektor a kablík mimo krabičku.
Velice důležitá část je externí SRAM paměť 23lcv512 (64kB), ve které jsou uloženy všechny alarmy, záznamy časových okamžiků a naměřené hodnoty (teploty, napětí). Tato paměť komunikuje s Arduinem přes SPI (piny SS, SCK, MISO, MOSI).

Jako vstupní zařízení jsem použil joystick. Jeho výhoda je v tom, že potřebuje jen 2 analogové vstupy pro 4 směry a jeden digitální vstup pro potvrzovací tlačítko. 
Kvůli mechanickému uspořádání bylo výhodnější joystick o 180° pootočit. 
Takže analogová hodnota os X a Y se trochu nelogicky zvětšuje při naklonění vlevo, nebo dolu.

O zvuky se stará reproduktorek, který je spínaný přes běžný FET tranzistor.

Pro napájení je možné použít :
 1) USB konektor na Arduinu.
 2) Vnitřní 9V baterii (nebo akumulátor - to však vyžaduje ruční úpravu několika konstant v programu).
 3) Vnější zdroj 12V.

Původní varianta počítala s napájením pomocí NiMH AKUpacku 5x1,2V, který by mohl být dobíjen při připojení hodin ke 12V napájecímu zdroji. Jak se ale později ukázalo, 6V (snížených ještě o úbytek napětí 0,4V na ochranné diodě) nestačí k napájení Arduina přes Vin pin. Vnitřní 5V stabilizátor už v tom případě nemá dostatečné napětí na vstupu a kvůli tomu se snižuje i referenční napětí pro analogové vstupy.

Přímo na Arduinu jsem musel provést jednu úpravu, aby nedocházelo k resetu při komunikaci. Úprava spočívala v odstranění kondenzátoru mezi DTR pinem na USB převodníku a resetovacím pinem na procesoru ATmega328. 
  Popis (obráceným směrem) je tady: http://playground.arduino.cc/Learning/AutoResetRetrofit
    (... tady kondenzátor mezi DTR a RESET na starou desku přidávali, aby funkci, které jsem se já potřeboval zbavit, vytvořili.)

 

Celkové schéma:

 Verze pro Eagle: astrohodiny-eagle.zip 
     (Byly využity knihovny součástek od PaJa - DĚKUJI) 

 


Mechanika

První verzi hodin jsem splácal na univerzální desce. Pro SMD obvody jsem použil přechodky na DIL (RTC a SRAM jsou na společné přechodce). Pískák a jeho spínací FET je umístěný v prostoru  pod SMD přechodkou s RTC obvodem a pamětí.
Baterie je alkalická "devítivoltovka". Aby tam svým plechovým krytem něco nezkratovala, tak jsem jí obalil pěnovkou.
Protože je modul joysticku jen pár milimetrů nad hlavní deskou, odizoloval jsem ho pro jistotu prešpánem.

Na mechanické spoje jsem používal hlavně tavné lepidlo.
Joystick je přes 4 distanční sloupky přidělaný k hornímu víku krabičky a dva z těchto sloupků slouží zároveň k uchycení hlavní desky.

Později jsem univerzální desku zrušil a hodiny jsem předělal na normální plošný spoj.
Fotografie s novým plošným spojem jsou zde: astrohodiny-pcb.htm

Tady jsou nějaké fotky (stará verze na univerzální desce)

   

     

 

 


Software

Popis programů je zde : software.htm

 

 


úvodní strana webu AstroMiK.org

poslední úprava stránky 7.2.2015