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:
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:
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);
}
#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);
}
#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!!!