Nízka spotreba

o tom, ako sa dá znížiť spotreba zariadenia pomocou softvérových a hardvérových prerušení, znížení pracovnej frekvencie, o režimoch spánku a spôsoboch prebudenia sa z neho

Motivácia

Jednou z hlavných výziev, ktorú priniesol Internet vecí, je dosiahnuť čo najnižšiu spotrebu energie zariadení. Efektívnym riadením spotreby dokážeme predĺžiť životnosť batériovo napájaných systémov z týždňov na mesiace či dokonca roky. V tomto cvičení si ukážeme niekoľko praktických spôsobov, ako znížiť spotrebu nášho chytrého senzora – znížením pracovnej frekvencie, využitím režimov spánku a prebúdzaním pomocou externého časovača alebo stlačením tlačidla.

Diagram stavov: konceptuálny diagram stavov chytrého senzora

Ciele

  1. naučiť sa uspať zariadenie

  2. naučiť sa zobudiť zariadenie pomocou externého prerušenia z tlačítka

  3. naučiť sa softvérovo meniť frekvenciu zariadenia

  4. porozumieť významu časovača Watchdog

  5. časovač cez externý RTC modul

Postup

Zníženie spotreby znížením frekvencie

Jedným zo spôsobov, ako je možné znížiť spotrebu zariadenia, je spomaliť jeho prácu. A spomaliť prácu mikrokontroléra vieme znížením jeho pracovnej frekvencie. Obecne totiž platí pravidlo, že čím pomalšie niečo pracuje, tým menej energie spotrebuje.

Pracovnú frekvenciu mikrokontroléra je možné zmeniť zavolaním funkcie freq(), ktorá sa nachádza v module machine. Ak je funkcia zavolaná bez parametra, vráti aktuálnu hodnotu pracovnej frekvencie. Ak je funkcia zavolaná s parametrom frekvencie (v Hz), táto bude nastavená.

Na mikrokontroléroch rodiny RP2 je možné nastaviť frekvenciu v rozsahu od 48 MHz do 250 MHz. Po zapnutí je frekvencia na doske RPi Pico nastavená na hodnotu 125 MHz a v prípade RPi Pico 2 na hodnotu 150 MHz.

Frekvencia periférií musí byť buď 48 MHz alebo zhodná s frekvenciou mikrokontroléra, pričom predvolená hodnota je 48 MHz. Ak sa frekvencia periférií zmení, všetky existujúce inštancie UART a SPI zmenia svoju prenosovú rýchlosť a môžu vyžadovať opätovnú konfiguráciu. V opačnom prípade nemusia pracovať správne a budete musieť zmazať celú flash pamäť pomocou špeciálneho obrazu flash_nuke.uf2 a znovu nahrať firmvér s jazykom MicroPython.

Keď budete spokojní s nastavením pracovnej frekvencie, umiestnite túto hodnotu do súboru boot.py.

V rozličných stavoch, resp. fázach môže chytrý senzor používať inú pracovnú frekvenciu. V našom prípade nebude potrebné odosielať dáta po každom meraní, ale buď v pravidelných intervaloch alebo po istom počte meraní. Potrebné bude nastaviť správnu frekvenciu pre WiFi modul, ktorá môže byť úplne iná, ako bude nastavená pracovná frekvancia mikrokontroléra.

Pre naše potreby používajte dve pracovné frekvencie:

  • pre meranie si vystačíme s hodnotou pracovnej frekvencie 48 MHz
  • pre WiFi pripojenie a komunikáciu s modulom CYW43 budeme potrebovať frekvenciu 125 MHz

Hodnota pracovnej frekvencie je uložená v premennej CPU_FREQ v module constants.py.

Uspanie zariadenia

Chytrý senzor, ktorý vytvárame, bude merať vlhkosť a teplotu v pravidelných intervaloch. Interval merania môže byť v jednotkách, ale aj v desiatkach minút. Medzitým však zariadenie nebude robiť nič. Preto ho medzi jednotlivými meraniami uvedieme do režimu spánku.

V jazyku MicroPython máme k dispozícii dve funkcie, pomocou ktorých je možné zariadenie uspať. Jedná sa o funkcie:

Parametrom oboch funkcií je čas v milisekundách, počas ktorého zostane zariadenie v režime spánku. Ak čas nie je zadaný, zariadenie prejde do spánku na neobmedzene dlhé obdobie.

Na doskách rodiny RP2 je však ich správanie rovnaké s tým rozdielom, že funkcia deepsleep() po zobudení reštartuje zariadenie. Spotreba je však v oboch prípadoch rovnaká.

