Introduction to Interrupts

prerušenia, meranie spotreby zariadenia

About

Pozrieme sa na to, akú spotrebu má Arduino Uno.

Goals

  • Osvojiť si problematiku prerušení.
  • Naučiť sa používať zdroj externého napätia.
  • Naučiť sa základy práce s multimetrom.
  • Naučiť sa zistiť životnosť batérie.
  • Naučiť sa vypočítať množstvo energie, ktorú batéria dodáva.

Content

Step 1: Prepare Your Environment

Počas cvičenia budete programovať prototypovaciu dosku Arduino Uno. Za tým účelom si nainštalujte Arduino IDE. Buď na vlastný laptop alebo na laboratórne Raspberry Pi.

Úloha 1.1

Na Raspberry Pi môžete Arduino IDE nainštalovať pomocou príkazu sudo apt install arduino, v prípade iných linuxových systémov použite príslušný balíčkovací systém.

Na systémoch Windows môžete Arduino IDE stiahnuť z oficiálnej stránky Arduina.

Step 2: Light Switch

Vašou úlohou bude vytvoriť jednoduché zapojenie, na ktorom si ozrejmíme preberanú problematiku - budeme zapínať a vypínať LED díódu pomocou tlačidla.

Úloha 2.1

Podľa priloženej schémy pripojte k prototypovacej doske Arduino Uno tlačidlo a LED diódu.

Schéma zapojenia

Úloha 2.2

Vytvorte program, ktorý bude vedieť pomocou tlačidla prepínať stav LED diódy.

Po spustení Arduina LED dióda nebude svietiť. Keď sa stlačí tlačidlo, zmení sa jej stav a LED dióda sa rozsvieti. Opätovným stlačením tlačidla LED dióda zhasne.

Celý systém sa bude tým pádom nachádzať v dvoch stavoch:

  1. enabled - v tomto stave LED dióda svieti
  2. disabled - v tomto stave LED dióda nesvieti

Správanie systému reprezentujte nasledujúci stavový diagram:

Stavový diagram reprezentujúci správanie systému
// macros
#define PIN_LED 3
#define PIN_BTN 2

// toggle the LED with button - polling
bool state = false;

void setup(){
    pinMode(PIN_BTN, INPUT_PULLUP);
    pinMode(PIN_LED, OUTPUT);
}

void loop(){
    // check state
    int value = digitalRead(PIN_BTN);
    if(value == LOW){
        state = !state;
    }
    
    // update state of the LED
    digitalWrite(PIN_LED, state);
    
    // have a break
    delay(1 * 1000);
}

Úloha 2.3

Otestujte svoje riešenie.

Step 3: Interrupts

Vytvorené riešenie trpí jednou veľkou dizajnovou vadou - ak dôjde k stlačeniu tlačidla počas pauzy, bude toto stlačenie ignorované. Poučovať používateľa, že musí držať tlačidlo dovtedy, kým sa nezmení stav LED diódy, je naozaj zlý dizajn a vám to zníži reputáciu ako programátora, resp. dodávateľa divných riešení. Tentokrát sa pokúsime problém vyriešiť tak, aby systém vedel reagovať na stlačenie tlačidla okamžite.

Úloha 3.1

Vytvorte ISR (Interrupt Service Routine) funkciu s názvom toggle(), ktorá ošetrí stlačenie tlačidla.

V rámci funkcie zmeňte stav premennej state a rovno jeho aktuálnu hodnotu pošlite na digitálny výstup 3.

Poznámka: Nezabudnite na to, že ISR funkcia nemá žiadne parametre a nevracia žiadnu hodnotu!

Úloha 3.2

Upravte deklaráciu premennej state tak, aby jej hodnota bola vždy načítaná znova.

Pri deklarácii premennej pridajte modifikátor volatile. Ten zabezpečí potrebné správanie. Keby pri tejto globálnej premennej tento modifikátor nebol, mohlo by sa stať, že premenná sa načíta do registra, a predtým, ako by došlo k jej spracovaniu (napr. zasvieteniu LED diódy) by došlo k prerušeniu, ktoré by jej aktuálnu hodnotu aktualizovalo. Riadenie programu sa vráti k funkcii zabezpečujúcej rozsvieteniu diódy, ale nič by sa nestalo, pretože stará hodnota by už bola načítaná v regristri.

Úloha 3.3

Vo funkcii setup() inicializujte prerušenie v režime FALLING.

Inicializáciu realizujte pomocou funkcie attachInterrupt().

Poznámka: Miesto čísla prerušenia, ktoré má byť ošetrené, je vhodnejšie použiť číslo pin-u, na ktorom je toto prerušenie sledované. To je možné dosiahnuť pomocou funkcie digitalPinToInterrupt(pin), ktorá automaticky prevedie číslo pin-u na číslo prerušenia. Týmto spôsobom je tiež možné zabezpečiť prenositeľnosť medzi viacerými platformami.

