Arduino
Hodiny pro astronomická pozorování
Ú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.
- 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
|