Lettura tensione batteria Lipo con arduino nano

Buon giorno a tutti, sto realizzando un telecomando con arduino nano ed una batteria lipo 1S, un display Oled, dei pulsanti ed il transceiver NRF24.
Alla Lipo c'è collegato un circuito di carica (TP4056) ed uno step-up (ho bisogno dei 5Vdc per il display).
Volevo leggere lo stato della batteria e tenerla monitorato, e visto che il TP4056 ha l'indicazione di carica, prelevare con due mosfet il segnale dei led indicativi e portarli a due ingressi digitali.
Ho collegato tutto, ma non funziona....non fa esattamente come voglio.
Quando apro il mosfet della lettura, nonostante con il tester legga 0V su A0 arduino legge qualcosa....
Come mai?
Accetto critiche e consigli-
Grazie.

Prova ad aggiungere una resistenza da 100/200 Kohm (il valore non è critico) tra A0 e GND.
BTW, non vedo bene l'NRF alimentato dal 3.3V dell'arduino nano, che io mi ricordi non è in grado di fornire la corrente necessaria.

Ciao, Ale.

Giustamente, se A0 rimane non collegato, capta disturbi. Non capisco, però, a che cosa serva il mosfet: lascia la batteria collegata ad A0.

Perchè se non lo interrompo, quando spengo la 5V, arduino si alimenta dall'ingrasso analogico, consumando la batteria...

Grazie Ale,effettivamente l'avevo anche disegnata... :laughing:
Chiedo se qualcuno ha mai usato il TP4056....perchè vorrei prelevare il segnale in uscita dai due led per visualizzarli sul display Oled, ma il problema è che non ci riesco, arduino non legge correttamente lo stato dei led.

Devi leggere sui catodi: livello basso = LED acceso.

se non lo interrompo, quando spengo la 5V, arduino si alimenta dall'ingresso analogico, consumando la batteria...

Basterebbe un interruttore doppio, ma puoi anche fare un partitore ad alta impedenza, con un consumo trascurabile, abbassando poi l'impedenza dinamica con un 100nF verso massa. Io l'ho fatto nel mio contatore Geiger con 1M e 270k e funziona benissimo. Tra l'altro, lo stesso pin viene normalmente usato come uscita per un LED e solo ogni tanto (30 secondi?) viene commutato per un attimo in ingresso per leggere la tensione della batteria. La tensione che esce dal partitore non è sufficiente per portare in conduzione il LED, che quindi non interferisce con la lettura.


Nello schema, il mosfet e il diodo servono per commutare l'alimentazione da USB e quella dalla batteria. Quando sono presenti i 5V USB, viene comunque letta la tensione della batteria facendo vedere lo stato della carica.

1 Like

Si, si chiama phantom power, l'alimentazione all'MCU viene fornita dal diodo a protezione dell'ingresso. Puoi comunque mettere in serie una resistenza da 10/20 Kohm, aggiungendo un condensatore da 0,1 uF tra A0 e GND, in questo caso l'MCU non avrà la corrente necessaria ad avviarsi, e l'eventaule assorbimento dovrebbe essere irrilevante (prova comunque a misurarlo). Altrimenti puoi fare un partitore di tensione con resistenze di alto valore (nell'ordine di 100K) ed impostare il Vref su INTERNAL (1,1 Volt), sempre mantenendo il condensatore tra A0 e GND.

Ciao, Ale.

P.S.: mentro scrivevo vedo che @Datman è già arrivato alla mia stessa conclusione... :grinning:

Grazie Datman, mi hai illuminato...
Effettivamente non ci avevo pensato,metto un alta impedenza in ingresso ed uso la tensione di reference interno che è sempre fisso a 1.1 per le conversioni.
L'istruzione analogReference(INTERNAL) basta metterla nel setup, corretto??
Quindi poi la scala è 1.1V=1024 corretto?
Ti chiedo una cosa, che non ho capito bene....la LIPO solitamente è da 3V a 4,1V, come fai ad alimentare arduino quando è alimentato a batteria?Chi ti da la 5Vdc?
E' forse lo zenner da 4.7Vdc?

