【S084】基于探索者机器人的现代投掷车
作品说明 |
作者:陈达权 贺启鑫 马金旭
单位:内蒙古工业大学
指导老师:武建新
机器人对于实现生产过程自动化、提高劳动生产率、降低劳动强度、保障生产安全具有重要意义,机器人是集机械、电子、控制技术于一体的典型的机电一体化设备。本项目结合本院实验室建设,设计一款小型机器人,使其能方便地变换动作。现代投掷车是基于光电感应与雷达控制的投掷车器,所谓的光电感应就是利用传感器对光的感应来改变投掷车的运动方向,旧式的投掷车主要是靠人工来控制运动方向,而现代投掷车是依靠光感应来改变方向,在工作过程中可大大的减少人力的需求,在未来的机械发展领域中将会有很大的发展空间。
关键字:现代投掷车 全方位雷达 机械手臂 避障 即时反应
1. 机器人设计
机器人模型主要有三部分组成,即移动部分、转动部分和工作部分。
1.1 移动部分
现代投掷车为车型,小车有4个轮子,前面两个轮各安装一个电动机实现对投掷车的驱动,同时前面两个轮子的上方各安装一个光感应传感器实现对投掷车的运动方向的控制,小车运动则由遥控手柄控制。
1.2 工作部分
工作部分主要是由机械手臂、机械手和探测雷达组成。
1.2.1 机械手臂
机械手臂是由主控板、传感器、2个标准舵机、电池及支撑组成。手臂有由下到上2个电机,其中第一个电机控制手臂180°旋转,实现小车附近180度范围内的物品的投掷;第二个电机控制机械手的转动方向。
1.2.2 机械手
机械手是最早出现的工业机器人,也是最早出现的现代机器人,用以按固定程序抓取、搬运物件或操作工具的自动操作装置。它可代替人的繁重劳动以实现生产的机械化和自动化,能在有害环境下操作以保护人身安全,因而广泛应用于机械制造。
机械手主要由手部、运动机构和控制系统三大部分组成。手部是用来抓持工件或产品的部件,该系统仅有一个机械手位于机械手臂上,用于物体的投掷。
1.2.3 探测雷达
探测雷达由原材料及2个圆周舵机、一个标准舵机组成。由下到上第一个电机控制圆盘360度旋转,第二个电机控制雷达的转向,第三个电机驱动雷达旋转。
2. 机器人设计图
2.1 机器人三维设计模型图
作品说明
2.2 机器人实物图
3. 系统机理及功能
在没有障碍的情况下,小车一直直线行走,雷达不停转动,雷达的旋转方向5秒钟改变一次。当左侧(或右侧)有光电感应时小车向左侧(或右侧)转并且小车停止运动,机械手臂竖直立起,机械手将物体抛出,手臂落下。当遇到障碍物时小车停止运动并且迅速倒退并停止,机械手臂竖直立起,机械手将物体抛出,手臂落下。当遇到声音时小车停止,机械手臂竖直立起,机械手将物体抛出。现代投掷车代替了人的繁重劳动以实现生产的机械化和自动化,能在有害环境下操作以保护人身安全。
4. 基于软件调试的快速编程
4.1 编程思想
通常的机器人调试都要先进行电机调试,然后进行主程序和各个子函数的调试,最后才可以进行装配之后的整体调试,其中整体调试的过程往往需要重复多次,甚至需要返回电机调试环节重新设定电机的位置和速度,这种方法对于调试电机数量很少的机构是可行的。但是如果当所要控制的电机数量很多时,就要考虑到各个电机所驱动的机构之间的时序和空间上的配合问题。我们通常用两种方法来解决这个问题,第一种方法就是把所有电机的状态整合为一个整体状态,然后给整体状态安排合理的时序;第二种方法是把所有电机的单一时序罗列,然后依照各个电机时序的分布,合理分割整体时序并且将各个电机的状态存放在整体时序中。这两种方法都解决了时序上的配合问题,但是对于每一个电机状态我们始终却只能依靠不断修改参数来确定,而且如果要考虑整体空间上的配合问题,就要对所有电机同时调试。这是一个相当繁琐的过程,所以我们采用了基于软件调试的快速方法来进行电机状态的确定,并且实现快速编程。
4.2 软件设计
4.2.1 编程软件
调试软件是基于C语言编程开发环境,最终功能实现对多路电机实时的上位机控制。软件的最终功能可分解为几个子任务:
① 实现串口通讯
② 实现接收数据的解码
③ 实现易于调试的数据输入
④ 实现实时调试和定状态调试
⑤ 实现状态的文本显示
4.2.2 程序设计
#include"config.h" #include"lib_io.h" #include"lib_arm.h" #define l Input(1,1) //将l宏定义为右边闪动传感器返回值 #define r Input(4,1) //将r宏定义为左边闪动传感器返回值
void motor(int a1,int a2,int a3,int a4,int a5,int a6)//电机函数 { Servo(1,a1);//左轮 Servo(2,a2);//右轮 Servo(3,a3);//转盘 Servo(4,a4);//投石关节1 Servo(5,a5);//投石关节2 Servo(6,a6);//投石关节3 Delay(1000);//延时 }
void move_front(int c,int d) //小车前进程序 { Servo(1,90-c); //左侧电机 变量c取值范围(-90~90) Servo(2,90+d); //右侧电机 变量d取值范围(-90~90) Delay(500); } void move_back(int c,int d) //小车后退程序 { Servo(1,90+c); //左侧电机 变量c取值范围(-90~90) Servo(2,90-d); //右侧电机 变量d取值范围(-90~90) Delay(2000); Servo(1,85); Servo(2,84); Delay(500); }
void move_right(int c,int d) //小车右转程序 { Servo(1,90-c); //左侧电机 变量c取值范围(-90~90) Servo(2,90-d); //右侧电机 变量d取值范围(-90~90) Delay(3000); Servo(1,85); Servo(2,84); Delay(500); } void move_left(int c,int d) //小车左转程序 { Servo(1,90+c); //左侧电机 变量c取值范围(-90~90) Servo(2,90+d); //右侧电机 变量d取值范围(-90~90) Delay(3000); Servo(1,85); Servo(2,84); Delay(500); } void stop() //小车停止程序 { Servo(1,85); Servo(2,84); Delay(25); } void tou_shi()//投石函数 { int i,j; for (i=20,j=170;i<=70,j>=60;i++,j--);//投石关节1、2 { Servo(4,i); Servo(5,j); Delay(20); } Delay(1000);//延时 Servo(6,40);//投石关节3 Delay(1000); Servo(6,120); Delay(1000); Servo(4,20); Servo(5,170); Delay(1000); }
int main(void) { Initial_ARM(); motor(85,84,87,20,170,120);//初始位置 Delay(2000); z1: while(1) { move_front(30,30); Servo(3,87); if(r==1) goto z2;
else if(l==1) goto z3;
else if(Input(3,1)==1) goto z4;
else if(Input(2,1)==1) goto z5;
} z2: Servo(3,87); move_left(30,30); tou_shi(); move_front(30,30); goto z1; z3: Servo(3,87); move_right(30,30); tou_shi(); move_front(30,30); goto z1; z4: Servo(3,87); stop(); move_back(30,30); tou_shi(); move_front(30,30); goto z1; z5: Servo(3,87); stop(); tou_shi(); move_front(30,30); goto z1; }
#include"config.h" #include"lib_io.h" #include"lib_arm.h" int main(void) { int i; while(1) { Servo(1,80); DelayNS(1000); for(i=50;i<=120;i=i+3) { Servo(1,i); DelayNS(1000); } for(i=110;i>=60;i=i-3) { Servo(1,i); DelayNS(1000); } } }
#include"config.h" #include"lib_io.h" #include"lib_arm.h" int main(void) { int i; while(1) { Servo(1,80); DelayNS(1000); for(i=70;i<=100;i=i+3) { Servo(1,i); DelayNS(1000); } for(i=110;i>=60;i=i-3) { Servo(1,i); DelayNS(1000); } } }
#include"config.h" #include"lib_io.h" #include"lib_arm.h" int main(void) { int i; while(1) { Servo(1,80); DelayNS(1000); for(i=70;i<=100;i=i+3) { Servo(1,i); DelayNS(1000); } for(i=110;i>=60;i=i-3) { Servo(1,i); DelayNS(1000); } } } |
5. 项目总结
基于ARM的嵌入式运动控制系统集成了计算机技术、ARM技术、运动控制芯片技术、嵌入式操作系统技术等技术为一体的技术含量高的控制系统。控制单元具有低功耗、高性能等优点,也便于以后机器人功能的扩展,同时嵌入式作系统具有良好的实时性,可实现多任务的调度,这就使机器人运具有良好的实时性,可靠性及抗干扰性。本项目制作的现代投掷车器人,可以应用于物体的投掷,这不仅能够减轻人的劳动量,带来便利,并且可以工作在危险环境中使劳动者的人身安全得到保障。
* 本项目未获得作者开源授权,无法提供资料下载。
|