Úloha 3.4

V prípade potreby aktualizujte funkciu loop().

Úloha 3.5

Otestujte svoje riešenie.

Ak ste postupovali správne, tentokrát sa bude LED dióda rozsvecovať a zhasínať okamžite po stlačení tlačidla nehľadiac na to, čo sa nachádza vo funkcii loop().

Step 4: Measuring Energy

Na záver sa pozrieme, koľko energie dokáže spotrebovať Arduino Uno. Pozrieme sa na to, koľko energie spotrebuje samotné, ako aj koľko energie spotrebuje s pripojenou diódou.

Úloha 4.1

Prototypovaciu dosku Arduino Uno môžeme napájať pomocou USB kábla alebo napájacieho konektora pre vstupné napätia od 7 do 12 Voltov. Toto vstupné napätie je cez regulátory a stabilizátory znížené na potrebné napätie.

Použite zdroj napätia na napájanie Arduina cez napájací konektor. Ak zdroj zapnete, váš program s ovládaním LED diódy bude na doske bežať.

Úloha 4.2

Na odmeranie spotreby použijeme multimeter: 1. multimeter nastavte na meranie prúdu v miliampéroch (pozícia mA), 2. pripojte vodiče do konektorov multimetra - čierny na konektor s označením COM, červený na konektor mAuA, 3. multimeter teraz zapojte do série vo vašom obvode - druhý koniec ČERVENÉHO vodiča (vychádzajúceho z multimetra) zapojte na + svorku zdroja a druhým koncom ČIERNEHO vodiča nahraďte PôVODNÝ vodič vychádzajúci z + svorky zdroja - k Arduinu, 4. program na doske by mal znova bežať, no na multimetri uvidíte aktuálnu spotrebu.

Pripojenie multimetra medzi zdroj napätia a Arduino Uno

Teraz si vyskúšajte vypínať a zapínať LED diódu pomocou vami naprogramovaného tlačidla. Pri rozsvietenej LED dióde bude spotreba vyššia.

Úloha 4.3

Povedzme, že chceme naše Arduino napájať z batérie. Môžeme použiť napríklad štandardnú 9V batériu, ak Arduino budeme napájať cez napájací konektor. Takáto batéria má svoju kapacitu uvádzanú v miliampérhodinách (mAh), čo znamená koľko prúdu dokáže dodávať po dobu jednej hodiny pri danom napätí.

Naša imaginárna batéria nech má kapacitu 600 mAh. Vypočítajte, ako dlho táto batéria dokáže napájať vaše Arduino pri zapnutej a pri vypnutej LED dióde.

Úloha 4.4

V predošlom prípade sme nebrali do úvahy napätie batérie, pretože spotrebu sme mali odmeranú pri danom napätí (resp. videli sme, že v rozsahu 7 až 12 V sa spotreba nemenila). Čo ak by sme chceli napájať Arduino cez jeho USB konektor, ale máme len našu imaginárnu 9V batériu (USB má napätie 5V)? Teoreticky je to možné, no v takom prípade potrebujeme vedieť energiu (E) batérie, pretože pri nižšom napätí a rovnakej spotrebe potrebujeme menej energie. Energia batérie predstavuje aký výkon dokáže batéria dodávať po dobu jednej hodiny.

Vypočítajte energiu (vo Watthodinách, resp. Joule-och) našej imaginárnej batérie.

Úloha 4.5

Ak máme vypočítanú energiu našej batérie, môžeme vypočítať aj výdrž batérie pri nižšom napätí. Stačí výpočítať, aký výkon potrebuje Arduino pri napájaní z USB a potom touto hodnotou vydeliť energiu batérie.

Vypočítajte, ako dlho vydrží batéria napájať vaše Arduino pri napájaní cez USB.

Additional Tasks

Je tu ešte jeden spôsob, ako napájať Arduino Uno. Doska má špeciálne piny označené 5V a 3.3V, ktoré slúžia ako trvalý zdroj napätia priamo z Arduina. Avšak ak doska nie je napájaná z napájacieho alebo USB konektora, je možné využiť jeden z týchto pinov. Tu je však veľmi dôležité dodržať vstupné napätie, pretože napätie na týchto pinoch nie je regulované (napájanie je priamo pripojené k mikrokontroléru, ktorý je nechránený !!!).

Ak chceme napájať Arduino 5 voltami, použijeme 5V pin ako + a GND pin ako -. Podobne urobíme aj v prípade 3,3 voltoch, ale miesto 5V pinu použijeme 3.3V pin.