Tener basso il consumo, usando solo un paio di pin.

Buonasera a tutti cari "colleghi"... scrivo per chiedere un vostro parere.. tale quesito afferisce sia al reparto "software", sia se vogliamo a quello hardware...quindi nel dubbio mi sono messo nella sezione generale. Sono ai miei inizi in questo ambito quindi non so se i valori che ottengo sono buoni, ottimi, o scandalosi. Premetto che ho cercato già moltissimo sul web, ma pur essendoci moltissimi articoli, quasi mai si scende nel dettaglio con casi pratici, ma piuttosto trovavo sempre articoli "tecnici" fini a se stessi.

Ecco il mio problema...devo realizzare un progetto basato su Arduino Pro Mini 5V 16Mhz. Arduino non deve fare un granchè, semplicemente leggere un centinaio di volte al secondo un valore analogico qualora questo supera la soglia impostata di "allarme", o in alternativa (con un "if" legato al fatto se è premuto o meno un bottone) tenere sotto controllo un input digitale qualora anche in questo caso venga segnalato un HIGH sopo uno stato di perenne LOW. Ora, il problema è che, per fare queste semplicissime operazioni il Pro Mini mi consuma circa 20mAh, che non è proprio pochissimo considerando che ho scelto Pro Mini (anche ) per la questione di consumo. Ho provato a utilizzare librerie come la Narcoleptic, ma considerando che non ho un granchè di delay presenti nel codice (alla fine legge di continuo l'analogico e lo compara al valore soglia) non ha modo di intervenire e quindi non mi aiuta per niente. Aggiungo che i consumi sono imputabili essenzialmente all'Arduino in quanto le altre cose collegate sono semplicemente una fotoresistenza (l'analogico che dicevamo) e un sensore PIR (il digitale, che consuma solo 0,3mA in LOW e poco più di picco in HIGH)...

Conoscete qualche libreria che può aiutarmi, o qualche porzione di codice che può fare al caso mio? Considerando che a me non serve la seriale, non serve proprio nulla tranne l'ADC (almeno credo) c'è qualche modo per abbassare i consumi? Dovrei collegare il tutto a una batteria 9V, quindi con un 20mAh ci duro solo un 25 ore...

Ringrazio tutti coloro che sapranno (o perlomeno cercheranno) di aiutarmi...

Se devi eseguire un'azione solo quando c'è un determinato livello di segnale su un pin la meglio è usare uno dei 2 pin a cui sono agganciati gli interrupt esterni, il D2 ed il D3, e poi tenere il micro fisso in sleep profondo durante tutto il suo funzionamento. http://playground.arduino.cc/Learning/arduinoSleepCode

Ma se parliamo di "Arduino" non risparmierai non granché perché così facendo "addormenti" solo il chip, il resto dell'elettronica (non molta, parlando di Pro Mini, ma qualcosa c'è) resta comunque sotto tensione.

invece se non usi un arduino e sole porte and ?

leo72: Se devi eseguire un'azione solo quando c'è un determinato livello di segnale su un pin la meglio è usare uno dei 2 pin a cui sono agganciati gli interrupt esterni, il D2 ed il D3, e poi tenere il micro fisso in sleep profondo durante tutto il suo funzionamento. http://playground.arduino.cc/Learning/arduinoSleepCode

Ma se parliamo di "Arduino" non risparmierai non granché perché così facendo "addormenti" solo il chip, il resto dell'elettronica (non molta, parlando di Pro Mini, ma qualcosa c'è) resta comunque sotto tensione.

il problema è che arduino non può essere addormentato quando è nel caso della lettura dell'analogico perchè svariate volte al secondo deve leggere, campionare, e comparare con il mio valore limite. Quindi CPU (si chiama cosi ?!) e ADC devono per forza funzionare...in più deve essere molto reattivo, mentre molte librerie low power avvisano che il "tempo di risveglio" è di meno di un secondo, ma c'è, e per l'utilizzo che devo farne (fotografico) è limitante... Da ignorante volevo capire...se non uso ad esempio tutto il comparto della comunicazione seriale (che un suo consumo ce l'ha)...posso spegnere solo quello? C'è un modo? in giro ho trovato un sacco di codice di basso livello ma da ignorante non lo comprendo e non riesco a usarlo... Avevo visto delle librerie appunto, la sleep.h se non erro...dove c'erano vari livelli di "addormentamento" ma l'ADC veniva subito ammazzato mentre a me serve eccome...

Lucailvec: invece se non usi un arduino e sole porte and ?

