Slot Cars Laser Triggered Lap Time Display GLCD
Componentes e suprimentos
![]() |
| × | 1 | |||
| × | 1 |
Aplicativos e serviços online
![]() |
|
Sobre este projeto
Introdução
Comprei um par de módulo laser KY008 e um sensor correspondente, e sabia que tinha que fazer um projeto legal com ele. Então peguei o par e criei um portão elétrico de cronometragem para a pista do carro caça-níqueis que já estava na mesa para meu projeto de carro caça-níqueis autônomo.
O Hardware
Os 3 componentes principais são o módulo de laser, o sensor receptor de laser e a tela GLCD.
Eu realmente amo usar GLCD, você pode encontrar informações sobre a pinagem aqui:https://playground.arduino.cc/Code/GLCDks0108/
E você pode baixar a biblioteca aqui:
https://bitbucket.org/bperrybap/openglcd
Criei um conector bacana e fácil para ele, como mostra a imagem abaixo.

O módulo laser KY008 tem 3 pinos, -, + e S, eu apenas encurto o S e o + para 5V. Se você não quiser que o laser fique ligado o tempo todo, conecte o pino S a um pino digital no Arduino. sempre que você definir um valor alto, o laser será ativado.
O sensor também possui 3 pinos, GND, VCC e SIGNALE. conecte à alimentação e ao pino de entrada no Arduino.
O desafio mais difícil nesta construção foi alinhar tudo.

Você pode assistir o resultado final neste clipe.
Código
- Arquivo sem título
Arquivo sem título Arduino
/ ** Tempo mantendo a porta digital * Código por:Tal Ofer * [email protected]*/#include "openGLCD.h" // voltas infounsigned long currentRunStartMillis; sem sinal longo lastRunInMillis; sem sinal longo bestRunInMillis; int currentLap; não assinado long SavedMillis; gText t1; // definirá o tempo de execução latergText t2; // definirá o tempo de execução latergText t3; // definirá o tempo de execução mais tarde // global para displayint sec_val, milli_val; // laser gate const int gateSensorPin =2; // o número do sensor de porta pinint gateSensorState; // a leitura atual do sensorint lastgateSensorState =LOW; // a leitura anterior de sensorunsigned long lastDebounceTime =0; // a última vez que o pino do sensor foi alternadoint debounceDelay =50; // o tempo de debounce; aumenta se a saída flickersvoid setup () {// modo pin pinMode (gateSensorPin, INPUT); atraso (50); // atrasar o sensor e o laser funcionar, então não vamos acionar a volta. // iniciar GLCD GLCD.Init (NON_INVERTED); // define áreas t1.DefineArea (textAreaTOP, lcdnums14x24); t2.DefineArea (0, GLCD.CenterY, 8, 2, números fixos 7x15); t3.DefineArea (GLCD.CenterX, GLCD.CenterY, 8, 2, números fixos 7x15); t3.SetFontColor (WHITE); // definir a cor da fonte t3.ClearArea (); // imprimir texto GLCD.SelectFont (System5x7); GLCD.CursorTo (1, 4); GLCD.print ("ÚLTIMO"); GLCD.CursorTo (11, 4); GLCD.print ("MELHOR"); // redefine os parâmetros currentRunStartMillis =0; lastRunInMillis =0; bestRunInMillis =0; currentLap =0;} void loop () {// lê o estado do sensor laser:int reading =digitalRead (gateSensorPin); // Se a chave mudou, devido a ruído ou ao pressionar:if (reading! =LastgateSensorState) {// zera o temporizador de debouncing lastDebounceTime =millis (); } // fim se // se passa o tempo de debounce if ((millis () - lastDebounceTime)> debounceDelay) {if (reading! =gateSensorState) {gateSensorState =reading; // Se baixamos, isso significa que o feixe foi quebrado if (gateSensorState ==LOW) {// salve os milis para que toda a matemática seja feita com o mesmo valor. saveMillis =millis (); // se não for a primeira volta if (currentLap> 0) {// salvar a última execução lastRunInMillis =savedMillis - currentRunStartMillis; // se a última execução for mais rápida, é melhor executar if (lastRunInMillis0) {calcResultFromMillis (savedMillis - currentRunStartMillis, &sec_val, &milli_val); } else {calcResultFromMillis (0, &sec_val, &milli_val); } // termina se // CURRENT RUN t1.CursorTo (3, 0); // coluna e linha são relativas à área de texto t1.Printf (F ("% 02d.% 03d"), sec_val, milli_val); // ÚLTIMA EXECUÇÃO calcResultFromMillis (lastRunInMillis, &sec_val, &milli_val); t2.CursorTo (1, 1); // coluna e linha são relativas à área de texto t2.Printf (F ("% 02d.% 03d"), sec_val, milli_val); // MELHOR EXECUÇÃO calcResultFromMillis (bestRunInMillis, &sec_val, &milli_val); t3.CursorTo (1, 1); t3.Printf (F ("% 02d.% 03d"), sec_val, milli_val);} // loop wnd // calcula milis em 2 valores, segundos e milis para displayvoid calcResultFromMillis (valor longo sem sinal, int * sec_val, int * milli_val) {* sec_val =int (valor / 1000); * milli_val =value - * sec_val * 1000;}
Processo de manufatura