蓝牙 Nerf 炮塔
组件和用品
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 3 | |
| | × | 2 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 30 | |
| | × | 4 | |
| | × | 15 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
| | × | 1 | |
关于这个项目
感谢您检查我的蓝牙控制的 Nerf 炮塔项目。我不认为这里有太多解释要做,这是一个 Nerf 炮塔,通过蓝牙从 Android 设备或 PC 控制。
.................... https://www.littlefrenchkev.com/bluetooth-nerf-turret.................. ......
它是如何运作的?
没有什么超级复杂的。俯仰和平移运动由 Arduino Nano 驱动的 2 个伺服系统处理。
飞镖使用由 2 个小型直流电机旋转的 2 个滚轮射出。发射命令时,伺服将飞镖推入滚轮。弹匣可容纳7个飞镖。
如上所述,它是通过蓝牙从安卓设备或 PC 控制的。
如何构建它?
组装:
三脚架和弹匣有两个不同的版本。一种是为 MG-90s 舵机设计的,另一种是为 MG996r 舵机设计的。 MG996r 舵机可能会耗电。如果您决定使用它们,请确保您的电源能够胜任工作。
三脚架:
杂志:
接线:
软件和测试!!!
一些额外的照片,因为为什么不!!!
代码
Arduino 代码Arduino
上传到arduino的代码。无论您选择通过安卓应用程序还是PC控制炮塔,代码都保持不变。#include //-----声明舵机和变量Servo recoil_servo;Servo pan_servo;Servotilt_servo;const字节 pan_limit_1 =0;常量字节 pan_limit_2 =180;常量字节倾斜_限制_1 =65;常量字节倾斜_限制_2 =180;常量字节后坐力_rest =180; // 静止时舵机的角度字节 recoil_pushed =125; // 舵机推dart需要达到的角度//-----串口数据处理相关变量byte byte_from_app;const byte buffSize =30;byte inputBuffer[buffSize];const byte startMarker =255;const byte endMarker =254;byte bytesRecvd =0;boolean data_received =false;//-----与电机计时和点火相关的变量bool is_firing =false;bool can_fire =false;bool recoiling =false;unsigned long fire_start_time =0;unsigned long fire_current_time =0;const long fire_time =150;unsigned long recoil_start_time =0;unsigned long recoil_current_time =0;const long recoil_time =2 * fire_time;const byte motor_pin =12;boolean motor_ON =false;//8============================Dvoid setup(){ //-----定义电机引脚模式 pinMode(motor_pin, OUTPUT);数字写入(motor_pin,低); //-----将伺服连接到引脚 recoil_servo.attach(9); pan_servo.attach(10);倾斜伺服.附加(11); //-----启动序列 recoil_servo.write(recoil_rest); pan_servo.write(90);延迟(1000);倾斜伺服.写(105); Serial.begin(9600); // 开始串行通信}//8==========================Dvoid loop(){ getDataFromPC();设置电机(); if (data_received) { move_servo(); set_recoil();设置电机(); } fire();}//8==========================Dvoid getDataFromPC() { //预期的数据结构[起始字节,平移量,倾斜量,电机开启,按下发射按钮,结束字节] //开始字节 =255 //平移量 =0 到 253 之间的字节 //倾斜量 =0 到 253 之间的字节 //电机开启 =0 用于off - 1 on //触发按钮按下 =0 表示未按下 - 1 表示按下 // 结束字节 =254 if (Serial.available()) { // 如果数据在串行中可用 byte_from_app =Serial.read(); //读取下一个可用字符 if (byte_from_app ==255) { // 查找起始字节,如果找到:bytesRecvd =0; //将接收到的字节重置为0(从头开始填充inputBuffer) data_received =false; } else if (byte_from_app ==254) { // 查找结束字节,如果找到:data_received =true; // 将 data_received 设置为 true 以便可以使用数据 } else { // 将接收到的字节添加到缓冲区 inputBuffer[bytesRecvd] =byte_from_app; //添加字符到输入缓冲区bytesRecvd++; // 增加接收到的字节(作为索引) if (bytesRecvd ==buffSize) { // 只是为了防止 inputBuffer 填满(不应该发生) bytesRecvd =buffSize - 1; // 如果 bytesReceived> 缓冲区大小设置 bytesReceived 小于缓冲区大小 } } }//8==========================Dvoid move_servo( ) { byte pan_servo_position =map(inputBuffer[0], 0, 253, pan_limit_2, pan_limit_1);//将输入缓冲区值转换为舵机位置值 pan_servo.write(pan_servo_position); //设置平移伺服位置字节tilt_servo_position =map(inputBuffer[1], 0, 253,tilt_limit_2,tilt_limit_1); //将输入缓冲区值转换为伺服位置值tilt_servo.write(tilt_servo_position); //设置平移伺服位置}//8============================Dvoid set_recoil() { if (inputBuffer[3] ==1) { //如果按下开火按钮 if (!is_firing &&!recoiling) { //并且还没有开火或反冲 can_fire =true; //设置可以触发为真(见void fire()中的效果) } } else { // 如果没有按下触发按钮 can_fire =false; //set 可以触发为 false(参见 void fire() 中的效果)}}//8============================Dvoid set_motor () { //-----使用 MOSFET 晶体管启动和停止电机。 if (inputBuffer[2] ==1) { //如果触摸到屏幕 digitalWrite(motor_pin, HIGH); //打开电机 motor_ON =true; } else { //如果屏幕没有被触摸 digitalWrite(motor_pin, LOW); //关闭电机 motor_ON =false; }}//8==========================Dvoid fire() { //如果电机字节打开,打开电机并检查if (can_fire &&!is_firing &&motor_ON) { //if (can_fire &&!is_firing) { fire_start_time =millis(); recoil_start_time =毫秒(); is_fireing =true; fire_current_time =毫秒(); recoil_current_time =毫秒(); if (is_firing &&fire_current_time - fire_start_time recoil_time) { is_firing =false; }}
python 文件
可执行文件和 android 应用程序可以在这里找到:https://www.littlefrenchkev.com/bluetooth-nerf-turrethttps://github.com/LittleFrenchKev/Bluetooth_Nerf_turret 示意图
这是主要的接线图。
布线分为小段,使用杜邦连接器连接在一起。这是为了便于组装。 这里是HC-05蓝牙接线。
这条接线包括一个分压器,允许将来自 arduino 的 5V 电压降低到 HC-05 接收器引脚的 3.3V 左右。