Vamos a programar #49 - Inútil apps #3 - Cómo calcular la velocidad.
Hola de nuevo a todos, el día de hoy vamos a continuar con la construcción de un velocimetro para bicicleta, en el post anterior vimos cómo hacer uso del sensor de efecto hall para poder detectar cuando es que la rueda da una vuelta completa (o cuando un imán es detectado por el sensor). Asi que ahora vamos a ver una parte importante.Para que el velocimetro quede bien, pienso que al menos debe de medir lo siguiente:
- Velocidad (obviamente).
- Distancia.
- RPM (revoluciones por minuto).
Al mirar el enunciado anterior, podemos determinar que es lo que ya tenemos; la velocidad, es lo que queremos saber, distancia, esta la podemos obtener y el tiempo; para este, arduino cuenta con varias formas de "contar el tiempo".
Obteniendo la distancia.
Para poder obtener la distancia, tenemos que medir cual es la circunferencia de la rueda, hay varias forma de obtenerla.
La primera es mirando la siguiente tabla:
| Diámetro | Medida rueda (mm) |
|---|---|
| 16x1.75x2 | 1272 |
| 20x1.75x2 | 1590 |
| 24x1 3/8 | 1948 |
| 24x1.75x2 | 1907 |
| 26x1 | 1973 |
| 26x1.5 | 2026 |
| 26x1.6 | 2051 |
| 26x1.75x2 | 2070 |
| 26x1.90 | 2089 |
| 26x1.95 | 2050 |
| 26x2.00 | 2114 |
| 26x2.125 | 2133 |
| 26x1 3/8 | 2105 |
| 26x1 3/8x11/2 | 2086 |
| 26x3/4 | 1954 |
| 27x1 1/4 | 2199 |
| 27x1 1/4 Fifty | 2174 |
| 27.5x2.10 | 2150 |
| 27.5x2.25 | 2195 |
| 28x1.5 | 2224 |
| 28x1.75 | 2268 |
| 28x1 1/2 | 2265 |
| 28x1 3/8x1 5/8 | 2205 |
| 29 x 2.10 | 2300 |
Para saber cual es tu llanta, bastará con revisar un costado de la misma, en mi caso es 24x2.125 (que no esta en la tabla), al revisar, no hay una medida para esa, por lo que pasaremos al siguiente metodo.
Si al revisar la tabla no viste un valor igual al tuyo, podemos obtener la circunferencia si usamos la siguiente formula: C = D * π, Donde C = a la circunferencia en centimetros, D = al diametro en centimetros y π = al numero pi (3.141592654), el diametro lo podemos obtener si usamos una regla para medir. En mi caso, la llanta tiene un diámetro de 62.3 cm, al aplicarlo a la formula anterior, tenemos que la rueda tiene una circunferencia de 195.72 cm.
Otra opción y la mas viable, es medir la circunferencia dando una vuelta, es decir poner una marca en la rueda y en el suelo; pedalear hasta dar una vuelta completa y medir la longitud de la linea.En mi caso la mediad resultante fue de 194.6 cm y esta medida es la mejor, porque ya cuenta con mi peso y si vemos no es muy diferente a la del calculo anterior.
Ahora ya podemos tener la distancia, sabemos, que en mi caso, cada vuelta representan 195.72 cm, la manera simple, es sumar cada medición, por lo que si al dar una vuelta sumamos 195.72 cm, al dar la segunda tendremos 391.44 cm y asi sucesivamente, por lo que la distancia la podemos definir de la siguiente manera: d=195.72 * N° de vuelta, para hacer más fácil la visualización, vamos a convertir los 195.72 cm a m lo que resulta que cada vuelta son 1.9572 m.
Otra opción y la mas viable, es medir la circunferencia dando una vuelta, es decir poner una marca en la rueda y en el suelo; pedalear hasta dar una vuelta completa y medir la longitud de la linea.En mi caso la mediad resultante fue de 194.6 cm y esta medida es la mejor, porque ya cuenta con mi peso y si vemos no es muy diferente a la del calculo anterior.
Ahora ya podemos tener la distancia, sabemos, que en mi caso, cada vuelta representan 195.72 cm, la manera simple, es sumar cada medición, por lo que si al dar una vuelta sumamos 195.72 cm, al dar la segunda tendremos 391.44 cm y asi sucesivamente, por lo que la distancia la podemos definir de la siguiente manera: d=195.72 * N° de vuelta, para hacer más fácil la visualización, vamos a convertir los 195.72 cm a m lo que resulta que cada vuelta son 1.9572 m.
Obteniendo la velocidad.
Ahora que tenemos la distancia, podemos obtener la velocidad, de la formula v=d/t, solo nos queda determinar el tiempo. al inicio pensaba usar el modulo de reloj ds1302, pero no se me hacía rentable, dado que solo podria medir tiempo en segundos, cómo programador, se que cada procesador es capaz de llevar la cuenta del tiempo (relativamente), al investigar un poco, vi que arduino cuenta con las funciones millis() y micros() que; respectivamente, llevan la cuenta de los milisegundos y los microsegundos desde que se empezo a ejecutar el programa (desde que se incendio?), para nuestros fines, podemos usar la función millis().
Con un temporizador, podemos tomar el tiempo de cada cuanto el sensor se activo, para eso, primero haremos la medicion de "en que momento estamos" y cuando el sensor detecte un cambio, anotar el tiempo, despues restaremos el tiempo de inicio con el del final y ese lapso de tiempo nos indicará, cuanto tiempo le toma avanzar 1.9572 m (en mi caso).
Con esa información, podemos crear una función en arduino cómo la que sigue:
// {...}
//obtener la velocidad
float GetVelocity(){
float Velocity = Distancia/((float)(millis()-OldTime)/1000);
OldTime=millis();
return Velocity;
}
// {...}
Con esta estaremos midiendo la velocidad en metros por segundo. para hacer la conversion a Km/h, debemos de multiplicar por 3600 (segundos en una hora) y dividir entre 1000 (metros por cada kilometro).
Hay que tener en cuenta algunas consideraciones, ¿cuando es prudente decir que la bicicleta se detuvo? en mi experiencia, el usuario normal, no puede ir muy lento asi que haremos las preparaciones para que cuando el sensor no se active en al menos tres segundos, asumamos que la bicicleta se ha detenido.
Y bien, por ahora es todo, en el siguiente post implementaremos todo el código neceario.
Los leo luego.
Vamos a programar #48 - Inútil apps #3 -Velocímetro para bicicleta, sensor de efecto Hall.
3/11/2018 03:26:00 p.m.
Arduino
,
c
,
c++
,
DIY
,
hall sensor
,
imanes
,
velocimetro
No hay comentarios.
Hola de nuevo a todos. El día de hoy vamos a ver una pequeña introducción a la construcción de un velocímetro.Cómo algunos sabrán, tengo cierta afición por hacer viajes en bicicleta, pero cómo soy un hombre de números, siempre me ha gustado cuantificar lo que hago (en medida de lo posible), así que decidí llevar la cuenta de la actividad que hacía. Por fortuna, muchos de los teléfonos actuales, tienen aplicaciones que ayudan a llevar el registro (gracias a sensores y al GPS).
Hasta hace poco tenía la idea de hacer una versión propia de un programa que lleve todos esos datos, pero un par de eventos bastante desafortunados, bastaron para pensarlo dos veces. Entonces opté por comprar un velocímetro, lo encargue desde China y tenía un tiempo estimado de entrega de dos meses, pero por sismos y varias cosas, no llegaron (ya va medio año prácticamente, pero aun espero su llegada junto con la de algunos paquetes mas grandes).
Al revisar cómo es que funcionan, noté que la gran mayoría funcionan de la misma manera; se pone un sensor en la tijera que sostiene una llanta y cada vez que ésta da una vuelta, de alguna manera se notifica. En el caso del velocímetro que encargue, en el manual (de internet) decía que se debía de pegar un imán a un rayo de la llanta y el sensor ponerse fijo en la tijera, al revisar más a detalle, averigüe que se trataba de un sensor de efecto Hall.
El sensor de efecto Hall.
Ahora veremos cómo conectar el sensor de efecto hall, para hacerlo, necesitas lo siguiente:El sensor de efecto Hall o simplemente sensor Hall o sonda Hall (denominado según Edwin Herbert Hall) se sirve del efecto Hall para la medición de campos magnéticos o corrientes o para la determinación de la posición en la que está.Si fluye corriente por un sensor Hall y se aproxima a un campo magnético que fluye en dirección vertical al sensor, entonces el sensor crea un voltaje saliente proporcional al producto de la fuerza del campo magnético y de la corriente. Si se conoce el valor de la corriente, entonces se puede calcular la fuerza del campo magnético; si se crea el campo magnético por medio de corriente que circula por una bobina o un conductor, entonces se puede medir el valor de la corriente en el conductor o bobina.Si tanto la fuerza del campo magnético como la corriente son conocidos, entonces se puede usar el sensor Hall como detector de metales. Wikipedia/SensorHall
- Sensor efecto hall.
- Resistencia 1KΩ ~10KΩ.
- Arduino
- Supply (4.5~24V).
- Ground.
- OutPut.
Con lo anterior pasemos al código.
//Pin al que coenctaremos el sensor
const int HallSensor = 3;
//LED para mostrar el cambio en caso de no disponer del monitor serie
const int LED = 13;
//Estado del sensor
int HallSensorVal = 0;
//Número de vuelta
int Lap = 0;
//Estado anterior del sensor
int OldState = 0;
//Inicializar lo necesario
void setup() {
Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(HallSensor, INPUT);
}
//Bucle princial
void loop() {
HallSensorVal = digitalRead(HallSensor);
if (OldState != HallSensorVal) {
if (HallSensorVal == LOW) {
digitalWrite(LED, HIGH);
Lap += 1;
Serial.println("Vuelta:");
Serial.println(Lap);
delay(1);
}
else {
digitalWrite(LED, LOW);
}
}
if (Lap > 99)
Lap = 1;
OldState = HallSensorVal;
}
El código anterior, lo único que hace, es verificar cual es el estado del sensor, cuando esta en modo "LOW", prende el LED que viene por default en el pin 13 y a la variable "Lap" le suma 1 (indicando una vuelta). Para probar el código anterior, necesitaras también un par de imanes, en mi caso, los extraje de un quemador de CD viejo, y los pegué en un motor (también extraído del lector de CD).
El resultado:
Con esto podemos probar que el sensor funciona de manera correcta.
Y bien, por ahora es todo, en el siguiente post, veremos cómo medir distancia y velocidad con el mínimo hardware posible. Aun no he decidido si usar las matrices para mostrar los datos o usar una pantalla LCD (cómo la del nokia) o incluso pantalla de siete segmentos. El código lo puedes copiar y pegar para usarlo, en cuanto este completo lo subire a mi dropbox.
Los leo luego.
Vamos a programar #47 - Co-Rutinas en LUA.
Hola de nuevo a todos, el día de hoy vamos a ver un poco sobre el lenguaje de programación LUA.Antes que nada, debo de aclarar que este no es un tutorial para aprender a programar en Lua, en este post solo explicaré cómo hacer uso de las co-rutinas. Probablemente en el futuro, habrá un ecuatorial completo en las series "Learning machine", pero por ahora y por petición de un amigo mio, veremos cómo es que se hace uso de ellas. Eso no nos impedirá ver lo básico, ¿Que es Lua?; bueno, lua es un lenguaje de programación interpretado; es decir, a diferencia de lenguajes cómo C o C#, este, no es necesario compilarlo para usarlo, una vez escrito el código fuente, se puede pasar al interprete (que será el ejecutable) y este interpretará el código y producirá un resultado, si es necesario cambiar alguna parte del programa, en lugar de volver a compilar el ejecutable, bastará con modificar el código fuente.
Co-rutinas.
Ahora veamos lo que nos trajo a este post, hace un tiempo, mientras un escribía código para "Play List M" (una aplicación para PSVita), un amigo vio lo que hacía y pregunto que si sabía usar lua, le dije que si, toda la aplicación esta hecha en ese lenguaje, entonces me pregunto si sabia usar las co-rutinas y si podía explicarserlas.
Las co-rutinas en lua, sirven para ejecutar código en una sección aparte, es muy similar un "thread" en c#, pero de una forma un tanto distinta. Veamos cómo es que se ejecuta un programa con un "thread" (hilo desde ahora) separado. Ahora observemos las siguientes imágenes.
![]() |
| Esta es la representación más simple de un programa |
![]() |
| Esta es la representación más simple de un programa con un hilo adicional. |
La ventaja de tener un hilo secundario, es que la aplicación no se bloqueara mientras haga un trabajo difícil (o haga un ciclo o un bucle), si los resultados no son necesarios para continuar con la ejecución del programa, podemos hacer otra tarea mientras el código del otro hilo termina.
En el caso de lua, cuando hablamos de co-rutinas, no significa que creemos otro hilo, para observar a detalle lo que ocurre, tomemos el siguiente código:
local counter = 1; local function OneToHoundred() while counter < 50 do io.write("Contador:"..counter.."\n"); coroutine.yield(); counter = counter + 1; end end CoProc = coroutine.create(OneToHoundred); local counter2 = 0; while counter2 < 101 do coroutine.resume(CoProc); io.write("Contador2:"..counter2.."\n"); counter2= counter2 + 1; end
En lua, la manera sencilla de crear una co-rutina, es haciendo uso de "coroutine.create()" y en su forma más sencilla, debemos de pasar una función cómo parámetro. para poder interactuar con la función, dentro de esta, debe de haber algo que diga "oye, tengo que decir algo", la función "coroutine.yield()" se encarga de hacer eso, finalmente, debemos de tener una parte que escuche y para eso existe "coroutine.resume()". Si tomamos cómo ejemplo el código anterior, vemos que hay que crear la funcion y esta debe de contener la "interrupción", en este caso "coroutine.yield()" la manera en que lua trabaja con las co-rutinas, es interrumpiendo, es decir si estamos ejecutando un trozo de código, este normalmente se ejecutará de forma lineal hasta el final, pero si usamos las co-rutinas, cuando observamos en el segundo bucle, y en general cuando se encuentre con la instrucción "coroutine.resume()", la ejecución pasará a la co-rutina y esta se ejecutará hasta que se encuentre con "coroutine.yield()", cuando se encuentra con esta instrucción, la ejecución continuará con la linea inmediata después de "coroutine.resume()".
Para poder apreciar mejor el resultado, puedes ir a la página de lua, y probar el código anterior.
Cómo lua es un lenguaje de "scripting" es usado en varias plataformas y las funciones disponibles pueden variar, pero todas las que se usan aquí, deben de estar disponibles en la mayoría, ahora por ejemplo, si queremos cargar archivos sin bloquear la pantalla principal, podemos hacerlo usando co-rutinas. Esa seria la introducción, pero esto se puede ampliar un poco mas, en otro post.
Los leo luego.
Suscribirse a:
Entradas
(
Atom
)











No hay comentarios. :
Publicar un comentario