机器人实训总结Word格式文档下载.docx
- 文档编号:22175028
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:21
- 大小:24.55KB
机器人实训总结Word格式文档下载.docx
《机器人实训总结Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《机器人实训总结Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
}
}
将程序录入小车并运行,旋转车轮旁的旋钮直至车轮停转便达到了调零的目的。
接下来,我们便要完成实训要求的第一个程序:
控制小车LED灯的亮灭。
通过参考指导书的已有程序,我们比较顺利的完成了该任务,任务程序如下:
(在试验中需要注意LED灯的正负极)
while
(1)
P1_0=0;
P1_1=1;
delay_nms(500);
P1_0=1;
P1_1=0;
任务二:
机器人触觉导航
该任务要求机器人碰到障碍物时,接触开关会有所察觉,通过编程让机器人避开障碍物。
在安装胡须时,需要注意胡须距传感立柱既不能太远也不能太近,太远会导致机器人碰到障碍物后反应过慢,太近则会使机器人在前方没有障碍物的情况下进行避障操作,影响小车正常行进。
胡须机器人避障程序如下:
intP1_4state(void)//获取P1_4的状态,右胡须
return(P1&
0x10)?
1:
0;
intP2_3state(void)//获取P2_3的状态,左胡须
return(P2&
0x08)?
voidForward(void)
P1_1=1;
delay_nus(1700);
P1_1=0;
delay_nus(1300);
delay_nms(20);
voidLeft_Turn(void)
inti;
for(i=1;
i<
=26;
i++)
delay_nus(1300);
delay_nms(20);
voidRight_Turn(void)
delay_nus(1700);
voidBackward(void)
=65;
ProgramRunning!
if((P1_4state()==0)&
&
(P2_3state()==0))
{
Backward();
//向后
Left_Turn();
//向左
}
elseif(P1_4state()==0)
//向后
}
elseif(P2_3state()==0)
Right_Turn();
//向右
else
Forward();
//向前
任务三:
机器人红外线导航
任务二触须接触导航是依靠接触变形来探测物体,而本任务是依靠红外线探测机器人前进路线,然后确定何时有光线从被探测物体反射回来,通过检测反射回来的红外光就可以确定前方是否有物体。
在本次任务中,我们需要使用三极管9013,这是因为C51的IO驱动能力较弱,这里我们加入三极管使其工作在开关状态。
三极管是一种控制元件,主要用来控制电流大小,简单地说,是用小电流去控制大电流。
红外导航避障程序如下:
intrins.h>
#defineLeftIRP1_2//左边红外接收连接到P1_2
#defineRightIRP3_5//右边红外接收连接到P3_5
#defineLeftLaunchP1_3//左边红外发射连接到P1_3
#defineRightLaunchP3_6//右边红外发射连接到P3_6
voidIRLaunch(unsignedcharIR)
intcounter;
if(IR=='
L'
)
for(counter=0;
counter<
38;
counter++)
LeftLaunch=1;
_nop_();
_nop_();
LeftLaunch=0;
R'
for(counter=0;
counter++)//右边发射
RightLaunch=1;
RightLaunch=0;
voidForward(void)//向前行走子程序
voidLeft_Turn(void)//左转子程序
inti;
for(i=1;
P1_1=1;
delay_nus(1300);
P1_1=0;
P1_0=1;
delay_nms(20);
voidRight_Turn(void)//右转子程序
delay_nus(1700);
P1_0=0;
voidBackward(void)//向后行走子程序
intirDetectLeft,irDetectRight;
uart_Init();
printf("
while
(1)
IRLaunch('
//右边发射
irDetectRight=RightIR;
//右边接收
//左边发射
irDetectLeft=LeftIR;
//左边接收
if((irDetectLeft==0)&
(irDetectRight==0))//两边同时接收到红外线
{
}
elseif(irDetectLeft==0)//只有左边接收到红外线
elseif(irDetectRight==0)//只有右边接收到红外线
任务四:
尾随小车
该任务的设计线路与任务三相同,故完成较为简单,试验程序如下:
#defineLeftIRP1_2//左边红外接收连接到P1_2
#defineRightIRP3_5//右边红外接收连接到P3_5
#defineLeftLaunchP1_3//左边红外发射连接到P1_3
#defineRightLaunchP3_6//右边红外发射连接到P3_6
intcounter;
if(IR=='
)//左边发射
LeftLaunch=1;
LeftLaunch=0;
)//右边发射
RightLaunch=1;
RightLaunch=0;
{
intpulseLeft,pulseRight;
do
IRLaunch('
irDetectRight=RightIR;
irDetectLeft=LeftIR;
if((irDetectLeft==0)&
(irDetectRight==0))//向后退
pulseLeft=1300;
pulseRight=1700;
elseif((irDetectLeft==0)&
(irDetectRight==1))//右转
pulseLeft=1700;
elseif((irDetectLeft==1)&
(irDetectRight==0))//左转
pulseRight=1300;
}
else//前进
delay_nus(pulseLeft);
delay_nus(pulseRight);
}
任务五:
机器人的距离检测
用同样的IRLED/探测电路检测距离,高灵敏度的频率可以探测远距离的物体,低灵敏度的频率可以探测距离较近的物体。
这使得距离探测就简单了。
选择5个不同频率,从最低灵敏度到最高灵敏度进行测试,依赖于探测器不能再检测到物体的红外线频率,就可以推断物体的大概位置。
测试扫描频率程序如下:
#include<
#defineLeftIRP1_2//左边红外接受连接到P1_2
//#defineRightIRP3_5//右边红外接收连接到P3_5
#defineLeftLaunchP1_3//左边红外发射连接到P1_3
//#defineRightLaunchP3_6//右边红外发射连接到P3_6
unsignedinttime;
intleftdistance;
//左边的距离
//intrightdistance;
//右边的距离
intdistanceLeft,irDetectLeft;
//intdistanceRight,irDetectRight;
unsignedintfrequency[5]={29370,31230,33050,35700,38460};
voidtimer_init(void)
IE=0x82;
//开总中断EA,允许定时器0中断ET0
TMOD|=0X01;
//定时器0工作在模式1:
16位定时器模式
voidFreqOut(unsignedintFreq)
time=256-(500000/Freq);
//根据频率计算初值
TH0=0XFF;
//高八位设FF
TL0=time;
//低八位根据公式计算
TR0=1;
//启动定时器
delay_nus(800);
//延时
TR0=0;
//停止定时器
voidTimer0_Interrupt(void)interrupt1
LeftLaunch=~LeftLaunch;
//取反
//RightLaunch=~RightLaunch;
//重新设值
voidGet_lr_Distances()
unsignedintcount;
leftdistance=0;
//初始化左边的距离
//rightdistance=0;
//初始化右边的距离
for(count=0;
count<
5;
count++)
FreqOut(frequency[count]);
irDetectLeft=LeftIR;
//左边接收
//irDetectRight=RightIR;
//右边接收
//printf("
f=%d\n"
time);
irDetectLeft=%d\n"
irDetectLeft);
irDetectRight=%d\n"
irDetectRight);
if(irDetectLeft==1)
leftdistance++;
//if(irDetectRight==1)
//rightdistance++;
timer_init();
ProgamRunning!
FREQENCYETECTED\n"
{
Get_lr_Distances();
distanceLeft=%d\n"
leftdistance);
distanceRight=%d\n"
rightdistance);
-----------------\n"
delay_nms(1000);
在进行串口调试时,应注意串口的接线位置,安装符合自己电脑的串口调试助手。
任务六:
寻线搬运机器人
可能是前几个任务完成太轻松的原因,是我们对实训产生了懈怠的想法,但最后的任务再一次提醒了我需要学习的东西还有很多,永远都不能骄傲自满。
经过一天多的调试,在机器人的运行和编程中,出现了以下几方面的问题:
一、转弯出现问题。
在一些路口中转弯出现了问题。
所以提倡用自定义转弯,提高成功率。
二、在运行机器人前要检查螺丝,检查机器人的性能是否良好,以免在运行过程中发生意外。
三、遇到错误时,要耐心,细心检查问题,分析问题,要互相讨论出解决方案。
四、电池的电量对小车运行影响极大最好选用质量较好的电池。
五、伺服电机的角度没有调好,导致机器人在运行过程中影响程序的运行。
六、熟悉自己的机器人,了解一些运行、编程的小技巧。
寻线搬运机器人编程如下:
AT89X52.h>
stdio.h>
#defineuintunsignedint
#defineucharunsignedchar
ucharQTIState;
voidTime1_init(void)
EA=1;
//硬件串口使用定时器1,供AT89S52与PC机通信使用
TMOD|=0x20;
//定时器1方式2.8位自动重装模式
SCON=0x50;
//模式1,8位数据
TH1=0xFD;
//波特率为9600
TL1=0xFD;
TR1=1;
//起动定时器
TI=1;
voidPivot_Left(void)//左转子程序
delay_nus(1500);
delay_nus(1350);
voidPivot_Right(void)//右转子程序
delay_nus(1650);
voidRotate_right(void)
voidRotate_Left(void)
delay_nus(1350);
voidBackward(void)//向后行走子程序
P1_1=1;
delay_nus(1300);
P1_1=0;
P1_0=1;
delay_nus(1700);
P1_0=0;
delay_nms(20);
voidGet_QTI_State(void)
QTIState=P2&
0x0e;
voidFollow_Line(void)
Get_QTI_State();
switch(QTIState)
case0x04:
Forward();
break;
case0x06:
Pivo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 机器人 总结