Sì.
Per quanto riguarda la tensione di alimentazione, nel programma ho previsto la possibilità di usare un convertitore a 5V, ma poi ho preferito alimentare tutto direttamente dalla tensione della batteria o dai 5V esterni quando presenti. Per il PWM che pilota lo strumentino tengo sotto controllo la tensione della batteria e applico una correzione in base a questa:

unsigned long XVref=1000; // Valore iniziale in mV, che sarà poi calcolato in base a VrefDec: XVref=0,94*(1000+VrefDec).  
int VrefDec=100; // Valore iniziale, che sarà poi letto da EEPROM o impostato di default.  

loop():
//...
if (millis()-t3>999) // Una volta al secondo:
  {
  // ...
  pinMode(A2,INPUT);
  delayMicroseconds(100);
  analogRead(A2); // Prelettura
  Vcc=int(analogRead(A2)*XVref/1000L); // Legge la tensione di alimentazione.
  pinMode(A2,OUTPUT);
  piloLED(); // Ripristina lo stato dei LED.

  if(analogOut)
    {
    anOut=((log10(uSvph)+2)*51); // log10(0,01)=-2; log10(1000)=3
    if(pwr==0) anOut=int(anOut*635/Vcc); // Se è alimentato direttamente da Litio (605=3V) o 5V in carica.
    else     anOut=int(anOut*635/1024); // Se è alimentato a 5V fissi.
    if(anOut<0) anOut=0; else if(anOut>255) anOut=255;
    analogWrite(6,anOut); 
    }
    //...
  }  

Scusa Datman, ma ancora non capisco come lo alimenti arduino...
Ho capito che, per come hai concepito il circuito, quando è alimentato da USB (quindi con batteria in carica) la Vcc è di 5V (o giù di li....valore dell'USB), mentre quando stacchi la USB la Vcc viene presa dalla batteria attraverso il mosfet e grazie al diodo non torna indietro...corretto?
A questo punto però, la Vcc varia dai 4.1Vdc dell Lipo carica ai 3Vdc di quando è scarica.....giusto?
Quindi come fai la 5Vdc per far girare arduino?
Ho guardato i catodi dei led del TP4056, ma hanno dei valori molto strani...non hanno logica 1-0....è per quello che ho messo dei mosfet, ma non si muovono correttamente.
Il datasheet del TP dice che pin 6 e pin 7 sono "When the battery is being charged, the
pin is pulled low by an internal switch, otherwise pin is in high impedance state"

Come ho già scritto, funziona tutto a 5V o a 4,2...3,2V.

Per i pin 6 e 7, metti 10...47k in parallelo a ciascun LED, oppure imposta gli ingressi come INPUT_PULLUP.

Datman, grazie per la risposta; io purtroppo continuo a non capire come fa a funzionare con la tensione così bassa...
Mi picarebbe capire meglio, non mi piacciono i copia incolla e va tutto...vorrei capire come funziona...
Inoltre la parte di programma che hai postato è relativa allo strumento analogico che si vede nel tuo schema?
Perchè vedo che usi dei logaritmi e non capisco il calcolo che fai...

Sì, serve per ottenere dal PWM valori indipendenti dalla tensione di alimentazione. Il logaritmo serve per quell'uso specifico, perché la scala che ho disegnato sullo strumento riporta 0,01-0,1-1-10-100-1000uSv/h e le suddivisioni 2-3-5 per ogni decade.

Ah ok, quella parte è chiara....
L'alimentazione per me resta un mistero...
L'oled ha bisogno dei 5Vdc, dove li prelevo ?
Basta la Lipo da 3-4V?
Ti prego, spiegami meglio il discorso che hai fatto con la batteria, non mi è chiaro come generi i 5V per arduino....perchè se non ho capito male quando manca la 5V della USB, il mosfet va in conduzione e da energia alla Vcc, ma la sua tensione è quella di una cella Lipo...come fa ad avere 5Vdc arduino?
Come alimento il display Oled?
Scusami ma voglio capire bene questa cosa...

Se il display ha veramente bisogno di 5V, metti un convertitore.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.