Lector de velocidad multiescala
#1
Buenas, puesto que me he liado a ajustar las velocidades máxima de todas las máquinas/automotores digitales que tengo de momento. Me he fabricado una herramienta estupenda para medirla. Ya que un cronómetro es muy de andar por casa y no es preciso, la idea pasaba por un lector basado en Arduino. Bien al grano:

Materiales necesarios

- Arduino nano/uno/mega...

   

realmente vale cualquiera, pero recomiendo por tamaño y coste utilizar un Arduino nano, yo he usado un mega porque lo tengo para otra cosa pero nos vale igual. Si son clónicos pueden venir sin el bootloader y es un pastel. Si no queréis líos, comprad una Arduino genuina aun siendo más cara.

- Dos sensores ópticos de aliexpress, son baratitos y leen perfectamente una vez se ajustan apropiadamente.

   

- Cables para unirlo todo, a elección de cada uno. Yo tengo cables para pinchar en los conectores idc, se llaman dupont pero vamos que para un montaje en maqueta es mejor soldar de forma permanente.

Bien, nos tenemos que bajar el ide de Arduino para programar todo, así como el driver para la placa. Si es una Arduino no clónica los drivers creo que están en la web de Arduino, en caso de ser una clónica, el controlador suele ser el ch340 que tiene sus migas para instalarlo, en esta parte no vamos a entrar porque cada ordenador es un mundo y cada uno tiene un cosa u otra. Partimos de la base que tenemos la placa conectada por el usb y reconocida por el ordenador.

En el programa tenemos que seleccionar en el selector de placas la placa con la que estamos trabajando. Arriba del todo en el menú clicamos y se nos abre un menú, escribimos nano y sale la placa para seleccionar, el puerto debería de detectarlo sin más.

   

   

Una vez tenemos nuestra placa funcionando, tenemos que llenarla de datos:

Código:
// Se pueden modificar solo los valores del final

// Definiciones

#define escala                160              // Escala desde la que queremos convertir la velocidad real a escala a velocidad del mundo real. Escalas comunes 87 220 450... etc.
#define distancia             0.0002           // Distancia de muestreo en km entre los sensores, usarla acorde a las longitudes de la composición o locomotora que queramos medirle la velocidad.
#define pin_sensor_entrada    9                // Usamos el pin D9 para el sensor de entrada. Podemos usar el pin digital que más nos convenga (para más información, leer el datasheet del arduino a utilizar).
#define pin_sensor_salida     10               // Usamos el pin D10 para el sensor de salida. Podemos usar el pin digital que más nos convenga (para más información, leer el datasheet del arduino a utilizar).

// A partir de aqui no se modifica ningún parámetro

// Variables

int sensor_entrada = pin_sensor_entrada;       // Variable para el sensor de entrada.
int sensor_salida = pin_sensor_salida;         // Variable para el sensor de salida.
unsigned long tiempo_inicial = 0;              // Variable para el tiempo inicial que empezará a contar desde el sensor de entrada.
unsigned long tiempo_final = 0;                // Variable para el tiempo final que empezará a contar desde el sensor de salida.
float velocidad;                               // Variable que aloja la velocidad.
float tiempo;                                  // Variable que aloja el tiempo entre sensores para hacer el conteo.

void setup() {  

  pinMode(sensor_entrada,INPUT);               // Ajustamos el pin del sensor de entrada como entrada.
  pinMode(sensor_salida,INPUT);                // Ajustamos el pin del sensor de salida como entrada.

}

