Kategória: Elektro návody

Zmenené: 30. september 2016

Arduino na baterky

Už dlhšie sa pohrávam s myšlienkou napájania senzora z batérie. Zvažoval som použiť ATtiny85, ale rozhodol som sa urobiť experiment so spotrebou Arduina, konkrétne Arduino Pro Mini 3,3 V/8 MHz. V článku predstavím výsledky svojho experimentu s jeho spotrebou.

Ako som spomenul, najprv som uvažoval nad ATtiny85. ATtiny85 je krásny a maličký mikroprocesor, ktorého spotreba môže v režime spánku (režim Power Down) dosiahnuť dokonca menej ako 1 µA (neskúšal som). Kúpil som si vývojovú dosku, ale to bol zlý nápad, pretože kvôli zenerovým diódam (na dáta USB) bola spotreba viac ako 2 mA, čo je na dlhodobý beh na batérie jednoducho veľa. Samozrejme, môžem použiť tento mini mikroprocesor bez USB, ale zaujímalo ma, či môžem niečo podobné dosiahnuť s doskou Arduino, ale hlavne potrebujem nejakú spätnú väzbu, pretože môj zamýšľaný senzor vyžaduje určité experimentovanie ana to je Arduino ako stvorené.

Moja voľba, samozrejme, padla na dosku Mini Pro, a to najmä pretože nemá zabudovaný prevodník USB/UART, ktorý síce prináša veľa pohodlia pri programovaní a ladení programu, zato sa však stáva zbytočným spotrebičom pri samotnom behu, pokiaľ neplánujete pripojenie USB (lenže to by som zase nepotreboval napájanie z batérií). Tieto dosky sú u Číňanov k dispozícii za necelé 2 € a je ich v obehu viacero verzií. Hlavným rozdielom týchto verzií je počet a umiestnenie vývodov, s čím súvisí aj rozloženie súčiastok na plošnom spoji. Ja som zvolil verziu s vývodmi A4 A5 mimo mriežku a vývodmi A6 a A7 na kratšej strane (oproti konektoru UART)

Hlavne som však zvolil verziu 3,3 V s frekvenciou 8 MHz. Prečo to je dôležité? Spotreba všetky mikroprocesorov AVR (ktorých dokumentáciu som čítal) udáva, že spotreba klesá s napájacím napätím a frekvenciou, takže rovnaká doska bežiaca na 5 V s rovnakou frekvenciou bude mať spotrebu vyššiu, pri vyššej frekvencii ešte vyššiu. A spotreba je to, o čo mi ide. Predstavu o závislosti spotreby na frekvencii si môžete urobiť napr. z článku Arduino’s ATMega328 Power Consumption alebo Arduino Low Power - How To Run ATmega328P For a Year On Coin Cell Battery.

Príprava

Aby som mohol uvažovať o úspore spotreby je nutné urobiť dve úpravy:

  • odpojiť/odstrániť LED indikácie napájania
  • odpojiť/odstrániť regulátor napätia

Prvý bod je asi jasný, tento indikátor pripojeného napájania má spotrebu asi 1,5 mA a mojim cieľom je dostať sa hlboko pod 1 mA, čo by s touto LED nešlo. Druhý bod je trochu diskutabilný. Vďaka tomuto regulátoru je možné dosku napájať širokým rozsahom napätia (cca 5 – 15 V), lenže tento regulátor má tiež svoju spotrebu. Otázkou ostáva, či sa táto spotreba prejaví aj pri priamom napájaní 3,3 V, ale neskúšal som to a jednoducho som ho odstránil, najmä na základe informácií z článku Arduino Low Power - How To Run ATmega328P For a Year On Coin Cell Battery.

V tomto článku autor použil deštruktívnu metódu – prerušil spoj k LED (s detailnými obrázkami), ja som použil menej deštruktívnu metódu – LED i regulátor som odspájkoval (presnejšie, odspájkoval mi ich kamarát, ja na to už nevidím). Prázdne miesta po LED a regulátore ukazuje obrázok:

odstránené LED a regulátor

