Pri návrhu obvodu, ktorý má fungovať na nízky výkon, som zistil, že je dobrým začiatkom zvoliť si dosku s mikrokontrolérom s nižším základným napätím ako 5V. Dôvody sú dva. Po prvé, nižšie napätie znamená nižšiu spotrebu, bodka. Po druhé, existuje mnoho ďalších dosiek a modulov pre aplikácie na 3,3V a použitie 5V úrovní pre napájanie alebo komunikáciu cez UART, I2C alebo SPI ich môže skutočne poškodiť bez iných ochranných prvkov obvodu.

Arduino Pro Micro 3.3V predávané SparkFun je dobrým základom pre návrhy na 3,3V. Používa mikrokontrolér ATmega32U4 bežiaci na 8MHz. Nižšia frekvencia ďalej pomáha udržiavať odber prúdu nízky, hoci to platí iba vtedy, keď mikrokontrolér nespí. Uspanie mikrokontroléra je takmer nevyhnutné v akejkoľvek aplikácii bežiacej na obmedzenom napájaní, obzvlášť pri napájaní z batérie.

Piny externého prerušenia #

Na prebudenie mikrokontroléra zo spánku alebo režimu vypnutia na základe nejakej externej udalosti možno použiť buď pin externého prerušenia alebo pin reset. Jedným pozoruhodným príkladom použitia pinu reset bol obvod TV-B-Gone, ale aj on zrejme teraz používa prerušenia. Dosky založené na ATmega328p majú iba dve externé prerušenia, umiestnené na digitálnych pinoch 2 a 3. ATmega32u4 však má ešte tri ďalšie piny externých prerušení, čo tvorí celkovo päť zdrojov externého, prípadne neperiodického prebudenia. Dva z piatich sú však použité na pinoch UART. Ich použitie komplikuje sériovú komunikáciu aj nahrávanie skíc súčasne. Pre niečo tak citlivo pracujúce so sériovým pripojením, ako sú dosky založené na ATmega32u4, to nie je jednoduchá úloha.

Ďalšie dva sú použité na pinoch 3 a 2, podobne ako u ATmega328p, ale s prehodenými číslami. Zámen čísel by nebol taký veľký problém, ale tieto dva piny sa používajú pre I2C na ATmega32u4. Pre návrhy spoliehajúce sa na I2C komunikáciu je to tiež dosť problém. To sa dá vyriešiť softvérovou knižnicou I2C, ale tá má vždy nejaké nevýhody oproti hardvérovým perifériám.

Existuje však piate externé prerušenie na ATmega32u4, ktoré nie je použité pre nič komunikačne súvisiace, a to je pin 7. Je na ňom pripojené externé prerušenie 4. Užitočné detaily možno vidieť z tabuľky nižšie:

Doskaint.0int.1int.2int.3int.4int.5
Založená na 328p (Uno, Ethernet)23
Založená na 2560 (Arduino Mega)2321201918
Založená na 32u4 (Leonardo, Micro)32017

Pin 7 v tabuľke je zobrazený tučne. Všimnite si, že ATmega2560 pohánajúci Arduino Mega má jeden ďalší zdroj externého prerušenia, ale je v tabuľke uvedený iba pre porovnanie.

Prebudenie z režimu vypnutia #

Strávil som značné množstvo času snahou, aby tento postup fungoval, sledujúc viaceré fórové príspevky a návody, ale nič mi nefungovalo. Existuje aj knižnica Low-power, ktorá je niekedy odporúčaná a tvrdí, že podporuje 324u, ale nepodarilo sa mi ju uviesť do funkcie pre účely použitia pinu 7 (externé prerušenie číslo 4) na iniciovanie prebudenia.

Namiesto toho som upravil kód z viacerých príspevkov nájdených na gammon.com.au:

#include <Arduino.h>
#include <avr/sleep.h>

const int wakeUpPin = 7;
const int ledPin = 17;

void wake()
{
    sleep_disable();
    detachInterrupt(digitalPinToInterrupt(wakeUpPin));
}

void sleepNow()
{
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    noInterrupts();
    sleep_enable();
    attachInterrupt(digitalPinToInterrupt(wakeUpPin), wake, LOW);
    interrupts();
    sleep_cpu();

}

void setup()
{
    pinMode(wakeUpPin, INPUT_PULLUP);
}

void loop()
{
    // Do something here
    // Example: Read sensor, data logging, data transmission.
    pinMode(ledPin, OUTPUT);
    delay(200);
    digitalWrite(ledPin, HIGH);
    delay(500);
    digitalWrite(ledPin, LOW);
    delay(200);
    pinMode(ledPin, INPUT);

    // Now go to sleep
    sleepNow();
}

Najdôležitejšou úpravou tu je režim pinu INPUT_PULLUP. Bez pullup rezistora s voľne visiacim pinom bolo správanie mikrokontroléra v súvislosti so spánkom veľmi zvláštne. Na niektorých pinoch dokonca LED stmievala. Použitie interného pullup rezistora spoľahlivo fungovalo na prebudenie ATmega32u4 Arduino Pro Micro skratovaním pinu na GND. Dokonca umožňuje nahrávanie novej skice bez problémov, čo samozrejme nie je možné, keď je mikrokontrolér vypnutý.

Poznámka: v prípade problémov skratujte pin RST na zem raz pre 750ms okno pred iniciovaním spánku, alebo dvakrát pre 8s okno, na nahratie novej skice, keď sa niečo pokazí a prebudenie zo spánku nie je jednoduché/možné.

Toto je 61. príspevok #100daystooffload.

Odkazy #