void loop() {
 
  Serial.begin(115200);                        // Esta versión del programa muestra por el monitor serie del ide de arduino los datos. De momento esto quedará así, a la hora de integrarlo en la maqueta usaré un lcd 16x2.

  while(digitalRead(sensor_entrada));          // Leemos el sensor de entrada. El bucle while es para ejecutar la condicion, una vez leído, salimos del bucle ya que si no estaría seguido leyendo.
  tiempo_inicial = millis();                   // Guardamos el tiempo inicial. La función millis() es una función integrada que cuenta los milisegundos desde que se inició el programa.
  while(digitalRead(sensor_salida));           // Leemos el sensor de salida. El bucle while es para ejecutar la condicion, una vez leído, salimos del bucle ya que si no estaría seguido leyendo.
  tiempo_final = millis();                     // Guardamos el tiempo final.
  tiempo = tiempo_final - tiempo_inicial;      // Hacemos la cuenta para averiguar el tiempo entre las lecturas de los sensores. Ej. tiempo_inicial = 0 tiempo final = 1, 1 - 0 = 1.
  tiempo = tiempo / 1000;                      // Convertimos los milisegundos a segundos
  tiempo = tiempo / 3600;                      // Convertimos los segundos a horas. Hacemos otro paso por comodidad.
  velocidad = (distancia / tiempo);            // v = d / t Fórmula de la velocidad. Distancia es la distancia entre los sensores expresada en km y t es el tiempo calculado que tarda en pasar el material rodante entre los sensores.  
  velocidad = (velocidad * escala);            // Escalamos la velocidad a la escala seleccionada arriba.
  Serial.print(velocidad);                     // Sacamos la velocidad a escala real 1/1 de nuestro material movil por el monitor serie del ide de arduino.
  Serial.println(" Km/h");                     // Esto añade una string para que el valor tenga más contexto. Ej. 100 Km/h en vez de 100 unicamente.
  delay(500);                                  // Añadimos un delay de 500 ms para ralentizar los datos mostrados por pantalla.
  velocidad = 0;                               // Reseteamos el valor de velocidad a 0 para el siguiente conteo.

  Serial.end();                                // Cerramos la conexión serie para evitar que el programa nos esté mandando datos continuos sin medir por la pantalla.  

}


El código está perfectamente comentado con lo que hace cada línea, se podrá hacer mejor o peor, pero según está funciona correctamente.

Tendremos que tocar los valores de arriba donde indica según nuestras necesidades. No obstante la Arduino nano posee los pines D9 y D10 así que esos valores no hace falta tocarlos. En cuanto a la escala, estamos en escalan.es n = 160, se acabaron las preguntas señoría jaja. Igualmente podemos poner el valor de otra escala y utilizarlo en consecuencia haciendo el montaje apropiado de la posición de los sensores.

Bien para que nuestra Arduino trabaje, copiamos ese código después de las modificaciones de la distancia entre sensores, escala y pines en el programa:

   

Y apretamos con la placa conectada al USB la flecha del menú superior, esto procederá a compilar el programa para la placa en cuestión y se grabará en ella, si tenéis dudas, por internet esta lleno de como grabar un programa de Arduino, aquí es para no extenderme mucho más.

En cuanto al conexionado es tal que así:

   

Donde los cables rojos van del 5V marcado en la Arduino al VCC de cada sensor.
Los negros van del GND marcado en la Arduino (masa negativo) al GND de cada sensor.
Y las los pines D9 y D10 marcados en la Arduino van a cada sensor a los pines OUT+, que es la salida de señal, Ponedlos acorde a lo configurado, no les deis la vuelta porque no va a medir correctamente.

Y en un principio, si los sensores están correctamente colocados en la maqueta o donde sea y las conexiones bien hechas, nos iremos por último al ordenador en el programa de la Arduino y pincharemos sobre herramientas -> monitor serie.

Se desplegará una pestaña en la parte baja donde recibiremos las lecturas, esto en principio lo haré así, cuando ponga todo bien, publicaré una modificación del programa para poder sacar los datos por un lcd 16x2 sin depender de un ordenador.

Bueno espero que este tocho os sirva y espero no haberme olvidado nada, yo estoy contento porque soy un purista de la velocidad y la he ajustado clavada +- 1 kmh.

Un saludo.
Responder
#2
Vaya trabajazo!

Mi más sincera enhorabuena.
Responder
#3
Enhorabuena Jorgito, quedo a la espera de la versión con el display, que con tu permiso incorporaré a un módulo.

Enviado desde mi POCKET 3 mediante Tapatalk
Responder
#4
Uff... muchísimas gracias por el aporte (grandioso aporte, diría yo).
Además, tengo un nano por casa guardado y sin usar. Me faltarían los demás componentes, pero nada que Aliexprés no pueda proporcionar, como bien dices.
No te digo que lo vaya a ejecutar de momento, pero tampoco te digo que no, jajaja. Si es que no me dejáis tranquilo...
Me gusta mucho la idea, Jorge.
Responder


Posibles temas similares...
Tema Autor Respuestas Vistas Último mensaje
  Ayuda: Semáforo en rojo reduce velocidad del circuito a la mitad [Analógico] cvillajos 35 19,078 13-03-2022, 11:12
Último mensaje: MarioAndretti
  Medidor de velocidad escala N. supertren_es 2 2,870 11-04-2021, 11:22
Último mensaje: Trenero_N
  Reguladores de velocidad-transformadores bonaro 1 5,931 02-01-2014, 18:30
Último mensaje: Luigi

Salto de foro:


Usuarios navegando en este tema: JORGITO_YKE, 1 invitado(s)