immagino si tratti di componenti elettronici...ci avevo pensato, ma il fatto è che se questo aggeggio funziona poi vorrei espanderlo, magari con un LCD e altri componenti quindi mi serve qualcosa di comunque un minimo complesso che possa "ragionare" e dialogare con altre cose...

no perchè deve essere per forza connesso all adc ? puoi usarlo coi pin di interrupt, giocando con le resistenze e la caduta di tensione su di esse, riesci ad usare la fotoresistenza con i pin di interrupt. Bisogna solamente vedere la corrente che che attraversa le resistenze e calcolarle in modo da mettere la soglia via "hardware" al posto di quella software.

giorgio90: il problema è che arduino non può essere addormentato quando è nel caso della lettura dell'analogico

Lo puoi mandare in sleep eccome tra una lettura ADC e l'altra, usa un timer per risvegliare il micro periodicamente, p.e. 10 volte al secondo che tanto di più non serve con una fotoresistenza, leggi i sensore e torna in sleep se non devi fare altro, vedrai che il consumo medio scende drasticamente sotto i 100 uAh

Arduino non deve fare un granchè, semplicemente leggere un centinaio di volte al secondo un valore analogico

Ma non sono un po troppe letture in un secondo? ... ce la fa l'ADC ad aggiornarsi quando ci sono variazioni significative?

Lucailvec: no perchè deve essere per forza connesso all adc ? puoi usarlo coi pin di interrupt, giocando con le resistenze e la caduta di tensione su di esse, riesci ad usare la fotoresistenza con i pin di interrupt. Bisogna solamente vedere la corrente che che attraversa le resistenze e calcolarle in modo da mettere la soglia via "hardware" al posto di quella software.

mi devo documentare meglio su questa cosa allora, anche se avrei voluto evitare di ricorrere ai pin di interrupt per il lento tempo di risveglio ma sopratutto perchè se un domani espando le funzioni e ci aggiungo altri sensori poi i pin di interrupt non basteranno... Comunque, ora che mi hai mostrato che la cosa è fattibile anche con un analogico, mi voglio informare di più, anche per pura conoscenza...grazie...

astrobeed:

giorgio90: il problema è che arduino non può essere addormentato quando è nel caso della lettura dell'analogico

Lo puoi mandare in sleep eccome tra una lettura ADC e l'altra, usa un timer per risvegliare il micro periodicamente, p.e. 10 volte al secondo che tanto di più non serve con una fotoresistenza, leggi i sensore e torna in sleep se non devi fare altro, vedrai che il consumo medio scende drasticamente sotto i 100 uAh

Ecco questa è una cosa interessante che avevo in dubbio. La fotoresistenza mi serve per rilevare un valore di luce istantaneo...praticamente la fotoresistenza deve segnalarmi quando "vede" il lampo di un flash, che avviene ovviamente in una frazione di secondo...ecco da dove viene la mia ipotesi di 100 letture al secondo...secondo te 10 non sono troppo poche per una cosa del genere? Purtroppo non avendo esperienza non so valutare se ce ne vogliono 10,100 o 1000 al secondo. Sono andato a intuito... Considerando che io avevo pensato di fare 100 letture al secondo (quindi un delay di 10ms a fine loop) "l'addormentamento" non lo potevo fare appunto perchè come delay minimo è richiesto da 16ms fino a 8s. Facendo 10 letture al secondo (quindi delay fine loop da 100ms) invece la cosa si può fare tranquillamente. Il mio unico dubbio è che 10 letture sono poche e tutto mi diventa poco reattivo ai segnali istantanei , chiedo quindi conferma in base alla vostra esperienza...

pablos:

Arduino non deve fare un granchè, semplicemente leggere un centinaio di volte al secondo un valore analogico

Ma non sono un po troppe letture in un secondo? ... ce la fa l'ADC ad aggiornarsi quando ci sono variazioni significative?

Tempo fa lessi in un altro post qui sul forum, dove appunto si parlava di ADC, che questo può arrivare anche a 9000 letture al secondo, quindi 100 non mi sembra moltissimo a paragone, è quasi due ordini di grandezza di meno...Ho anche provato nella pratica e la fotoresistenza è ottimamente reattiva...Tuttavia il mio dubbio (non avendo esperienza su cui basarmi) è che 100 sia sovrastimato e non serva, ma basta un valore più basso...diciamo che il mio paletto è che la fotoresistenza si accorga del lampo...che faccia 100 letture o 5 non so valutare quale basti, ma a me importa che il lampo venga riconosciuto...

ringrazio tutti coloro che mi stanno aiutando, grazie alle vostre risposte scopro sempre cose nuove e interessanti...

