lunes, 23 de diciembre de 2013

Monitorizar batería LiPo con Arduino

Trasteando con mi nuevo proyecto me surgió la “problemática” de poder controlar el estado de la batería lipo de 2 celdas que utiliza.

Voy a hacer una pequeña introducción para refrescar conocimientos, para los que los tengáis frescos saltaros esto.
Estas baterías se usan mucho en modelísmo y tienen una fama regular por su inestabilidad si se las trata mal (descargas totales, exposición a altas temperaturas,...). Yo tengo que decir que en todas las pruebas que he realizado y en el tiempo que llevo trasteando con ellas no he tenido ningún problema siempre que se las cuide un poco.

El uso de este tipo de batería es muy atractivo para nuestros proyectos, debido al pequeño tamaño y a la intensidad que pueden llegar a entregar.
Una batería LiPo sencilla entrega 3,7 voltios (un pelin escaso en un proyecto normal con Arduino) por lo tanto tendremos que usar por lo menos una de doble celda o 2S. ¿Que es esto? pues dos baterías sencillas conectadas en serie, por lo tanto una 2S entregara 7,4V.
Esquema 1
 Para su buena conservación la tensión de cada celda no debe de bajar de los 3,3V. Pero como están en serie puede descargarse mas una de las celdas. Para controlar esto traen un terminal intermedio (conector RC desde el que se cargan) que es en donde tenemos que monitorizar el estado de dichas celdas.


Existen soluciones comerciales que nos avisaran de cuando una de las celdas bajo de los 3,3V. Si no te apetece trastear es una buena solución los venden en ebay muy baratos.


Empezando a Trastear:


Antes de empezar tenemos que tener claro que vamos a utilizar voltajes que mal usados podrían llegar a dañar nuestra placa Arduino.  
Para poder medir la tensión de las celdas vamos a usar 2 de las entradas analógicas de nuestro Arduino.
Del conector RC usaremos las conexiones de 3,7v y 7,4v (roja y amarilla del esquema 1), los positivos de las celdas , la masa no la tendremos que conectar a la masa del Arduino ya que es la misma que lo alimenta.
Primer problema!! las entadas analógicas miden de 0 a 5V para la primera celda no hay problema ¿pero para la de 7,4v? Solución, un maravilloso divisor resistivo!!!. Colocaremos 2 resistencias del mismo valor 1k en serie entre la masa y los 7,4v y si medimos entre las dos resistencias tendremos la mitad de la tensión (3,7) la cual si lo podremos medir con la entrada analógica.  
Esquema 2
Ya tenemos el montaje del circuito y ahora toca la programación. Antes de ponernos a entender el código (que tampoco es que sea nada difícil...) hay que saber como nos muestra Arduino las medidas analógicas.
Nos devolverá 1023 cuando tengamos 5 voltios y 0 cuando tengamos 0 voltios por lo tanto si queremos saber que voltios tenemos solo tendremos que hacer una regla de tres (Medida*5)/1023.

Como se puede ver en el esquema 1 el valor que nos da la celda 2 es la suma de la celda 1 y la celda 2. Para calcular la tensión de la segunda celda tendremos que multiplicarla por 2 (debido a que el divisor resistivo divide la tensión a la mitad) y a esto restarle el valor de la primera celda ValorCelda2=(Celda2*2)-Celda1.


Bueno pues aclarado esto analicemos el código:


#define PinCelda1 A0
#define PinCelda2 A1

int Celda1 = 0;
int Celda2 = 0;
float VoltiosCelda1=0;
float VoltiosCelda2=0;

void setup()
{
  Serial.begin(9600);
}


void loop()
{
  // Lee y guarda en las variables
  Celda1 = analogRead(PinCelda1);  
  Celda2 = analogRead(PinCelda2);

  // Calcular el valor de la celda 2
  Celda2=(Celda2*2)-Celda1;

  // Pasa la lectura a voltios
  // si no se pone .0 elimina decimales
  VoltiosCelda1=(Celda1*5)/1023.0;
  VoltiosCelda2=(Celda2*5)/1023.0; 
  
  // Muestra los resultados
  Serial.print("S1 = ");
  Serial.print(VoltiosCelda1);
  Serial.print("V --- S2 = ");
  Serial.print(VoltiosCelda2);
  Serial.print("V ------ ");
  Serial.print(Celda1);
  Serial.print(" - ");
  Serial.println(Celda2);
  
  // Para el flujo durante medio segundo
  delay(500);
}

