Check out the new blog at http://linuxehacking.ovh , this one will no longer be updated

sabato 29 marzo 2014

Ricaricare una batteria di Acer Aspire One e monitorarne i parametri con arduino

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


Per il collegamento con arduino le cose sono leggermente più complesse invece, ma completamente fattibili.
Per poter dialogare con SMBus, è necessario usare una libreria software per I2C reperibile qui http://playground.arduino.cc/Main/SoftwareI2CLibrary .
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

Questi parametri corrispondono all'utilizzare il pin 19 per SCL ed il pin 18 per SDA , nel caso si utilizzi un arduino diverso qui https://spreadsheets.google.com/pub?key=rtHw_R6eVL140KS9_G8GPkA&gid=0 è possibile consultare la mappatura delle porte AVR con i pin arduino.

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.

2 commenti:

  1. Hi tell where to connect "+" and where "-" the power unit of this battery It is red "+" and blue "-" a wire?

    RispondiElimina
  2. I would like know how you find of the laptop battery address.

    RispondiElimina