Režim spánku

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Režim spánku

Příspěvek od Axamith » 10 bře 2018, 08:30

Řeším provoz Arduina na baterie ve venkovním prostředí s požadovanou výdrží v řádech měsíců. Dělám to na Arduinu Pro mini 3,3V 8 MHz. Na webu je toho spousta, inspiroval jsem se článkem https://www.arduinotech.cz/inpage/konst ... arduino-i/.
Pominu-li potřebnou úpravu HW, vypitval jsem z kódu následující část, která řeší režim spánku s periodickým probouzením:

Kód: Vybrat vše

#include <LowPower.h>

#define PERIODE 1 // cas spanku [min]
unsigned int timer = 0x00;
unsigned int periodeCounter = 0x00;
int LED = 13; // info LED
void setup()
{
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  timer = (PERIODE * 60)/8; 
   periodeCounter = timer + 1;
}
void loop()
{
blink();
while(periodeCounter < timer);
{
LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); 
periodeCounter++;
  }
periodeCounter = 0x00;
}
void blink ()
{
  digitalWrite(LED, HIGH); 
  delay(500);               
  digitalWrite(LED, LOW);     
  delay(10);
  }


Prošel jsem si detaily knihovny LowPower https://github.com/rocketscream/Low-Power
Pomocí knihovny mohu vypnout následující části Arduina:

ADC, Timer 0, Timer 1, Timer 2, SPI, USART0, TWI

Co vše si mohu dovolit vypnout, aniž bych se nedostal do problémů?

Mám možnost buď přes cyklus prodlužovat čas spánku s periodou 8 sec. nebo uspat "navždy" přes SLEEP_FOREVER a probudit přerušením přes RTC. Máte někdo zkušenost, co je výhodnější? Jestli cyklovat, nebo živit I2C a čip RTC?

Poznámka pod čarou, všimněte si v uvedeném kódu příkazu

Kód: Vybrat vše

#define PERIODE 1
Logicky bych ho ukončil středníkem, ovšem v tom případě kompilátor vyhodí chybu. Divné ...

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Režim spánku

Příspěvek od jankop » 10 bře 2018, 09:51

Kód: Vybrat vše

#define PERIODE 1
Není na tom nic divného, je to direktiva a prostě to vychází z definice, #include také neukončuješ středníkem. Direktivy nejsou příkazy jazyka, ale příkazy pro překladač.
Ale k tomu Sleep. Určitě největšího efektu dosáhneš, když procesor kompletně uspíš a na buzení použiješ externí RTC. Ten má obvykle vyvedený jeden pin alarm. kterým můžeš probudit kompletně zastavené MCU přes interrupt, který bývá většinou statický. V tomhle kontextu ani nechápu tvoji poznámku o aktivním I2C

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Režim spánku

Příspěvek od Axamith » 10 bře 2018, 10:34

K tomu RTC, žiji v představě, že RTC komunikuje s Adruinem přes I2C. Probuzení pošle přes SQW. viz. https://www.zive.cz/clanky/pojdme-progr ... fault.aspx (poslední příklad).

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Režim spánku

Příspěvek od AstroMiK » 10 bře 2018, 11:57

SQW je extra pin na RTC obvodu (u něktrých obvodů je označovaný jako /INT).
V RTC je možné přes I2C nastavit čas, kdy se má tento extra pin přepnout do LOW (např 1x za den, každých 5 minut, každou hodinu ....)
RTC pak už přes I2C nekomunikuje.
Tento pin pak může sloužit pro probuzení Arduina z extra hlubokého spánku.


Snižování spotřeby proudu při napájení z baterií jsem řešil v těchto projektech:

Krmítko pro psa s ATtiny13 - tam jsem použil RTC, které se spíná 1x za den.
http://www.astromik.org/raspi/krmitko/index.htm
V tomto případě je ATtiny pomocí FET tranzistoru úplně odpojené od napájení, takže neodebírá vůbec žádný proud a ani se nemusím starat o žádný sleep režim. Při sepnutí /INT pinu v RTC obvodu se napájení zapne a v ATtiny se rozběhne program.
Když se provedou všechny potřebné operace, nastaví se v RTC obvodu ten spínací pin na HIGH, čímž se vypne napájení do ATtiny.



