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!!!
Saludos desde Ecuador...
ResponderEliminarMuchí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
Lástima que no haya respuesta al comentario, también estoy muy interesado.
ResponderEliminarY me ha parecido un artículo muy bueno.
Gracias.
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
ResponderEliminarhola otra cosa se supone que las dos celdas se descargaran a la par,no?
ResponderEliminarMCD : MCD : MCD
ResponderEliminarMCD 오산 출장안마 : 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