Doba, na ktorú sa chytrý senzor uspí, je konfigurovateľná používateľom. V nastaveniach je uložená pod názvom measurement_interval. Zariadenie na túto dobu uspite v stave Sleep. Pred prechodom do režimu spánku však nezabudnite korektne vypnúť všetky moduly a ukončiť všetky otvorené spojenia.

Okamžité prebudenie zariadenia z režimu spánku

Nie vždy je vhodné čakať, kým sa zariadenie zobudí automaticky po uplynutí nastaveného času. V niektorých situáciách potrebujeme možnosť prebudiť ho skôr – napríklad pri zásahu používateľa. Keďže naše zariadenie je vybavené tlačidlom, môžeme ho využiť práve na tento účel. Po stlačení tlačidla sa zariadenie prebudí a reštartuje, čím získame kontrolu nad jeho prebudením aj mimo plánovaného cyklu spánku.

V tomto kroku teda vytvoríte prerušenie na pine, ku ktorému je pripojené tlačidlo. Ak je zariadenie v režime spánku, vznik externého prerušenia spôsobí jeho okamžité prebudenie.

Funkcia, ktorá bude spracúvať vzniknuté prerušenie, môže byť prázdna – dôležité je, aby bola zavolaná. V opačnom prípade prerušenie nebude ošetrené a zariadenie sa neprebudí.

Externý časovač pomocou RTC modulu

Náš chytrý senzor nebude aktívny neustále – väčšinu času strávi v úspornom režime spánku, aby šetril energiu. Takéto správanie je typické pre zariadenia v rámci Internetu vecí, kde je dôležité, aby jednotlivé komponenty pracovali len vtedy, keď je to skutočne potrebné. Zo spánku sa môže zariadenie prebudiť dvoma spôsobmi: buď manuálne, stlačením tlačidla používateľom, alebo automaticky po uplynutí vopred nastaveného časového intervalu.

Ak budeme senzor uspávať vždy na konštantný čas, musíme počítať s tým, že jeho následné prebúdzanie sa bude postupne posúvať o dobu, počas ktorej senzor vykonáva meranie a spracovanie dát. Aj keď nejde o závažný problém, v niektorých prípadoch môže viesť k neželanej používateľskej skúsenosti.

Ak si napríklad používateľ nastaví, aby sa meranie vykonávalo vždy na celú hodinu, už po jednom dni môže byť začiatok merania posunutý o približne jednu minútu.

Na odstránenie tohto problému a zabezpečenie, aby sa merania vykonávali vždy v presne stanovených intervaloch, máme dve možnosti:

  1. Pred uspaním zariadenia vypočítať presnú dĺžku času, počas ktorého má zostať v spánku. Týmto spôsobom môžeme zabezpečiť, že sa prebudí práve v okamihu, keď sa má začať ďalšie meranie.

  2. Uspať zariadenie na neurčitý čas a prebudiť ho externým signálom v presne určenom okamihu. Na tento účel je možné použiť externý hodinový modul, ktorý dokáže generovať zobúdzací signál na svojom výstupnom pine. Tento signál môžeme pripojiť k vstupu mikrokontroléra, ktorý pri jeho aktivácii zariadenie zobudí podobne, ako v prípade stlačenia tlačidla. Takýmto modulom je napr. DS3231.

    Rozloženie pinov RTC modulu DS3231

Strážny pes

Počas prevádzky môže zariadenie niekedy „uviaznuť“ – dostať sa do stavu, z ktorého sa nedokáže zotaviť bez zásahu používateľa. Typickým príkladom je nekonečná slučka, v ktorej sa zariadenie pokúša pripojiť k neexistujúcej WiFi sieti, alebo neošetrená výnimka, ktorá spôsobí, že zariadenie zostane „visieť“.

Aby sa dokázalo automaticky zotaviť z takýchto situácií, používame špeciálny časovač s názvom Watchdog Timer. Ak zariadenie uviazne, Watchdog ho po uplynutí nastaveného času automaticky reštartuje.

V tomto kroku vo vhodnom okamihu zapnite a správne nakonfigurujte Watchdog Timer, aby sa predišlo zaseknutiu zariadenia a zabezpečila sa jeho stabilná prevádzka.

Pred odchodom z cvičenia…

Ďalšie úlohy

  1. V prípade akýchkoľvek problémov nezabudnite prejsť do stavu Error a reprezentovať vzniknutú chybu potrebným blikaním.

Ďalšie zdroje

  1. MicroPython: Quick reference for the RP2: General board control

  2. MicroPython Chapters: Zmena frekvencie zariadenia

  3. The DS3231 real time clock chip

  4. Last Minute Engineers: Interface DS3231 Precision RTC Module with Arduino

  5. Random Nerd Tutorials: Raspberry Pi Pico: DS3231 RTC (Real-Time Clock) – Get Time and Set Alarms (MicroPython)