Jak přesné jsou hodiny postavené z Arduina?

Tento článek vznikl na základě poměrně dlouhé teoretické rozpravy v diskuzním fóru Robodoupěte ve vlákně „Hodiny a časování“. Pro ty co vlákno nečetli, jen ve zkratce: diskutovalo se o konstrukci programu (hlavně podmínek) pro vytvoření hodin, o přesnosti vnitřního oscilátoru Arduina, respektive jeho keramického rezonátoru nebo krystalu a celkově o vhodnosti použití vnitřního časovače Arduina pro konstrukci hodin. Protože z teoretické rozpravy nevzešel žádný použitelný závěr, rozhodl jsem se uskutečnit praktický pokus, který by měl celý problém objasnit.

Zadání pokusu:

Pro pokus bylo nejprve nutné napsat jednoduchý program pro hodiny odvozené z vnitřního časovače Arduina. Hodiny mají klasický formát (hh:mm:ss) a pro zobrazení se používá LCD displej. Jako standard pro porovnání odchylky byly použity hodiny řízené DCF vysilačem.

K pokusu bylo použito pět Arduin, zakoupených postupně na různých internetových obchodních portálech (aby měření postihovalo různé šarže výroby). Dvě Arduina měla LCD displej připojený paralelně a tři sériově; to jen na okraj.

Průběžný čas všech hodin byl odečítán z jedné fotografie, která se pořizovala vždy ve stejnou dobu a na níž byl zachycen čas, zobrazený na displejích všech Arduin zároveň s displejem kontrolních hodin, řízených DCF vysílačem.

Výsledky experimentu byly následně zpracovány v Excelu.

Aby se předešlo možným nepřesnostem, vneseným do experimentu napájením a výpadkům sítě, všechna Arduina byla napájena přes pin 5 V (nikoliv VIN) z jednoho pulzního zdroje 5 V. Zdrojem pro něj byl 12 V akumulátor solárního systému.

Cílem pokusu bylo zjištění přesnosti takto vytvořených hodin jednotlivých Arduin a určení jejich odchylky. Z výsledků je možno přímo zjistit rozptyl a směrodatnou odchylku rozdílů času po jednotlivých dnech experimentu. Nepřímo pak je možno odhadnout tepelnou závislost komponent, respektive zjistit, zda se nějaká takováto závislost v průběhu experimentu projevila.

Vlastní pokus

K pokusu bylo vybráno pět Arduin, očíslovaných A1 až  A5. Frekvence oscilátoru byla měřena osciloskopem OWON PDS5022

  • A1: Arduino s keramickým rezonátorem, označený písmeny Al. Frekvence rezonátoru: 15,93 MHz.
  • A2: Mega 2560 s keramickým rezonátorem, označený písmeny Ae. Frekvence rezonátoru: 15,86 MHz.
  • A3: Arduino Nano s keramickým rezonátorem, označeným písmeny Af. Frekvence rezonátoru: 15,94 MHz.
  • A4: Arduino Nano s krystalem. Frekvence krystalu: přesně 16 MHz.
  • A5: Iduino Nano s keramickým rezonátorem, označeným písmeny Ae. Frekvence rezonátoru: 15,9 MHz.

01První dvě Arduina měla displej napojen paralelně, další tři sériově. Toto připojení, ač jsem si to nejprve neuvědomil, mělo vliv na přesnost experimentu. Nebylo to však dáno vlastními hodinami, běžícími v Arduinu, ale zobrazením. Tato „chyba“ se projevila hned na začátku měření, kdy se mi podařilo vyfotografovat všechny displeje ve druhé sekundě, ale dvojka byla zobrazena pouze u prvních dvou displejů. Vzhledem k delší odezvě sériového rozhraní byla na ostatních třech zobrazena stále ještě jednička (zapojení neumožňovalo zpoždění ve spuštění časovačů Arduin). Pokus tedy měl díky těmto rozdílům v rozhraní nepřesnost 1 s, protože nebylo možno zajistit, aby fotografie vznikla vždy přesně v polovině sekundy, kdy už jsou na obou typech displejů zobrazeny správné hodnoty.

