Slot Cars Tiempo de vuelta activado por láser Pantalla GLCD
Componentes y suministros
| × | 1 | ||||
| × | 1 |
Aplicaciones y servicios en línea
|
Acerca de este proyecto
Introducción
Compré un par de módulo láser KY008 y un sensor a juego, y supe que tenía que hacer un proyecto genial con él. Así que tomé el par y creé una puerta de control de tiempo eléctrica para la pista de los autos tragamonedas que ya estaba sobre la mesa para mi proyecto de autos tragamonedas sin conductor.
El hardware
Los 3 componentes principales son el módulo láser, el sensor del receptor láser y la pantalla GLCD.
Realmente me encanta usar GLCD, puedes encontrar información sobre el pin-out aquí:https://playground.arduino.cc/Code/GLCDks0108/
Y puede descargar la biblioteca desde aquí:
https://bitbucket.org/bperrybap/openglcd
Creé un conector agradable y fácil para él, como se muestra en la imagen de abajo.
El módulo láser KY008 tiene 3 pines, -, + y S, solo acorto tanto el S como el + a 5V. Si no desea que el láser esté encendido todo el tiempo, conecte el pin S a un pin digital en el Arduino. siempre que lo establezca alto, el láser se encenderá.
El sensor también tiene 3 pines, GND, VCC y SIGNALE. conéctelo a la alimentación y al pin de entrada del Arduino.
El desafío más difícil en esta compilación fue alinearlo todo.
Puedes ver el resultado final en este clip.
Código
- Archivo sin título
Archivo sin título Arduino
/ ** Tiempo que mantiene la puerta digital * Código de:Tal Ofer * [email protected]*/#include "openGLCD.h" // vueltas infounsigned long currentRunStartMillis; unsigned long lastRunInMillis; unsigned long bestRunInMillis; int currentLap; unsigned Millis guardado durante mucho tiempo; gText t1; // definirá el tiempo de ejecución latergText t2; // definirá el tiempo de ejecución latergText t3; // definirá el tiempo de ejecución más tarde // global para displayint sec_val, milli_val; // puerta láser const int gateSensorPin =2; // el número del sensor de puerta pinint gateSensorState; // la lectura actual del sensorint lastgateSensorState =LOW; // la lectura anterior de sensorunsigned long lastDebounceTime =0; // la última vez que se alteró el pin del sensorint debounceDelay =50; // el tiempo de rebote; aumentar si la salida flickersvoid setup () {// modo pin pinMode (gateSensorPin, INPUT); retraso (50); // retrasar el funcionamiento del sensor y el láser, para que no se active la vuelta. // iniciar GLCD GLCD.Init (NON_INVERTED); // definir áreas t1.DefineArea (textAreaTOP, lcdnums14x24); t2.DefineArea (0, GLCD.CenterY, 8, 2, números fijos7x15); t3.DefineArea (GLCD.CenterX, GLCD.CenterY, 8, 2, números fijos7x15); t3.SetFontColor (BLANCO); // establecer el color de la fuente t3.ClearArea (); // imprimir texto GLCD.SelectFont (System5x7); GLCD.CursorTo (1, 4); GLCD.print ("ÚLTIMO"); GLCD.CursorTo (11, 4); GLCD.print ("MEJOR"); // restablecer los parámetros currentRunStartMillis =0; lastRunInMillis =0; bestRunInMillis =0; currentLap =0;} void loop () {// leer el estado del sensor láser:int reading =digitalRead (gateSensorPin); // Si el interruptor cambió, debido al ruido o presionando:if (lectura! =LastgateSensorState) {// reinicia el temporizador antirrebote lastDebounceTime =millis (); } // finaliza si // si pasa el tiempo de rebote if ((millis () - lastDebounceTime)> debounceDelay) {if (lectura! =gateSensorState) {gateSensorState =reading; // Si bajamos, esto significa que el rayo se rompió if (gateSensorState ==LOW) {// guarda los milis para que todos los cálculos se hagan con el mismo valor. SavedMillis =millis (); // si no es la primera vuelta if (currentLap> 0) {// guarda la última ejecución lastRunInMillis =SavedMillis - currentRunStartMillis; // si la última ejecución es más rápida, mejor ejecutar if (lastRunInMillis0) {calcResultFromMillis (SavedMillis - currentRunStartMillis, &sec_val, &milli_val); } else {calcResultFromMillis (0, &sec_val, &milli_val); } // finaliza si // CURRENT RUN t1.CursorTo (3, 0); // la columna y la fila son relativas al área de texto t1.Printf (F ("% 02d.% 03d"), sec_val, milli_val); // ÚLTIMA EJECUCIÓN calcResultFromMillis (lastRunInMillis, &sec_val, &milli_val); t2.CursorTo (1, 1); // la columna y la fila son relativas al área de texto t2.Printf (F ("% 02d.% 03d"), sec_val, milli_val); // MEJOR CORRIDA calcResultFromMillis (bestRunInMillis, &sec_val, &milli_val); t3.CursorTo (1, 1); t3.Printf (F ("% 02d.% 03d"), sec_val, milli_val);} // wnd loop // calcular milis en 2 valores, segundos y milis para displayvoid calcResultFromMillis (valor largo sin signo, int * sec_val, int * milli_val) {* sec_val =int (valor / 1000); * milli_val =valor - * sec_val * 1000;}
Proceso de manufactura