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

23.02.2014 15:48

Translate to English

    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 conventory", 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řejmně 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í.    

 

Zpět

Diskusní téma: Lekce 27 - Adruino a napájení z baterie aneb jak uspat Arduino

Datum
Vložil
Titulek

A zaroven

Neni nahodou "a zaroven" &&?

Datum
Vložil
Titulek

nekdo z nas spatne pocita :o)

jestli se nepletu, tak 0,38 mA (samotny mikroprocesor) je vice nez 0,20 mA (Arduino) , takze tam v tech cislech mate asi trochu neporadek. "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"

Kazopadne super clanek za ktery dik.

Datum
Vložil
Titulek

Re: nekdo z nas spatne pocita :o)

beru zpet. unikla mi desetinna carka

Datum
Vložil
Titulek

ujetý čas

Zdravím,
nastavil jsem počet cyklů na 4500 což je deset hodin,takže by se měl co deset hodin spustit kód.Jenže čas byl ujetý o víc jak 30min na 10 a půl h.Zkoušel jsem i na kratší na půl hodině už o 3 min.Zkoušeno na Arduino Nano klon.VČEM JE PROBLÉM?

Datum
Vložil
Titulek

Re: ujetý čas

Problém je v tom, že watchdog časovač prostě nemá takovou přesnost. Není to ostatně ani jeho úkol pracovat přesně. Také je otázka, jak máš napsaný kód, protože pokud tvůj kód bude trvat 100ms a pak až uspíš mikroprocesor, tak je to za deset hodin chyba už 45 minut. Pro práci s delším časem použij nějaký RTC (Real Time Clock) modul. Hodně se používá modul s obvodem DS1307, ale ten není moc přesný. V dnešní době je dobrá volba modul s obvodem DS3231, který je mnohem přesnější. Z něj udělané hodiny už se nechají i prakticky použít ;-)

Datum
Vložil
Titulek

Re: Re: ujetý čas

Tých 8 s je v skutočnosti 8192 ms ...

Datum
Vložil
Titulek

Re: Re: ujetý čas

A jak by pak vypadal kod? Nejak jsem v tom zamotanej... poradite? Diky

Datum
Vložil
Titulek

asi mala chybicka

našel jsem v kódu malinkou chybičku, která ale za bežné situace nemá vliv na ěh programu, ale přeci jen:

86. citac_impulsu = 0;// vynuluj čítač
87. impuls_z_wdt = 0; // vynuluj impuls
88. enterSleep();// znovu do spánku
89. }
90. else
91. {
92. enterSleep();//znovu do spánku
93. }

myslím si , že mezi řádky 91 a 92 by mělo byt opět toto nulování:
impuls_z_wdt = 0; // vynuluj impuls

Datum
Vložil
Titulek

Napájení

Dobrý den,
proč nelze arduino napájet jak pomocí USB a adaptéru na nabiječce? Viz zde: http://tronixino.wordpress.com/2012/02/04/use-samsung-galaxy-nexus-power-adapter-as-power-source-for-arduino/

Děkuji

Datum
Vložil
Titulek

Re: Napájení

ide to ale nierkedy chces byt mobilny tak musis pouzit baterie

1 | 2 >>

Vyhledávání

arduino8.cz © 2015 Všechna práva vyhrazena.