Vamos a programar #89 - Midiendo voltajes con arduino - Camino a Spedometer v. Final

Hola de nuevo a todos, el día de hoy vamos a ver cómo medir voltajes usando arduino. Todo esto para agregarlo a "Spedometer M" (y de una vez por todas decir que está terminado). Uno de los principales puntos a tratar, es la presentación de la batería, haciendo memoria en el código habían 5 situaciones diferente para mostrar el estado de la batería, pero algo importante que olvide mencionar, es que eran meramente ilustrativas. Uno podría pensar que al haber 5 "iconos" diferentes, cada uno representaría al 20%, pero en este caso no es así.


El primero de los problemas es que no tenemos una lectura precisa del nivel de la batería, anteriormente ya habíamos hecho un post en el cual mostraba cómo es que se hace la lectura de un voltaje, pero ¿podemos ser mas precisos? Para entender cómo podemos ganar precision, primero hay que recordar cómo es que se hacen las lecturas (y recomiendo que leas un post donde hablamos un poco).

Para medir el voltaje, lo que hacemos es ingresarlo por un pin del arduino, internamente, este posee un mecanismo que traslada el voltaje un valor digital. Cuando conectamos 0v a un pin analogo del arduino y hacemos la lectura con "analogread()" está devolverá un valor de 0. EN cambio si conectamos 5v esta devolverá un valor de 1023. ¿Por que ocurre esto? Simple arduino cuenta con convertidor análogo-digital con una resolución de 8 bits por lo que cada valor entre 0 y 1023 sera igual a un valor de 0v a 5v. Para saber que valor le corresponde a cada voltaje, bastará con mirar la siguiente formula:
donde "n" es el valor de la lectura que "analogread()" regresa . Para entender un poco lo que pasa, supongamos que toamos la lectura usando arduino y este nos regreso un valor de 155.
al sustituirlo tenemos:
Y si lo medimos usando un multimetro tenemos:

Que es bastante acertado. Pero ahora lo que nos interesa hacer es ganar mas definición. Cuando arduino "mide" un voltaje en realidad lo que hace es compararlo con otro, por default este es de 5v, pero se puede elegir otro.

Para indicar que queremos usar un voltaje externo de referencia, podemos usar la función "analogReference()" que recibe un parámetro que puede ser cualquiera de los siguientes:


  • DEFAULT (el valor de la alimentación, si se usan 5v, esta sera la referencia, si se usan 3.3v esta lo será).
  • INTERNAL (Usa un voltaje interno de 1.1v pero solo en el modelo uno, en otros modelos es de 2.56v y elgunos no esta disponible).
  • EXTERNAL (Usa el PIN AREF y se puede usar un valor mayor a cero y menor o igual a 5v)

Existen otros parámetros, pero por ahora nos centraremos en estos.

Primero usaremos el parámetro "INTERNAL" y para que pruebes, puedes usar el siguiente código:

int ValIn = 0;
int CurVal = 0;
float CurVolt =0;

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

void loop()
{
	CurVal=analogRead(ValIn);
	Serial.println(CurVal);
	CurVolt=CurVal*1.1; 
	Serial.print("Valor");
	Serial.print(CurVal);
	Serial.print("mV:");
	Serial.println(CurVolt);
	Serial.println("Done");
	delay(2000);
}

Una vez que lo subas a tu arduino, deberás de conectar el voltaje positivo de tu voltaje (una pila por ejemplo) al pin A0 y el voltaje negativo a tierra. Yo al hacer la medición de la misma pila me da un valor de 710 que al reemplazarlo en la formula (actualizando los valores) no da:
Que es un valor mas cercano al que nos dio el multímetro.

Y sabiendo lo anterior ahora podemos hacer que la referencia sea la indicada para el nivel de la batería. Primero modificaremos un poco el código para hacer uso de la referencia externa, para eso prueba copiar el siguiente código:
int ValIn = 0;
int CurVal = 0;
float CurVolt =0;

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

void loop()
{
	CurVal=analogRead(ValIn);
	Serial.println(CurVal);
	CurVolt=CurVal*1.1; 
	Serial.print("Valor");
	Serial.print(CurVal);
	Serial.print("mV:");
	Serial.println(CurVolt);
	Serial.println("Done");
	delay(2000);
}

Ahora deberás de conectar un voltaje de 4.2v al pin "AREF" del arduino y conectar el lado positivo de la pila al pin "A0" y el negativo a tierra. Es importante tener nuestro voltaje de referencia estable. Si has seguido los post sobre el velocímetro, sabrás que hacemos uso de un boost converter para obtener un voltaje estable de 5v, si no te quieres complicar la vida, simplemente puedes usar un divisor resistivo con una resistencia de 1.2 kohm junto co una de 6.3 kohm (si tienes 5v exactos te dará 4.2v a la salida).

Algo que es importante aclarar para finalizar el post, es que para mostrar el porcentaje de batería no podemos simplemente usar la formula del porcentaje ya que todas las pilas son diferentes y a pesar de que la capacidad de una pila se puede medir de acuerdo al voltaje que esta nos da, depende meramente del fabricante cómo es "la curva de descarga" (que veremos en otro post) cómo dije al inicio, en el caso del velocímetro, los iconos son meramente ilustrativos de "la pila recien se cargo", "Está medio vacía" y "ya hace falta una recarga".

Y bien, por ahora es todo, lo ejemplos de código cómo son sencillos puedes simplemente copiarlos y pegarlos para probarlos y hago énfasis en que al pin "AREF" del arduino SIEMPRE se le debe aplicar un voltaje mayor a cero y menor o igual a 5.

Los leo luego.

2 comentarios

  1. Me gusta que en las ecuaciones conservas las unidades y no solo aparcen o desaprencen a lo loco, gracias papu esperando para ver la version definitiva del velocimetro

    ResponderBorrar