Come posso far funzionare il mio atmega328 per un anno con le batterie?


51

Scenario

Ho creato una bella serratura elettronica per il mio dormitorio. Attualmente è un Arduino Diecimila con un servo [un] che blocca la porta. Ha una tastiera numerica con pulsanti 3x4 e 5 LED (2 coppie serie e un singolo LED). Attualmente funziona anche con un caricabatterie per cellulare.

Ora l'ho riprogettato per funzionare su un Arduino autonomo (ATmega328), ma mi piacerebbe davvero farlo funzionare con batterie AA o anche con una batteria da 9V.

Per quanto riguarda il software, ho pensato di poter effettuare sleepchiamate per determinati periodi all'interno del metodo loop per mantenere il consumo di energia ATmega il più basso possibile. E lascia che i LED "lampeggino" il più a lungo possibile.

Domanda 1

Quando un pulsante viene premuto durante i pochi millisecondi in cui la scheda dorme, verrà "ricordato" / "trattenuto" fino a quando non si disattiva e quindi verrà raccolto come pulsante premuto?

Quale sarebbe il modo migliore per gestire questo pulsante premere su sleep? Posso codificarlo per svegliarmi all'attività del pulsante o devo semplicemente lasciarlo dormire, ad esempio 10 minuti. in ogni ciclo?

Domanda 2

Come affronterei la matematica per calcolare quante batterie AA sono necessarie per far funzionare questo dispositivo per 10 mesi?

Inoltre, non so come misurare il consumo medio di energia al minuto o giù di lì, poiché si alterna rapidamente ecc.

Il dispositivo

Il mio dispositivo di blocco della porta

Risposte:


35

Atmega328 offre sei modalità di risparmio energetico, ordinate dal minimo all'eccellente (consumi attuali stimati da questo post del forum ):

  • SLEEP_MODE_IDLE: 15 mA
  • SLEEP_MODE_ADC: 6,5 mA
  • SLEEP_MODE_PWR_SAVE: 1,62 mA
  • SLEEP_MODE_EXT_STANDBY: 1,62 mA
  • SLEEP_MODE_STANDBY: 0,84 mA
  • SLEEP_MODE_PWR_DOWN: 0,36 mA

Citando la domanda originale:

Ho pensato di poter inserire sleepchiamate per determinati periodi all'interno del metodo loop "

Dovresti utilizzarlo sleep_cpu()dopo aver impostato la modalità di sospensione desiderata, dall'elenco sopra. Arduino Playground ha un post utile a riguardo .

L'applicazione deve essere guidata dall'interruzione, utilizzare ampiamente le modalità di sospensione di cui sopra e riattivare il processore alla pressione dei pulsanti, overflow del timer e eventi timer watchdog per eseguire effettivamente le attività.

Ulteriori risparmi energetici possono essere ottenuti attraverso i seguenti passaggi:

  • Utilizzare l'oscillatore interno del microcontrollore e una frequenza di clock bassa (8 MHz anziché 16), ma assicurarsi che il codice relativo a tempo e temporizzazione continui a funzionare come previsto. A tale scopo potrebbe essere necessaria una versione diversa del bootloader.
  • Evitare di tenere i LED accesi a lungo se l'applicazione li utilizza. L'uso di un flash doppio o triplo rapido di breve durata (0,05 secondi attivi, 0,5 secondi spenti), con intervalli di secondi intermedi, garantisce un'indicazione evidente con un consumo minimo di energia
  • Utilizzare un regolatore di commutazione anziché lineare, se è necessario un regolatore.
  • Far funzionare il microcontrollore a bassa tensione, se supportato, 3,0 volt (ad es. Cella al litio CR2032, non è necessario alcun regolatore) o 3,3 volt invece di 5 volt.
  • Seguire le raccomandazioni nel foglio dati per le impostazioni dei pin di ingresso e uscita non utilizzate per uno spreco di potenza minimo.

