亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

自主神经哨兵炮塔

组件和用品

OpenBuilds NEMA 17 步进电机
× 1
带齿轮箱的DFRobot步进电机
× 1
DFRobot 步进电机驱动器
× 1
DFRobot Pixy 2 Cam
× 1
Arduino Mega 2560
× 1
超声波传感器 - HC-SR04(通用)
× 1
Nerf Nitron Gun
× 1

必要的工具和机器

3D 打印机(通用)
烙铁(通用)
CNC 路由器

应用和在线服务

Arduino IDE
Autodesk Fusion 360

关于这个项目

想法

几年前,我看到一个项目展示了一个半自主的炮塔,一旦瞄准就可以自行开火。这让我产生了使用 Pixy 2 相机获取目标然后自动瞄准 nerf 枪的想法,然后它可以锁定并自行开火。

组件

对于这个项目,枪需要眼睛,所以我选择使用 Pixy 2,因为它可以很容易地与主板连接。然后我需要一个微控制器,所以我选择了 Arduino Mega 2560,因为它有多少针脚。

由于枪需要两个轴,偏航和俯仰,它需要两个步进电机。因此,DFRobot 向我发送了他们的双 DRV8825 电机驱动板。

加元

我首先加载 Fusion 360 并插入 nerf 枪的附加画布。然后我用那个画布创建了一个实体。枪设计完成后,我制作了一个带有一些轴承支撑的平台,可以让枪从左到右旋转。我在旋转平台旁边放置了一个步进电机来驱动它。

但更大的问题是如何使枪上下倾斜。为此,需要一个线性驱动系统,其中一个点连接到可移动块上,另一个点连接到枪的后部。一根杆将两点连接起来,使枪可以沿其中心轴转动。

制造零件

我设计中的几乎所有部件都是 3D 打印的,所以我使用了我的两台打印机来创建它们。然后我创建了可移动平台,首先使用 Fusion 360 为我的 CNC 路由器生成必要的刀具路径,然后我从一张胶合板上切下磁盘。

组装

在创建了所有零件之后,就该组装它们了。我首先将轴承支架连接到旋转盘。然后我通过将 6 毫米铝杆和螺纹杆穿过零件来组装线性节距组件。

最后,我用一根钢棒和两个由铝挤压制成的柱子连接了 nerf 枪本身。

编程

现在是项目最困难的部分:编程。射弹机非常复杂,其背后的数学计算可能令人困惑。我首先一步一步地写出程序流程和逻辑,详细说明在每个机器状态下会发生什么。不同的状态如下:

  • 获取目标
  • 定位枪
  • 启动电机
  • 开枪
  • 关闭电机

获取目标首先要设置 Pixy 以跟踪作为目标的霓虹粉红色物体。然后枪移动直到目标在 Pixy 的视野中居中,然后测量从枪管到目标的距离。通过使用这个距离,可以使用一些基本的三角函数找到水平和垂直距离。我的代码有一个名为 get_angle() 的函数,它使用这两个距离来计算击中目标所需的角度。

然后喷枪移动到这个位置并通过 MOSFET 打开电机。在它缠绕五秒钟后,它会移动伺服电机以扣动扳机。然后 MOSFET 关闭电机,然后 nerf 枪返回寻找目标。

玩得开心

我在墙上贴了一张霓虹粉色的索引卡来测试枪的准确性。它做得很好,因为我的程序校准并调整了测量距离的角度。这是一段演示枪支工作的视频:

代码

  • 示意图
