Uspání a přerušení

 

 

Uspání a přerušení

Úspora energie Arduina je přesvědčivá za okolností, kdy provozujeme aplikace způsobem "Arduina bez Arduina".

Jádrem desek Arduino je procesor, často procesor "ATmega328P" amerického výrobce ATmel Corporation, datový list. Na všech deskách jsou přiřazeny procesoru periférie, např. stabilizátor napětí, převodník USB aj., které umožňují snadnou obsluhu procesoru ale zároveň spotřebovávají el. energii.

 Pro zajištění funkce procesoru je nezbytné, aby procesor obsahoval zaváděcí program, tzv. "Bootloader", který je možné do procesoru "vypálit", viz kapitola "Butování AT328P", případně pořídit nový procesor s již vypáleným zaváděcím programem. Pokud máme procesor obsahující zaváděcí program, můžeme použít pouze samotný procesor podobným způsobem, jako desku Arduino, což má dvě výhody:

- ušetříme část plochy

- v případě uspání procesoru minimalizujeme spotřebu el. energie.

Zvláště druhá výhoda je lákavá pro bateriové aplikace. Např. deska UNO odebírá 40 - 50 mA. V případě zapojení s "holým" procesorem je odběr cca 20 mA a uspáním lze dosáhnout spotřeby cca 0,3 mA. Extrémně, podle austrálského zdroje, klesne spotřeba po uspání četných částí procesoru až na 0,15 µA.

 K procesoru je vhodné dokoupit 28 pinovou patici a nutno dokoupit krystal 16 MHz. Mnohé návody na "Arduino bez Arduina" (např. zde) doporučují zapojit ke krystalu kondenzátory 22 pF a k reset pinu odpor. Bylo odzkoušeno, že procesor běžel po připojení jen krystalu. Krystal 16 MHz připojíme na piny XT1 a XT2, napájeni 1,8-5,5 V (podle kmitočtu krystalu:  4MHz/1,8-5,5V; 10MHz/2,7-5,5V; 20MHz/4,5-5,5V, případně podle již uvedeného australského zdroje podle tabulky)  připojíme na piny Vcc a GND. 

 

 

 Pro naprogramování procesoru použijeme např. desku UNO, která obsahuje patici procesoru (do patice vložíme náš procesor a naprogramujeme).

 

 

Předmětný skeč odladíme na desce UNO a nahrajeme do procesoru vloženého do patice. Poté desku odpojíme od napájení, vyjmeme procesor s patice a umístíme do předmětné aplikace bez desky.

Do procesoru byl nahrán kód "Blink" z "Příkladů" IDE. Na pin D13 připojíme LED přes omezovací odpor 120 ohmu proti GND (na uvedeném foto byl odpor zakomponován v přívodu ledky). LED blikala podle programu, odběr procesoru byl 20 mA.

 

Nyní přistoupíme k uspání procesoru.

 Podle australských podkladů je zde předložen skeč obsahující uspání procesoru a jeho probuzení pomoci funkce "přerušení". Po přerušení dojde k vykonání určené procedury v části programu "void AKCE ()" a poté se opět procesor uspí a čeká na další "přerušení". 

Pro režim spánku lze zvolit několik základních variant s různým odběrem:

SLEEP_MODE_IDLE: 15 mA

SLEEP_MODE_ADC: 6.5 mA

SLEEP_MODE_PWR_SAVE: 1.62 mA

SLEEP_MODE_EXT_STANDBY: 1.62 mA

SLEEP_MODE_STANDBY : 0.84 mA

SLEEP_MODE_PWR_DOWN : 0.36 mA

 Byl zvolen režim zde uvedený jako nejúspornější - "SLEEP_MODE_PWR_DOWN" s očekávaným poklesem odběru na 0,36 mA. 

Funkce "Přerušení" zastaví běh programu a provede určenou operaci. K tomu je možné využít na Arduino deskách pouze určené piny. Na deskách UNO a NANO jsou to piny D2 a D3  označené v předmětném parametru příkazu přerušení jako piny 0 a 1, viz kapitola "Přerušení". 

