Lekce 27 – Adruino a napájení z baterie aneb jak uspat Arduino

    Po několika dotazech ohledně napájení Arduina z baterie, kde se stále řeší její životnost, jsem se rozhodl uveřejnit tento návod jak se postarat, aby napájení z přenosných zdrojů vydrželo co nejdéle.

    Jak si sami můžete ověřit, samotné Arduino UNO má po zapnutí odběr ze zdroje asi 20mA (bude se lišit podle typu  a kvalitě použití součástek). Při použití napájení z 9V baterie, která má kapacitu cca 500 až 600 mAh se dostaneme k času do jejího vybití okolo 30 hodin a to počítám ideální stav, kdy k Arduino nejsou připojeny další součástky, čidla, displeje apod. Musíme také počítat s tím, že stabilizátor na základové desce, aby snížil napětí na 5V toto přemění na tepelnou energii a to při napájení z baterie není ideální stav. Další možností jsou tzv. “step-down convertory”, kde jejich účinnost je okolo 80%, ale touto cestou se dnes ubírat nebudeme.

Řešením pro nás bude Arduino uspat. Podobně jako u stolního počítače to bude obdobné, kdy se uloží do režimu spánku, tak my uspíme mikroprocesor. Tato funkce se samozřejmě nehodí na vše co budeme tvořit, ale je ideální volbou pro zařízení, které bude v nějakém intervalu získávat data z nějakého čidla a ty poté buď někam odesílat, indikovat nebo ukládat.

Pro uspání Arduina zavoláme funkci sleep_mode();, která je obsažena v knihovně avr/sleep.h. Tuto nemusíte odněkud stahovat je součástí Arduino IDE. Protože režimů, ve kterých Arduino může spát je několik, nastavíme si zvolený režim voláním uspání pomocí funkce:

set_sleep_mode(mode);

Já přikládám tabulku všech dostupných módů:

mode
SLEEP_MODE_IDLE nejméne úsporný
SLEEP_MODE_ADC
SLEEP_MODE_PWR_SAVE
SLEEP_MODE_STANBY
SLEEP_MODE_PWR_DOWN nejúspornější

Další potřebný příkaz je sleep_enable();, který zajistí, že přechod do režimu spánku bude dostupný. No tak Arduino už umíme uspat, ale jak ho probudit. Na výběr máme několik možností.

  1. Pomocí externího přerušení. Vysvětlovali jsme si v lekci 21. Arduino se probudí a bude pokračovat v činnosti při nastaveném přerušení pomocí příkazu attachInterrupt(přerušení, funkce, mód); Vhodné to bude například kdy uživatel stiskne nějaké tlačítko apod. 
  2. Pomocí příchozí komunikace na sériovém portu. Serial UART
  3. Pomocí vnitřního časovače. INTERNAL TIMER
  4. Pomocí WATCHDOG TIMER
     Vzhledem k tomu, že se dnes budeme zajímat o ten nejúspornější režim vzhledem k tomu, že se budeme snažit při napájení z baterie o co největší úsporu a to SLEEP_MODE_POWER_DOWN. Musím se zmínit také, že při tomto režimu nejsou všechny možnosti probuzení možné. Například INTERNAL WATCH (vnitřní časovač) Arduino neprobudí. Jak jsme si řekli zaměříme se na zařízení, které bude v nastavený časový interval něco dělat. Zbývá nám tedy použít WATCHDOG TIMER. Druh zařízení, které bude plně automatizovaná, bez nějaké obsluhy a na baterie nechceme obsluhovat pomocí tlačítka, které by jej vzbudilo a ani příchozí komunikace na sériové lince nepřipadá v úvahu. Pokud by jsme k němu vedli kabel se sériovou komunikací, už potom není problém přidat napájecí vodič. Toto nebude náš případ.
Uvedu tedy celý funkční kód i s komentáři:

     Celý kód není nějak složitý. Jako novinka je tam použití WATCHDOG TIMERU. Výsledou dobu intervalu si nastavíme v proměnné “impulsu_ke_spusteni”. Watchdog timer je nastaven na maximální možnou dobu 8 sekund. Arduino necháme každý interval 8 sekund probudit aby spočítal počet intervalů a buď provedl to co chceme nebo šel “zase rychle spát. Při probuzení na počítání se samozřejmě zvýší proud, ale je to pouze na malinký okamžik a to řádově milisekund. Můžete sami změřit. V kódu pro ukázku se testovací kód, kdy se rozsvítí LED dioda na pinu 13 a po 3 vteřinách zase zhasne a Arduino spí. Počet nastavených cyklů ke spuštění se rovná 2, tzn. že program se spustí každých 16 sekund. Pro praktické použití počet intervalů nastavíme na vetší hodnotu, aby se program vykonával třeba každou hodinu. Musíme vzít také v potaz, že když impuls dává watchdog timer pokaždé po 16 vteřinách bez ohledu na délku vykonávaného programu. Bude trvat našemu kódu nějaká práce 10 vteřin, Arduino bude spát pouze zbývajících 6.
     Tak k tomuto kódu externích součástek netřeba. Integrovaná LED dioda na Arduinu UNO by se měla rozsvítit každých 16 sekund na 3 vteřiny. Teď si provedeme měření skutečné spotřeby. Já jsem si pro tento případ upravil USB kabel, který k Arduinu připojím přes multimetr. Z USB kabelu mám již stabilizovaných 5V. Z měření ale zjistím, že v režimu spánku má Arduino odběr cca 20mA a při probuzení 30mA :-o. Nesmíme zapomínat, že na desce Arduina je stabilizátor, je tam převodník USB — seriálový port. Co s tím? NO, když si něco budeme praktického stavět, tak tam přeci nemusíme nechat celou desku Arduina a samotný mikroprocesor si zapojíme bez toho. V lekci Arduino bez Arduina jsme si již ukazovali, že to není vůbec složité. Stačil z Arduina UNO vyjmout mikroprocesor, přidat 16Mhz krystal, dva kondenzátory a jeden odpor. To je jeho základní zapojení. Pro naší indikaci, aby jsme věděli že Arduino nespí a využili jsme ukázkový kód připojíme ještě Led diodu na pin 13 přes adekvátní odpor.
    Sami již při měření vidíte rozdíl. Arduino (tedy vlastně pouze mikroprocesor) odebírá v režimu spánku 0,38 mA (nevím zda při použití mého multimetru bude měření přesné). Po probuzení a rozsvícení LED diody je to něco málo přes 19mA. Úspora to tedy pro baterii bude značná. Nepočítáme-li krátkou spotřebu při probuzení je doba výdrže 50x větší. Operace, které budou probíhat nemusí být 3 vteřiny, ale dostaneme si určitě při praktickém použití na velice krátký časový úsek.
     Já jsem si na zkoušku také zkusil připojit malý Li-ion knoflíkový článek LIR2032. Má napětí 3,6V a jak víme ATMEGA328 má pracovní napětí od 1,8V do 5,5V. Spotřeba byla při probuzení 10mA a po uspání shodná 0,3mA. Článek má kapacitu 35 až 40 mA. Bez uspání by článek pracoval 3,5 až 4 hodiny a při použití režimu spánku okolo 4 dní.

 

Napsat komentář

Translate »