02Výsledek experimentu:

Arduino 14 denní test času A1

Nano

A2

Mega

A3

Nano

A4

Nano (krystal)

A5

Nano (Iduino)

kmitočet oscilátoru

[MHz]

15,93 15,86 15,94 16 15,9
odchylka po 14 dnech

[s]

-496

 (8m16s)

-8596

(2h 23m 16s)

141 423

(7m 3s)

-2972

(49m 32s)

průměrná denní odchylka

[s]

35,3 614 10,3 30,3 212,1
rozptyl denních průměrů

[s]

3,3 4,9 0,8 5,9 2,7
sm. odch. denních průměrů

[s]

1,8 2,2 0,9 2,4 1,6

Arduina byla ponechána v činnosti nepřetržitě čtrnáct dní. Po tu dobu byl vždy ve stanoveném čase proveden kontrolní odečet. Potom byl pokus ukončen a výsledky jsou uvedeny v následující tabulce a grafech níže.

Závěr

Celý pokus probíhal v pracovně, kde nepravidelně kolísala teplota v rozmezí 15 až 20° C. Korelace kolísání teploty s denními časovými odchylkami nebyla zjištěna, což však neznamená, že by Arduina nebyla na teplotu citlivá, jen že při této teplotní změně zřejmě závislost neměla takový vliv, aby byla v měření zaznamenána. Jak už bylo uvedeno výše, pokus byl prováděn se sériovým i paralelním připojením LCD, což mělo za následek u sériového zobrazení zpožděný zápis času na displej a tedy nejistotou 1 sekundy při odečítání výsledků.

Navzdory předpokladům se ukázalo, že vnitřní časovač Arduina je velmi přesný. Každé Arduino mělo sice jinou odchylku od standardního času (předcházení nebo zpomalování), avšak přírůstky těchto odchylek byly každý den téměř konstantní. V grafech nazvaných „časové odchylky“ jsou černou křivkou znázorněny rozdíly standardního času a času Arduina. Linearitu odchylky každého Arduina ukazují proložená lineární spojnice trendu (žlutě).

Nepřesnost oscilátoru popisuje druhý graf „jednotlivých denních odchylek“. Jednotlivými denními odchylkami je myšlen každodenní přírůstek chyby času jednotlivých Arduin. Zde je patrné, že rozdíly v denních přírůstcích chyby byly, avšak i u nejhoršího kusu se jednalo o jednotky sekund a vzhledem k tomu, že odečítání bylo zatíženo sekundovou nejistotou, byl to velmi dobrý výsledek. Navíc je z grafů patrné, že při proložení těchto odchylek spojnicí trendu, jsou chyby času po čtrnácti dnech jen v jednotkách sekund, u nejlepšího kusu (A3) se jednalo o 1 s, tedy jen o nejistotu měření.

Z pokusu tedy vyplývá, že vhodná korekce hodin na průměrnou odchylku by chybu času mohla velmi dobře odstranit a Arduino by se při dobré korekci mohlo použít jako hodiny s chybou do 10 s za měsíc.

Odchylky jsou patrné i v naměřené frekvenci rezonátoru. Korelace mezi kmitočtem oscilátoru a časem je v tabulce zjevná. Jako nejvhodnější kmitočet oscilátoru pro Arduino určené k měření času se ukazuje frekvence 15,94 MHz.

Navzdory předpokladům se neprojevila vyšší přesnost krystalu, i když ten měl vždy přesně 16 MHz (ověřeno i u dalšího kusu, který se neúčastnil pokusu), jeho rozptyl denních odchylek nebyl zrovna ideální a keramické rezonátory s ním byly zcela srovnatelné, ba i lepší.

Zdrojový kód použitého programu