giorgio90: Ecco questa è una cosa interessante che avevo in dubbio. La fotoresistenza mi serve per rilevare un valore di luce istantaneo...praticamente la fotoresistenza deve segnalarmi quando "vede" il lampo di un flash, che avviene ovviamente in una frazione di secondo...ecco da dove viene la mia ipotesi di 100 letture al secondo...secondo te 10 non sono troppo poche per una cosa del genere?

Prima di tutto le fotoresistenze sono dispositivi molto lenti, tipicamente ci mettono tra i 50 e i 100 ms per arrivare al loro valore resistivo minimo se illuminate al massimo, addirittura ci mettono diversi secondi per tornare alla resistenza massima, quella di dark, quando poste al buio. Una fotoresistenza non è un sensore adatto per rilevare il lampo di un flash, fenomeno che al massimo dura meno di 2 ms se scattato alla massima intensità, solitamente dura meno di 0.5 ms con valori minimi prossimi a 0.05 ms, dipende da come viene regolato manualmente o cosa decide il suo automatismo. Al posto della fotoresistenza è meglio se usi un fotodiodo, dispositivi enormemente più veloci, anche il più scarso ha una banda reale di diverse decine di kHz, contro i 150-200 Hz delle fotoresistenze. Ora tutto dipende da cosa devi fare dal momento in cui rilevi il flash e quanta latenza è accettabile, la soluzione ideale è utilizzare il comparatore analogico del 328p, funziona anche durante lo sleep e genera un interrupt quando si supera la relativa soglia, il che ti permette di tenere il micro in sleep per tutto il tempo che non c'è il flash, o il pir, ottenendo un consumo medio molto basso per quanto riguarda il micro. Però c'è tutto il resto del pro mini, che alla fine è un ARDUINO UNO miniaturizzato, che consuma corrente a partire dal regolatore di tensione e il convertitore USB, alla fine molto difficilmente riesci a scendere sotto i 5-6 mA complessivi per il solo Arduino. Forse ti conviene valutare l'uso di una batteria LiPo 7.2V da 1000 mAh, è poco più grande di una 9V e ti garantirebbe diversi giorni di autonomia.

La fotoresistenza mi serve per rilevare un valore di luce istantaneo...praticamente la fotoresistenza deve segnalarmi quando "vede" il lampo di un flash, che avviene ovviamente in una frazione di secondo...ecco da dove viene la mia ipotesi di 100 letture al secondo...secondo te 10 non sono troppo poche per una cosa del genere?

Il fotoresistore LDR ha una velocità non entusiasmante: ti consiglio un fototransistor/fotodiodo.

Tarando con un trimmer la sensibilità del sensore, puoi evitare di usare l'ingresso analogico a favore di un ingresso digitale usato con external interrupt.

cyberhs: Tarando con un trimmer la sensibilità del sensore, puoi evitare di usare l'ingresso analogico a favore di un ingresso digitale usato con external interrupt.

Buona anche questa, usando un opamp e qualche resistenza si crea un comparatore a soglia esterno, regolabile, e può sfruttare i due pin di interrupt, flash e pir, per risvegliare l'ATmega dallo sleep profondo, solo 0.1 uA, però non so fino a che punto vale la pena di "dannarsi" per minimizzare il consumo del micro quando tutto il resto consuma molto di più :)

astrobeed:
Prima di tutto le fotoresistenze sono dispositivi molto lenti, tipicamente ci mettono tra i 50 e i 100 ms per arrivare al loro valore resistivo minimo se illuminate al massimo, addirittura ci mettono diversi secondi per tornare alla resistenza massima, quella di dark, quando poste al buio.
Una fotoresistenza non è un sensore adatto per rilevare il lampo di un flash, fenomeno che al massimo dura meno di 2 ms se scattato alla massima intensità, solitamente dura meno di 0.5 ms con valori minimi prossimi a 0.05 ms, dipende da come viene regolato manualmente o cosa decide il suo automatismo.
Al posto della fotoresistenza è meglio se usi un fotodiodo, dispositivi enormemente più veloci, anche il più scarso ha una banda reale di diverse decine di kHz, contro i 150-200 Hz delle fotoresistenze.
Ora tutto dipende da cosa devi fare dal momento in cui rilevi il flash e quanta latenza è accettabile, la soluzione ideale è utilizzare il comparatore analogico del 328p, funziona anche durante lo sleep e genera un interrupt quando si supera la relativa soglia, il che ti permette di tenere il micro in sleep per tutto il tempo che non c’è il flash, o il pir, ottenendo un consumo medio molto basso per quanto riguarda il micro.
Però c’è tutto il resto del pro mini, che alla fine è un ARDUINO UNO miniaturizzato, che consuma corrente a partire dal regolatore di tensione e il convertitore USB, alla fine molto difficilmente riesci a scendere sotto i 5-6 mA complessivi per il solo Arduino.
Forse ti conviene valutare l’uso di una batteria LiPo 7.2V da 1000 mAh, è poco più grande di una 9V e ti garantirebbe diversi giorni di autonomia.