L'incorporazione di questi suggerimenti consente di eseguire applicazioni di microcontrollore per settimane o mesi su una singola cella a bottone CR2032 e anni su una cella al litio di tipo LR123. Naturalmente, il chilometraggio può variare in base ai sensori, alle uscite e all'effettiva elaborazione richiesta dall'applicazione.

Alcuni riferimenti utili:


Con la mia esperienza, in SLEEP_MODE_PWR_DOWN puoi portarlo da 0,1uA a 6,0uA se sei stato furbo nel spegnere ogni piccola cosa (come il rilevamento del brown-out). Ho creato build che utilizzano meno di 60uA che durano 3-5 anni su un set di batterie alcaline AA.
Tim Eckel,

@TimEckel Sono pazzo di indicare lo stato con i LED - che consuma budget di energia come se stesse andando fuori moda.
Anindo Ghosh,

3
Non deve. Utilizzare LED ad alta potenza con alta resistenza. Utilizzerà una frazione di mA invece di oltre 20 mA. Inoltre, lampeggia il LED di stato per 5-15 ms ogni pochi secondi anziché essere costantemente acceso. Avevo un LED di stato debole a basso costo che utilizzava 30 mA, l'ho cambiato in LED ad alta potenza con un resistore da 3,3k Ohm che lampeggiavo per 15 ms una volta ogni 8 secondi. Sono passati da 30 mA a 2,9 uA di corrente media, 1/1000 della potenza!
Tim Eckel,

4
@TimEckel Chiaramente non capisci la portata della mia passione per le luci lampeggianti MrGreen Non è come se volessi ridurre l'intensità, mi piacciono quelle piccole cose luccicanti come le fiamme dell'Ade, il bilancio del potere è dannato! Una nota più seria: sono a conoscenza di quei piccoli trucchi, e in effetti ne ho modellati alcuni dei miei, che aumentano l'impatto visivo dell'allarme riducendo la potenza attraverso i LED. Quel commento precedente era ( solo parzialmente ) per scherzo, per andare con le molte divertenti domande a LED a cui rispondo qui.
Anindo Ghosh,

3
Ho misurato il consumo di energia di ATMega328P a diverse tensioni e frequenze e ho
Cano64,

19

Ho un Arduino Pro Mini sulla mia scrivania in questo momento che sta esaurendo 2 batterie AA e potrebbe funzionare per oltre un anno, se necessario.

Ci sono tre aspetti del design che hanno raggiunto questo obiettivo.

1. Un regolatore diverso

Sto usando un regolatore di boost LTC3525. Ha una corrente di quiescenza molto bassa (7uA) e un'alta efficienza (> 90% a 0,2 mA). Qualcosa di simile a questa scheda sparkfun https://www.sparkfun.com/products/8999 dovrebbe fare un lavoro simile. Assicurati di collegarlo al pin 5V su Arduino, non VIN, in modo che il regolatore Arduino non venga utilizzato.

2. Sleeeeeeep

La percentuale di tempo in cui il dispositivo è attivo sarà piccola. Per il resto del tempo il dispositivo dovrebbe essere addormentato in SLEEP_MODE_POWER_DOWN. Puoi basare le tue routine di sonno sulla Libreria a basso consumo Rocketscreem . Secondo quel link dovresti riuscire a farlo scendere a 1,7uA con ADC, BOD e WDT disattivati ​​e in modalità di spegnimento.

3. Interrompe

L'altra metà del sonno è interrotta per svegliarlo. In modalità di spegnimento, solo il livello si interrompe su INT1 e INT2, TWI match e WDT lo riattiverà. Quindi è necessario disporre di un pulsante collegato a INT1 o INT2 in modo che la pressione del pulsante lo riattivi.

Altre cose:

Spegni tutti i LED a meno che non sia assolutamente necessario. Se il blocco è all'interno, i LED non devono essere luminosi, risparmiando più energia. Inoltre, se è necessario che MCU esegua regolarmente alcune attività, utilizzare il timer del watchdog per svegliarlo periodicamente.

Modificare:

Un metodo che può funzionare è utilizzare la libreria Low Power sopra e dormire per circa 60 ms ad ogni loop grazie al timer watchdog. Al risveglio verificare la pressione del pulsante. La funzione da chiamare sarebbe

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

