Risparmio energetico

Ciao a tutti,
ok, questo è il mio primo topic, non sapendo con esattezza se andrà a finire in hardware o software sono stato sul generale...

Ho realizzato un piccolo circuito, usando un motore stepper, un driver e due pulsanti che mandano avanti e indietro questo motore (per farla semplice, in realtà è un po' più complicato). Ora mi trovo a dover ottimizzare il più possibile il consumo energetico, poichè questo progetto dovrà essere attivo 24h/24 365g/365 e alimentato a batteria. Questo circuito sarà montato su qualcosa in movimento e potrà invece essere disattivato quando fermo.
Per dare un'idea, mediamente il mio circuito deve stare acceso/pronto 8 ore a settimana, ma il motore deve fare solo qualche centinaio di spostamenti. Non è possibile utilizzare un interruttore manuale per staccare la batteria.

Ho già provveduto a leggere e fare ricerche sui vari sleep mode, ma ancora non ho una soluzione che mi soddisfa. Tra un movimento e l'altro del motore ho già disabilitato il motore, in modo da limitarne il consumo (non ho problemi a mantenere la posizione dello stepper).

Allo stato attuale io ho ipotizzato due livelli di risparmio energetico:

  1. uno sleep dopo tot secondi di inattività, con risveglio causato dalla pressione di uno dei pulsanti
  2. un "hard sleep" dopo tot minuti/ore di inattività, con risveglio causato dalla pressione di uno dei pulsanti oppure da un micro interruttore di movimento. Per questo step avevo ipotizzato un secondo controllore (attiny85?) a monte del mio arduino principale, che gestisse solamente la batteria e il flusso di corrente all'arduino. In questa situazione è accettabile anche un tempo di risveglio nell'ordine dei secondi.

che ne pensate? dove sto sbagliando? perchè sembra così facile? :smiley:
Grazie mille in anticipo per l'aiuto!

Intanto di che cosa stiamo parlando?
Arduino oppure Atmega standalone? In entrambi i casi, quale?

Poi perché scomodare un secondo microcontrollore? Gli Atmega dispongono di alcuni interrupt esterni denominati INT0, INT1 ecc... (il numero varia in base al tipo di microcontrollore). Questi interrupt sono capaci di risvegliare il microcontrollore anche da stati molto profondi di sonno (quelli più "risparmiosi"). Basta che ricevano un segnale di tipo LOW sul pin corrispondente ed il micro viene riportato in attività.

Ho lavorato parecchio sul risparmio energetico in passato, sia sugli Atmega che sugli Attiny, se hai bisogno di aiuto, chiedi pure.

leo72:
Intanto di che cosa stiamo parlando?
Arduino oppure Atmega standalone? In entrambi i casi, quale?

Poi perché scomodare un secondo microcontrollore? Gli Atmega dispongono di alcuni interrupt esterni denominati INT0, INT1 ecc... (il numero varia in base al tipo di microcontrollore). Questi interrupt sono capaci di risvegliare il microcontrollore anche da stati molto profondi di sonno (quelli più "risparmiosi"). Basta che ricevano un segnale di tipo LOW sul pin corrispondente ed il micro viene riportato in attività.

Ho lavorato parecchio sul risparmio energetico in passato, sia sugli Atmega che sugli Attiny, se hai bisogno di aiuto, chiedi pure.

per il momento il "principale controllore" è un arduino uno, il secondo step sarà con un arduino mini, ma definito il progetto finale credo si potrà semplificare e ottimizzare. Sicuramente si passerà a qualcosa di più compatto, per necessità.

Il secondo microcontrollore mi sembrava una buona idea per risparmiare corrente, l'attiny85 per esempio non consuma meno di un atmega? Se resterò su un arduino come board principale, non c'è un po' troppa componentistica che consuma, oltre alla differenza tra atmega e attiny?
La batteria che potrò utilizzare sarà di circa 750mAh, quindi ogni 0.1mA risparmiato mi farà comodo

Se parliamo di Arduino il risparmio dato dal solo Atmega è relativo, visto che il resto della circuiteria a bordo della scheda continua a lavorare. Anche il Mini ha un regolatore a bordo, bisogna vedere quanto consuma.

Il Tiny85 consuma meno dell'Atmega328 ma se sommi il consumo di 2 chip avrai senz'altro un consumo superiore a quello di un solo microcontrollore.
Inoltre se vai di standalone, puoi non solo abbassare la tensione di alimentazione del chip ma anche la sua frequenza. E sfruttando sleep molto profondi puoi arrivare a consumi dell'ordine dei uA (micro Ampere).

Piuttosto, 750 mAh non è un po' poco per una batteria che deve attivare un motore? Hai fatto i conti del consumo del motore? 8 ore potrebbero svuotarla velocemente.

leo72:
Se parliamo di Arduino il risparmio dato dal solo Atmega è relativo, visto che il resto della circuiteria a bordo della scheda continua a lavorare. Anche il Mini ha un regolatore a bordo, bisogna vedere quanto consuma.

Il Tiny85 consuma meno dell'Atmega328 ma se sommi il consumo di 2 chip avrai senz'altro un consumo superiore a quello di un solo microcontrollore.
Inoltre se vai di standalone, puoi non solo abbassare la tensione di alimentazione del chip ma anche la sua frequenza. E sfruttando sleep molto profondi puoi arrivare a consumi dell'ordine dei uA (micro Ampere).

Ottimo, grazie! è quello che immaginavo...quindi piuttosto che un chip "base" in standalone + una scheda (inutilmente) complessa, mi consigli un solo chip standalone. Faccio due verifiche sull'hw necessario e poi vediamo quanto si può semplificare!

Piuttosto, 750 mAh non è un po' poco per una batteria che deve attivare un motore? Hai fatto i conti del consumo del motore? 8 ore potrebbero svuotarla velocemente.

non è di sicuro molto, ma come dimensioni non ho molte possibilità. Posso forse salire a 1Ah, considera però che il motore non deve funzionare continuativamente. Il motore potrebbe essere questo
http://www.nipponpulse.com/catalog/parts/search/motors-linear-stepper/part_id:65
oppure potrei passare ad un brushless con un sensore di posizione. Per il momento lo stepper è la soluzione più pratica.

Sicuramente un chip standalone, a meno che tu non voglia usare shield per pilotare il motore. Ma non mi pareva il tuo caso.
Capito cosa c'è da pilotare, si sceglie il micro in base alle uscite ed alla quantità di memoria.

Torno sulla questione motore. Quello che hai linkato vedo che lavora a 12V e con corrente di 0,1A. Usando 12V, dovrai abbassare la tensione per il micro, e qui si torna al regolatore di corrente sempre operativo. Dovrai quindi sceglierne uno con un basso consumo, in modo da "limitare i danni" quando il chip è in sleep.

leo72:
Sicuramente un chip standalone, a meno che tu non voglia usare shield per pilotare il motore. Ma non mi pareva il tuo caso.
Capito cosa c'è da pilotare, si sceglie il micro in base alle uscite ed alla quantità di memoria.

Torno sulla questione motore. Quello che hai linkato vedo che lavora a 12V e con corrente di 0,1A. Usando 12V, dovrai abbassare la tensione per il micro, e qui si torna al regolatore di corrente sempre operativo. Dovrai quindi sceglierne uno con un basso consumo, in modo da "limitare i danni" quando il chip è in sleep.

Colpa mia, in realtà il motore è questo
http://www.nipponpulse.com/catalog/parts/search/motors-linear-stepper/part_id:70
ed è alimentato a 5V. Il mio pacco batterie sarà verosimilmente da 7,4V, quindi dovrò comunque abbassare la tensione in qualche maniera.

Grazie ancora per i consigli!

maaaaa usare direttamente il tiny?

comunque un ottimo articolo per arrivare a 0.1uA con un 328 (richiede un minimo di manualità e un programmatore esterno) http://www.sparkfun.com/tutorials/309

notare che è stato settato per

waking up only with an external INT button interrupt or with a 32.768kHz TMR2 overflow interrupt

cioè per accendersi con la pressione di un pulsante o con un overflow del timer, quindi non è necessario un micro esterno per temporizzare le operazioni (certo il timer sballerà un po', vedi swRTC di leo72)

lesto:
maaaaa usare direttamente il tiny?

Ho scritto:

leo72:
Capito cosa c'è da pilotare, si sceglie il micro in base alle uscite ed alla quantità di memoria.

Attendiamo quindi info sul progetto, e poi scegliamo il micro in base alle esigenze.

comunque un ottimo articolo per arrivare a 0.1uA con un 328 (richiede un minimo di manualità e un programmatore esterno) http://www.sparkfun.com/tutorials/309

notare che è stato settato per

waking up only with an external INT button interrupt or with a 32.768kHz TMR2 overflow interrupt

cioè per accendersi con la pressione di un pulsante o con un overflow del timer, quindi non è necessario un micro esterno per temporizzare le operazioni (certo il timer sballerà un po', vedi swRTC di leo72)

Quell'articolo l'ho seguito anch'io quando ho sviluppato il mio Micrologio[/quote], dove ho un Atmega328 alimentato con una comune batteria a bottone CR2032 che uso anche per accendere il display. Consumo in stand-by oscillante medio 1,5 micro Ampere.
Ma essendo un orologio, il chip si risveglia 1 volta al secondo. Se invece non deve fare altro che attendere il verificarsi di un evento esterno, allora si può fermare anche il timer 2 ed il relativo modulo RTC e risparmiare ulteriormente.

Ok, mi avete aperto un nuovo mondo...a questo punto procedo con il resto del progetto e poi vedo cosa mi serve esattamente. Ero molto preoccupato del consumo ma mi sembra di capire che si riesca ad ottenere ottimi risultati.

leo72:
Quell'articolo l'ho seguito anch'io quando ho sviluppato il mio Micrologio, dove ho un Atmega328 alimentato con una comune batteria a bottone CR2032 che uso anche per accendere il display. Consumo in stand-by oscillante medio 1,5 micro Ampere.
Ma essendo un orologio, il chip si risveglia 1 volta al secondo. Se invece non deve fare altro che attendere il verificarsi di un evento esterno, allora si può fermare anche il timer 2 ed il relativo modulo RTC e risparmiare ulteriormente.

Molto interessante, ordino subito il materiale che mi manca e inizio a giocarci un po' anche io! :slight_smile:

Leggiti bene il codice, è tutto ben commentato quindi facilmente capibile.