Příkaz k přerušení obsahuje tři parametry:

attachInterrupt (pin, ISR, mod)

Pokud dojde na určeném pinu k události "mod" podle parametru RISING, FALLING, CHANGE (více zde), program se zastaví a provede "ISR" (Interrupt Service Routine). Byly zvoleny parametry:

attachInterrupt (0, wake, FALLING)

Pokud dojde na pinu D2 (pin přerušení 0) k poklesu napětí z logické "1" na logickou "0" (FALLING) provede se blok programu "wake", v níže uvedeném skeči se jedná o část "void wake()", kde je nastaveno ukončení spánku příkazem "sleep_disable()" .  

Funkce uspání a přerušení ověříme níže uvedeným skečem "Uspani_preruseni.ino", ve kterém je použita knihovna "sleep.h" (je součástí IDE):

 

Skeč "Uspani_preruseni.ino":

#include <avr/sleep.h>         			//knihovna "uspání"                                       
const byte LED=9;                  		//přiřazení proměnné LED pinu D9                                 
 
void setup()
{digitalWrite(2,HIGH);}                       	//přiřazení logické "1" pinu D2                    
  
void loop()                                  	//smyčka                      
{set_sleep_mode(SLEEP_MODE_PWR_DOWN);  		//nastavení uspání procesoru
sleep_enable();                         	//uspání
attachInterrupt(0,wake,FALLING);  		//přerušení - když se na pinu D2 (pin 0 přerušení) zruší log 1 (FALLING), provede se blok programu "void wake()"   
EIFR=bit(INTF0);    				//vyčištění/vynulování registru přerušení                 
interrupts();                          		//povoleni k přerušení
sleep_cpu();               			//povoleni k uspání            
AKCE();}                                	//provede se blok programu  "void AKCE()"
  
void wake()                            		//procedura probuzení
{sleep_disable();}                      	//dojde k přerušení režimu spánku
  
void AKCE()                             	//procedura AKCE - po probuzení se provede procedura AKCE (rozsvítí se ledka na pinu D9 na 10 sekund)
{pinMode(LED,OUTPUT);
digitalWrite(LED,HIGH);
delay(10000);
digitalWrite(LED,LOW);}

 

Program nahrajeme na desce UNO do procesoru, poté procesor přemístíme do patice opatřené krystalem 16MHz. Na pin D9 připojíme ledku proti GND (přes ochranný odpor) a procesor připojíme na napájení 5V. Program ihned uspí procesor a spotřeba klesne na indikovaných 0,3 mA.

 

Poté krátce spojíme pin D2 přes odpor cca 1k na GND. Na pinu D2 dojde k poklesu logické "1" (FALLING) a program přeruší režim spánku blokem programu "void wake()". Následně se spustí blok programu "void AKCE()",  ledka pinu D9 se rozsvítí na 10 sekund při odběru procesoru 37 mA. Poté se opět procesor uspí a čeká na další "FALLING". 

 

 

Sepnutím pinu D9 na GND můžeme spustit různé "akce" naprogramované v bloku "void AKCE()", např. lze naprogramovat provolání a odeslání varovné SMS mobilním volačem GSM v rámci aplikace alarmu. Je vhodné upozornit na případné napěťové zachvění při sepnutí pinu D2 na GND (více zde), které může v různých aplikacích způsobovat problémy. V předloženém bastlu se problém zachvění při sepnutí D2 neprojevil.

 

Na co si dát pozor

Uvedené procedury uspání a přerušení byly ověřovány v rámci bastlu alarmu a bylo zjištěno, že uspání procesoru bylo doprovázeno jeho zvýšenou citlivostí na vnější "elektrické" impulsy. Procesor se náhodně probouzel používáním spotřebičů připojených na stejnou prodlužovačku jako napájení bastlu alarmu (jeho 220V síťového adapteru). Například používáním pistolové pájky, rozsvícením stolní lampy, připojením 220V vidlice síťového adapteru, který dobíjel akumulátor bastlu alarmu.  

 

 

Zárí 2020

 

Home

 

Arby

arduinohobby@email.cz