14

Tutti questi commenti sono chiari. Vorrei aggiungere qualche altro suggerimento:

1) Per i LED, utilizzare LED da 20 mA ad alto rendimento. Ecco la logica. Diciamo che vuoi un LED di stato debole che lampeggi ogni 8 secondi. Non vuoi che sia luminoso, quindi usi un LED casuale. Il problema è che un LED fioco utilizza ancora 20 mA (o più) per emettere solo 100 mcd. Invece, ottieni un LED ad alta uscita che è ancora valutato per 20 mA ma può emettere 4000 mcd (assicurati di guardare l'angolo di uscita, probabilmente vorrai comunque che sia di 30 gradi o più). Con questo LED da 4000 mcd, lo colleghi con qualcosa come una resistenza da 3,3 k Ohm e ottieni circa 100 mcd di emissione luminosa, ma stai utilizzando meno di 1 mA. Quindi, invece di utilizzare 20 mA per il LED di stato, stai usando una frazione di un singolo mA. In genere ho anche impostato il tempo di accensione del LED di stato per soli 5-15 ms, il che può anche risparmiare molta energia se in precedenza hai avuto il tempo di attivazione del flash a 100 ms.

2) Il mio regolatore di tensione preferito è il Microchip MCP1700. Utilizza solo 1,6 µA di corrente di riposo ed è super economico (circa $ 0,30 in piccole quantità). L'unica limitazione è che la tensione di ingresso massima è di soli 6 volt, quindi non è possibile utilizzare una batteria da 9 volt. Ma è perfetto per 4 batterie AA, un LiPo a cella singola o due celle a bottone al litio.

3) Per alimentare un circuito ATmega con 4 batterie AA, di solito uso un diodo 1N4001 su VCC per far cadere il massimo 6 volt delle 4 batterie a 5,5 volt. Inoltre, il diodo protegge l'ATmega dalla tensione inversa, quindi ha due scopi utili. In questo modo, posso creare un circuito alimentato a batteria che può utilizzare fino a 0,1 µA durante il sonno in quanto non esiste un regolatore di tensione che consuma corrente continuamente.


8

Ho fatto un test su un atmega328P-PU nudo su una breadboard usando la libreria RocketScream LowPower

Usato questo schizzo:

#include "LowPower.h"

void setup(){}

void loop()
{
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);         
    delay(5000);
}

Con un oro corrente ho misurato 7,25 uA in modalità di spegnimento.


1
Bello! Ci proverò al più presto. Ciò consente di far funzionare un atmega238 per anni con una batteria CR2032?
Basj,

6

Ci sono due domande qui, ma solo la seconda fa davvero parte del titolo della domanda, quindi è probabilmente meglio se ne apri un'altra per la domanda di programmazione di Arduino. Risponderò alla seconda domanda qui.

Una singola batteria alcalina AA da 1,5 V di fascia alta ha una capacità di circa 2600 mAh. Se scegli batterie al litio, puoi ottenere circa 3400 mAh se sei fortunato. Andiamo con quella figura come base per il miglior caso assoluto.

Il modo in cui si calcola il tempo di esecuzione massimo teorico per un carico è semplicemente la capacità divisa per il carico. Se il tuo carico è 1mA, puoi eseguirlo per 3400/1 = 3400 ore = 141 giorni = ~ 5 mesi. Tuttavia, questo è solo un massimo teorico , dal momento che inizierai a ottenere una significativa caduta di tensione di circa il 65% in quel momento. Se stai regolando l'uscita, otterrai un effetto di fuga in cui più bassa è la tensione della batteria, maggiore è la corrente necessaria per mantenere la tensione regolata, che scarica la batteria più velocemente. Sarei sorpreso se riuscissi a ricavarne oltre l'80% della capacità pubblicizzata con una tensione sufficientemente elevata da far funzionare il tuo dispositivo.

