Batterie LiPo e Arduino

Buonasera a tutti! Ho acquistato da un po' uno starter kit, e facendo alcune prove per un progetto, mi è sorta la necessità di monitorare lo stato di carica di una batteria, per rimuoverla e ricaricarla quando necessario. Ora ho letto un po' in giro e ho visto che dal singolo ingresso per avere una lettura approssimativa del voltaggio residuo posso piazzare un partitore e andare di proporzione (ed in effetti potrebbe essere più che sufficiente). Ho visto che con la batteria che ho (12,47V a pieno carico), piazzando due resistenze, una da 1532 e l'altra da 988, ottengo 4,88V in uscita. La corrente misurata tra positivo e fine resistenza più grande è 12mA, misurando tra positivo che esce dal partitore e negativo ho letto circa 6mA. Che corrente può sopportare l'ingresso di arduino? Se alzassi le le resistenze dovrei diminuire le correnti in generale diminuendo il consumo della batteria dovuto al partitore?

Integrati che fanno già questo lavoro ma per batterie 12V ne esistono? Ho visto quelli MAX170XX ma sono per batterie 1s o 2s.

Ciao, essendo il tuo primo post, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto ;)) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

gpb01: Ciao, essendo il tuo primo post, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto ;)) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

Chiedo Venia, non avevo visto la sezione presentazioni, l'avevo cercata ma erroneamente non usando il tasto Search...

Ho postato poco fa nella discussione delle presentazioni.

La cella LiPO ha una tensione nominale di 3.7V che arriva a piena carica a circa 4.2V.

Mettendo in serie più celle (2S, 3S, 4S, ecc.) si ottengono tensioni superiori, ma la ricarica corretta richiede un carica batterie specifico per LiPO munito di bilanciatore: ecco perché nelle batterie c'è quel connettore particolare aggiuntivo.

Se hai una 3S, la tensione nominale è 3 x 3.7 = 11.1V (12.6V a piena carica), quindi hai bisogno di un partitore resistivo con rapporto 3 a 1.

Un partitore 20k più 10k è l'ideale poiché assorbe pochissimo (0.4mA) e ti fornisce la tensione della singola cella equivalente: quando è scesa al di sotto di 3V è il momento di ricaricare.

cyberhs: La cella LiPO ha una tensione nominale di 3.7V che arriva a piena carica a circa 4.2V.

Mettendo in serie più celle (2S, 3S, 4S, ecc.) si ottengono tensioni superiori, ma la ricarica corretta richiede un carica batterie specifico per LiPO munito di bilanciatore: ecco perché nelle batterie c'è quel connettore particolare aggiuntivo.

Se hai una 3S, la tensione nominale è 3 x 3.7 = 11.1V (12.6V a piena carica), quindi hai bisogno di un partitore resistivo con rapporto 3 a 1.

Un partitore 20k più 10k è l'ideale poiché assorbe pochissimo (0.4mA) e ti fornisce la tensione della singola cella equivalente: quando è scesa al di sotto di 3V è il momento di ricaricare.

Grazie mille! Esattamente cosa mi serviva sapere.

Devo solo vedere se ho già disposizione quelle resistenze. Io volevo fare un sistema con luci led che indichino più o meno i livello di carica. E tenermi il margine un po' sopra il minimo di sicurezza dei 3V. La mia comunque, da voltmetro indica 12,47V a pieno carico, di conseguenza dovrebbe uscire qualcosa meno sull'ingresso arduino.

Sono riuscito a recuperare le resistenze e a imbastire un circuitino al volo.
Però testandolo ho alcuni intoppi che non capisco.
Usando un Voltmetro prima di collegarlo ad Arduino, onde evitare sovraccarichi, ho visto che la lettura era 3.98/4V collegando un alimentatore a parete da 12V, quindi ho provato a collegarlo alla scheda con uno Sketch che leggeva l’analogread relativo e mi doveva scrivere sul seriale l’equivalente valore 0/1023 del votlaggio, con un calcolo a spanne doveva essere più o meno 820. Solo che non era minimamente regolare, e il valore tendeva a rarissimi sprazzi a fermarsi su quel valore.
Mentre da Voltmetro era stabile.

Inoltre ho notato che anche senza carico collegato facendo analogread sui peidini e printando dava dei valori attorno al 300, mi sembra anche quelli leggermente oscillanti…

Mi sono perso qualcosa da inserire lungo il circuito o potrebbe essere un problema della scheda?
La scheda è una Arduino UNO Rev. 3

Probabilmente lo sketch interroga continuamente l'ingresso analogico e non dai tempo al condensatore del convertitore AD di caricarsi.

Inserisci un ritardo di 500ms tra le letture.

Potrebbe anche essere del rumore proveniente dall'alimentazione: metti un condensatore da 100n tra l'ingresso analogico ed il ground.

Avevo inserito un delay(1500) per avere modo di leggere con calma i valori che mi sputava fuori, questo perché tanto, anche a sistema finito, a me serve solo che a grandi linee mi informi con dei led quando la carica scende ai famosi 3,3/3,4 per cella per staccare la batteria e ricaricarla.

Il condensatore lo devo mettere in pratica dove prelevo i V che vanno all'ingresso A0?

E' normale che comunque dia un valore non zero (circa 300) a ingresso scollegato? Lo fa anche su A1 e mi pare A2, poi non ho più provato sugli altri.

Il condensatore in pratica va inserito in parallelo al ramo basso del partitore.

Se non ottieni un risultato soddisfacente, inserisci un elettrolitico da 10μ

L'ingresso analogico è ad alta impedenza e se lo lasci scollegato ti fornisce un valore quasi casuale.

Perfetto, funziona... Ero un pirla io, che mi era sfuggita una terra...

