Hodiny z pekla

Tchýně přijela na návštěvu a vypadá to, že neplánuje odjet? Zlobivý mladší sourozenec? Zbytečně dobré pracovní prostředí? Problém dokážeme snadno vyřešit s Arduinem!

Spousta lidí si stěžuje, že nemůže spát, když v místnosti tikají hodiny. Ale časem si stejně zvyknou. Co takhle to trochu vylepšit a udělat hodiny, které tikají nestandardně? Deset minut jdou běžným způsobem, pak se na půl minuty zastaví a následně zpoždění doženou… a pak zase čtvrt hodiny běží normálně. Tohle je daleko více obtěžující, než běžné tikání! A přitom ty hodiny jdou přesně – v každou chvíli je odchylka od aktuálního času menší než dvě minuty.

Tedy postavte si takovéhle super hodiny, nainstalujte je do místnosti, kde spí nechtěná návštěva, a pak už se jen kochejte výsledkem.

Dost textu, teď krátké video. Nestandardní chování je tady hodně zhuštěno – pro dokonalý výsledek je lepší, když se „divné“ věci dějí jen občas, řekněme po deseti či více minutách. Ale to by to video bylo nudné.

 

Jak na to?

Když otevřete kterékoli nejlevnější ručičkové hodiny, najdete v nich něco velmi podobného tomuto:

2017-05-14 13.06.17

Dole je slot na AA baterku. Vlevo nad ním je kompletní elektronika – krystal kmitající nejčastěji na 32768 Hz a dělička. Nahoře je elektromagnet – srdce celých hodin. Nahrazuje kyvadlo či pružinu a nepokoj – jednou za sekundu sepne a přitáhne jádro zleva doprava resp. zprava doleva. Dole pod ním je sada ozubených koleček, která kmitání převádějí na pohyb ručiček hodin.

Úprava hodin je jednoduchá – odstřihneme vodiče vedoucí od děličky  do elektromagnetu (zde na fotce už jsou odstřižené) a budeme ho řídit z Arduina.

Vzhledem k tomu, že hodiny musí fungovat na jednu AA baterii dost dlouho, elektromagnet nepotřebuje mnoho proudu. Konkrétně v mých hodinách jsem naměřil, že při napájení 1.5 V teče cívkou magnetu 5 mA.  Je tedy možné ho budit přímo piny Arduina, bez tranzistorů či jiných spínacích prvků.

Potřebujeme do cívky pouštět proud každou sekundu opačně (jednou „zleva doprava“, podruhé „zprava doleva“). Není tedy možné spínat cívku proti fixnímu napětí – musíme ji zapojit mezi dva výstupní piny Arduina. A vzhledem k tomu, že je cívka konstruovaná na napětí 1.5 V, a Arduino pracuje s výstupní úrovní v řádu 5 V, je potřeba přidat rezistor – hrubým odhadem jsem tam dal 380 ohm a funguje to.

Kompletní schema je tedy zde:

2017-06-18 10.34.19

Kdo více rozumí elektronice, teď nepochybně zařve „Ne! Takhle to nejde! Na cívce se při sepnutí a rozepnutí naindukuje napětí, které Arduino poškodí! Musí tam být ochranné diody!„. Nemusí. Kouknete-li do datasheetu, v kapitole „13.1 I/O-Ports – Overview“ najdete větu „All I/O pins have protection diodes to both VCC and Ground as indicated in Figure 13-1.“ a v obrázku 13-1 je to zcela jednoznačně nakresleno – ochranné diody jsou přímo součástí mikrokontroléru.

Tím je hardwarová část hotová. Aby hodiny začaly tikat, stačí opakovat následující cyklus:

  1. Tikneme „zleva doprava“:
    1. D2 = HIGH, D4 = LOW (proud teče jedním směrem). Počkat cca 30 msec.
    2. D2 = HIGH, D4 = HIGH (proud neteče).
  2. Počkáme skoro sekundu (1000 msec – 30 msec = 970 msec).
  3. Tikneme „zprava doleva“:
    1. D2 = LOW, D4 = HIGH (proud teče druhým směrem). Počkat cca 30 msec.
    2. D2 = HIGH, D4 = HIGH (proud neteče).
  4. Počkáme skoro sekundu (1000 msec – 30 msec = 970 msec).

Tedy, takto to stačí, pokud chcete, aby hodiny tikaly pravidelně. Pokud mají tikat nepravidelně, pak to znamená tam přidat trochu náhodných čísel a tak dále.

Fungující aplikaci najdete ke stažení zde.

Nabízí dva „divné“ režimy:

  1. Hodiny se na náhodný čas zastaví … a pak zpoždění nějakou dobu dohánějí.
  2. Hodiny náhodný čas tikají pomaleji … a pak zpoždění nějakou dobu dohánějí.

Každý „divný“ režim trvá náhodný čas mezi cca 20 a 80 sekund.

Na řádku

int coDelat = random(1, 4);

ve funkci loop() se nastavuje, jak často se budou dít „divné“ věci. Pokud padne náhodné číslo 1, hodiny se zpomalí a pak zrychlí; pokud padne 2, hodiny se na chvíli zaseknou; pro vyšší čísla běží normálně.

Nejlepší výsledek mi přijde při random(1,18); pak dochází k divným věcem zhruba jednou za deset minut.

Funkce kompenzuj() dolaďuje běh hodin tak, aby v globálním pohledu šly stále správně. Je závislá na přesnosti interních hodin vašeho Arduina. Pokud je denní odchylka větší než dvě minuty, lze hodiny poladit změnou řádku

long realnychSec = millis() / 1000L;

ve funkci porovnejCas(). Pokud zde místo 1000L dáte nižší číslo, hodiny se zrychlí – změna o jednotku znamená cca minutu a půl za den. Pokud dáte číslo vyšší, hodiny se stejným způsobem zpomalí.

Pak už stačí jen Arduino a vhodný napájecí zdroj vestavět do plastu hodin …

2017-05-18 19.08.32

a je hotovo a je možno hodiny pověsit na zeď.

Na malou powerbanku 2400 mAh mi hodiny fungují cca 32 hodin. Správu napájení Arduina jsem neřešil. Kdyby bylo potřeba dosáhnout větší výdrže, pak je samozřejmě možné použít samostatný mikrokontrolér a místo delay() procesor uspávat.

 

Reklamy

Napsat komentář

Filed under Mikrokontroléry - Arduino, ESP8266, Picaxe, ..., Počítače, vývoj HW a SW

Zanechat odpověď

Vyplňte detaily níže nebo klikněte na ikonu pro přihlášení:

WordPress.com Logo

Komentujete pomocí vašeho WordPress.com účtu. Odhlásit /  Změnit )

Google+ photo

Komentujete pomocí vašeho Google+ účtu. Odhlásit /  Změnit )

Twitter picture

Komentujete pomocí vašeho Twitter účtu. Odhlásit /  Změnit )

Facebook photo

Komentujete pomocí vašeho Facebook účtu. Odhlásit /  Změnit )

Připojování k %s