Xwork's Blog

The lord is waiting to take your hand.

Vamos a programar #81 - Midiendo voltajes con arduino

No hay comentarios.
Hola de nuevo a todos, el día de hoy vamos a ver cómo medir el nivel de una batería usando arduino. En el post anterior vimos cómo usar resistencias para poder limitar la cantidad de voltaje que estará ingresando al arduino, para lo ejemplos de hoy usaremos valores en múltiplos de 3.7v  que son los valores nominales para las baterías de litio hasta los 14.8v.




Para poder hacer las pruebas, voy a utilizar un arduino en conjunto a una pantalla LCD, por si quieres adaptar solo la parte que hace la medición, vendrá bien identificado que es lo que hace cada parte.

Para empezar vamos a recordar un par de cosas importantes: Primera. Nunca debemos de exceder los 5v que arduino usa, ingresar un voltaje mayor podría causar daños en tu circuito (en incluso a ti) por lo que hay que extremar las precauciones. Segunda. Cómo sabemos que el voltaje de una batería de iones de litio nunca va a pasar de los 4.2v, podemos hacer los cálculos para que en el divisor resistivo nos de un voltaje similar a este.

Los cálculos.

Primero vamos a empezar con los 14.8v (que serian 4 pilas en serie) y para calcular, tomemos la formula que sirve para calcular el voltaje y sustituyamos valores. Hay que tomar en cuenta que estamos usando el valor nominal por lo que deberiamos de usar resistencia que nos den un valor cercano a 3.7v
Para R2 voy a usar una resistencia de 100kΩ, el voltaje que esperamos es menor que 5v pero sabemos que tendremos una mejor medición si usamos múltiplos de 3.7v asi que ese será nuestro objetivo entonces R2 = 100kΩ, V2 = 3.7 y el voltaje de entrada sera 14.8v por lo que V1 = 14.8. Sustituyendo tenemos:
Al realizar los cálculos tenemos que debemos de poner dos resistencias en serie, la primera de ellas de 100kΩ y la segunda de ellas de 300kΩ. Podemos realizar los cálculos con los valores máximos de la pila que serán 4.2v*4 = 16.8 por lo que sustituyendo otra vez tenemos:
Y al realizar las mediciones podemos confirmar que son correctas.
El voltaje de entrada es 16.84v
Cómo no tengo resistencias de 300kΩ uso tres de 100kΩ, R1 es la  resistencia mas cercana a V+ (cable rojo)
Ahora podemos conectar de manera segura al arduino
Antes de pasar al código de arduino, hagamos los calculos para cuando el voltaje es de 12.6v y nuevamente queremos obtener los 4.2v maximos de la pila, tenemos:

Cómo neuvamente no hay resistencias de 200,003Ω redondeamos al valor decimal mas cercano 200,000Ω
Al realizar las mediciones tenemos:
Ahora tenemos 12.63v

Igual uso dos resistencias de 100kΩ
Y nuevamente tenemos un voltaje seguro.

El código.

El código que sirve para medir el voltaje en arduino es el siguiente:
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
//SCL - A5
//SDA - A4
LiquidCrystal_I2C lcd(0x27,20,4);

void setup() {
	lcd.init();     
	lcd.backlight();
}
float Volt = 0.0;
int InVolt = 0;

void loop() {
	//Conectamos el voltaje de entrada  al pin A0 del arduino
	//Recordatorio amable: NO DEBE DE EXCEDER LOS 5 Volts
	InVolt = analogRead(A0);
	Volt = InVolt * (5.0 / 1023.0);
	lcd.setCursor(0 , 0);
	lcd.print("Voltaje actual");
	lcd.setCursor(0 , 1);
	lcd.print(Volt);
	delay(1000);
}

Cómo podrás observar el código es realmente sencillo, simplemente conectamos el voltaje que queremos medir al pin A0 (v+ y v- a GND), luego cómo arduino cuenta con convertidor analogo-digital de 10 bits, bastara con leer el valor  y multiplicarlo por 5 y dividirlo entre 1023 (hay que recordar que 2^10 = 1023) y con esto tendremos un valor que sera el voltaje de la bateria.


Tras realizar varias mediciones, he detectado que el valor que se despliega en el arduino es bastante cercano al de las baterías por lo que ahora podremos revisar un poco el estado de éstas.

Y bien, por ahora es todo, en el siguiente post veremos cómo incorporar el código al velocímetro.

Los leo luego.

No hay comentarios. :

Publicar un comentario

Back to basics #7 - Divisores resistivos.

No hay comentarios.
Hola de nuevo a todos, el día de hoy vamos a ver un poco mas sobre el uso de las resistencias.


