|
【S065】拧螺丝辅助机器人
作品说明 |
作者:何书凡、徐悦、余佳阳、袁铭浩、郑伊美
单位:西安外事学院
指导老师:钱小川、陈泽平
1. 产品说明
1.1 设计目的
自动化机器人近年来在我国发展迅速,本项目旨在设计一款拧螺丝辅助机器人,拧螺丝辅助机器人的出现可以说是节省了很多人力,尤其是当代青年对进场打工的厌恶,解放了我们不得不做的一些体力活,而且其操作更加的方便和准确,对于使用其工作的工厂和行业而言,是不可缺少的得力助手。在该机器人工作的过程中,该机器人不需要搭手拧螺丝,可以自行夹取物体并为其拧上螺丝,本设计为中小型企业“机器换人”打了一剂强心针,不仅解决了单工位人工锁螺丝难题,还极大减少了中小企业自动化购置成本。质量好的机器人甚至可以应用在各种中高级装配工作当中,可以部分取代或完全取代人力搬运装配。机器人的使用可以深化人们智能生活的理念,让科技化深入到人民大众的生活中,具有显著的经济和社会效益。
作品说明
拧螺丝辅助机器人实物图
1.2 设计背景
随着个性化需求的出现,对生产场景柔性化程度要求也越高,在生产制造的过程中就需要一个更好的帮手来完成越来越高的要求,智能型机器人在社会上就越来越受欢迎,它的出现就可以很好地满足人们对此越来越多,越来越高的要求,它能够不断重复做一些设定好的精确动作,提高效率,减少失误,为人们解放双手,减少人的劳动力,拧螺丝辅助机器人作为一款智能型的机器人,具备一定的人工智能化,能够自主地进行物体的寻找抓取以及拧上、卸取螺丝等系列操作,因此设计一个此类机器人来作为辅助对于生产制造来说具有很重大的意义。
本产品以拧螺丝辅助机器人为研究对象,充分调研了目前市场上拧螺丝辅助机器人的研究现状,了解了该种机器人的发展趋势以及不足,项目的最终目的是针对目前市场上拧螺丝辅助机器人结构复杂,不能随意移动等缺点进行改造,设计一种能够自主运动并且可以自行抓取物体帮助物体拧紧螺丝的简易多功能拧螺丝辅助机器人。该机器人可以按照路线运动,并且中途可以绕开所有障碍物,到达指定的位置,然后完成指定的任务,主要可应用于电子加工厂等。
拧螺丝辅助机器人模型设计图
1.3 设计思路
根据市场上拧螺丝辅助机器人的研究现状和需求分析,本设计拟采用“需求分析—关键技术—设计功能”的总体思路,如下图所示:
1.3.1 需求分析
本项目需要按照路线寻找并夹取物体,然后将其放置到与上方螺丝相对应的位置并进行拧螺丝或卸螺丝等系列操作,完成操作后将物体重新放回原位。
1.3.2 关键技术与功能
本项目设计的拧螺丝辅助机器人包括行走模块、检测模块、旋转模块、识别夹取模块。
① 行走模块:机器人的行走模块实现了机器人的自主移动。其中用了步行电机、用PWM调速,用超声波来检测物体的位置。
② 检测模块:机器人的检测模块检测物体的螺丝是否拧紧,若拧紧,则电机停止运转;若未拧紧,则将螺丝拧紧后停止运转电机。
③ 识别抓取模块:机器人的识别抓取模块实现了机器人对特定物体进行抓取搬运功能。机器人通过安装在车上的HR-04超声波传感器对物体进行距离测算,检测出适当距离的物体后,通过夹取模块来控制具有三个自由度的机械臂进行抓取,当机械臂的抓夹触碰到物体时,启动触碰传感器停止手爪的抓取运动,然后把物体放到指定区域。
④ 旋转模块:机器人的旋转模块实现了机器人将螺丝拧紧、卸取等功能。
1.4 难点和解决办法
本项目的难点是机械臂如何抓取物体,对此我们进行了多次的实验、测量、计算来解决这一难题。
抓取物体后如何调整位置和角度对准到操作部位也是一个难点,针对机械臂如何调整角度,我们进行了多次的实验和改进,最终在机械臂上使用了三个自由度,三个自由度的机械臂共同维持机械爪的转动。
如何按照规定的路线准确的寻找物体也需要进行多次的实验和调整。
1.5 创新点
① 本项目机器人的机械臂用了三个自由度,可以使机械臂随意转动,提高机器人的灵活度。
② 底座安装了三个轮子,机器人可以按照路线走动到达位置开始工作,比起需要人为将物体放在机器人上使其工作要方便很多,可以减少人的劳动力。
③ 机器人的体积小,占地面积不是很大,可以适用于电子加工厂装配等。
④ 巧妙的机械结构可以使机械臂更好地抓取物体并到达指定位置为其进行下一步的拧螺丝操作,提高工作效率。
2. 整体结构
2.1 硬件设计说明
2.1.1 主控板设计
采用Ares-ST 扩展板。
2.1.2 识别夹取模块
利用探索者零部件,组装成一个夹合装置和一个舵机相连,控制舵机的转动达到伸缩和张开的目的。
采用超声波传感器,因本产品是单线程的工作,延迟传感器的识别,等物体到达最终位置时取消识别,开始进行拧螺丝环节,并不需要把螺丝拧紧,可以设置拧25圈(测试最合适的圈数),只要完成了25圈,就可以理解为已经把螺丝拧紧了。
3. 软件设计
本次设计的拧螺丝辅助机器人代码运行环境是基于window10 Arduino1.5.2,下图为本作品的系统软件设计总体流程图:
系统设计软件框图
当接通电源,机器人开始进行电子元件初始化,行走模块开始工作。当超声波检测到物体且距离判断合适时,机器人会停下来抓取物体;若超声波检测不到信号,机器人继续行驶;若超声波传感器未检测到信号且距离判断过大时,则按照原轨迹继续前行,夹取到物体后将其放置到与上方螺丝相对应的位置并进行拧螺丝或卸螺丝等系列操作,完成操作后将物体重新放回原位,结束进程。
4. 示例程序
程序 ①:
#define V_MAX 12800 //步进电机速度 #include <Arduino.h> #include <Wire.h> #include <Servo.h> Servo myservo1; Servo myservo2; Servo myservo3;
#define STOP 0 #define FORWARD 1
int chaoshengbo_left = A0;/// int pos = 0;
void setup() { Serial.begin(9600); pinMode( chaoshengbo_left, INPUT); myservo1.attach(2); myservo2.attach(3); myservo3.attach(4); initMotor();
}
void loop(){ { for(int i=5;i>0;i--) { forward(); delay(0); } while(1) { delay(2000); chaoshengbo_left=1; //有信号为0 没有信号为1
if(chaoshengbo_left=1)
{forward();//调用前进函数 myservo2.write(125); myservo3.write(25); for (pos = 25; pos >= 0; pos -= 1) myservo3.write(pos); delay(1); } } } }
void rotation(int angle) //舵机旋转函数,输入目标角度angle { int anglex=myservo1.read(); //读取舵机实际角度,将其值赋给anglex if(angle>anglex) //如果实际角度小于目标角度,则逐渐增大角度至目标角度为止 { for(int i=anglex;i<angle;i++) { myservo1.write(i); delay(15); } } else if(angle<anglex) //如果实际角度大于目标角度,则逐渐减小角度至目标角度为止 { for(int i=anglex;i>angle;i--) { myservo1.write(i); delay(15); } } }
//============================================================ void moveTest(){ move( 80, 80, 80, 80); //前进 move(-80, -80, -80, -80); //后退 move(-80, 80, 80, -80); //左平移 move( 80, -80, -80, 80); //右平移 move(-80, 80, -80, 80); //左转 move( 80, 80, -80, -80); //右转 } void forward() { move(80,80,80,80); move(80,80,80,80); delayMicroseconds(2); } |
#include "Arduino.h" #include <AccelStepper.h> #include <MultiStepper.h>
#define EN 8 #define MAIN_STEP 200 //步进电机每圈步数 #define MICRO_STEP 16 //驱动细分数 (gaile 16->2) #define TOTAL_STEP (MAIN_STEP * MICRO_STEP) //16细分下每圈步数 #define D_WHEEL 56.5 //车轮直径/mm const double CWheel = M_PI * D_WHEEL; //车轮周长/mm const double Ratio = TOTAL_STEP / CWheel; //step/mm
AccelStepper stepper_x(1, 45, 44); //x AccelStepper stepper_y(1, 33, 32); //y AccelStepper stepper_z(1, 43, 42); //z AccelStepper stepper_a(1, 31, 30); //a
MultiStepper steppers;
void initMotor(){ pinMode(EN, OUTPUT); digitalWrite(EN, LOW);
steppers.addStepper(stepper_x); steppers.addStepper(stepper_y); steppers.addStepper(stepper_z); steppers.addStepper(stepper_a);
stepperSet(V_MAX); }
//x ; y ; w / mm void move(double x, double y, double z, double a){ double step_x, step_y, step_z, step_a;
x *= Ratio; y *= Ratio; z *= Ratio; a *= Ratio;
step_x = x; step_y = -y; step_z = z; step_a = -a;
stepperMove(step_x, step_y,step_z,step_a); }
void stepperSet(double _v){ stepper_x.setMaxSpeed(_v); stepper_y.setMaxSpeed(_v); stepper_z.setMaxSpeed(_v); stepper_a.setMaxSpeed(_v); } void stepperMove(long _x, long _y, long _z, long _a){ long positions[4]; positions[0] = _x; positions[1] = _y; positions[2] = _z; positions[3] = _a;
steppers.moveTo(positions); steppers.runSpeedToPosition();
stepper_x.setCurrentPosition(0); stepper_y.setCurrentPosition(0); stepper_z.setCurrentPosition(0); stepper_a.setCurrentPosition(0); } |
程序 ②:
* 本项目未获得作者开源授权,无法提供资料下载。