bclose

MEDIDOR DE CARGA BATERIAS Li-Po

Comprobando la situación de las baterías
CategoríaProyecto de usuario
AutorSuso
Fecha06/05/2016
ConceptoMedidor de carga de baterías LIPO.
DescripciónUn proyecto que combina un LCD de 16×02 y un Arduino Nano para montar un medidor de carga de baterías
DificultadMedia

 

 

Material requerido.

Imagen de Arduino UNOArduino Nano (también vale el Uno o el Mega)
Display LCDUn display LCD, de 16×2 o LCD 20×4, I2C.
componente3 x Resistencias de 330 Ω

 

rojo verde amarillo 3 LEDs, rojo, amarillo y verde
ProtoboardUna Protoboard .
conexionesAlgunos cables de protoboard, preferiblemente Dupont macho/hembra.
PotPotenciómetro de 10K
Multimetro sencillo Multimetro

 

Diagrama de conexion

 

Esquema proto board

El funcionamiento es muy sencillo. Arduino lee por la entrada analógica A0 el voltaje que tiene la batería, y lo compara con la referencia de 5V, que es a la que él trabaja, mostrando dicho voltaje por el display LCD.

Así mismo, hace un cálculo del porcentaje de carga de dicha batería, en base a que a plena carga (4.2V) nos dará el 100% y a 3.2V la carga será del 0%. Esto valores vienen porque estas baterías a plena carga arrojan un valor de 4.2V y durante su uso, el voltaje de las mismas no debe caer por debajo de 3.2V pues se pueden ir dañando y mermar sus capacidades. Se puede modificar el valor de carga mínima con tan solo modificarlo en el sketch.

Para un control a simple vista, se utilizan tres LEDs de colores verde, amarillo y rojo. El primer estará encendido hasta una carga del 40%. A partir de ahí se encenderá el amarillo hasta que la carga sea del 10% en el que se enciende el rojo, indicándonos que pronto habrá que recargar la la batería.

Igualmente, estos porcentajes se pueden modificar en el sketch y darles otros rangos.

El potenciómetro lo utilizamos como offset (Ajuste de voltaje). El proyecto está ideado para alimentarlo con una fuente externa de 5V, como puede ser un cargador de móvil y un cable modificado para alimentar la protoboard con esos 5V. De esta manera, alimentamos a Arduino y al display LCD.

Muestra la medida de voltaje

Como los cargadores o fuentes no siempre entregan 5V exactos, y pueden oscilar entre 4.85V y 4.90V (también 5.3V), Arduino estará alimentado por ese voltaje, y su ADC (Conversor Analógico Digital) también, y hará la conversión en base a ese voltaje, no a 5V. Pero en el sketch hacemos el cálculo en base a 5V y debemos corregir esa diferencia.

Para eso usamos el potenciometro,y seleccionando entre un rango de valores predeterminado podemos ajustar esa diferencia, con la ayuda de un multímetro. Una vez ajustado, ya no es necesario mientras usemos la misma fuente de alimentación.

El condensador de 100uF le he colocado para estabilizar un poco la tensión de alimentación, y evitar demasiadas fluctuaciones.

En esta foto se muestra la precisión comparado con un multímetro. Se puede observar que para la fuente de alimentación utilizada, el offset se estableció en 42.

COnfirmando con la medida del voltimetro

 

El programa de control

 

Este es el sketch

/* Sensor de voltaje para baterías Li-Po de una celda (1S).
   * Se toma el voltaje de la batería a través de la entrada A0.
   * Se muestra el voltaje y el porcentaje de carga por un display LCD I2C 1602
   * Además, tenemos tres LEDs que se van encendiendo dependiendo de la carga.
   * verde = hasta 40%
   * amarillo = hasta
   *   4.2 = 100% (máximo voltaje, máxima carga)
   *   3.2 = 0%   (mínimo voltaje de seguridad)
   *  
   * IMPORTANTE: La tensión que entra por USB o por el pin de 5V (Nano),
   * afecta a la precisión, ya que ésta puede ser difente de 5.0V en algunos mV.
   * El ADC utiliza el voltaje de alimentación como voltaje de referencia.
   * Utilizamos un potenciómetro para regular el voltaje de offset, y regular
   * la precisión, con la ayuda de un multímetro.
   *
   *
   * Por Suso. 19/04/2016
   */

  #include <LiquidCrystal_I2C.h>
  #include <Wire.h>
    /* Funcion de configuracion de pines del modulo 
       LCD/I2C (Direccion,en,rw,rs,d4,d5,d6,d7,backlight,polaridad)
    */

  LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
  byte pinV=A0; // Para leer el voltaje
  byte ledR=12; // LED rojo
  byte ledA=11; // LED amarillo
  byte ledV=10; // LED verde  

  float voltaje=0.0;
  int medida=0;
  int porcent=0;
  int pinOffset=A1;
  float offset=0.0;
  int valorPot = 0;

  unsigned long tAntes =0; // para el refresco de pantalla
  unsigned long tAhora =0;
  unsigned long tEjec =10000;

  void setup() 
     { lcd.begin(16,2); // inicializamos el LCD.
       lcd.backlight(); // encendemos la retroiluminación.
       pinMode(ledR, OUTPUT);
       pinMode(ledA, OUTPUT);
       pinMode(ledV, OUTPUT);
       Serial.begin(9600);
       digitalWrite(ledR, LOW);
       digitalWrite(ledA, LOW);
       digitalWrite(ledV, HIGH);
     }

