机电综合实验两轮智能移动机器人实验报告书

机电综合实验 之

机电一体化综合控制实验报告书

          

          

           题    目:两轮智能移动机器人

          

           实 验 者:

         

           学    号:

          

           班    级:

 日    期: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、 培养在实践中研究问题,分析问题和解决问题的能力;
我们必须坚持理论联系实际的思想,以实践证实理论,从实践中加深对理论知识的理解和掌握。实验是我们快速认识和掌握理论知识的一条重要途径。

通过本实验加深我们对机器人的了解,更进一步的掌握了各部件之间的功能特性。让我们在以后更多的实验中能灵活应用探究方法和操作能力。除此,我们在机器人教学中培养了我们的兴趣,创新能力分析能力和动手操作能力,激发了我们学习、探索、掌握和运用智能机器人技术的兴趣,提高我们爱科学、学科学、用科学的积极性,丰富我们的课余文化生活,增强我们的探究意识、进取意识、团队意识和竞争意识。特别是在机器人的编程和调试方面,我们通过亲手装配、实验、编程和实施机器人项目、直至达到我们所需要的结果。这过程使们们获得发自内心的快乐,同时也培养了我们的动手实践能力、创新思维能力、综合应用能力和团结协作能力。通过机器人实验我们觉得自己变得更从容、更自信、更具有成就感。通过实验操作,我们的能力在动手操作和探究方面都得到较大的提升。同时我们也体会到了团队合作的重要性。

八.实验对社会的意义

在二十一世纪科技社会时代,人类社会将全面进入以智能机器人为代表的智能时代。相信在不久的将来有关机器人的研究与应用水平将取得重大突破。机器人的广泛应用将极大促进社会生产力的发展与产业结构的调整。机器人的制造与销售将成为一个新的经济增长点。这必将会推进中国在世界的发展脚步。因此实施基础教育领域开展智能机器人的教育,是为了让中国的学生能够有准备地迎接属于我们的明天——智能机器人时代的到来。虽然我们的机器人不能在生产中得以利用和开发,但是它将是开发设计高智能机器人的雏形和创新的源泉。

相关推荐