Hace algún tiempo hicimos un velocímetro para bicicleta, y todo funciona bien salvo un par de detalles. Un de las cosas que luego me pasa, es que la batería se acaba a la mitad del recorrido y cómo me es importante saber cuanta distancia hago en cada uno, siento que si se apaga el velocímetro a mitad del camino, éste simplemente ya no cuenta. Cómo ya van varias veces que me pasa, decidí mostrar la información de la batería en la pantalla (Aprovechando el espacio disponible en ella.) y así al menos tener una idea de cuando debo de cargar la batería.

Antes de empezar, hay que buscar un método para medir el voltaje; hay que recordar que el velocímetro está basado en arduino, esto significa que en las entradas podemos medir niveles de hasta 5V, la batería tiene niveles de 3v a 4.2v, esto significa que en teoría podríamos simplemente conectar la batería a una de las entradas y "medir", pero en general es una mala practica conectar directamente la batería al micro-controlador.

Para poder medir el voltaje de manera segura vamos a usar un divisor de tensión, pero antes de continuar veamos que es:
Un divisor de tensión es una configuración de un circuito eléctrico que reparte la tensión de una fuente entre una o más impedancias conectadas en serie. wikipedia/divisordetension
Para crearlo, simplemente debemos de unir dos resistencias (o mas) en serie y tomar el voltaje de uno de los puntos medios cómo muestra el siguiente diagrama:


Y hay una formula que sirve para calcular cual es el voltaje que queremos usar. Para eso miremos la siguiente imagen:

Donde tenemos:

  • V2 = Voltaje de salida
  • R2 = El valor de la resistencia 2
  • R1 = Valor de la resistencia 1
  • V1 = Voltaje de entrada

Ahora tomemos cómo ejemplo la siguiente configuración:


Arreglo de resistencias


Tenemos 3v a la entrada

Si observas cuidadosamente, tenemos dos resistencia de 4.7 KΩ  y 3v a la entrada que si reemplazamos en la formula
tenemos:


Y al realizar las mediciones, podemos comprobar que en efecto los cálculos son correctos:

Medimos "en medio" de las resistencias
Si no te gusta usar la formula, bastará con usar resistencias del mismo valor y el voltaje será proporcional, en el ejemplo anterior usamos dos resistencias de 4.7 por lo que al dividir entre dos nos resulta 1.5v.

Ahora de  manera intuitiva, si usamos tres resistencias de 100kΩ y medimos en la primer sección tendremos una tercera parte del voltaje y si medimos en la segunda, tendremos dos terceras partes, eso significa que si usamos un voltaje de 3v a la entrada, tendríamos voltajes cercanos a 1v y 2v respectivamente. Ahora lo comprobaremos.

Ahora usamos tres resistencias de 100kΩ


Voltaje en la primer unión

Voltaje en la segunda unión
Con esto podemos medir de manera más segura el voltaje directamente con el arduino, pero cómo siempre hay que tener consideraciones. La primera de ellas es que usar este método para reducir el voltaje no es la más conveniente si queremos alimentar un LED' por ejemplo, ya que implicaría un gasto de corriente adicional, pero además no funciona del todo bien y entre mas sea la corriente peor funcionará. La segunda, que valores son los que debemos de usar, eso depende mucho de la aplicación, pero bastara con resistencias dentro del rango de los kΩ y eso se debe a que el propio divisor resistivo gasta cierta potencia, si recordamos la ley del watt, si tenemos un divisor resistivo con dos resistencias de 4.7kΩ y un voltaje de 3v, la potencia que se disipa en las resistencias es de 0.0003w que no es mucho, pero si usamos resistencias de 10Ω en la misma configuración tendríamos un gasto de 0.15w (haciendo técnicamente nada). Para tener una mejor aproximación al resultado que queremos, debemos de usar resistencias de precisión, las resistencias que usé para el segundo ejemplo, no lo son y ahí es cuando se produce la diferencia (los colores dicen que son de 100kΩ pero en realidad son de 98kΩ~99kΩ).

Y bien, por ahora es todo, en el siguiente post veremos cómo medir el voltaje de una bateria usando arduino.

Los leo luego.

No hay comentarios. :

Publicar un comentario

Vamos a programar #80 - La conjetura de Collatz (Ver. Pascal).

No hay comentarios.
Hola de nuevo a todos, el día de hoy vamos a continuar con re-fritos de viejos programas, pero ahora en lenguajes que no habíamos usado. En esta ocasión vamos continuar con la prueba de la conjetura de Collatz pero en el lenguaje de programación pascal.



Antes de continuar, es importante mencionar la importancia de saber crear un programa en un lenguaje distinto al que estamos acostumbrados usando los fundamentos del lenguaje, en este caso, deberías de ser capas de crear este programa leyendo los post de aprendizaje que hice para pascal (Para el resto de lenguajes no hay pero recuerda que mi objetivo no es enseñarte a programar). Y bien ahora continuemos con el código.

El código en Pascal que hace funcionar las cosas es el siguiente:

program Collatz (output);
uses crt, sysutils;
var MyVal: integer;
function IsEven (Number:integer): boolean;
begin
	if Number mod 2 = 1 then
		exit (false)
	else
		exit (true);
end;

procedure CalculateCollatz (Number:integer);
begin
	while Number > 1 do
	begin
		if IsEven (Number) = false then
		begin
			Number:= Number * 3 + 1;
			writeln (Number);
		end
		else
		begin
			Number:= Number div 2;
			writeln (Number);
		end;
	end;
end;

begin
	writeln('Inserta un numero');
	readln(MyVal);
	CalculateCollatz(MyVal);
	readln();
end.

Cómo podrás ver, el programa consta de dos funciones, la primera de ellas en orden de aparición es "IsEven()" y recibe un parámetro del tipo "integer" y sirve para determinar si el número que se paso cómo argumento es par o no; si el valor es par, la funcion devuleve "true", en caso contrario devuelve "false".

La siguiente función es "CalculateCollatz" aquí es donde se hace el calculo (siguiendo las reglas de la conjetura). Si revisaste alguno de los post de aprendizaje para Pascal, pero mas específicamente el post "Learning Machine #5", verás que hacemos uso de "if" y hace poco tiempo alguien me pregunto: "¿Que pasa si tengo más de una línea de código después de mi if?". Y pido una disculpa ya que en su momento lo olvide por completo pero si cambia un poco el uso de "if" si es de una línea o no. Cuando usamos la instrucción "if" si es de múltiples lineas, se deberá de hacer uso de la palabra reservada "begin" seguida de todo el código que se requiera ejecutar en la condición y se termina con "end;" si se usan instrucciones "else" (de igual manera que con if), cada una deberá de ir con su respectivo inicio y final, pero solo la última deberá tener punto y coma.

Y bien, por ahora es todo, cómo de costumbre puedes bajar el código de mi dropbox para que lo pruebes, pero además, puedes probarlo en linea por si no quieres instalar el compilador. En el siguiente post continuaremos con mas programación y con mas refritos hasta que se me ocurra algo bueno.

Los leo luego.

No hay comentarios. :

Publicar un comentario

Vamos a programar #79 - La conjetura de Collatz (Ver. Python).

No hay comentarios.
Hola de nuevo a todos, el día de hoy vamos a ver un poco más de Python.



En el último post vimos un acercamiento a Python y si bien el blog nunca se ha tratado de "tutoriales" para aprender a programar, mucha gente pidió que adaptara un programa de los que previamente ya habíamos hecho en blog. Ya que solo será la versión adaptada a Python de la conjetura de Collatz, te recomiendo echarle un vistazo a los post que hicimos tanto para Android (Java) cómo para Windows (C#).

Ahora veamos el código que hace funcionar las cosas.

#Prueba de la conjetura de collatz en Python
def IsEven(Number):
	if (Number % 2 == 1):
		return False
	else:
		return True

def CalculateCollatz(Number):
	while Number > 1:
		if (IsEven(Number) == False):
			Number  = Number * 3 + 1
			print(Number)
		else:
			Number = Number / 2
			print(Number)

CalculateCollatz(int(input('Ingresa un numero\n')))
input()

Cómo verás, el programar consta de solo dos funciones; la primera de ellas en orden de aparición es: "IsEven" que recibe un número parámetro y su función es determinar si un número es par o no. Si al hacer la operación "mod" el resultado es uno, eso significa que el número no es par y la funcion devuelve "false" en caso contrario, la función devuelve "true" (que indica que el número es par, valga la redundancia).

La siguiente función es "CalculateCollatz" y tal cómo su nombre lo indica, aqui es en donde se realizan los cálculos y se muestran en pantalla (siguiendo las reglas de la conjetura).

Finalmente solo mandamos a llamar a la función "CalculateCollatz()" que recibirá cómo parámetro un numero que el usuario ingresará.

Y bien, cómo puedes ver, es relativamente fácil portar los programa que ya tenioamos a Python, hay que tomar una cuantas consideraciones en cuanto al lenguaje (en comparación a los otros), pero python resulta realmente poderoso a la hora de escribir un programa. Cómo de costumbre puedes bajar el programa de mi dropbox para que lo pruebes o bien, puedes copiarlo para probarlo en el editor en linea

No hay comentarios. :

Publicar un comentario