void loop() 
    { tAhora = millis();              // Comprobamos para refrescar el LCD
      if( tAhora - tAntes >= tEjec)
        {  // cada 10 segundos
           tAntes = tAhora; // actualizamos variables
           lcd.clear();     // Refrescamos
        }

    medida = analogRead(pinV); // Leemos voltaje de la batería
    valorPot = analogRead(pinOffset); //Leemos ajuste de offset
    int ajuste = map (valorPot, 0,1023,60,5); // Mapeamos a un rango más corto

/* Podemos jugar con los dos últimos valores de la función map. Cuanta más diferencia
   haya entre ellos, menos precisión tendremos con el potenciómetro.
   El valor más grande es para voltajes más lejanos de 5V. El más pequeño para
   las fuentes muy cercanas a 5V. Así, con una fuente de 4.90V el valor de offset será
   de 9 ó 10.
*/

offset = (ajuste/100.0);
lcd.setCursor(12,1);
lcd.print (offset);
voltaje= ((((medida*5.0)/1023.0))- offset); // Convertimos a valor con decimales
if (voltaje<=0)
   { // Si es menor o igual a cero
     voltaje=0.0;  // Le damos valor 0, para evitar negativos
   }

porcent=((voltaje*100)-320); // Fórmula para mostrar el porcentaje de carga
if(porcent<=0)
   { // Evitamos valores negativos
     porcent=0;
   }

// Condicionales para encender los LEDs
if(porcent>=41)
  {  digitalWrite(ledR, LOW);
     digitalWrite(ledA, LOW);
     digitalWrite(ledV, HIGH);
  }

if(porcent<41 && porcent>10)
  {  digitalWrite(ledR, LOW);
     digitalWrite(ledA, HIGH);
     digitalWrite(ledV, LOW);
  }

if(porcent<=10)
  {  digitalWrite(ledR, HIGH);
     digitalWrite(ledA, LOW);
     digitalWrite(ledV, LOW);
  }

lcd.setCursor(0,0);
lcd.print("Voltaje: ");
lcd.print(voltaje);
lcd.print("V");
lcd.setCursor(0,1);
lcd.print("Carga: ");
lcd.print(porcent);
lcd.print("%    ");

//Descomentar para mostrar por monitor serial.
//Serial.print(medida); Serial.print("   ");
//Serial.print(voltaje);Serial.print("   ");
//Serial.print(porcent); Serial.println("%");

delay(1000);
}

Aquí una foto del medidor funcionando, con una batería de móvil en desuso:

Prototipo de medidor

Podríamos añadir un buzzer que nos avisara también cuando el nivel de voltaje llegase a un límite crítico.

Espero le guste.

Saludos.

01/05/2016

 

 

 

 

