Slot Cars 激光触发单圈时间 GLCD 显示
组件和用品
| × | 1 | ||||
| × | 1 |
应用和在线服务
|
关于这个项目
介绍
我买了一对 KY008 激光模块和一个匹配的传感器,我知道我必须用它做一些很酷的项目。于是带着这对搭档,为我的自动驾驶老虎机项目已经摆在桌面上的老虎机轨道创建了一个电动计时门。
硬件
3个主要部件是激光模块、激光接收传感器和GLCD屏幕。
我真的很喜欢使用 GLCD,您可以在此处找到有关引脚的信息:https://playground.arduino.cc/Code/GLCDks0108/
你可以从这里下载库:
https://bitbucket.org/bperrybap/openglcd
我为它创建了一个漂亮而简单的连接器,如下图所示。
KY008 激光模块有 3 个引脚,-、+ 和 S,我只是将 S 和 + 都缩短到 5V。如果您不希望激光器一直开着,请将 S 引脚连接到 Arduino 上的数字引脚。只要你把它调高,激光就会打开。
传感器也有 3 个引脚,GND、VCC 和 SIGNALE。连接到电源和 Arduino 上的输入引脚。
此版本中最困难的挑战是让所有内容保持一致。
您可以在此剪辑中观看最终结果。
代码
- 无标题文件
无标题文件Arduino
/** 计时数字门* 代码:Tal Ofer* [email protected]*/#include "openGLCD.h"// 圈数 infounsigned long currentRunStartMillis;unsigned long lastRunInMillis;unsigned long bestRunInMillis;int currentLap;unsigned长时间保存Millis;gText t1; // 将定义运行时 latergText t2; // 将定义运行时 latergText t3; // 稍后将定义运行时 // global for displayint sec_val, mill_val;// 激光门 const int gateSensorPin =2; // 门传感器 pinint gateSensorState 的数量; // 传感器的当前读数 lastgateSensorState =LOW; // 之前从传感器中读取的 unsigned long lastDebounceTime =0; // 上次传感器引脚被切换时 debounceDelay =50; // 去抖动时间;如果输出闪烁则增加void setup() { // 引脚模式 pinMode(gateSensorPin, INPUT);延迟(50); // 延迟传感器和激光工作,所以我们不会触发圈速。 // 启动 GLCD GLCD.Init(NON_INVERTED); // 定义区域 t1.DefineArea(textAreaTOP, lcdnums14x24); t2.DefineArea(0, GLCD.CenterY, 8, 2, fixednums7x15); t3.DefineArea(GLCD.CenterX, GLCD.CenterY, 8, 2, fixednums7x15); t3.SetFontColor(白色); // 设置字体颜色 t3.ClearArea(); // 打印文本 GLCD.SelectFont(System5x7); GLCD.CursorTo(1, 4); GLCD.print("最后一个"); GLCD.CursorTo(11, 4); GLCD.print("最佳"); // 重置参数 currentRunStartMillis =0; lastRunInMillis =0; bestRunInMillis =0; currentLap =0;}void loop(){ // 读取激光传感器的状态:int reading =digitalRead(gateSensorPin); // 如果开关由于噪音或按压而改变: if (reading !=lastgateSensorState) { // 重置去抖动计时器 lastDebounceTime =millis(); } //end if // 如果超过去抖动时间 if ((millis() - lastDebounceTime)> debounceDelay) { if (reading !=gateSensorState) { gateSensorState =reading; // 如果我们变低,这意味着光束被破坏了 if (gateSensorState ==LOW) { // 保存毫秒,这样所有的数学运算都将使用相同的值完成。保存的米利斯 =米利斯(); // 如果不是第一圈 if (currentLap> 0) { // 保存最后一次运行 lastRunInMillis =savedMillis - currentRunStartMillis; // 如果上次运行更快,则最佳运行 if (lastRunInMillis0) { calcResultFromMillis(savedMillis - currentRunStartMillis, &sec_val, &milli_val); } else { calcResultFromMillis(0, &sec_val, &milli_val); } //end if // 当前运行 t1.CursorTo(3, 0); // 列&行相对于文本区域 t1.Printf(F("%02d.%03d"), sec_val, mill_val); // 上次运行 calcResultFromMillis(lastRunInMillis, &sec_val, &milli_val); t2.CursorTo(1, 1); // 列&行相对于文本区域 t2.Printf(F("%02d.%03d"), sec_val, mill_val); // 最佳运行 calcResultFromMillis(bestRunInMillis, &sec_val, &milli_val); t3.CursorTo(1, 1); t3.Printf(F("%02d.%03d"), sec_val, milli_val);} //wnd循环//计算毫秒为2个值,秒和毫秒用于displayvoid calcResultFromMillis(unsigned long value, int *sec_val, int * milli_val) { *sec_val =int(value / 1000); *milli_val =值 - *sec_val * 1000;}
制造工艺