Hay que tener precaución de desconectar las resistencias del conector RC cuando terminemos de usar nuestro proyecto ya que a través del divisor resistivo poco a poco nos puede descargar la batería.


Basado en este código he preparado una librería que facilita su uso en nuestros proyectos:


#include <LiPo.h>

#define PinCelda1 A3
#define PinCelda2 A4
#define PinSalida 13

LiPo Bateria(PinCelda1,PinCelda2,PinSalida);

void setup(){
  Serial.begin(9600);
}

void loop(){
  if(Bateria.Comprueba()){
    Serial.println("Bateria BAJA");
  }
  Serial.print(Bateria.TensionCelda1());
  Serial.print(" - ");
  Serial.println(Bateria.TensionCelda2());
  delay(1000);
}

Cuando ejecutemos Bateria.Comprueba()  nos entregara un false si esta dentro de los parámetros y un true si la batería esta baja y pondrá a HIGH el PinSalida para poder encender un led o controlar un circuito que detenga el funcionamiento del proyecto.
Se puede poner en el PinSalida un circuito con un inversor y un diodo led bicolor para que nos indique el estado, por ejemplo de un color verde y cambiando a rojo cuando la batería este baja.

En otra entrada colgare una librería para ejecutar código cada X tiempo sin detener el flujo del loop().
La ventaja de esto es que nuestro programa continuara un su normal ejecución y por ejemplo cada minuto comprobara el estado de la batería.

Bueno pues a trastear!!!


5 comentarios:

  1. Saludos desde Ecuador...

    Muchísimas gracias Roberto por tremendo aporte me esta ayudando mucho en el proyecto que estoy desarrollando. Tengo también algunas dudas que tal vez tu las puedas despejar:
    1. Estoy trabajando dos baterías Venom 20C 2S 5400mAh 7.4 LiPO, las cuales estoy utilizando para alimentar dos motores con caja reductora y el resto de la electrónica que son un arduino y una raspberry. La idea es tener un circuito que me permita cargar estas baterías con seguridad y de la misma forma que me permita obtener la energía de las baterías. Qué me podrías recomendar hacer para este tipo de baterías???

    2. Estado investigando y he visto que se habla mucho de las PCM para cargar las baterías de LIPo, este es el circuito que necesito para mi proyecto?? y si es así cual me recomendarías para el tipo de baterías que estoy utilizando??

    Me preocupa bastante este asunto por que se que este tipo de baterías son muy especiales incluso vinieron con una conexión extra que según se es el balanceador

    De antemano te agradezco la atención a mi pedido

    Gracias

    ResponderEliminar
  2. Lástima que no haya respuesta al comentario, también estoy muy interesado.
    Y me ha parecido un artículo muy bueno.

    Gracias.

    ResponderEliminar
  3. hola mi idea es conectar un modulo de arduino que hace el efecto de indicador de carga de bateria,lleva 4 leds y la forma es como una pila,lleva 4 pines para la conexion al arduino,la cuestion seria programarlo,si la bate esta a 100 que esten los 4 leds encendidos y al 50 pues 2 leds(creo que tienen dos colores verde y rojo)entonces cuando este al 25 algo mas de el minimo que carga de las lipo que pase a color rojo

    ResponderEliminar
  4. hola otra cosa se supone que las dos celdas se descargaran a la par,no?

    ResponderEliminar
  5. MCD : MCD : MCD
    MCD 오산 출장안마 : MCD. 과천 출장안마 A complete, all-in-one sound engine, 남양주 출장마사지 capable of producing up to 60 FM FM (12-bit) stereo 양주 출장샵 sounds at once. 오산 출장마사지 It was the first software package that

    ResponderEliminar