DIY激光射击场:使用Arduino和蜂鸣器反馈构建干目标系统
该项目向您介绍了一种引人入胜且具有成本效益的激光干靶系统方法。我们将利用Arduino Uno微控制器作为系统的大脑,与各种组件连接,以创建逼真的培训体验。 激光指示器充当您的虚拟枪支,而光传感器 (LDR) 与运算放大器 (LM358) 相结合,可精确检测激光何时击中指定目标。四位数七段显示屏 (TM1637) 可实时跟踪您的命中,激励您提高准确性。 为了在您的训练中添加听觉元素,每当您成功命中时,由 Arduino 控制的蜂鸣器就会响起,提供即时反馈。此外,重置按钮可让您轻松清除计数器并重新开始新的训练课程。 这款 DIY 激光靶系统提供了一种安全方便的方法,可以在家中磨练您的射击技能,非常适合业余爱好者和打靶练习爱好者
项目介绍
在目标实践领域,创新不断推动培训方法的演变。其中一项进步是激光干靶系统,这是一个复杂的平台,无需实弹即可模拟射击场景。该项目探索了激光干目标系统的设计和功能,该系统利用 Arduino Uno、TM1637 四位七段显示器、复位按钮、带有运算放大器 LM358、BC547 晶体管和蜂鸣器的 LDR(光敏电阻器)等组件。这些组件共同创建了一个全面的系统,用于精确的目标跟踪和成功命中后的听觉反馈。
设计和组件:
激光干目标系统的核心是 Arduino Uno 微控制器,这是一个用于电子项目的多功能且广泛使用的平台。它接收来自LDR的输入,处理数据,并控制显示器和蜂鸣器的输出信号。
TM1637 四位七段显示屏为用户提供视觉反馈,清晰准确地显示目标计数。其四位数配置允许显示各种分数,增强了系统的多功能性。
重置按钮为用户提供了快速将目标计数重置为零的便利,从而促进了练习会话之间的无缝转换。此功能对于在训练演习期间保持效率和组织至关重要。
包含带有运算放大器 LM358 和 BC547 晶体管的 LDR 通过实现光检测来增强系统功能。LDR 感应由激光击中目标引起的环境光强度变化。运算放大器 LM358 为 Arduino Uno 提供更强大的输入。BC547 晶体管充当开关,使 Arduino Uno 能够准确地检测目标上是否存在命中。
蜂鸣器集成在系统中,可在击中目标时提供听觉反馈。其独特的声音提醒射手注意他们的准确性,加强积极的强化并提高练习期间的参与度。
功能性:
激光干靶系统的工作原理如下:
初始化:打开系统电源后,Arduino Uno 初始化显示器,将目标计数重置为零,并准备接收来自 LDR 的输入信号。
目标检测:当射手瞄准并向目标发射激光时,LDR 会检测光强度的变化。当激光击中目标时,LDR 会记录光的增加,从而触发信号。
信号处理:来自 LDR 的信号由运算放大器 LM358 放大,以确保准确性和可靠性。然后,放大的信号由Arduino Uno处理。
目标计数:检测到命中后,Arduino Uno 会递增 TM1637 七段显示器上显示的目标计数。射手可以实时跟踪他们的表现。
听觉反馈:同时,Arduino Uno 激活蜂鸣器以发出声音,表示击中成功。这种听觉反馈加强了积极的强化,增强了用户体验。
重置:在练习期间的任何时候,射手都可以按下重置按钮将目标计数重置为零,从而允许重新开始或过渡到新的练习。
优势和应用:
与传统的目标练习方法相比,激光干靶系统具有以下几个优势:
安全性:通过使用激光代替实弹,该系统消除了与枪支相关的意外伤害风险。这使其成为在室内环境或空间有限的区域进行培训的理想选择。
成本效益:该系统减少了对弹药和纸靶等消耗性资源的需求,从而为用户节省了长期成本。
即时反馈:视觉和听觉反馈的结合为射手提供了即时满足感,允许立即调整和提高性能。
可访问性:该系统可以由所有经验水平的用户轻松设置和操作,使初学者和有经验的射手都可以访问。
结论:
激光干目标系统集成了 Arduino Uno、TM1637 显示器、复位按钮、带运算放大器 LM358 的 LDR、BC547 晶体管和蜂鸣器等组件,代表了目标实践技术的重大进步。它的安全性、成本效益、多功能性和即时反馈使其成为枪支训练和休闲射击活动的宝贵工具。随着技术的不断发展,激光干靶系统等创新将继续塑造目标练习方法的未来,提高全球射手训练的有效性和可及性
激光代码
#include <Arduino.h>
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 9
#define DIO 8
TM1637Display display(CLK, DIO);
// the number of the pushbutton pin
const int FireButton = 11;
int Fire_State = 0; // variable for reading the pushbutton status
int button_state=0;
int k=0;
const int Reset_Button=10;
const int buzzer=13;
const int LASER=12;
void setup() {
pinMode(FireButton, OUTPUT);
pinMode(buzzer, OUTPUT);
pinMode(LASER, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(Reset_Button, INPUT);
Serial.begin(9600);
display.clear();
display.setBrightness(0x0f);
display.showNumberDec(k, true); // Expect: 0000
}
void loop()
{
display.setBrightness(0x0f);
// read the state of the pushbutton value:
Fire_State = digitalRead(FireButton);
button_state=digitalRead(Reset_Button);
//Serial.println(digitalRead(LASER));
// check if the pushbutton is pressed. If it is, the Fire_State is HIGH:
noTone(buzzer);
digitalWrite(LASER, LOW);
if (Fire_State == HIGH)
{
display.showNumberDec(k, true);
tone(buzzer, 1000);
k=k+1;
digitalWrite(FireButton, HIGH);
digitalWrite(LASER, HIGH);
Serial.println(digitalRead(LASER));
}
if (button_state ==HIGH)
{
k=0;
display.showNumberDec(k, true); // Expect: 0000
}
else {
digitalWrite(FireButton, LOW);
}
delay(100);
}
靶系统
#include <Arduino.h>
#include <TM1637Display.h>
// Module connection pins (Digital Pins)
#define CLK 10
#define DIO 9
TM1637Display display(CLK, DIO);
const int LDR_Pin = 6; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
// variables will change:
int LDR_State = 0; // variable for reading the pushbutton status
int button_state=0;
int k=0;
const int BUTTONPIN=8;
const int buzzer=5;
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
pinMode(buzzer, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(LDR_Pin, INPUT);
pinMode(BUTTONPIN, INPUT);
Serial.begin(9200);
display.clear();
display.setBrightness(0x0f);
display.showNumberDec(k, true); // Expect: 0000
}
void loop()
{
display.setBrightness(0x0f);
// read the state of the pushbutton value:
LDR_State = digitalRead(LDR_Pin);
button_state=digitalRead(BUTTONPIN);
Serial.println(LDR_State);
// check if the pushbutton is pressed. If it is, the LDR_State is HIGH:
noTone(buzzer);
if (LDR_State == HIGH)
{
display.showNumberDec(k, true);
tone(buzzer, 1000);
k=k+1;
digitalWrite(ledPin, HIGH);
}
if (button_state ==HIGH)
{
k=0;
display.showNumberDec(k, true);
}
else {
digitalWrite(ledPin, LOW);
}
delay(100);
}