Allora, ti rispondo con ordine in base a quello che mi hai domandato…:

Per quanto riguarda la fotoresistenza, sapevo che non sono il top, tuttavia con un tempo rapido di aggiornamento mi avevano sempre soddisfatto alla grande, e difatti anche in questo caso il lampo lo vede e funziona il tutto…non utilizzo quelle piccole classiche, ma questa, sempre che influenzi più di tanto…:

Sicuramente un fotodiodo è meglio, ma avendo sempre usato le fotoresistenze (con buoni risultati) onestamente non ci avevo mai manco pensato ai fotodiodi, vedendoli come qualcosa di più specifico e mangiacorrente (ricordo vagamente che quella che vidi io mangiava quei comodi 20mAh da sola)…
se non ti rubo troppo tempo, potresti linkarmene qualcuno che potrebbe fare al caso mio, il più economico possibile ? (sono studente e questi alla fine sono solo esperimenti)…

Il procedimento che viene svolto è :
Arduino, tramite fotoresistenza, legge la luce ambiente e crea un valore di riferimento. Quando un lampo crea un valore analogico di lettura più alto della luce ambiente allora immediatamente viene fatta scattare la focamera (che ho collegato tramite un 4N35). Tutto qui…alla fine anche se c’è un ritardo di qualche decina di millisecondi non mi interessa, ovviamente non deve esserci un ritardo di un secondo, quello no…idem per il pir…

Per quanto riguarda il comparatore analogico, come funziona?
L’ADC non serve comunque, dovendo campionare il segnale analogico? (parlo da ignorante, perdonatemi se dico fesserie)

Arrivare a consumare 5-6mAh mi va bene, alla fine con una batteria da 9V (motivo per cui il regolatore mi va di lusso on board) ci faccio un 100 ore e la cosa è più che accettabile considerando che non è un dispositivo da tenere acceso 24h/24 ma solo apposta per i vari esperimenti, della durata chessò massimo di un paio d’ore a volta…quindi la necessità di andare a usare uno standalone (con lo sbattimento di farlo, reperire i pezzi, e spendere anche più di pro mini) non c’è.
Deve essere una cosa molto economica, e già mettendoci una lipo, con tutti i problemi di carica/scarica, e necessità di un circuito di ricarica, diventa un macello. Alla fine come dicevo già arrivare a 100 ore è ottimo, considerando che la 9V costa pressappoco 1 euro, e per cambiarla basta un semplice stacca-attacca, la cosa pende assolutamente verso i 9V, considerando appunto che con 1 euro di batteria posso usarla per 50 volte con un uso ogni volta di due ore, quindi se ci “gioco” un paio di volte a settimana, mi durerebbe teoricamente quasi metà anno.

cyberhs:

La fotoresistenza mi serve per rilevare un valore di luce istantaneo…praticamente la fotoresistenza deve segnalarmi quando “vede” il lampo di un flash, che avviene ovviamente in una frazione di secondo…ecco da dove viene la mia ipotesi di 100 letture al secondo…secondo te 10 non sono troppo poche per una cosa del genere?

Il fotoresistore LDR ha una velocità non entusiasmante: ti consiglio un fototransistor/fotodiodo.

Tarando con un trimmer la sensibilità del sensore, puoi evitare di usare l’ingresso analogico a favore di un ingresso digitale usato con external interrupt.

questa cosa è molto interessante, devo studiarla meglio per eventuali prossimi utilizzi…come dicevo vorrei evitare di usare i due pin di interrupt, perchè se poi devo aggiungere altre funzionalità e il codice non è ottimizzato per consumare poco, alla fine i pin interrupt quelli sono… ti ringrazio comunque per lo spunto che approfondirò…