Ak podrobne porovnáte tento môj obrázok s tými jeho, uvidíte klasický problém čínskych klonov. Tým problémom je, že čínske klony používajú mierne odlišné rozloženie súčiastok a dokumentácii sa nedopátrate (aspoň mne sa to nepodarilo), a tak prerušenie spoja vlastne ani neprichádza do úvahy, pretože netuším čo všetko by som odpojil…

Poznámka

Mimochodom, novšie originálne verzie Arduino Pro Mini majú na doske prepojku, ktorú stačí rozpojiť a tým odpojíte regulátor, ale na čínskych táto prepojka nie je, a to som strávil veľa času preklikávaním jednotlivých ponúk a detailným skúmaním obrázkov.

Pripojenie USB

Pripojenie prevodníka USB/UART nie je predmetom tohoto člálnku, ale kvôli úplnosti tu uvediem ako na to, pretože predpokladám, že mnohí ešte túto dosku nepoužili.

Ako prvú vec je treba prevodník USB/UART, v čínskych obchodoch je ich kopa za 2 – 3 €. Ak chcete cez neho aj pohodlne nahrávať program, poobzerajte sa po takom, ktorý ma vyvedený signál DTR, sú to prevodníky s FT232 a CP2102. Mám oba, ale použil som prevodník s CP2102 (pretože tie s FT232 sú aj tak falzifikáty a vo Windows s nimi bude viac práce ako úžitku. Dôležité (v tomto prípade) je aj to, aby poskytoval možnosť napájania 3,3 V, čo poskytujú oba, hoc každý iným spôsobom.

Zapojenie je prosté:

FT232           Arduino     CP2102          Arduino

----+           +----       ----+           +----
    |           |               |           |
DTR |---------->| DTR       DTR |---------->| DTR
    |           |               |           |
Rx  |---------->| Tx0       Rx  |---------->| Tx0
    |           |               |           |
Tx  |<----------| Rx1       Tx  |<----------| Rx1
    |           |               |           |
5V  |---------->| VCC       5V  |---------->| VCC
    |           |               |           |
CTS |           | GND       GND |<--------->| GND
    |           |               |           |
GND |<--------->| GND       3V3 |           | GND
    |           |               |           |
----+           +----       ----+           +----

V prípade, že máte prevodník, ktorý nemá vyvedený signál DTR, môžete ho pokojne použiť tiež, ale pri programovaní je potrebné ručne reštartovať mikroprocesor tlačidlom (nikdy som to neskúšal):

USB/UART        Arduino

----+           +----
    |           |
3V3 |---------->| VCC
    |           |
Tx  |---------->| Rx
    |           |
Rx  |<----------| Tx
    |           |
GND |<--------->| GND
    |           |
----+           +----

Všimnite si, že v oboch prípadoch sú Vývody Tx a Rx prekrížené, tzn. Tx prevodníka je pripojený k Rx dosky a naopak.

Poznámka

S tou dôležitosťou 3,3 V to nei je až také horúce. ATmega328P (ktorý je mozgom tejto dosky) zvládne 5 V bez problémov a regulátor je odpojený, ak však je k doske pripojené nejaké výslovne 3,3V zariadenie, tak môže nastať problém.

Po pripojení treba vyskúšať funkčnosť, v prípade problémov znova skontrolovať zapojenie. A hlavne, pozor na merací prístroj – ten môj ((UNI-T 139B) nerobil problém pri rozsahu mA, ale pri rozsahu µA už nebolo možné dosku naprogramovať…

Režim spánku

Ako prvé ma zaujímalo, či nameriam rovnaké hodnoty ako v uvedených článkoch – spomínal som, že s ATtiny som sa hodnotám z dokumentácie ani len nepriblížil (kvôli zapojeniu zvyšku vývojovej dosky). Nebudem napínať, s Arduino Pro Mini som nameral veľmi podobné výsledky, čo ma upokojilo: pretože to znamená, že čínska doska je tiež použiteľná.

Ale pekne po poriadku. N tento experiment som použil skoro prázdny program, ktorý len blikol zabudovanou LED a prepol mikroprocesor do režimu Power Down – tzn. do najhlbšieho spánku s najnižšou spotrebou, aké ATmega328P dokáže ponúknuť. Použil som na to knižnicu Low-Power a uspával som mikroprocesor na 8 sekúnd, aby môj merací prístroj stihol stabilizovať nameranú hodnotu. Pretože metóda na uspanie mikroprocesora poskytuje možnosť nechať zapnuté/vypnúť ADC (analógovo-digitálny prevodník) a BOD (detekcia poklesu napätia), použil som všetky štyri možnosti, aby som zistil, či a aký majú vplyv na spotrebu počas spánku.

Samotný program je naozaj jednoduchý, blikne LED, aby som vizuálne zaregistroval prechod a uspí mikroprocesor:

#include "LowPower.h"

const byte LEDpin = 13;         // číslo vývodu LED

void setup()
{
    pinMode(LEDpin, OUTPUT);
}

void loop()
{
    // spať 8 s, ADC aj BOD zapnuté
    blik();
    LowPower.powerDown(SLEEP_8S, ADC_ON, BOD_ON);

    // spať 8 s, ADC zapnuté a BOD vypnuté
    blik();
    LowPower.powerDown(SLEEP_8S, ADC_ON, BOD_OFF);

    // spať 8 s, ADC vypnuté a BOD zapnuté
    blik();
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_ON);

    // spať 8 s, ADC aj BOD vypnuté
    blik();
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
}


void blik()
{
    digitalWrite(LEDpin, HIGH);
    delay(100);
    digitalWrite(LEDpin, LOW);
}

To čo som nameral ma jednak potešilo, ale hlavne mi potvrdilo, že vypínanie ako ADC, tak i BOD je potrebné na dosiahnutie naozaj minimálnej spotreby:

Arduino Pro Mini
Stav ADC BOD Spotreba
[µA]
PWRdown ano ano 116,9
PWRdown ano nie 110,2
PWRdown nie ano 23,3
PWRdown nie nie 4,3

V tabuľke vidno, že režim Power Down s vypnutými ADC i BOD má výsledok v spotreby púhych 4,3 µA, alebo 0,0043 mA. Táto hodnota korešponduje s hodnotami nameranými inými ľuďmi (na originál doskách), a tak je tento čínsky klon vhodný na prácu na baterky!

Výsledok by sa dal ešte mierne vylepšiť, keby som namiesto WDT (časovač WatchDog) použil zobúdzanie externým obvodom, ale pridávať len kvôli tomu externý časovač môže v konečnom dôsledku spotrebu zvýšiť, samozrejme pokiaľ tento obvod nie je na činnosť zariadenia i tak nutný.

Vypínanie obvodov

Výsledok prvého experimentu so spotrebou počas spánku ma potešil a povzbudil do pokusov so znižovaním spotreby za behu. Ono totiž väčšina procesorov (zase, ktorých dokumentáciu som čítal) poskytuje možnosť vypínania jednotlivých súčastí mikroprocesora – ktorých súčastí, to závisí od konkrétneho typu. V prípade ATmega328P sa jedná o:

  • komunikačné moduly – SPI, IIC (TWI) a UART
  • moduly časovačov – Timer0, Timer1 i Timer2
  • modul ADC

Samozrejme, tieto funkcie nie sú súčasťou knižnice Arduino a na ich využitie treba pozrieť do štandardnej knižnice AVR Libc, konkrétne do hlavičkového súboru avr/power.h: Power Reduction Management.

Rada

Pretože som vypínal aj časovač timer0, ktorý Arduino používa na čakacie slučky (delay()), musel som použiť čakaciu slučku z AVR LibC (util/delay.h: Convenience functions for busy-wait delay loops), tá však podporuje max. 6,5 sekundy.

Program vyzerá trochu zložitejšie, ale je to len zdanie. Vo svojej podstate dookola bliká LED a pri každom blikaní vypína/zapína nejaké tie zariadenia. Pôvodne som chcel otestovať jednotlivé zariadenia samostatne, no nakoniec samostatne zapínam/vypínam len ADC a všetky ostatné vypínam/zapínam naraz:

#include <avr/power.h>

#define F_CPU 8000000UL             // 8 MHz
#include <util/delay.h>

const byte LEDpin = 13;

void setup() {
    pinMode(LEDpin, OUTPUT);

    // power settings
}

void loop() {

    for (byte i=0; i<10; i++)
    {
        digitalWrite(LEDpin, HIGH);
        _delay_ms(100);
        digitalWrite(LEDpin, LOW);
        _delay_ms(100);
    }

    powerOn();

    // ADC on
    ADCSRA |= _BV(ADEN);            // enable ADC
    power_adc_enable();
    blink();

    // ADC off
    ADCSRA &= ~(_BV(ADEN));         // disable ADC
    power_adc_disable();
    blink();

    powerOff();

    // ADC on
    ADCSRA |= _BV(ADEN);            // enable ADC
    power_adc_enable();
    blink();

    // ADC off
    ADCSRA &= ~(_BV(ADEN));         // disable ADC
    power_adc_disable();
    blink();
}

void powerOff()
{
    power_spi_disable();
    power_twi_disable();
    power_usart0_disable();

    power_timer0_disable();
    power_timer1_disable();
    power_timer2_disable();
}

void powerOn()
{
    power_spi_enable();
    power_twi_enable();
    power_usart0_enable();

    power_timer0_enable();
    power_timer1_enable();
    power_timer2_enable();
}

void blink()
{
    digitalWrite(LEDpin, HIGH);
    _delay_ms(4000);
    _delay_ms(4000);
    digitalWrite(LEDpin, LOW);
    _delay_ms(4000);
    _delay_ms(4000);
}

Jadrom sú funkcie powerOn() a powerOff(), ktoré jednoducho zapínajú/vypínajú moduly (v poradí):

  1. SPI
  2. IIC (TWI)
  3. UART
  4. časovač 0
  5. časovač 1
  6. časovač 2

Poznámka

Tá zabudovaná LED mi tu imituje ďalšie obvody, ktorých predpokladaná spotreba je práve na úrovni tejto LED.

Výsledky sú zaujímavé:

Arduino Pro Mini 3,3 V/8 MHz
Stav ADC Ostatné On
[mA]
Ostatné Off
[mA]
LED On ano 4,9 4,5
LED On nie 4,8 4,4
LED Off ano 3,5 3,1
LED Off nie 3,4 3,0

V tabuľke sú vľavo uvedené spotreby pri rozsvietenej i zhasnutej zabudovanej LED, a to pri zapnutom i vypnutom ADC. Vpravo sú uvedené spotreby pri rovnakej situácii, ale tentokrát s vypnutými ostatnými zariadeniami. A ako môžete sami vidieť, spotreba je jednoducho o 400 µA (0,4 mA) nižšia. Možno si poviete, že 400 µA za to nestojí. No uvedomte si, že je to 10 % spotreby s LED a ešte viac pri spotrebe bez LED, a tak ma i tieto výsledky potešili a vedú ma k záveru, že keď na spotrebe záleží, má zmysel nepoužívané obvody vypínať.

Životnosť batérie

Po úspešných experimentoch so znižovaním spotreby nastal čas povedať si, čo z toho, resp. ako dlho mi taký senzor vydrží fungovať na batériu. Odpoveď nie je celkom jednoduchá, pretože to závisí od dvoch vecí:

  • kapacita batérií
  • spotreba zariadenia

Kapacita batérií je spravidla udávaná v mAh (miliampér hodiny):

1 ~mAh = 1 ~000 ~\mu{Ah}

Zvyčajná kapacita najbežnejších batérií (líši sa podľa výrobcu):

Typ Označ Kapacita Napätie
gombíková lítiová CR2032 225 mAh 3 V
gombíková lítiová CR2450 610 mAh 3 V
alkalická ceruzková AA 2 000 mAh 1,5 V
malá alk. ceruzková AAA 1 000 mAh 1,5 V

Ak vás napadne, 9V batéria je v tomto prípade jednak nepoužiteľná, pretože odstránením regulátora nemôžem zariadenie napájať viac ako 5,5 V (špecifikácia výrobcu). I preto ako možnosti ostávajú buď jedna lítiová gombíková batéria (3 V), alebo dve (3 V) až tri (4,5 V) alkalické batérie. Z pohľadu poklesu napätia počas vybíjania a minimálneho napätia zariadenia (2,7 V pri 8 MHz), nie je voľba dvoch alkalických batérií vhodná, pretože ani zďaleka nemožno využiť celú kapacitu (zariadenie by prestalo pracovať ani nie v polovici kapacity – keď poklesne napätie článku pod 1,35 V).

Poznámka

Použitie nabíjateľných článkov (akumulátorov) neodporúčam. NiCD a NiMH akumulátory majú nižšie napätie, Li-Po v porovnateľnej veľkosti majú nižšiu kapacitu ako alkalické a ich nabíjanie a vybíjanie so sebou prináša len problémy…

Spotreba zariadenia je trochu zložitejšia. Keby senzor nič nerobil, ale celý čas spal spánkom úsporných (tzn. s najnižšou spotrebou) a okolité obvody nemali žiadnu spotrebu, tak by senzor spotrebovával 4,3 µA (ako som nameral) a každú hodinu by teda spotrebovával 4,3 µAh. Pri použití článku CR2450 by teda teoreticky dokázal mikroprocesor spať:

t = \frac {610} {0,0043} \doteq 141 ~860 ~hod

Rada

141 860 hodín je necelých 6000 dní, teda približne 16,2 roka.

Lenže senzor musí aj niečo robiť, v mojom prípade prácu simuluje svietiaca LED, kedy má zariadenie spotrebu 4,5 mA (resp. 4,9 mA). Keby vôbec nespal, mal by spotrebu 4,5 mAh. Pri použití článku CR2450 by teda teoreticky dokázal mikroprocesor pracovať:

t = \frac {610} {4,5} \doteq 135 ~hod

Rada

135 hodín je asi 5,6 dňa.

Pretože môj senzor bude pracovať len asi 200 ms a potom bude asi 8 s (8 000 ms) spať, bude jeho priemerná spotreba:

I = \frac {4,5 \cdot 200 + 0,0043 \cdot 8 ~000} {8 ~000 + 200} \doteq 0,114 ~mA

Priemerná spotreba teda je 0.114 mA, alebo 114 µA. Z lítiového článku CR2450 teda dokáže pracovať:

t = \frac {610} {0,114} \doteq 5 ~351 ~hod

5 351 hod predstavuje asi 223 dní – a práve tu vidno aká dôležitá je minimalizácia spotreby, veď je rozdiel ak senzor dokáže pracovať 5 alebo 223 dní… V skutočnosti to bude trochu menej (alebo možno aj viac), pretože kapacita batérie závisí na rôznych faktorov (pri menšom odbere je vyššia), z batérie nedokážeme dostať všetku kapacitu, batéria sa trochu vybíja i sama atď.

Pri použití troch alkalických článkov AAA by to bolo:

t = \frac {1 ~000} {0,114} \doteq 8 ~771 ~hod

Rada

…teda asi 365 dní.

Tu zase vidno, aký veľký pokrok (v podobe lítiových batérií) nastal, veď si zoberte ten rozdiel: gombík s rozmermi 24×5 mm skoro plnohodnotne nahradí tri články AAA, ktoré majú rozmer dokopy asi 32×44 mm (bez držiakov).

Ak by som dobu reálnej práce senzora skrátil na povedzme 50 ms, budú výsledky ešte zaujímavejšie:

  • priemerná spotreba klesne na asi 31 µA
  • životnosť batérií stúpne na asi 820 dní, čiže asi 2 a ¾ roka.

Záver

Prezentujem tu výsledky meraní spotreby upravenej dosky Arduino Pro Mini i postupy výpočtov životnosti batérie. berte, prosím, do úvahy, že namerané hodnoty prúdov sú, vzhľadom na presnosť môjho meracieho prístroja, skôr orientačné a výpočty životnosti zase len teoretické.

Tak či tak, výsledky ukazujú, že je možno dlhodobo prevádzkovať senzor na jednu gombíkovú batériu (s kapacitou cca 610 mAh). Výpočty tiež ukázali aké dôležité (s ohľadom životnosti batérie) je vypnúť nepoužívané moduly a minimalizovať dobu behu na plný výkon. Lenže hlavne to druhé (doba behu) je v prípade knižnice Arduino trochu problematická, pretože jednoduchosť jej použitia je vyvážená práve stratou kontroly nad trvaním operácií.