V prejšnjem prispevku smo sestavili napravico – predvajalnik glasbe z zvočnim modulom vs1000, I2C zaslonom, Arduinom, tipkami ter zvočnikom. Za zaznavo pritiska tipke smo uporabili prekinitve namesto, da bi v loop() zanki konstantno pregledovali stanje na priključkih. Tudi s tem pristopom nismo bili glede porabe energije kaj boljši, saj je procesna enota neprestano divjala skozi loop() zanko in porabljala energijo tudi takrat, ko ni opravljala nič koristnega.
Če bi želeli napravico narediti malo bolj „realno“, recimo kot prenosni predvajalnik glasbe, pa bi bilo potrebno postoriti še nekaj stvari. V tem prispevku se ne bomo preveč ukvarjali s preostalo strojno opremo, pravzaprav bomo opremo okrnili na minimum, saj je bila uporaba preostalih dveh modulov že predstavljena. Uporabili bomo le tipke, zvočnik in Arduino za programiranje, nato pa mikrokontroler postavili v minimalno okolje, kjer bo lahko deloval z izredno majhno porabo. Tako bomo v praksi videli, na katerem principu “prave” naprave zmorejo dolgotrajno baterijsko delovanje. Arduino nam je tudi pri tem raziskovanju lahko v veliko pomoč.
Koliko „pije“ Arduino?
Arduino Uno R3 porabi na 5V preko USB priključka približno 50mA, če nanj ni priključena nobena periferna naprava. Je to veliko ali malo? Dokler je naprava, ki smo jo izdelali, priključena na USB priključek našega prenosnika, to niti ni veliko. Ko jo pa priključimo npr. na 4×1,2V akumulatorje s kapaciteto 3000mAh, to pomeni, da ob neprekinjenem delovanju lahko pričakujemo življensko dobo približno dva dni in pol. Z dodatnimi porabniki še manj. To ni niti tako zelo slabo, ampak da se še mnogo bolje. Srce Arduina, čip ATmega328PU pri svojem delovanju pri 5V porablja le okoli 10mA toka. Vse ostalo požre Arduino vezje, ki vključuje linearne napetostne pretvornike, USB serijski pretvornik, LED diode in še kaj. Kogar mika, da bi z nožem porezal PCB sledi do svetečih diod lahko povem, da bo prihranek le skromen: okoli 2,2mA/LED. Če pa bi se lahko znebili vse periferije, bi z istimi akumulatorji že dosegli okoli tri tedne delovanja. (Čas delovanja v urah= kapaciteta v mAh / tok v mA) To zveni že bolje, a prihranki pri porabi se tu šele prav začnejo: čip ATMega328PU omogoča t.i. načine spanja, ki ugašajo posamezne sklope čipa, s čimer lahko porabo pošljemo v desetine mikro A, izjemoma celo samo nekaj mikro A. Pri tem pa že lahko govorimo o večletnem neodvisnem delovanju.
Seveda si takšnega počitka ne moremo vedno privoščiti, odvisen je od aplikacije. Katere aplikacije pa to dopuščajo? V splošnem so to aplikacije, kjer le redko potrebujemo mikrokontroler v aktivnem stanju: npr. periodično zajemanje in pošiljanje podatkov ali npr. kratko sekvenco opravil po interakciji s človekom, kot je to v našem primeru. Tudi, če ima aktivno stanje relativno veliko porabo bo ob redkih takšnih dogodkih odločilnega pomena poraba, ko je čip v mirovanju. Poglejmo si to na primeru.
Recimo, da želimo narediti preprosto igračo. Igrača bo imela 3 tipke, ob pritisku na vsako tipko bo zaigral drug ton. Program za igračo bomo najprej razvili na “standardnem” Arduinu, nato pa zgradili minimalistično verzijo “Arduina”, z le nekaj komponentami, ki bo omogočala zares dolgotrajno baterijsko uporabo.
Najprej si malo bolj podrobno oglejmo kaj načini spanja sploh so. Arduinov čip ima poleg procesne enote, kjer izvaja inštrukcije, več perifernih enot kot so: USART (za serijsko komunikacijo), števci, ADC pretvorba, I2C enota, SPI enota ipd. Vse te enote so zaradi enostavnosti pri Arduinu vklopljene, saj je razvijanje tako najenostavnejše. Seveda vsaka enota nekaj prispeva k porabi. Nekatere več, nekatere manj. Ko želimo, da naša naprave avtonomno deluje dolgo časa, postane breme delujočih, a nepotrebnih naprav omejujoče. Čip ATMega328P ima več sklopov spanja znotraj katerih se še dodatno lahko odločamo o posameznih izključitvah. Podroben opis bi zahteval precej prostora, zato si bomo na tem mestu ogledali le najbolj globok način spanja: “power down mode”, to je način, ko je izključena celo procesna enota – izvajanje programa se ustavi. Iz globokega spanca lahko mikrokontroler zbudijo le nekatere prekinitve, med njimi tudi prekinitve ob spremembi stanja. Tudi upravljanje z načini spanja na nivoju registrov je sicer v principu enostavno, a zaradi številnih možnosti nepregledno. V ta namen bomo uporabili eno od kar nekaj knjižnjic, ki so jih napisali uporabniki Arduina . Najdemo jo na naslovu: http://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-arduino-library/. Na tej strani najdete tudi vse porabe toka za različne kombinacije spalnih načinov. Knjižnjico dodate v mapo Library, ki se nahaja v mapi razvojnega okolja Arduina, nato pa jo kličete z #include <lowPower.h> Knjižnjica je zelo kratka in enostavna za uporabo. Ker je starejšega datuma boste morali v knjižnjici <wprogram.h> zamenjati z <arduino.h>, če uporabljate IDE novejši od 022.
Tempero d.o.o. Vipavska 4e
5270 Ajdovščina
Programiranje z Arduino (8) – varčni Arduino
2014_SE218_45