Collegando solo il partitore legge perfettamente il valore e sono riuscito anche ad inserire nello sketch il modo di restituirmi il valore in Volt della batteria. Ho inserito anche i LED che indicano la carica della batteria. Solo che risolto un problema se ne presenta un altro...

Ho notato la cosa però, solo implementando il partitore nella scheda di alimentazione del progettino. In pratica quando mettevo a terra i LED collegati ad Arduino la lettura passava da 12,36V a 12,56V (quella non è l'effettiva che arriva al pin, è solo la lettura moltiplicata per il coefficiente del partitore), presumo ovviamente sia il fatto che i LED hanno delle resistenze per farli funzionare e vanno a modificare il valore del partitore?

Per ora il sistema è costituito da un regolatore di tensione L7805 con i suoi relativi condensatori (10uF, 100uF elettrolitici e due da 100pF ceramici), il tutto alimentato attraverso connettore JST della serie XH. Il partitore l'ho inserito tra l'ingresso sul JST ed il nodo dove si collega la terra del regolatore. Ho inserito come consigliato anche un condensatore da 100pF nel partitore, che ho visto funzionava discretamente.

Da questo dovrei alimentare una serie di led IR ed una videocamera ad infrarossi, direttamente a 12V dalla batteria, ed un visore crt di una videocamera a V attraverso il regolatore. Sicuramente collegando questa roba andrei a modificare il valore del partitore rischiando danni ad Arduino?

Ho notato però che se collego ai 5V del L7805 un LED la lettura non cambia, mentre cambia di 0.03V se lo collego alla 12V della batteria. Come potrei fare per disaccoppiare il partitore dal sistema? Un alternativa che ho pensato mentre scrivevo qui potrebbe essere che, dato che la batteria come tutte le LiPo ha il cavetto di bilanciamento, potrei collegare ad uno dei due connettori il sistema di alimentazione, mentre all'altro potrei collegare il partitore e mandare il segnale ad arduino. Potrebbe funzionare?

Soluzioni senza fare sto rigirio ci potrebbero essere? Un diodo?

Ho la quasi certezza di non essere stato chiaro, quindi se avete voglia di darmi qualche consiglio, chiedetemi pure cosa ho spiegato male.

Se dovesse servire, appena ho qualche minuto tra domani sera e Sabato faccio uno schema in Fritzing e metto un paio di immagini magari più esplificative...

Grazie mille!

I condensatori che indichi da 100pF devono essere da 100nF (100000pF).

Il 7805 regge un massimo di 1A con dissipatore e non credo possa alimentare anche un CRT.

A questo punto aspettiamo uno schema elettrico.

Ciao, si scusami, era 100nF. Mi sono confuso.. Il CRT comunque è una cosa minuscola, stasera magari quando sono a casa faccio una foto all'accrocchio prototipale del visore e se riesco metto uno schema con fritzing...

Allego un paio di immagini del mio accrocchio attuale…
Come ho testato il partitore montato sulla Breadboard lunga, collegando una breadboard ad un connettore della batteria e arduino UNO all’altro.

Questo è invece il prototipo del visore montato provvisoriamente su una tavoletta di compensato.
La scheda di alimentazione montata ora sul legno verrà sostituita da quella in basso. dove è inserita la Arduino Micro.

Il partitore pensavo di metterlo sulla microforata con la micro e collegata come nella prova ai connettori diversi della batteria.

Ho notato che con le resistenze montate sulla breadboard ho un effetto strano.
Con il voltmetro ai capi della resistenza montata tra v-out e gnd leggo 3,95V, nella schermata seriale di arduino invece mi dà 4.06V, ho notato però che collegando la terra che attiva i LED non mi varia la lettura del pin A03. Quindi forse ho ottenuto ciò che mi serviva.

Vi copio il codice che ho usato, magari ho sbagliato qualcosa io e per quello mi esce un risultato, anche se di poco, sbagliato.

const int partitore = A3;
float lettura = 0.00;
float Voltaggio = 0.00;
int ledPin25 = 13;
int ledPin50 = 12;
int ledPin75 = 8;
int ledPin100 = 7;

void setup() {
  Serial.begin(9600);
  pinMode(ledPin25, OUTPUT);
  pinMode(ledPin50, OUTPUT);
  pinMode(ledPin75, OUTPUT);
  pinMode(ledPin100, OUTPUT);

}

void loop(){

  lettura = analogRead(partitore);
  Voltaggio = (lettura/1023)*5*1;
  Serial.print("Voltaggio: ");
  Serial.println(Voltaggio, 2);
  delay(500);
  if (lettura<655){
    digitalWrite(ledPin25, LOW);
    digitalWrite(ledPin50, LOW);
    digitalWrite(ledPin75, LOW);
    digitalWrite(ledPin100, LOW);
  }
  else {
     if (lettura<707){
    digitalWrite(ledPin25, HIGH);
    digitalWrite(ledPin50, LOW);
    digitalWrite(ledPin75, LOW);
    digitalWrite(ledPin100, LOW);
  }
  else {
     if (lettura<759){
    digitalWrite(ledPin25, HIGH);
    digitalWrite(ledPin50, HIGH);
    digitalWrite(ledPin75, LOW);
    digitalWrite(ledPin100, LOW);
  }
  else {
    if (lettura<811){
    digitalWrite(ledPin25, HIGH);
    digitalWrite(ledPin50, HIGH);
    digitalWrite(ledPin75, HIGH);
    digitalWrite(ledPin100, LOW);
  }
  else{
    digitalWrite(ledPin25, HIGH);
    digitalWrite(ledPin50, HIGH);
    digitalWrite(ledPin75, HIGH);
    digitalWrite(ledPin100, HIGH); 
  }
}
}
}
}