利用 Arduino Nano、NRF24L01 和 TM1637 显示屏构建一个便携式激光射击场,用于追踪射击情况、命中情况及实时准确性
扫描二维码
随时随地手机看文章
该系统由两个独立的 Arduino Nano 单元组成:
激光枪单元 — 一款手持式控制器,配备有激光二极管、发射按钮、复位按钮以及一个 4 位的 TM1637 显示屏。每次按下扳机键,激光就会发射 80 毫秒,并且会增加射击次数计数器。前面板上的一个红色 LED 会确认无线连接状态,并在每次射击时闪烁。
目标单元 — 一个独立的盒子,内含一个 LDR(光敏电阻)传感器、蜂鸣器、绿色状态指示灯以及其自身的 TM1637 显示屏,用于显示击中次数。当激光束与 LDR 相遇持续时间超过 50 毫秒时,即视为有效击中,蜂鸣器会发出声音,击中次数会立即通过 NRF24L01 无线电传输给枪支。
这两个单元均通过 NRF24L01 2.4GHz 无线电进行通信,该无线电具有硬件自动确认和自动重试功能——这使得无线连接比仅使用 433MHz ASK 模块的连接要稳定得多。
其工作原理
枪击检测(枪支一侧)
当按下火警按钮(经过 30 毫秒的延时处理)后,Arduino 将激光器拉高 80 毫秒,触发短暂的蜂鸣声,并将内部的“火警计数”变量(上限为 99)递增。TM1637 短暂显示“FIRE”,然后返回到旋转的统计数据显示界面。
碰撞检测(目标侧)
LDR 通过一个外部 10kΩ 的上拉电阻与 D8 相连接,该电阻连接至 5V 电压源。当激光照射到 LDR 上时,该引脚变为低电平。一个非阻塞的脉冲宽度滤波器会测量该引脚保持低电平的持续时间:
•50 毫秒以内 → 噪音,忽略
•50 毫秒至 2000 毫秒 → 有效命中
•超过 2000 毫秒 → 环境光线,忽略不计
在有效击中的情况下,击中次数会增加,蜂鸣器会鸣响 60 毫秒,状态指示灯会闪烁,并且显示屏会立即更新。
无线通信(NRF24L01)
每当有命中情况发生时,目标就会向炮台发送一个包含 2 个字节的数据包:
•byte[0] = 0x01 (消息已命中
•byte[1] = 挑战次数;
该目标还会每隔 1.5 秒发送一次心跳数据包,以便枪械知晓连接状态是否正常。枪械在其显示屏上显示“LINE”,当连接建立时,红色 LED 会持续亮起。如果 3 秒内未收到任何数据包,枪械会显示“---”符号,并且 LED 会熄灭。
当按下复位按钮时,该枪能够向目标发送一个复位指令(0xFF),从而使两个装置同时归零。
显示旋转(炮侧)
枪械展示每隔 2 秒钟会在三个屏幕上依次切换:
•第 XX 段——枪声响起
•Ht XX — 被收听次数
•AC XX — 准确率百分比(命中次数×100/射击次数)
在所有屏幕上,这个指示灯每 500 毫秒闪烁一次,以此作为系统运行状态的指示标志。
自测(目标端)
在电源接通后,目标会执行一次自检程序:
•1111 → 初创企业
•8888 → 所有段落检查完毕
•LED闪光灯 → 状态 LED 测试
•蜂鸣器发出两声哔哔声 → 蜂鸣器测试
•6666 → 重置按钮检查(5 秒钟窗口)
•7777 → LDR 激光检查(7 秒钟窗口)
•8888 加 3 次短促的蜂鸣声 + 指示灯闪烁 → 通过
本文编译自hackster.io





