Capita spesso di ritrovarsi delle batterie di portatili defunti, di cui non si sa cosa farne, la cosa più semplice è spaccarla e recuperarci le celle 18650, ma se poi ci si vuole realizzare qualche progetto, sorge subito il problema di come sapere quanta % di carica ha, il tempo di ricarica, e soprattutto avere un circuito di protezione che eviti esplosioni o eventi del genere.
La prima cosa fondamentale da sapere è che la quasi totalità di queste batterie utilizza SMBus ( Simile a I2C ) ed il protocollo Smart Battery, il quale è uno standard per monitorare i parametri delle batterie nei sistemi elettronici.
Nel nostro caso lavoreremo su una batteria AL10B31.
Fortunatamente del portatile di provenienza è stato possibile reperire lo schema elettrico e quindi avere il pinout della batteria
Ricarica e utilizzo della batteria
La prima cosa interessante è il pin 3, in questo schema è collegato direttamente a massa, ma sulla scheda madre associata alla batteria in mio possesso , invece ho visto che era presente 1kOhm fra questo pin e la massa, quindi ho provveduto a collegare tale resistenza fra il pin 3 e l’8.
È necessario prestare attenzione al fatto che una volta collegato questo pin a massa tramite la resistenza da 1K , è presente la tensione della batteria sui terminali , quindi bisogna evitare di creare cortocircuiti di qualsiasi genere , in quanto , si , probabilmente sono protette anche da corto queste batterie, ma se i cavi dovessero essere sottili invece di andare in protezione, possono ustionarvi le mani.
Per iniziare la ricarica, si possono applicare 12.6 volt fra il pin 8(-) e il pin 1(+) da un alimentatore con limitazione di corrente minore di 1.5-2 ampere.
Il fatto della limitazione di corrente e del voltaggio sono cose ESSENZIALI, pena nel peggior dei casi, incendi o esplosioni.
Collegamento con arduino
Una volta creato lo sketch arduino , prima di includere la libreria, è necessario impostare alcuni parametri
SDA_PIN , SDA_PORT , SCL_PIN , SCL_PORT
Nel mio caso utilizzando un arduino mega 2560, ho utilizzato
#define SDA_PIN 3
#define SDA_PORT PORTD
#define SCL_PIN 2
#define SCL_PORT PORTD
#define I2C_SLOWMODE 1
Lo sketch che utilizzo per monitorare i parametri è il seguente
byte deviceAddress = 11;
#define VOLTAGE 0x09
#define TEMPERATURE 0x08
#define CURRENT 0x0a
#define CAPACITY 0x10
#define TIME_TO_FULL 0x13
#define CHARGE 0x0d
void setup()
{
pinMode(22,INPUT_PULLUP);
pinMode(23,INPUT_PULLUP);
Serial.begin(115200); // start serial for output
Serial.println(i2c_init());
pinMode(22,INPUT_PULLUP);
pinMode(23,INPUT_PULLUP);
scan();
}
unsigned int fetchWord(byte func)
{
i2c_start(deviceAddress<<1 | I2C_WRITE);
i2c_write(func);
i2c_rep_start(deviceAddress<<1 | I2C_READ);
byte b1 = i2c_read(false);
byte b2 = i2c_read(true);
i2c_stop();
return (unsigned int)b1|(((unsigned int)b2)<<8);
}
void scan()
{
byte i = 0;
for ( i= 0; i < 127; i++ )
{
Serial.print(“Indirizzo “);Serial.print(i);
bool ack = i2c_start(i<<1 | I2C_WRITE);
if ( ack )
Serial.println(“OK”);
else
Serial.println(“NO”);
i2c_stop();
}
}
void loop()
{
Serial.print(“Voltaggio: “);
Serial.println(fetchWord(VOLTAGE));
Serial.print(“Temperatura: “);
unsigned int tempk = fetchWord(TEMPERATURE);
float tempc = ((float)tempk)/10.0-273.15;
Serial.println(tempc);
Serial.print(“Corrente (mA):” );
Serial.println(fetchWord(CURRENT));
Serial.print(“Capacità (mAh):” );
Serial.println(fetchWord(CAPACITY));
Serial.print(“Carica: “);Serial.print(fetchWord(CHARGE));
Serial.print(” Minuti rimanenti alla carica completa: “);
Serial.println(fetchWord(TIME_TO_FULL));
delay(5000);
}
Questo sketch all’avvio fa una scansione del bus per trovare le periferiche e poi di default si collega alla batteria che si trova all’indirizzo 0x11.
A livello hardware, per eseguire il collegamento, è necessario collegare 2 resistenze di pullup da 10K verso +5v sui pin SCL e SDA e collegare MBDATA e MBCLK rispettivamente con SDA ed SCL su arduino.
Per poter monitorare altri parametri, è possibile consultare la documentazione di smart battery all’indirizzo http://sbs-forum.org/specs/sbdat110.pdf
Ricordo di evitare di caricare batterie al litio in modo sperimentale senza essere presenti durante la carica.
Ciao Tiziano,
ho scoperto solo ora il tuo articolo e lo reputo molto interessante. Avrei una domanda per te: perché per la ricarica, applichi 12.6 volt fra il pin 8(-) e il pin 1(+) quando la batteria è da 11.1V?
Grazie
Le Li-Ion sono nominali 3.7 da li 11.1V ma in carica completata invece sono a 4.2V che moltiplicato per 3S fa 12.6V