原理图C/C++
上传到 Arduino Mega
#include #include #include "BasicStepperDriver.h"#include #include //X 是间距,Y 是yawconst int pin[] ={6,7,8,5,4,12}; //MX STEP, DIR, EN, MY STEP, DIR, ENconst int limit_switch =26,laser_pin =11, spool_pin =10,servo_pin =13, distance_trig =29, distance_echo =30;double velocity =21.336;double velocity_squared =455.2浮动current_angle =0.0;浮动hyp_distance; //枪到目标的距离(以米为单位)#define X_MID 164#define Y_MID 150#define DEADZONE 15#define G 9.8#define STP_PER_DEG_YAW 3.333#define STP_PER_DEG_PITCH 184859#define MICROSTEPS 32#define RPM MOTOR20_ST_32#define RPM MOTOR20_STYEPS_120 /17.7777 步/度BasicStepperDriver pitch_stepper(MOTOR_STEPS_X, pins[1], pins[0]);BasicStepperDriver yaw_stepper(MOTOR_STEPS_X, pins[4], pins[3]);Servo trigger;Pixy2I2C pixy;enum States {ACQUIREPO , FIRE, WIND_DOWN, RETURN};States state =ACQUIRE;void setup() { Serial.begin(115200); init_pins();延迟(1000); //home_pitch(); pixy.init(); Serial.println("Ready...");}void loop() { switch(state){ case ACQUIRE:acquire_target();状态 =位置;数字写入(激光针,高);休息; case POSITION:Serial.println("定位");位置枪();状态 =线轴;休息; case SPOOL:Serial.println("spooling");数字写入(spool_pin,高);延迟(5000);状态 =火;休息;案例火灾:fire_gun();状态 =WIND_DOWN;休息; case WIND_DOWN:Serial.println("结束");数字写入(spool_pin,低);延迟(2000);状态 =返回;数字写入(激光针,低);状态 =获取;休息; }}void fire_gun(){ Serial.println("开枪!");触发器.写(108);延迟(400);触发器。写(90);延迟(2000);}无效位置枪(){浮动x,y; hyp_distance =ping(); hyp_distance /=100; while(!hyp_distance){ hyp_distance =ping(); hyp_distance /=100; }Serial.println(hyp_distance); x =cos(current_angle) * hyp_distance; y =sin(current_angle) * hyp_distance; float target_angle =get_angle(x,y);目标角度/=100; Serial.println(target_angle); move_pitch(target_angle - current_angle); current_angle =target_angle;}void Acquire_target(){ int x=0, y=0;长步骤_采取=0;布尔锁定=假; while(!lock){ pixy.ccc.getBlocks(); if(pixy.ccc.numBlocks){ x =pixy.ccc.blocks[0].m_x; y =pixy.ccc.blocks[0].m_y; Serial.print("目标在X位置看到:");Serial.print(x);Serial.print(", Y:");Serial.println(y); if(x <=(X_MID - DEADZONE)){ //如果太靠左,将枪向左移动 move_yaw(1); } else if(x>=(X_MID + DEADZONE)){ move_yaw(-1); } else if(y <=(Y_MID - DEADZONE)){ //太高了,把枪往上移pitch_stepper.move(33152);采取的步骤 +=33152; } else if(y>=(Y_MID + DEADZONE)){ pitch_stepper.move(33152);采取的步骤 +=33152; } else{ 锁=真; Serial.print("目标锁定在位置 X:");Serial.print(x);Serial.print(", Y:");Serial.println(y); Serial.print("所采取的步骤:");Serial.println(steps_taken); } } } current_angle =steps_taken / STP_PER_DEG_PITCH; Serial.print("当前角度:");Serial.println(current_angle);}void init_pins(){ pinMode(pins[2],OUTPUT); pinMode(pins[5],OUTPUT); pinMode(limit_switch, INPUT_PULLUP); pinMode(laser_pin, 输出); pinMode(spool_pin,输出); pinMode(距离回声,输入); pinMode(距离触发,输出);数字写入(引脚[2],低);数字写入(引脚[5],低);数字写入(激光针,低);数字写入(spool_pin,低);触发器。附加(伺服销); pitch_stepper.begin(RPM, MICROSTEPS); yaw_stepper.begin(5, MICROSTEPS); trigger.write(90);}void move_yaw(float degree){ yaw_stepper.move(degrees*STP_PER_DEG_YAW*32);}void move_pitch(float degree){ current_angle +=degree; pitch_stepper.move(degrees*STP_PER_DEG_PITCH);}float get_angle(float distance, float height){ float i =2 * height * 455.225;浮动 j =G * 距离 * 距离;我 +=j; j =9.8 * i; i =sqrt(pow(velocity_squared,2) - j); return atan((velocity_squared-i) / (G * distance))*(180/PI);}float ping(){ Serial.println("Getting distance...");持续时间长;数字写入(距离触发,低);延迟微秒(5);数字写入(距离触发,高);延迟微秒(10);数字写入(距离触发,低);持续时间 =脉冲输入(距离回声,高);返回持续时间 / 2 / 29.1; //以米为单位的距离}void home_pitch(){ Serial.println(digitalRead(limit_switch)); if(!digitalRead(limit_switch)){ //如果开关处于活动状态 pitch_stepper.rotate(720); } while(digitalRead(limit_switch)){ //Serial.println(digitalRead(limit_switch)); pitch_stepper.move(-32); } pitch_stepper.rotate(2880*2);}

定制零件和外壳

Thingiverse 存储库
thingiverse.com 上的 CAD 文件

示意图


制造工艺

  1. 步进电机
  2. 集成驱动器简化了步进电机设计
  3. Raspoulette 原型
  4. 简单的 Pi 机器人
  5. 双极步进电机库
  6. Swiper - 自动 Tinder/Bumble Swiper
  7. 自主家庭助理机器人
  8. SmartWay
  9. 由串行对话控制的基于步进的旋转支架
  10. 伺服电机和步进电机之间的灰色地带
  11. 什么是直线电机?
  12. 什么是伺服电机?