Druhý projekt byl Bateriově napájený GSM alarm.
Tam se zase místo RTC obvodu používá obyčejný kontakt na dveřích, při jehož sepnutí se Arduino probouzí z režimu spánku.
http://www.astromik.org/raspi/gsmalarm/index.htm

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Režim spánku

Příspěvek od Axamith » 10 bře 2018, 12:08

Řešení RTC + FET je perfektní, moc děkuji za vysvětlení problematiky a nakopnutí správným směrem.
Ten pes je perfektní, hezkej rošťák :-)

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Režim spánku

Příspěvek od jankop » 10 bře 2018, 12:09

Jen bych si dovolil doplnit. U MCU Microchip PIC třeba platilo, že když se vypojily všechny oscilátory a všechno co nějak "tikalo", tak se dala dostat spotřeba do oblasti nanoampér. K danému procesoru obvykle existují DC tabulky, které definují spotřebu jednotlivých komponent systému. Často pak hraje zásadní roli spotřeba obvodů kolem procesoru a procesor nebere skoro nic. Jen netuším, do jaké míry je možné se v Arduinu abstrahovat na úroveň registrů MCU. Pokud je obvod dobře navržen, není obvykle třeba vypínat ani jeho napájecí napětí.
AstroMiK dobře popsal to buzení časovačem, tak jsem to myslel v předchozím.

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Režim spánku

Příspěvek od Axamith » 10 bře 2018, 12:14

Mám na cestě uA, tak až dorazí, očešu Pro mini o LED a regulátor a začnu zkoušet režimy spánku a měřit spotřebu. Podle výsledku určím směr, kterým se vydám.

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Režim spánku

Příspěvek od Axamith » 03 dub 2018, 10:26

Tento víkend jsem se konečně dostal k očesání Arduina Pro mini 3,3V 8 MHz o obě LED a regulátor napětí, viz. https://www.arduinotech.cz/inpage/konst ... arduino-i/
Cituji z textu:

Reálné testy, které jsem na takto upraveném HW provedl - tedy i s osazeným WISOL transceiverem mi ukázaly nádherných 4,6uA spotřebu ve spánku. Tohle se již velmi blíží čidlům, s "profi" konstrukcí na jiných čipech a dosažená spotřeba se dá s klidným svědomím označit za low power.

Mám v tom trochu zmatek, spotřeba 4,6 uA je 0,0046mA http://www.prevod.cz/index.php?str=290&raz=1
To mi v podstatě klasický multimetr ukazuje, při rozsahu 2mA mám na displeji 0,004
Když ovšem připojím ručkový uA s rozsahem 100 uA, jde okamžitě za roh. Budík jsem kupoval právě pro tato měření spotřeby v režimu spánku. Možná pro stromy nevidím les, ale mám v tom už guláš ...

jankop
Příspěvky: 1029
Registrován: 06 zář 2017, 20:04
Reputation: 0
Bydliště: Brno
Kontaktovat uživatele:

Re: Režim spánku

Příspěvek od jankop » 03 dub 2018, 10:57

Problém bude ve vnitřním odporu měřidla. Ten může být docela velký, i cca 2000ohmů. Když připojíš Arduino přes analogové měřidlo, procesor ještě nespí a odběr je velký. Vlivem vnitřního odporu měřidla není procesor dostatečně napájen a nejspíš řádně nenaběhne a tudíž se neuspí a zůstane v nedefinovaném stavu. Můžeš zkusit dát paralelně k měřidlu sepnutý spínač, který rozepneš, až když bude Arduino připojené. Doporučuji dát paralelně k měřidlu shottky diody na ochranu měřidla. Pro daný účel ale není analogové měřidlo příliš vhodné, raději věř tomu multimetru, ten by měl mít o řád menší vnitřní odpor.

Axamith
Příspěvky: 530
Registrován: 09 srp 2017, 08:17
Reputation: 0
Kontaktovat uživatele:

Re: Režim spánku

Příspěvek od Axamith » 03 dub 2018, 11:05

Děkuji za vysvětlení. Hlava mi to nebrala, propadal jsem skepsi ...

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 8 hostů