机电综合实验 之
机电一体化综合控制实验报告书
题 目:两轮智能移动机器人
实 验 者:
学 号:
班 级:
日 期:2013.12.29
目录
一、实验目的.............................................................................3
二、实验对象.............................................................................3
三、设计原理..............................................................................3
四、实验过程.............................................................................7
五、实验设备.............................................................................7
六、实验步骤及报告...................................................................7
1、实验前的安装调试..........................................................................7
2、小车按预定路线行走..............................................................................9
3、小车匀加速/减速运动..............................................................................11
4、小车触须避障..........................................................................................13
5、小车红外避障............................................................................................22
七、心得...................................................................................25
八、本实验对社会发展的影响...................................................26
一、实验目的
1、掌握机器人机械工作方式、触觉开关及红外导航工作原理,掌握机器人尾随行走所需的闭环控制算法
2、学会运用 C 语言初次编写少量的程序,运用编译器编译生成可执行文件,然后下载到单片机上,通过串口观察机器人上的单片机教学板的执行结果
二、设计对象
本项目是使用典型的机器人工程对象,采用STC8952单片机作为大脑,行走机构为两个车轮,采用伺服电机控制。触觉导航采用触觉开关,红外导航采用发射红外线遇障碍反射技术导航。
三、设计原理
运用STC8952单片机,采用C语言对其进行编程,控制机器人伺服电机以不同速度运动是通过让单片机输入、输出接口输出不同的脉冲序列来实现的。
如
控制机器人伺服电机以不同速度运动是通过让单片机的输入/输出(I/O)口输出不同的脉冲序列来实现的。51 系列单片机是一种低功耗、高性能 CMOS8 位微控制器,具有 8K 在系统可编程 Flash 存储器。使用 Atmel 公司高密度非 易失性存储器技术制造,与工业 80C51产品指令和引脚完 全兼容。片上 Flash 允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的 8 位 CPU 和在系统可编程 Flash.
单片机各 I/O 接口的内部结构有关,而且每个 8 位并行 I/O 口的使用方式也不太一样。AT89S52 引脚如图所示,AT89S52 共有44 根引脚,其中 32 根是 I/O 端口引脚。在这 32 根引脚中,有29 根具备两种用途,既可作为I/O 端口,也可作为控制信号或地址及数据线。
机器人伺服电机控制信号
电机转速为零的控制信号时序图
图 1所示是高电平持续 1.5ms 低电平持续 20ms,然后不断重复的控制脉冲序列。该脉冲序列发给经过零点标定后的伺服电机,伺服电机不会旋转
程序段:
while(1)
{
P1_0=1; //P1_0输出高电平
delay_nus(1500); //延时1.5ms
P1_0=0; //P1_0输出低电平
delay_nus(20000); //延时20ms
}
图 2所示是高电平持续 1.3ms 低电平持续 20ms,然后不断重复的控制脉冲序列。该脉冲序列发给经过零点标定后的伺服电机,伺服电机顺时针全速旋转。
程序段:
while(1)
{
P1_0=1; //P1_0输出高电平
delay_nus(1300); //延时1.3ms
P1_0=0; //P1_0输出低电平
delay_nus(20000); //延时20ms
}
图 3所示是高电平持续 1.7ms 低电平持续 20ms,然后不断重复的控制脉冲序列。该脉冲序列发给经过零点标定后的伺服电机,伺服电机逆时针全速旋转。
程序段:
While(1)
{
P1_0=1; //P1_0输出高电平
delay_nus(1700); //延时1.7ms
P1_0=0; //P1_0输出低电平
delay_nus(20000); //延时20ms
}
从图 1、2和3可知,控制电机运动转速的是高电平持续的时间,当高电平持续时间为 1.3ms 时,电机顺时针全速旋转,当高电平持续时间1.7ms 时,电机逆时针速旋转。
四、实验内容
按时间顺序,实验主要有以下内容:
1、安装软件并调试,电机调零
2、基本巡航动作
3、让小车行走一定的形状(本次实验设计路线是一个“口”字)
4、完成简单触觉导航
5、实现红外导航避障
五、实验步骤及报告
(一)软件和硬件的安装调试
1、硬件连接
机器人大脑需要连接电源以便运行,同时也需要连接到PC机(或笔记本电脑)以便编程和交互。以上接线完成后,就可以用编辑器软件来对系统进行测试。
(1)串口的连接
机器人教学板通过串口电缆连接到PC
机(或笔记本电脑)上以便与用户交互。
(2)下载线的连接
机器人程序通过连接到PC机或者笔记本电脑的并口上的ISP下载线来下载到教学板上的单片机内。
(3)电池的安装
本实验机器人采用五号碱性电池给机器人电机和教学板供电,先检查机器人底部电池盒内是否已经装好电池,并是否有正常的电压输出。
2、软件部分
在本实验学习中,反复用到三款软件:Keil uVision2 IDE集成开发环境、下载软件、串口调试软件等。
(1)Keil uVision2 IDE集成开发环境
该软件是德国 KEIL 公司出品的 51 系列单片机 C 语言集成开发系统。如果你已经学习过《基础机器人制作与编程》,并掌握了 PBASIC 语言编程思想和基本技能,你将会发现,C语言在语法结构上更加灵活,功能更加强大。
(2)SL ISP软件下载工具
使用该软件你可以将可执行文件下载到你的机器人单片机上。该软件的使用需要计算机有并行口。
(3)串口调试软件
此软件是用来显示单片机与计算机的交互信息的。在硬件上,计算机至少要有串口或USB接口来与单片机教学板的串口连接。
3、电机调零
启动Keil uVision IDE 程序,建立项目文件,选择正确的芯片类型,创建与编辑一个调零程序,编译后产生可执行文件,并下载可执行文件到STC8952单片机,然后观察电机是否转动,若转动,用螺丝起子手动调零。
调零程序如下:
#include<BoeBot.h>
#include<uart.h>
int main(void)
{
int counter;
uart_Init();
printf("Program Running!\n");
for(counter=0;counter<130;counter++)//运行3 秒
{
P1_1=1;
delay_nus(1500);
P1_1=0;
P1_0=1;
delay_nus(1500);
P1_0=0;
delay_nms(20);
}
while(1);
}
}
二、基本巡航动作
下面的程序片段可以使其向前走:
P1_1=1;
delay_nus(1700);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
下面的程序片段可以使其向后走:
P1_1=1;
delay_nus(1300);
P1_1=0;
P1_0=1;
delay_nus(1700);
P1_0=0;
delay_nms(20);
下面的程序片段可以使你的机器人原地左转:
P1_1=1;
delay_nus(1300);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
下面的程序可以使你的机器人原地右转:
P1_1=1;
delay_nus(1700);
P1_1=0;
P1_0=1;
delay_nus(1700);
P1_0=0;
delay_nms(20);
实现一定形状行走:
实验设计路线是一个“口”字,类似电机调零的相关操作,把程序导入单片机内,实现调试。
程序如下:
#include<BoeBot.h>
#include<uart.h>
int main(void)
{
int counter;
uart_Init();
printf("Program Running!\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);
}
While(1);
}
(二)匀加速/减速运动
匀加速运动程序:
for(pulseCount=10;pulseCount<=200;pulseCount=pulseCount+1)
{
P1_1=1;
delay_nus(1500+pulseCount);
P1_1=0;
P1_0=1;
delay_nus(1500-pulseCount);
P1_0=0;
delay_nms(20);
}
匀减速运动程序:
for(pulseCount=200;pulseCount>=0;pulseCount=pulseCount-1)
{
P1_1=1;
delay_nus(1500+pulseCount);
P1_1=0;
P1_0=1;
delay_nus(1500-pulseCount);
P1_0=0;
delay_nms(20);
}
两轮机器人加速减速走程序:
#include<BoeBot.h>
#include<uart.h>
int main(void)
{
int pulseCount;
uart_Init();
printf("Program Running!\n");
for(pulseCount=10;pulseCount<=200;pulseCount=pulseCount+1)
{
P1_1=1;
delay_nus(1500+pulseCount);
P1_1=0;
P1_0=1;
delay_nus(1500-pulseCount);
P1_0=0;
delay_nms(20);
}
for(pulseCount=1;pulseCount<=75;pulseCount++)
{
P1_1=1;
delay_nus(1700);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
}
for(pulseCount=200;pulseCount>=0;pulseCount=pulseCount-1)
{
P1_1=1;
delay_nus(1500+pulseCount);
P1_1=0;
P1_0=1;
delay_nus(1500-pulseCount);
P1_0=0;
delay_nms(20);
}
while(1);
}
(三)触须避障
编程让机器人通过触觉胡须导航之前,首先必须安装并测试胡须,安装机器人触觉胡须所需的硬件元件清单,包括:
(1)金属丝2根
(2)平头M3×22盘头螺钉2个
(3)13mm圆形立柱2个
(4)M3尼龙垫圈2个
(5)3-pin公-公接头2个
(6)220Ω电阻2个
(7)10kΩ电阻2个
安装胡须:1 拆掉连接主板到前支架的两颗螺钉
2 参考图4-2,进行下面操作
3 螺钉依次穿过M3尼龙垫圈、13mm圆形立柱
4 螺钉穿过主板上的圆孔之后,拧进主板下面的支架中,但不要拧紧
5 把须状金属丝的其中一个钩在尼龙垫圈之上,另一个钩在尼龙垫圈之下,调整它们的位置使它们横向交叉但又不接触
6 拧紧螺钉到支架上 图4-2 安装机器人胡须
7 参考接线图4-3,搭建胡须电路。
注意:右边胡须状态信息输入是通过P1口的第4脚完成,而左边胡须状态信息输入是通过P2口的第3脚完成
8 确定两条胡须比较靠近,但又不接触面包板上的3-pin头。推荐保持3mm的距离。
9图4-4所示是实际的参考接线图。
10 安装好触觉胡须的机器人如图4-5所示
观察一下图4-3所示的胡须电路示意图,显然每条胡须都是一个机械式的、接地常开的开关。胡须接地(GND)是因为教学板外围的镀金孔都连接到GND。金属支架和螺丝钉提供电气连接给胡须。
通过编程让单片机探测什么时候胡须被触动。由图4-3可知,连接到每个胡须电路的I/O引脚监视着10K上拉电阻上的电压变化。当胡须没有被触动,连接胡须的I/O管脚的电压是5V;当胡须被触动时,I/O短接到地,所以I/O管脚的电压是0V。
胡须测试程序:
#include<BoeBot.h>
#include<uart.h>
int P1_4state(void)
{
return (P1&0x10)?1:0;
}
int P1_7state(void)
{
return (P1&0x80)?1:0;
}
int main(void)
{
uart_Init();
printf("WHISKER STARTES\n");
while(1)
{
printf("右边胡须的状态:%d ",P1_4state());
printf("左边胡须的状态:%d\n",P1_7state());
delay_nms(150);
}
}
2、通过胡须导航
程序如下:
#include<BoeBot.h>
#include<uart.h>
int P1_4state(void)
{
return (P1&0x10)?1:0;
}
int P1_7state(void)
{
return (P2&0x80)?1:0;
}
void Forward(void)
{
P1_1=1;
delay_nus(1700);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
}
void Left_Turn(void)
{
int i;
for(i=1;i<=19;i++)
{
P1_1=1;
delay_nus(1300);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
}
}
void Right_Turn(void)
{
int i;
for(i=1;i<=19;i++)
{
P1_1=1;
delay_nus(1700);
P1_1=0;
P1_0=1;
delay_nus(1700);
P1_0=0;
delay_nms(20);
}
}
void Backward(void)
{
int i;
for(i=1;i<=38;i++)
{
P1_1=1;
delay_nus(1300);
P1_1=0;
P1_0=1;
delay_nus(1700);
P1_0=0;
delay_nms(20);
}
}
int main(void)
{
int counter=1;
int old2=1;
int old3=0;
uart_Init();
printf("Program Running!\n");
while(1)
{
if(P1_4state()!=P1_7state())
{
if((old2!=P1_4state())&&(old3!=P1_7state()))
{
counter=counter+1;
old2=P1_4state();
old3=P1_7state();
if(counter>4)
{
counter=1;
Backward();//向后
Left_Turn();//向左
Left_Turn();//向左
}
}
else
counter=1;
}
if((P1_4state()==0)&&(P1_7state()==0)) //两胡须同时碰到
{
Backward(); //向后
Left_Turn();//向左
Left_Turn();//向左
}
else if(P1_4state()==0) //右胡须碰到
{
Backward();//向后
Left_Turn();//向左
}
else if(P1_7state()==0) //左胡须碰到
{
Backward();//向后
Right_Turn();//向右
}
else //胡须没有碰到
Forward();//向前
}
}
带着胡须机器人怎样行走?
主程序中的语句首先检查胡须的状态。如果两个胡须都触动了即P1_4state()和
P2_3state()都为0,调用Backward(),紧接着调用Left_Turn ()两次;如果只是右胡须被触
动即只有P1_4state()==0,程序调用Backward(),然后再调用Left_Turn ();如果左胡须被
触动即只有P2_3state()==0,程序调用Backward(),然后再调用Right _Turn();如果两个
胡须都没有触动,在这种情况下,在else中调用Forward()语句。
函数Left_Turn(),Right_Turn()以及Backward()看起来应该相当熟悉,但是函数
Forward()有一个变动。它只发送一个脉冲,然后返回。这点相当重要,因为机器人可以在
向前行走中的每两个脉冲之间检查胡须的状态。意味着,机器人在向前行走的过程中,每秒
检查触须状态大概43次(1000ms/23ms ≈ =43)。
因为每个全速前进的脉冲都使得机器人前进大约半厘米。只发送一个脉冲,然后回去检
查胡须的状态是一个好主意。每次程序从Forward()返回后,程序再次从while循环的开始处
执行,此时if…else 语句会再次检查胡须的状态。
(五)红外避障
1、实验器材:
(1) 两个红外检测器
(2) 两个IR LED
(3) 四个470□电阻
(4) 两个9013三极管
2、搭建红外线前灯
? (1)断开主板和伺服系统的电源
? (2)建立下图所示的电路,
2、测试程序
(1)测试左边程序:
#include<BoeBot.h>
#include<uart.h>
int P1_2state(void)
{
return (P1&0x04)?1:0;
}
int main(void)
{
int counter;
int irDetectLeft;
uart_Init();
printf("Program Running!\n");
while(1)
{
for(counter=0;counter<38;counter++)
{
P1_3=1;
delay_nus(13);
P1_3=0;
delay_nus(13);
}
irDetectLeft=P1_2state();
printf("irDetectLeft=%d\n",irDetectLeft);
delay_nms(100);
}
}
(2)测试右边程序:
#include<BoeBot.h>
#include<uart.h>
int P1_7state(void)
{
return (P1&0x04)?1:0;
}
int main(void)
{
int counter;
int irDetectRight;
uart_Init();
printf("Program Running!\n");
while(1)
{
for(counter=0;counter<38;counter++)
{
P1_6=1;
delay_nus(13);
P1_6=0;
delay_nus(13);
}
irDetectRight=P1_7state();
printf("irDetectRight=%d\n",irDetectRight);
delay_nms(100);
}
}
(3)步骤:
² 打开教学板的电源
² 输入、保存并运行测试程序
² 保持机器人与串口电缆的连接,因为你需用调试终端来测试你的IR组
² 放一个物体,比如手或一张纸,距离左侧IR组大约2到3厘米,
² 验证当你放一个物体在IR组前时,调试终端是否会显示“0”;当你将物体移开时,它是否显示“1”
² 如果调试终端显示的是预料的值,没发现物体显示1,发现物体显示0,说明测试完成,红外发射探测器安装成功
² 如果调试终端显示的不是预料的值,试试排错部分里的步骤进行排错排错,并检查电路和输入的程序,或者调整红外发射器角度,直到测试正常
²
3、红外避障程序
#include<BoeBot.h>
#include<uart.h>
#include<intrins.h>
#define LeftIR P1_2 //左边红外接收连接到P1_2
#define RightIR P1_7 //右边红外接收连接到P3_2
#define LeftLaunch P1_3 //左边红外发射连接到P1_3
#define RightLaunch P1_6 //右边红外发射连接到P3_3
void IRLaunch(unsigned char IR)
{
int counter;
if(IR=='L') //左边发射
for(counter=0;counter<38;counter++) //发射时间比胡须长
{
LeftLaunch=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
LeftLaunch=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
if(IR=='R') //右边发射
for(counter=0;counter<38;counter++)
{
RightLaunch=1;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
RightLaunch=0;
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
}
void Forward(void) //向前行走子程序
{
P1_1=1;
delay_nus(1300);
P1_1=0;
P1_0=1;
delay_nus(1700);
P1_0=0;
delay_nms(20);
}
void Left_Turn(void) //左转子程序
{
int i;
for( i=1;i<=26;i++)
{
P1_1=1;
delay_nus(1300);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
}
}
void Right_Turn(void) //右转子程序
{
int i;
for( i=1;i<=26;i++)
{
P1_1=1;
delay_nus(1700);
P1_1=0;
P1_0=1;
delay_nus(1700);
P1_0=0;
delay_nms(20);
}
}
void Backward(void) //向后行走子程序
{
int i;
for( i=1;i<=65;i++)
{
P1_1=1;
delay_nus(1700);
P1_1=0;
P1_0=1;
delay_nus(1300);
P1_0=0;
delay_nms(20);
}
}
int main(void)
{
int irDetectLeft,irDetectRight;
uart_Init();
printf("Program Running!\n");
while(1)
{
IRLaunch('R'); //右边发射
irDetectRight = RightIR;//右边接收
IRLaunch('L'); //左边发射
irDetectLeft = LeftIR;//左边接收
if((irDetectLeft==0)&&(irDetectRight==0))//两边同时接收到红外线
{
Backward();
Left_Turn();
Left_Turn();
}
else if(irDetectLeft==0)//只有左边接收到红外线
{
Backward();
Right_Turn();
}
else if(irDetectRight==0)//只有右边接收到红外线
{
Backward();
Left_Turn();
}
else
Forward();
}
}
七、心得体会
通过本门课程实验,以下能力得到了较大的提高:
1、了解机电一体化原理和应用,以及单片机使用的注意事项
2、 培养具有综合应用相关知识来解决实验问题的基础理论;
3、 培养在实践中研究问题,分析问题和解决问题的能力;
我们必须坚持理论联系实际的思想,以实践证实理论,从实践中加深对理论知识的理解和掌握。实验是我们快速认识和掌握理论知识的一条重要途径。
通过本实验加深我们对机器人的了解,更进一步的掌握了各部件之间的功能特性。让我们在以后更多的实验中能灵活应用探究方法和操作能力。除此,我们在机器人教学中培养了我们的兴趣,创新能力分析能力和动手操作能力,激发了我们学习、探索、掌握和运用智能机器人技术的兴趣,提高我们爱科学、学科学、用科学的积极性,丰富我们的课余文化生活,增强我们的探究意识、进取意识、团队意识和竞争意识。特别是在机器人的编程和调试方面,我们通过亲手装配、实验、编程和实施机器人项目、直至达到我们所需要的结果。这过程使们们获得发自内心的快乐,同时也培养了我们的动手实践能力、创新思维能力、综合应用能力和团结协作能力。通过机器人实验我们觉得自己变得更从容、更自信、更具有成就感。通过实验操作,我们的能力在动手操作和探究方面都得到较大的提升。同时我们也体会到了团队合作的重要性。
八.实验对社会的意义:
在二十一世纪科技社会时代,人类社会将全面进入以智能机器人为代表的智能时代。相信在不久的将来有关机器人的研究与应用水平将取得重大突破。机器人的广泛应用将极大促进社会生产力的发展与产业结构的调整。机器人的制造与销售将成为一个新的经济增长点。这必将会推进中国在世界的发展脚步。因此实施基础教育领域开展智能机器人的教育,是为了让中国的学生能够有准备地迎接属于我们的明天——智能机器人时代的到来。虽然我们的机器人不能在生产中得以利用和开发,但是它将是开发设计高智能机器人的雏形和创新的源泉。
智能机器人实验报告学院:数理与信息工程学院专业:计算机科学与技术(师范)111学号:姓名:教师:上交时间:年月日实验一机器人听令出…
《智能机器人》实验报告学院:数理与信息工程学院专业:计算机科学与技术(师范)学号:姓名:教师:上交时间:20XX年12月19日成绩…
智能机器人实验报告报告题目院系名称专业名称学号学生姓名20xx年12月智能机器人实验报告第1页报告题目摘要字体宋体小四15倍行距中…
机器人实验报告一实验目的1认识能力风暴机器人并会简单编辑程序使其完成规定动作2了解能力风暴机器人内部构造认识声音光敏碰撞等传感器3…
实验一教你的机器人走路一要求与目的熟悉机器人用于走路的脚要教你的机器人学会走路同时你要掌握控制机器人走路的基本方法二内容1机器人为…
机器人实验报告二仿生机器人、人形机器人运动控制[实验目的]熟悉仿生机器人、人形机器人运动控制方法。制作仿生机器人取物品的动作,制作…
机电综合实验之机电一体化综合控制实验报告课程项目两轮智能移动机器人院系机械与运载工程学院班级20xx级车辆班姓名学号二O一四年目录…
《智能机器人》实验报告学院:数理与信息工程学院专业:计算机科学与技术(师范)学号:姓名:教师:上交时间:20XX年12月19日成绩…
院系电气信息工程学院班级XX级电气X班姓名XXX提交日期机器人实验报告前言作为先进制造业中不可替代的重要装备和手段工业机器人已经成…
华北电力大学实验报告实验名称机器人控制技术基础课程名称机器人控制技术基础实验人李丙伦机械070520xx04030125曾庭机械0…
机能学实验室学习总结(1.内蒙古医科大学内蒙古呼和浩特010000;2.中国国际航空内蒙古有限公司呼和浩特010000)【中图分类…