机器人设计.docx
《机器人设计.docx》由会员分享,可在线阅读,更多相关《机器人设计.docx(17页珍藏版)》请在冰豆网上搜索。
机器人设计
《智能控制与程序设计》-宝贝车机器人
课程报告
班级:
电信学院13306
人员:
王丽春
同组人员:
陈天、刘棒锦
时间:
2015.11.14
指导教师:
杨杰、汤博文
地点:
工业中心3021
一、课程目的、任务及要求
1.1课程目的
①通过训练,了解一个完整的、可以运动的机器人应由那几部分组成。
理解每一个机器人都是根据特定要求而设计的,设计的第一步就是将使用要求分析清楚,确定设计时需要考虑的参数,包括:
机器人的运动路径、定位精度,重复定位精度、任务执行参数等。
②了解目前机器人的能量供给的各种形式,掌握控制部分和执行部分的供电方式。
③理解机器人的运动系统的构成及其原理。
④了解机器人探测周边环境的传感器有那些,掌握传感器的信号如何传送给单片机的。
⑤理解机器人是如何根据传感器的信息做出决策。
⑥掌握机器人如何运动,并且了解机器人运动的其它方法。
⑦理解机器人与用户交换信息的各种方法。
⑧培养团队协作和独立工作能力。
1.2课程任务及要求
③陈述清楚宝贝机器人如何实现运动。
④掌握宝贝机器人的控制部分和运动部分的供电方式,并画出这两部分的电路示意图。
⑤理清宝贝机器人的人机交互关系,陈述清楚宝贝机器人如何实现人机交互(通过串口调试软件实现人机交互)。
⑥陈述清楚宝贝机器人有那些传感器,传感器的信息是如何传送到单片机的。
⑦完成宝贝机器人的触觉导航,并陈述清楚其原理。
⑧能在实验中迅速排除各种故障。
⑨鼓励创新,在完成前八个任务的前提下,尽量能做出新的开发,如果现有硬件条件不满足,可以陈述清楚创新原理。
二、课程准备
2.1实验设备
硬件:
PC机一台、AT89S52型单片机、机器人组件、ISP下载电缆、串口线、电池
软件:
KeiluVision4IDE集成开发环境、progisp172软件下载工具、串口调试软件
2.2机器人的组装和软件的安装及初步应用
2.2.1组装宝贝车机器人
“宝贝车”是由许多部件组成的一款机器人,在使用及编程控制其运动之前,首先要进行组装,步骤如下:
(1)安装机器人底盘硬件
零件列表:
宝贝车底盘、螺柱、盘头螺钉、13/32英寸的橡胶圈
1.将13/32英寸的橡胶套圈插到宝贝车底盘中心的孔内,确保底盘中心孔的边缘嵌在橡胶圈的凹槽中;
2.用4个螺钉将螺柱固定在底盘上。
(2)拆除伺服喉,将电机安装在底盘上
零件列表:
宝贝车底盘(已部分组装好)、连续旋转电机、螺钉3/8英寸4-40、
螺母4-40
1.用螺钉和螺母将电机固定在底盘上,为了最好性能,需从里面将电机放入底盘。
由于底盘空间小,螺钉也小,所以螺丝起子不容易进去,螺钉的安装需要有一定的耐心;
2.用标签纸表示左右电机轮。
(3)安装电池盒和轮子
零件列表:
宝贝车底盘、平头螺钉3/8英寸4-40、螺母4-40、带有插头的电池盒、开口销、球状尾轮、橡皮圈、塑胶轮子
1.安装电池盒比较简单,注意的就是在将电源线和伺服电机线穿过橡胶圈的孔时,由于两条线的接头比较大,可先将橡胶圈取出便于穿出,当线穿过之后再将橡胶圈安在底盘的空上;
2.安装尾轮,用开口销作为轴,穿过底盘左侧、尾轮、底盘右侧的孔,将球状尾轮固定在底盘上,并将开口销的一端弯曲;安装驱动轮,只要将两个轮子有凹槽的一面压在输出轴上,并用螺钉固定即可,注意给轮子安橡胶圈时,为了便于安装将橡胶圈可裁窄一些。
(4)安装教学底板
零件列表:
宝贝车机器人底盘、平头螺钉、带控制器的教学板
2.2.2安装软件及其初步应用
1.本次实验需要用到3款软件:
KeiluVision4IDE集成开发环境、PROGISP172下载软件、串口调试软件。
在软件安装好以后,应有串口的连接和ISP下载线的连接,以实现编程和交互。
KeiluVision4软件的使用:
启动KeiluVision4ProjectNewProject在文件名中输入“001”,保存在想保存的位置选择AT89S52,确定选择不加载“否”单击新建按钮,将编号的程序写入保存001.c在项目文件夹在目标工程项目中,右键“SourceGroup1”单击AddFilestoGroupSourceGroup1Add右键Target1选择Optionfortarget‘Target1’单击output,选择CreateHEXFi:
确定运行,没有错误即创建成功文件名为001.hex,这个文件就是将来可以烧录到C51单片机中的可执行程序。
PROGISP172下载软件的使用:
串口调试软件的使用:
打开串口调试终端,选择COM1后单击“打开串口”,在程序运行时,在接收区就会看到单片机向PC发出的信息。
此软件用来显示单片机与计算机的交互信息,在硬件上要有串行接口或USB接口来与单片机教学板的串口连接。
三、课程任务
3.1伺服电机的控制
3.1.1单片机的输出测试
单片机的输出测试是通过控制单灯闪烁实现的根据图1搭建LED电路:
图1
通过编程控制单灯闪烁、两灯同时闪烁和两灯交替闪烁,以及其闪烁的时间,只要让两个LED灯分别接到P1_0和P1_1,电路连接方式相同,通过对P1_0和P1_1赋值,并改变delay_nms(time)即可实现以上各种控制,例如两灯交替闪烁,间隔时间为1s,程序如下:
#include
#include
intmain(void)
{
uart_Init();
printf("TheLEDconnecedtoP1_0isblinking!
\n");
while
(1)
{
P1_1=1;
delay_nus(1500);
P1_1=0;
delay_nus(200);
}
}
3.1.2伺服电机的标定
在测试控制伺服电机转速的信号之前,一定要对伺服电机标定(调零),其程序如下:
●对右轮标定
#include
#include
intmain(void)
{
uart_Init();//初始化串口
printf("TheLEDconnectedtoP1_0isblinking!
\n");
while
(1)
{
P1_0=1;//P1_0输出高电平
delay_nus(1500);//延时1.5ms
P1_0=0;//P1_0输出低电平
delay_nms(20);//延时20ms
}
}
此程序使左轮静止不动,如果左轮缓慢动,应用起子对其调整,具体步骤:
将教学底板上的三位开关扳到2,调整底盘下边伺服电机的调零螺钉,调整时要缓慢,直到标定的轮子静止不动。
●对左轮标定
#include
#include
intmain(void)
{
uart_Init();//初始化串口
printf("TheLEDconnectedtoP1_0isblinking!
\n");
while
(1)
{
P1_1=1;//P1_1输出高电平
delay_nus(1500);//延时1.5ms
P1_1=0;//P1_1输出低电平
delay_nms(20);//延时20ms
}
}
此程序使右轮静止不动,如果右轮缓慢转动,同样应用起子对其调整,具体步骤同左轮的标定。
遇到的问题及解决办法:
分别标定两个伺服电机比较浪费时间,可以将两个程序写在一起,同时对左右电机进行标定,可节省时间。
3.1.3对电机控制信号的测试
控制电机的速度的是高电平持续时间,当高电平持续时间为1.3ms时,电机顺时针全速旋转,当高电平持续时间1.7ms时,电机逆时针全速旋转
注意的问题:
顺时针和逆时针是从所测试的轮子的外面轴向看过去的旋转方向。
●图2为电机转速为0的控制信号时序
图2
●图3为1.3ms的控制脉冲序列使电机顺时针全速旋转
图3
●图4为1.7ms的控制脉冲序列使电机逆时针全速旋转
图4
心得体会:
电机转动方向及速度的调节可以通过改变delay_nus();括号中数值来实现调节。
实际测试小车时,合理的速度及左右轮方向的配合可以使小车行走时更可靠,这需要反复调试程序。
3.2机器人巡航控制
3.2.1基本巡航动作
这个任务主要是改变机器人的前进方向,实现向前、向左、向右、向后、原地转、绕支点转,并结合上一任务循环次数的控制来控制运动时间。
机器人的转向问题无非是通过控制机器人的两个轮子逆时针、顺时针旋转来实现。
表1说明了机器人在标定电机后在不同脉冲序列的情况下的运动形式。
表1
左轮
右轮
转向
P1_1=1;delay_nus(1700);P1_1=0;delay_nms(20);
左轮逆时针转
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
右轮顺时针
前进(全速)
P1_1=1;delay_nus(1300);P1_1=0;delay_nms(20);
左轮顺时针转
P1_0=1;
delay_nus(1700);
P1_0=0;
delay_nms(20);
右轮逆时针
后退(全速)
P1_1=1;delay_nus(1300);P1_1=0;delay_nms(20);
左轮顺时针转
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
右轮顺时针
双轮左转
P1_1=1;delay_nus(1700);P1_1=0;delay_nms(20);
左轮逆时针转
P1_0=1;
delay_nus(1700);
P1_0=0;
delay_nms(20);
右轮逆时针
双轮右转
P1_1=1;delay_nus(1500);P1_1=0;delay_nms(20);
左轮停止
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
右轮顺时针
以左轮为支点左转
P1_1=1;delay_nus(1700);P1_1=0;delay_nms(20);
左轮逆时针
P1_0=1;
delay_nus(1500);
P1_0=0;
delay_nms(20);
右轮停止
以右轮为支点右转
注意:
伺服电机的控制线连接在教学板的单片机上,通过给单片机控制器编程,使单片机的P1端口的第一引脚P1_1和第二引脚P1_1来发出伺服电机的控制信号,控制信号通过控制线来控制左右伺服电机的转动,从而实现机器人以不同的速度及方向运动。
函数控制机器人运行程序:
#include
#include
intmain(void)
{intcounter;
uart_Init();
printf("ProgramRunning\n");
for(counter=1;counter<=65;counter++)
{
P1_1=1;delay_nus(1700);P1_1=0;
P1_0=1;delay_nus(1300);P1_0=0;
delay_nms(20);
}
for(counter=1;counter<=26;counter++)
{
P1_1=1;delay_nus(1300);P1_1=0;
P1_0=1;delay_nus(1300);P1_0=0;
delay_nms(20);
}
for(counter=1;counter<=26;counter++)
{
P1_1=1;delay_nus(1700);P1_1=0;
P1_0=1;delay_nus(1700);P1_0=0;
delay_nms(20);
}
for(counter=1;counter<=65;counter++)
{
P1_1=1;delay_nus(1300);P1_1=0;
P1_0=1;delay_nus(1700);P1_0=0;
delay_nms(20);
}
}
数组控制机器人运行程序:
#include
#include
intmain(void)
{
intcounter;
charNavigation[10]={'F','L','F','F','R','B','L','B','B','Q'};
intaddress=0;
uart_Init();
){
P1_1=1;delay_nus(1700);P1_1=0;
P1_0=1;delay_nus(1700);P1_0=0;
delay_nms(20);
}
for(counter=1;counter<=65;counter++)
{
P1_1=1;delay_nus(1300);P1_1=0;
P1_0=1;delay_nus(1700);P1_0=0;
delay_nms(20);
}
while(Navigation[address]!
='Q')
{
switch(Navigation[address])
{
case'F':
Forward();break;
case'L':
Left_Turn();break;
case'R':
Right_Turn();break;
case'B':
Backward();break;
}
address++;
}
printf("programRunning!
\n");
for(counter=1;counter<=65;counter++)
{
P1_1=1;delay_nus(1700);P1_1=0;
P1_0=1;delay_nus(1300);P1_0=0;
delay_nms(20);
}
for(counter=1;counter<=26;counter++)
{
P1_1=1;delay_nus(1300);P1_1=0;
P1_0=1;delay_nus(1300);P1_0=0;
delay_nms(20);
}
for(counter=1;counter<=26;counter++
3.3机器人触觉导航
3.3.1连接触觉导航电路并测试
零件列表:
金属丝2根、平头M3×22盘头螺钉2个、13mm圆形立柱2个、M3尼龙垫圈2个、3-pin公-公接头2个、220欧电阻2个、10k欧电阻2个
安装步骤:
1.拆掉连接主板到前支架的两颗螺钉;
2.螺钉依次穿过尼龙垫圈和圆形立柱;
3.把须状金属丝的其中一个勾在尼龙垫圈之上,另一个勾在尼龙垫圈之下,调整位置使他们横向交叉但又不接触;
4.拧紧螺钉到支架上。
按照图5搭建电路:
图5触须电路原理图
胡须避障程序:
#include
#include
intP1_4state(void)
{return(P1&0x10)?
1:
0;}
intP2_3state(void)
{
return(P2&0x08)?
1:
0;
}
intmain(void)
{
while
(1)
{
if((P1_4state()==0)&&(P2_3state()==0))
{
Backward();Left_Turn();Left_turn();
}
elseif(P1_4state()==0)
{
Backward();Left_Turn();
}
elseif(P2_3state()==0)
{
Backward();Right_Turn();
}
else
Forward();
}
}
电路原理:
由原理图可知,每条胡须都是一个常开开关。
连接到每个胡须电路的I/O引脚监视着10k上拉电阻上的电压变化。
当胡须没有被触动时,连接胡须的I/O管脚的电压是5V,当胡须被触动,I/O短接到地,所以I/O管脚的电压是0V。
单片机可以读入相应的数据,进行分析、处理、控制机器人运动。
在进行胡须测试之前需将串口电缆连接好,需用到调试终端以显示左右胡须状态,调用相关程序进行测试。
3.3.2胡须导航,胡须测试程序:
#include
#include
intP1_4state(void)
{
return(P1&0x10)?
1:
0;
}
intP2_3state(void)
{
return(P2&0x08)?
1:
0;
}
intmain(void)
{
uart_Init();
printf("WHISKERSTARTES\n");
while
(1)
{
printf("right;%d'",P1_4state());
printf("left;%d'",P2_3state());
delay_nms(150);
}
}
两个胡须状态有三种,需分情况讨论,需用到if语句。
程序中应用的子程序(Ox代表十六进制数):
1.获取P1_3的状态,即左胡须
intP1_3state(void)
{return(P1&0x08)?
1:
0;}
2.获取P1_2的状态,即右胡须
intP1_2state(void)
{return(P2&0x04)?
1:
0;}
3.向前子程序
voidForward(void)
4.左转子程序
voidLeft_Turn(void)
5.右转子程序
voidRight_Turn(void)
6.后退子程序
voidBackward(void)
7.循迹左转
voidLeft_Turnsmall(void)
8.循迹右转
voidRight_Turnsmall(void)
9.左拐180度
voidLeft_Turn180(void)
10.右拐180度
voidRight_Turn180(void)
11.小幅度左拐
voidLeft_Turn111(void)
12.小幅度右拐
voidRight_Turn111(void)
13.停车
voidStop_car(void)
注:
子程序中的左右转和后退可以设定一个变量,用来代表循环次数,然后只需在主程序中更改变量的值即可实现左右转角度的改变及后退距离的改变,程序更容易修改。
说明:
左胡须接引脚P1_3,右胡须接引脚P1_2,在机器人的运动过程中,当左右胡须同时触到障碍物时,两个引脚输入全为0,此时通过调用相应函数Backward();Left_Turn();Left_Turn();实现后退并转180度;当只有左胡须触到障碍物时,P1_4输入为0,此时调用函数Backward();Right_Turn();实现向后并向右转;当只有右胡须触到障碍物时,P2_3输入为0,此时调用函数Backward();Left_Turn();实现向后并向左转。
函数调用的过程中其实是通过连接在单片机引脚上的两个伺服电机控制线,向伺服电机发送不同的脉冲序列,从而实现电机的不同运动。
四、课程总结
本学期智能控制与程序设计课程感觉收获颇多,我们这次课程设计提供了一次理论与实践结合的机会,通过这次课设我们学到的不光是单片机和C语言编程的应用,还涉及到电路知识及机器人工程等知识,是一次很好的创新性实习,既锻炼了动手能力又培养了创新能力和团队合作精神,对我们将来开发单片机系统或从事机器人研究打下了很好的基础。
通过这次实习也让我们学习到了要善于发现问题,遇到问题时,要从不同角度去思考,避免惯性思维。