(66) Comments

    • Shafick Cruz

    Hola! Gracias por el tutorial. Exatamente lo que buscava.
    Podria esplanar con mas detalhes las lineas:
    porcent=((voltaje*100)-320); (que reprsenta el 320?)
    int ajuste = map (valorPot, 0,1023,60,5); (hay una grand explanacion acerca de esta linea, pero todavia no lo comprendi.)
    Y la funcion de offset. Tambien quede con duda acerca de su empleo en la formula.
    Gracias.

    • Hola, el -320 es para hacer que con 3.2V sea un 0% de batería ya que no es bueno descargarlas por debajo de ese voltaje. La segunda instrucción es para mapear la entrada analógica, o sea para convertir los valores de 0 a 1023 de 60 a 5.

  • Hola, si solo disponemos de una batería de 9V que valores de la instrucción habría que cambiar para hacer funcionar el circuito correctamente ? Gracias de antemano.

    • Hola Hassan, puedes usar un regulador para bajar el voltaje a 5V y alimentar arduino con eso.

    • Bruno

    Hola, exelente proyecto. tengo una prgunta. Necesito alimentar el arduino con una bateria, y medir el estado de esa bateria tambien, ya sea su carga como su voltage. Como podria conectarlo? ya que si conecto la bateria al pin A0 y a su vez a 5v, cuando este cargando siempre va a sensar 5 v ya que A0 va a estar conectado al cargador y a la bateria a la vez. Gracias

    • Hola Bruno, pues es una buena pregunta. En principio se me ocurre que puedes usar un boost converter de la batería a alimentación de Arduino para garantizar que la entrada sea siempre 5V, y así tendrías una referencia estable. Por lo demás conectarías la batería sin pasar por el boost al A0. Ya nos contarás si te funciona. Un saludo.

  • hola, tengo un problema ya cuando voy a compilar me aparece error en esta parte “LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);” nose si sera la libreria i2c que estoy usando, me podrian proporcionar la que utilizaron?
    y en la lcd no aparece nada de lo que se deveria de ver ni tampoco al darle reset al arduino tampoco reinicia la lcd
    ya lo prove con 2 arduinos y la lcd esta bn ya la prove.
    gracias.

    • Hola Juan, A medida que el tiempo pasa, el IDE arduino va cmabiando y las librerias deben actualizarse. Busca en google el nombre de la libreria mas github que es donde se publican las actualizaciones e instalate la ultima a ver si se corrige el error ¿Vale?

    • Hola Juan.

      Evidentemente, como dice Admin, es la librería. En el momento que escribí ese sketchs, usé una versión de la librería que no es la actual. Debes cambiar tan solo dos líneas (si no recuerdo mal):

      LiquidCrystal_I2C lcd(0x27, 16, 2);

      … y esta:

      lcd.begin();

      Saludos.

  • hola, tengo una duda, para alimentar el arduino con la misma fuente que se medira, que le debo de cambiar planeo usar un arduino nano y una bateria de 3.7v y no habra problema en la medicion?

    • Hola Raúl, con conectar una salida de la batería a un pin analógico de Arduino debería valer. El resto el proceso sería el mismo que el del proyecto.

  • Que tal, muchas gracias por el tutorial, estoy realizando un proyecto con arduino, motor shield, varios motores dc de 3.3v y un raspberry, la principal dificultad que tengo es en la autonomia del proyecto, ya que se gastan muchas baterias. Quiero utilizar una bateria lipo como principal fuente de energia, pero no tengo idea como obtener de la misma bateria los 7.5 V para el arduino, los 5v para el motor shield y el raspberry, y 3,3 para otros motores. Si existe alguna manera que no exceda en tamaño y peso, y si no, cual seria la mejor forma de obtener estos voltajes. De antemano muchas gracias

    • Hola William.

      Lo que pides es algo dificil: batería de bastante autonomía, bastante potencia, pero que sea pequeña y pese poco.

      En primer lugar, no tienes que alimentar a Arduino con 7.5V. Puedes hacerlo con 5V desde el pin “5V” de la misma placa. Así te evitas el regulador líneal que es poco eficiente y no malgastas esos 2.5V en calor disipado.
      Puedes optar por una batería Li-Po de 7.4V que las tienes desde los 850mAh hasta los 5200mAh. Luego necesitas dos conversores DC-DC Buck o step-down. Uno para bajar hasta los 5V y el otro para los 3.3V.
      Lo más caro de todo esto es la batería, dependiendo del modelo que escojas. Los convertidores cuestan menos de 2€. Otra cosas que debes comprar es el cargador especial para estas baterías, con lo que debes valorar si el presupuesto te lo permite.

      La otra opción es una batería de gel, o ácido-plomo de 6V, que es más voluminosa y pesada, pero el cargador no es tan caro. De hecho, casi puedes armar uno tú mismo.

      Saludos.

      • Muchas gracias Jesús por la respuesta.
        Según entiendo, lo mejor seria bajar el voltaje de 7.5v a 5v y 3.3v conectando en paralelo a la batería 2 conversores DC-DC Buck o step-down para obtener dichos voltajes, estoy en lo correcto?. No existe algún riesgo que pueda ocurrir si los conecto de esta manera ( dígase problemas de sobrecalentamiento o explosiones). E investigado por ahi que existen módulos para medir el voltaje de las baterías lipo para evitar que se descargen de manera peligrosa, es conveniente utilizarlos con los conversores DC-DC Buck o step-down? De antemano muchas gracias por su respuesta.
        Saludos.

        • Por nada.

          El tema de alimentar a Arduino con 7.5V es que desperdicias voltaje, ya que el micro trabaja con 5V. Y como estás trabajando con baterias hay que economizar cada voltio. Eso sí, deben ser 5V casi exactos. Por suerte los convertidores DC-DC tienen bastante estabilidad.
          En efecto. Debes conectar en paralelo sendos convertidores, uno para cada voltaje que necesita tu proyecto. Por sobrecalentamiento, no deberías preocuparte en principio, a no ser por la parte de los motores, que hay que ver cuánto consumen todos juntos. Un DC-DC Buck como el LM2596 aguanta 2A.
          El tema de que se descargue la batería de forma peligrosa, conozco un DC-DC Boost de 3.3V-5V que trae incluido ese sistema, pero es para baterías de 3.7V (1S). También ya hay módulos cargadores TP4056 mejorados que traen ese sistema, pero lo mismo, es para cargar baterías de 3.7V.
          No conozco módulo alguno para baterías de 7.4V (2S) que tengan ese sistema, pero imagino que navegando un poco puede que encuentres algo. En principio se me ocurre que, currándotelo un poco, añadas al sketch una parte que vaya sensando el voltaje de la batería, (con un divisor resistivo pues hablamos de 7.4V) y que cuando se acerque a la zona crítica te avise con un zumbador o similar. Hay otra forma también de hacerlo, la cual se me ocurrió una vez, la probé y funcionó. Se trata de añadir un sistema de “autodesconexión” con un pulsador y un relé. Para poner en marcha el sistema debes pulsar brevemente el pulsador hasta que se enclave el relé y quede alimentado Arduino y todo el sistema. Luego puedes soltar el botón ya que Arduino se encarga de mantener la bobina del relé energizada y, por lo tanto, entrando corriente desde la fuente de alimentación (batería en tu caso) a todo el circuito. Cuando Arduino detecte, con condicionales, que el voltaje ha llegado a la zona crítica, desactiva el relé, deja de entrar corriente al circuito, todo se apaga, y la batería no sigue entregando corriente.

          Sé que es un poco rollo lo que te he soltado, pero bueno, son opciones. Bucea por Internet a ver si existe algún módulo para proteger de la descarga excesiva a las baterías de 7.4V

          Saludos.

        • Hola William.
          Para 2 baterias de 3,7v puestas en 2S usa un PCM, no deja que baje el voltaje a menos de 3.2v ni que se carguen a mas de 4.2, tenes que usar 2 PCM, se conectan en serie igual que las baterias.

    • Rodrigo Gaete

    el valor del medidor de carga de batería cuanto es? y me gustaría saber cual es valor también añadiendo el buzzer

    • No se lo que me preguntas Rodrigo

    • Javier

    Muy interesante el proyecto, existiría forma de ver esos datos mediante un modulo Bluetooth y una aplicacion android?
    Un saludo.

    • Los datos ya los tienes en el Arduino, o sea que si encuentras una aplicación con la que leer lo que le llega del Arduino no tendrías más que enviarlos con un módulo Bluetooth. Un saludo.

    • Claro que si. Basta con que conectes el circuito a un Bluetooth HC_06 por ejemplo y te conectes desde el movil. Cada vez que imprimes el valor en el display puedes enviarselo a la puerta serie del bluetooth

    • Saya maurys

    hola.. excelente proyecto, tengo una pregunta , yo normalmente uso packs de baterías a diferentes voltajes , a 12 18 y 24 volts , los packs los hago yo mismo , uso baterías 18650 recicladas, como puedo hacer para usar este mismo proyecto con mis packs de baterías? o no hay manera de hacerlo?

    • Hola Saya

      Es de lo mas facil. La unica cuestion es que dependiendo del arduino que utilices tienes que asegurarte de no sobrepasar la tension de ntrada valida en los convertidores. Imaginate que quieres medir una bateria de 24V con un arduino uno de 5V maximo. Basta con que pongas un divisor de tension a la entrada con la proporcion correcta.

      Por ejemplo si pones 5 resistencias de un k seguidas y con 24 V en los extremos, si lees en los extremos de una de las resistencias tendras la quinta parte de la caida de tension, o sea 24/5 = 4.8 a tension nominal y si alcanzara 30V tendrias los 5V maximo que acepta

    • Alex Segarra

    Buenos dias y feliz año nuevo!

    Una duda… ¿ Puedo usarlo para LiPo 3S de 11.1V

    Saludos!

    • Hola alex,
      Este proyecto usa un pin de arduino para leer la carga de la bateria y el maximo que puede leer es de 5 V, pero usando un division de tension con un par de resistencias altas (Para evitar consumos inutiles) debidamente calculada podrias leer una tension aceptable con el arduino y el proyecto seguiria siendo valido. Seria tan sencillo como usar una segunda entrada con ese divisor de tension y multiplicar el resultado por el factor de conversion

      • como pondría un divisor de tensión? en el esquema que tendría que modificar ? ( gran proyecto por cierto muchas gracias )

        • Hola Josué, tendrías que ponerlo entre la batería y la entrada del Arduino.

Give a Reply

WordPress Anti-Spam by WP-SpamShield