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.
Ú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:
enabled
- v tomto stave LED dióda svietidisabled
- v tomto stave LED dióda nesvieti
Správanie systému reprezentujte nasledujúci stavový diagram:
// macros
#define PIN_LED 3
#define PIN_BTN 2
// toggle the LED with button - polling
bool state = false;
void setup(){
(PIN_BTN, INPUT_PULLUP);
pinMode(PIN_LED, OUTPUT);
pinMode}
void loop(){
// check state
int value = digitalRead(PIN_BTN);
if(value == LOW){
= !state;
state }
// update state of the LED
(PIN_LED, state);
digitalWrite
// have a break
(1 * 1000);
delay}
Ú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.
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.