giorgio90: Da ignorante volevo capire...se non uso ad esempio tutto il comparto della comunicazione seriale (che un suo consumo ce l'ha)...posso spegnere solo quello? C'è un modo? in giro ho trovato un sacco di codice di basso livello ma da ignorante non lo comprendo e non riesco a usarlo...

Certo che sì. Puoi fisicamente "staccare la corrente" a tutto quel che non ti serve, in modo da ridurre al minimo i consumi. All'uopo c'è il registro PRR (datasheet pag. 44) con cui puoi spengere le periferiche che non usi, compresi anche i timer (non togliere l'alimentazione al timer 0 se usi i delay e/o millis altrimenti si blocca il codice).

leo72:

giorgio90: Da ignorante volevo capire...se non uso ad esempio tutto il comparto della comunicazione seriale (che un suo consumo ce l'ha)...posso spegnere solo quello? C'è un modo? in giro ho trovato un sacco di codice di basso livello ma da ignorante non lo comprendo e non riesco a usarlo...

Certo che sì. Puoi fisicamente "staccare la corrente" a tutto quel che non ti serve, in modo da ridurre al minimo i consumi. All'uopo c'è il registro PRR (datasheet pag. 44) con cui puoi spengere le periferiche che non usi, compresi anche i timer (non togliere l'alimentazione al timer 0 se usi i delay e/o millis altrimenti si blocca il codice).

Ecco questa era una delle cose che avevo trovato, ma nella pratica non so cosa scrivere...come dicevo, in giro ho travato un sacco di codici ma non so come usarli...qui se mi pare di aver ben capito dovrei scrivere nel setup una cosa del genere...:

ADCSRA = 0;
PRR = B10010111;

con gli 0 e gli 1 in base a cosa tenere acceso e spento secondo questa griglia...giusto?

Nel mio caso cosa devo spegnere e cosa tenere acceso?

Se poni ad 1 il bit della periferica interessata la spengi, se lo poni a 0 la riaccendi (logica inversa).

Ad esempio, per spengere la seriale, che è la USART0, devi porre ad 1 il relativo bit:

PRR |= (1<<PRUSART0);

per riaccenderla:

PRR &= ~(1<<PRUSART0);

Per capire come si manipolano i registri, puoi far riferimento a questo mio articolo. Tratta delle porte logiche ma la matematica usata è identica.

leo72:
Se poni ad 1 il bit della periferica interessata la spengi, se lo poni a 0 la riaccendi (logica inversa).

Ad esempio, per spengere la seriale, che è la USART0, devi porre ad 1 il relativo bit:

PRR |= (1<<PRUSART0);

per riaccenderla:

PRR &= ~(1<<PRUSART0);

Per capire come si manipolano i registri, puoi far riferimento a questo mio articolo. Tratta delle porte logiche ma la matematica usata è identica.

Molte grazie Leo !!!
Nel mio caso oltre al timer0 che mi serve per mantenere vivi i delay, e l’ADC per campionare l’analogico, cosa altro mi serve? Posso spegnere tutto il resto? Non uso comunicazioni seriali, quindi di sicuro l’USART non serve, da quello che ricordo a sto punto non dovrebbe servirmi manco lo SPI e il TWI, i timer 1 e 2 invece a cosa servono? mi sono utili?

L'SPI la puoi spengere se non usi schede ethernet o SD, che dialogano tramite il connettore ISP dell'Arduino. I timer 1 e 2, se non usi il PWM, puoi disattivarli (a meno che qualche libreria che stai usando non li utilizzi). Il TWI è l'I2C, anche in questo caso puoi spengerlo se non lo usi.

leo72: L'SPI la puoi spengere se non usi schede ethernet o SD, che dialogano tramite il connettore ISP dell'Arduino. I timer 1 e 2, se non usi il PWM, puoi disattivarli (a meno che qualche libreria che stai usando non li utilizzi). Il TWI è l'I2C, anche in questo caso puoi spengerlo se non lo usi.

Perfetto, non uso nulla di questi componenti...spengo tutto !!!!!!

mi confermi che con questa porzione di codice posta in setup spengo definitivamente quelle componenti?

PRR = B11001110;

perdonate, ma non è possibile usare un attiny85 per la semplice lettura del fotodiodo o della fotoresistenza? poi, dopo che la lettura è avvenuta, far salire a livello logico alto un pin, collegato a un pin interrupt dell arduino mini

dopotutto, un attiny 85 se a 1MHZ consuma 300 uA in modalità attiva e 0,1 in sleep. poi, sl posto che usare il regolatore di tensione della scheda pro, meglio usare un MCP1702, con bassa caduta di tensione, consumo di 2uA di corrente di quiescenza con uscita massima di 250mAh

giorgio90: mi confermi che con questa porzione di codice posta in setup spengo definitivamente quelle componenti?

PRR = B11001110;

Dal datasheet, tu stacchi: TWI, TIMER2, TIMER1, SPI, USART.