Quindi, supponiamo che si ottenga l'80% di quel tempo dopo la caduta di tensione e le inefficienze del regolatore. Partiamo dal presupposto che stai funzionando a 3,3 V da tre batterie in serie. Ciò fornirà comunque la stessa capacità, ma la tensione sarà sufficiente per un regolatore. Se il tuo dispositivo funziona a 15 mA (è una stima piuttosto prudente) i numeri saranno così:

  • Capacità dopo 80% di efficienza = 3400 * 0,8 = 2720 mAh
  • Tempo = 2720/15 = 181 ore = 7.54 giorni

Quindi avresti bisogno di circa 144 batterie al litio (48 set di 3) per eseguirlo per un anno. Non così buono!

Suggerirei invece di utilizzare un'alimentazione CC regolata dalla rete. È possibile includere un backup della batteria, che è facile da configurare con un relè SPDT: basta collegare la bobina alla rete elettrica CC e avere il contatto "off" collegato alla batteria. Quando la CC non funziona, il contatto si interrompe e viene invece utilizzata la batteria.


I miei sogni cordless sono distrutti;) Grazie per la risposta dettagliata. Questa mi è sembrata l'opzione migliore.
LouwHopley,

Per coincidenza, questa era la stessa domanda che mi ponevo quando progettavo una serratura elettronica. Anche con una batteria ricaricabile da 10.000 mAh non ne valeva la pena. Finì solo per usare un adattatore DC 250mA e una vecchia batteria del telefono cellulare come backup.
Polinomio

4
15 mA in media non mi sembrano molto conservativi! Il 328 può funzionare con microampere a una cifra in modalità di sospensione, e sicuramente potresti cavartela con almeno un sonno semi-profondo per la maggior parte del tempo. Inoltre, alle basse frequenze (ad es. 0,5 MHz) è possibile cavarsela con <1 mA in modalità attiva. Naturalmente, altri componenti (regolatori di tensione, ecc.) Devono essere scelti per adattarsi alla natura a bassa potenza.
exscape

4
@Polynomial Non ho esaminato attentamente lo schema, ma sicuramente il progetto potrebbe essere realizzato senza un "LED di alimentazione". Oppure potresti battere le palpebre, in modo che sia acceso, ad esempio a metà luminosità (tramite PWM), solo per dire 25 ms ogni 2 secondi, in modo che l'uso corrente scenda a una media di ~ 0,09 mA invece di 15.
exscape

1
Arduino ha fame di potere. Costruire la propria scheda risolverebbe questo. Atmega328 assorbe 0,2 mA quando 32kH e 0,75 uA in modalità di risparmio energetico.
Vorac,

4

Qualcosa che nessuno ha ancora menzionato: è necessario disporre di un modo per disattivare l'alimentazione + 5V che alimenta il servo, quando non lo si utilizza. Anche quando non si muove, un servo assorbirà comunque energia.

Un FET con gate controllato da un pin I / O di Arduino è un buon modo per farlo.


In genere uso un 2N3904 per ciascun sensore o qualunque cosa per accenderlo / spegnerlo. Oppure, se il sensore è a bassa potenza e la stessa tensione di quello che sto utilizzando l'ATmega, utilizzo semplicemente un pin direttamente per controllare lo stato dell'alimentazione.
Tim Eckel,

1
Utilizzare un 2n7000 per utilizzare una potenza significativamente inferiore rispetto a un 2n3904 e non è necessario un resistore di base.
John Meacham,

3

Potresti prendere in considerazione l'utilizzo di un microcontrollore appositamente ottimizzato per un basso consumo energetico per il tuo prossimo progetto. Per un basso consumo energetico è necessario consumare una potenza molto bassa durante il sonno. Ciò che viene spesso trascurato è che è anche importante quanto velocemente può svegliarsi da questo sonno.

Ciò che conta è quanta carica ci vuole dal sonno più profondo per gestire un interrupt il più velocemente possibile (perché la scarica di energia sarà molto breve allora) e tornare di nuovo a dormire.

Un esempio di tale microcontrollore è MSP430 di Texas Instruments. Sul loro sito Web troverai le note applicative su come conservare le applicazioni di energia e di raccolta dell'energia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.