Sensor de batería

Muchos proyectos con Arduino son alimentados con baterías para conseguir dispositivos autónomos pero en estos casos es muy importante conocer el nivel de batería, para poder poner nuestro dispositivo en stand-by y dar una alerta de baja batería para que esta no se dañe.

Podemos crear un sensor de voltaje para Arduino de forma muy sencilla, utilizando un puerto analógico, con dos resistencias correctamente dimensionadas y un pequeño script.

Hardware

Cálculo de resistencias

Para calcular las resistencia que vamos a usar deberemos realizar varios pasos.

Calcular R2

Sabiendo que R2 esta en paralelo con la salida del sensor (y probablemente con la entrada analógica del micro-controlador) vamos a determinar el ampere que queremos que reciba Vout. Normalmente entre 1mA y 0,5mA es suficiente para que nuestro microcontrolador pueda leer la señal que le vamos a enviar. En segundo lugar, sabemos que el Vout máximo, ha de ser igual o algo inferior al voltaje de trabajo de nuestro microcontrolador (normalmente 3,3v o 5v). Usando la ley de Ohm (V=I*R) calcularemos R2

Ejemplo:

  • V = 3,3V
  • I = 0,0005A
  • R2 = 3,3/0,0005 = 6600Ω
  • R2 = 3,3/0,001 = 3300Ω

Podemos escoger una resistencia comercial entre 3,3KΩ y 6,6KΩ vamos a coger una resistencia de 4,7KΩ ya que es un valor común.

Lo siguiente es determinar los Watts de la resistencia para dimensionarla correctamente. Para ello primero determinaremos la corriente real para la resistencia escogida (I=V/R).

Ejemplo:

  • I = 3,3/4700 = 0,0007A

A continuación, teniendo el voltaje y la intensidad, calcularemos la potencia (P = V * I:

  • 3,3 * 0,0007 = 0,0023w

En este ejemplo, cualquier resistencia de 4,7KΩ y 1/4w o 1/8w nos servirá para R2.

Calcular R1

Teniendo R2 cuantificada y caracterizada, podemos proceder a cuantificar R1. Para ello necesitamos conocer el voltaje máximo de la batería que queremos monitorizar, y utilizaremos la formula siguiente:

Siguiendo con nuestro ejemplo, los cálculos quedarían así:

  • Vout = 3,3V
  • Vin = 12,4V
  • R2 = 4700Ω
  • R1 = (Vin*R2/Vout)-R2
  • R1 = (12,4*4700/3,3)-4700 = 12960Ω

Al calcular R1, vemos que no existe un valor comercial de resistencia que nos permita fabricar este sistema, por lo que por último, vamos a probar con distintos valores comerciales cercanos a R1 y R2 y vamos a ver como cambia Vout con diversas combinaciones, buscando un resultado que nos permita tener 2 resistencias comerciales y un Vout, ligeramente inferior al nominal de nuestro microcontrolador. Para ello utilizaremos la formula anterior:

Ejemplo:

  • Vin = 12,4V
  • R1 = 12960Ω -> 12000Ω
  • R2 = 4700Ω -> 4200Ω
  • Vout = Vin * (R2 / (R1 + R2))
  • Vout = 3,21V

Rango operativo de la batería

Por último debemos calcular el Vout mínimo de la batería. El Vout máximo es el que hemos utilizado en el calculo de las resistencias, y sabemos que con una batería que al 100% de carga nos da 12,4V (una LiPo 3S) el Vout será de 3,21V.

Si el voltaje mínimo operativo de dicha batería es de 9,6V, debemos calcular que Vout tendremos si el Vin es igual al mínimo operativo:

  • Vin = 9,6V
  • R1 = 12000Ω
  • R2 = 4200Ω
  • Vout = Vin * (R2 / (R1 + R2))
  • Vout = 2,5V

También podemos calcular los voltajes de salida con la herramienta «Calculadora de división de voltaje» de Digi-Key

Script

Una vez localizadas las resistencias necesarias, construimos el circuito según el esquemático inicial y realizamos un script para nuestro controlador en el que el input de 3,21V, nos muestre una batería al 100% y para un input de 2,5V nos muestre que el nivel de batería es del 0%

Si disponemos de un puerto analógico con resolución de 10 bits (valores de 0 a 1023), sabemos que el valor 1023 equivale a 3,3v, por lo que tendremos que hacer una regla de 3 para saber que entrada nos dará el VoutMax y el VoutMin:

  • VoutMax = 3,21V -> 995
  • VoutMin = 2,5V -> 775

En caso de que utilicemos Arduino, podríamos utilizar el siguiente script:

int battery; //Porcentaje
int analogVoltage; //Lectura Analogica

void setup()
{
  Serial.begin(9600);
  pinMode(A0, INPUT); //Vout
}

void loop()
{
   analogVoltage = analogRead(A0);
   battery = map(analogVoltage, 775, 995, 0, 100);
   
  if (battery >= 25){
    Serial.print("Battery level: ");
    Serial.print(battery);
    Serial.println("%");
    delay(10);
  }
  
  if (battery < 25)
  {
    Serial.println("Low battery");
    delay(10);
  }
  
  if (battery < 0)
  {
    Serial.println("Empty");
    delay(10);
  }
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *