“创意之星”模块化机器人实验指导书(实验版)
电子科技大学
机器人构型
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
与运动
规划实验
机械电子工程学院
2010年3月
目录
实验一 MultiFLEX控制卡编程实验 ......................................................................... 2 实验二 多自由度串联式机械手 ............................................................................ 11 实验三 简易四足机器人 ....................................................................................... 16 实验四 轮式机器人运动控制实验 ........................................................................ 20 实验五 机器人传感系统实验 ................................................................................ 25 实验六 自主避障机器人实验 ................................................................................ 27 实验七 追光的机器爬虫 ....................................................................................... 38 实验八 开放性实验:设计自己的机器人 ............................................................ 49
1
实验一 MultiFLEX控制卡编程实验 实验目的
(1)了解MultiFLEX控制卡的基本结构;
(2)了解WinAVR+AVRStudio编译环境的使用;
(3)了解C 语言环境下编写控制程序,并编译、下载到MultiFLEX 控制器中执行的流程
(4)熟悉关于AVR 单片机的io 口有关的寄存器的概念、作用 (5)理解函数gpio_mode_set(),write_gpio(),read_gpio()的定义,掌握其用法
(6)熟悉并掌握利用2 中的3 个函数控制MultiFLEX 控制卡的16 路IO 口 实验环境:
UP-MRcommander 控制软件
实验器材:
计算机 1台
MultiFLEX 控制卡 1块
控制卡电源线 1根
串口下载线 1根
232电缆 1根
USB转232电缆 1根
舵机 4个
舵机延长线 4根
实验步骤
1 WinAVR 以及AVRStudio 软件的安装
首先大家打开实验指导书配套光盘,在“MultiFLEX 控制卡\AVR MCU 开发资料”目录下,打开“WinAVR”文件夹,双击
“WinAVR-20060421-install.exe”完成WinAVR 的安装;然后打开“AVR Studio”文件夹,根据文件夹里面的安装说明进行AVRstudio 的安装,并将其升级到最新版本。
注意:请先安装WinAVR 再安装AVRStudio,这样WinAVR 才能自动嵌入到AVRStudio 中。
2 用3AVRStudio 建立一个工程
首先打开我们刚刚安装好的AVRStudio,会出现如下窗口:
2
点击选框1 中的按钮可以新建一个工程,点击选框2 中的按钮可以打开一个工程,选框3 是最近你所打开的文件,你可以选中快速将其打开。在这里,我们点击1(NewProject),会出现如下窗口:
在此窗口中我们可以设置关于新工程的一些基本信息。在选框1(Projec tType)中,第一项AtmelAVRAssembler 指汇编工程文件,第二项AVRGCC 指建立后的文件为C 语言工程文件,在此我们选择AVRGCC(如果没有安装WinAVR 则此处不会出现AVRGCC 选项)。在选框2 中,我们可以确定工程名(Project name)以及初始文件名(Initial file),在此我们不妨均取名为test。在选项框3 中,我们可以确定工程所在的文件夹位置,在此我们不妨将路径设为D:\test。在选
中如果选中Create folder,则会在3 中确定的文件夹中新建一个以工程项卡2
名为文件夹名的文件夹,所有与该工程有关的文件会放在此文件夹内;在选项卡2 中选中Create initial file 会生成一个初始.c 文件,方便我们编写程序。以上设定完成后我们点击Next 进行下一步设置,会弹出如下窗口:
3
在此窗口中我们可以设置一些关于计算机调试的一些信息。在选项框1 之中我们设置程序调试平台,在此我们选择AVRSimulator。在选项框2 中我们可以选择单片机类型,你可以根据实际需要选择,在此我们选择ATmega128(本实验以创意之星控制板为平台,所以选择创意之星的控制核心ATmega128,AVRStudio 可以进行软件模拟单片机的运行过程,但本书中不作介绍)。选择完成后我们点击Finish,这样一个新工程就初步建立了。然后会出现如下窗口。
其中选框1 为菜单栏,选框2 为工具栏,选框3 为工程管理树,选框4 为程序编辑栏,选框5 为编译信息栏。作为我们的第一个代码实验,我们可在选框4 中输入如下程序:
#include
#define BEEP_ON PORTG |= _BV(PG3)
#define BEEP_OFF PORTG &= ~_BV(PG3)
int main(void)
4
{
int i,j;
PORTG = 0;
DDRG = 0xff;
while(1)
{
for(i=0;i<0xFF;i++) {for(j=0;j<0xFF;j++);} BEEP_ON;
for(i=0;i<0xFF;i++) {for(j=0;j<0xFF;j++);} BEEP_OFF;
}
}
然后在菜单栏选择“Project——》Configuration Options”
会弹出如下窗口:
5
在控制核心工作频率(Frequency)一栏输入14745600,由于创意之星采用的晶振是此频率,故如此设置。其他选项均采用默认设置即可,然后点击确定。保存文件,然后在菜单栏选择“Build——》Build”(或者按F7),如下图所示:
在编译信息栏会出现相应的编译信息,显示是否有错误,其中显示“Build succeeded
with 0 Warnings„”说明我们编译正常通过,这时,在我们当初设置的工程所在的文件夹的default 文件夹“D:\test\test\default”里会出现很多新文件,这些都是程序编译的结果,其中有个test.hex 文件是程序烧写文件,将这个文件经过烧录软件下载至MultiFLEX 控制板后程序就能运行,至于如何烧写我们将在后面进行介绍。
3 将*.hex 文件烧录至MultiFLEX 控制卡中
首先我们要安装烧写软件PonyProg2000,打开实验指导书配套光盘,在“\MultiFLEX控制卡\AVR MCU 开发资料\ponypro”目录下,运行ponyprogV206f.exe,安装完毕后运行,有两个提示会出现,都选择确认,最终正确运行的PonyProg2000 如下图所示:
首先我们应该对软件进行总线时序校准,在Setup 中选择Calibration 即可。然后进行下载方式设置,点击“Setup——》InterfaceSetup”
6
会出现如下窗口:
由于“创意之星”配置的是并行下载线,所以我们应该选择Parallel,在下拉选项中选择AvrISPI/O,如上图所示,其他选项按其默认设置,不予更改,然后点击“OK”完成设置。
然后我们进行目标芯片的选择:点击“Device——》AVR micro”,在弹出的选项框中选择ATmega128,如下图所示,这样我们就完成了目标芯片的选择。
现在我们用并口下载线将电脑和MultiFLEX 控制卡进行连接。下图是“创意之星”提供的并口下载线以及其线序:
7
下图是MultiFLEX 控制卡的功能区域图,将下载线的5 针插头与其中的H 区的5 针插头相连接,注意线序
连接完成后给控制卡通上电源(程序烧写过程中不允许断电,请确保电源的可靠性)。然后在刚才打开的PonyProg2000 中点击“File——》Open Device File”或者点击图标打开我们前面生成的test.hex 文件(应该在“D:\test\test\default”文件夹中),然后点击“Command——》Write All”或者点击图标,然后程序就会开始烧写至控制卡里面,烧写过程如下图:
当PonyProg2000 显示烧写成功时我们的第一个实验程序就顺利的烧写进MultiFLEX 控制卡中了,正常情况下我们会听到控制卡蜂鸣器发出急促的“嘟嘟嘟”的声音,如果没有任何现象请你检查以上步骤是否按要求完成或者检查下载线有没有插反、控制卡是否正常供电,修改有问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
的地方后再生成hex 文件进行烧录,直至蜂鸣器出现
规则
编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf
的嘟嘟声为止。
4 编写C 程序实现对16 路I/O 口的控制
I/O 口(In/Out 口)是数字电路的重要组成部分之一,通过I/O 口,我们可以控制端口的电平变化,也可以对端口的电平信息进行读取。在机器人人领域对I/O 口的操作更是无处不在,那么针对创意之星的MultiFLEX 控制卡我们怎么通过编写c 与程序对其I/O 口进行操作呢,我们将在本小节对其进行介绍。
8
首先我们来简单了解一下AVR 单片机与I/O 口有关的寄存器。AVR 单片机与I/O 口有关的寄存器有3 个:PORTX,DDRX,PINX(X 为端口编号)。
DDRX 说明X 端口的输入输出状态,例如:如PORTA=0x0F=0000 1111,则引脚PA0-PA3均为输出(1 为输出),引脚PA4-PA7 均为输入(0 为输入)。
PORTX 说明X 端口的输入输出的具体信息,例如:当PORTA=0x0F 时,若PORTA=0X33=00110011,则引脚PA0、PA1 为输出,且输出信号为高(1);引脚PA2、Pa3 为输出,但输出信号为低(0);PA4、PA5 为输入且输入有效;至于PA6、PA7 虽然DDRA 已经将其设置为输入,但是PORTA 使其输入无效,所以PA6、PA7 的输入信号读不出来。
PINX 为输入端口的具体信息(PINX 只能读取不能写入),例如:当DDRA=0x0F,PORTA=0x33时,如果读取PINA 即char temp=PINA,则temp=--XX0011,其中为输入的引脚只有PA4-PA7,PA4 与PA5 状态为XX,X 为输入信号,而PA6、PA7 的输入为--,-为一个不确定的数。
以上是只是关于端口寄存器的一个简略介绍(如果读者想了解更多相关知识,请参考相关资料,推荐黄任的《AVR 单片机与CPLD/FPGA 综合应用入门》,北京航空航天大学出版社),方便大家看懂源程序,对于MultiFLEX 控制卡,我们已经在系统程序里面进行了处理,同学们只需要调用相关的函数即可对控制卡的IO0-IO15 这16 个引脚进行控制。
实验准备:
1.控制卡的IO0-I03 分别与4 个LED 灯连接(连接方式参见实验指导书)
2.控制卡的I015 与1 个碰撞传感器(实质上是一个开关)连接
3.控制卡与电脑之间用并口下载线正确连接
4.控制卡电源线正确连接
实验程序:
#include "Public.h"
#include "Usertask.h"
void user_task(void)
{
uint8 io_in;
uint8 io_out;
uint8 temp8;
uint16 temp16;
gpio_mode_set(0x00FF);
write_gpio(0xFF00);
while(1)
{
temp16 = read_gpio();
io_in = (uint8)(temp16>>8);
temp8=(io_in&0x80);
if(temp8==0)
{
io_out=0x01;
9
while(io_out)
{
write_gpio(~((uint16)io_out)); delay(5);//延时5×20MS=0.1s
io_out<<=1;
write_gpio(~((uint16)io_out)); delay(5);
}
}
else write_gpio(0xFF00); }
}
实验总结
整个实验的运行结果应为:当开关(碰撞传感器)未按下时,所有LED 灯点亮,当开关
持续按下时,led 灯循环点亮。
实验报告内容
记录自己的程序
10
实验二 多自由度串联式机械手 实验目的
(1)了解串联式机器人、自由度和空间机构学、机器人运动学的基本概念;
(2)熟悉四自由度串联式机械手;使用配套动作程序,然后自己给机器人编写动作;
(3)掌握“创意之星”机器人套件的搭建和装配技巧
(4)熟悉并掌握舵机控制函数rc_moto_control()以及延时函数delay()的使用方法,理解其函数定义
(5)熟悉并掌握利用函数控制舵机运动
实验环境:
UP-MRcommander 控制软件
实验器材:
计算机 1台
MultiFLEX 控制卡 1块
控制卡电源线 1根
串口下载线 1根
232电缆 1根
USB转232电缆 1根
舵机 5个
舵机延长线 5根
实验步骤
1 结构组装
其结构(3D 模型图,线缆和其他细节没有在图上表示出来) 示意图如下:
11
此部分组装完成后,用手旋转橙红色U-3-3-3 构件,应该和腰关节舵机的输出轴牢固地连接在一起,不能有松动、晃动或者卡住的现象。
组装其他部分。需要2 个基本构形A,1 个基本构形B,以及一个基本构形E。各个基本构形之间可以用通用连接件(D8x4、D8x6 塞子)连接,也可以用螺栓和螺母连接。需要注意的是,如果用通用连接件连接,最终完成的机械手的刚度会差一些;如果用螺栓/螺母连接,则需要仔细思考连接的先后顺序,不能先把各个基本构形组装出来之后再拼装,否则可能由于空间限制而无法进行拧螺丝等操作。
例如,连接DOF2 和DOF3 的两个基本构形的时候,就需要预先把DOF3 上的U3-3-3 红色U 型构件连接到DOF2 的舵机架上。
2 连接电缆
12
按下表所示顺序连接指定关节的舵机的电缆到MultiFLEX 控制卡上:
3 调整初始姿态
打开控制卡的电源,我们会发现机器手开始运动到初始姿势之后会锁定该姿势。为了使用配套光盘中附带的动作程序,我们需要手动调整每个关节的姿势,调整完毕后应该如下图所示:
4 写入动作程序
调整之后,再次打开电源。我们应该看到组装完成的机械手保持如上图所示的状态。此时在UP-MRcommander 软件中调入“UP-MRcommander\机械臂\机械臂.mra”这个动作文件,并下载执行。机械臂就可以运动起来了。 5 建立自己的动作程序
现在我们来编写自己的动作程序。动作程序的编写过程就是建立一个个的动作,并设计每个动作的姿态,以及持续时间。这一步中我们的目标是编写一个机械手的程序,它可以让机械手把一个纸团从他的左侧夹起,放到右侧,并如此重复。
编写动作的几个要点是:
要在“在线调试”的状态下对每个动作进行调试;如下图所示,选中“在线调试”复选框,即进入了在线调试状态。这种状态下,在UP-MRcommander 界面上的任何改动动作的操作都回立刻被机器人执行。利用在线调试功能可以很方便地为机器人编写每一个动作。
13
舵机的运动速度可以在0~255 之间调节。但是对于机械手来说,舵机的运动速度在50~150 比较合适。由于机械手的每个关节舵机(尤其是底座部位的舵机)的负载很大,如果速度太快的话,舵机会很快速地启动和停止,有可能损伤舵机本身,甚至有可能误伤操作者。
如果设定舵机的速度较慢,并且动作的执行时间太短的话,相应的动作可能还没有执行完毕就已经进入了下一个动作。没有执行完的动作将被忽略。
为刚刚编写好的动作命名。如下图所示。命名的好处是,我们可以很清楚地知道这个动作的目的是什么。
如下图所示,你很难搞明白左图的动作程序是什么。相对的,右图的动作程序每一步都进行了命名,如果我们要修改动作程序,很容易找出需要修改的地方来调试。
编写C 程序实现对舵机的控制
用“创意之星”机器人套件搭建的机器人的主要关节都是由舵机驱动的,我们选择USERTASK.C 对其进行编辑。输入如下程序:
#include "Public.h"
#include "Usertask.h"
void user_task(void)
{
uint8 array_rc[23]={0};
array_rc[0]=90+20;
14
array_rc[1]=170;
array_rc[2]=90-20;
array_rc[3]=170;
array_rc[4]=90-20;
array_rc[5]=170;
array_rc[6]=90+20;
array_rc[7]=170;
rc_moto_control(array_rc); delay(50);
array_rc[0]=90;
array_rc[1]=170;
array_rc[2]=90;
array_rc[3]=170;
array_rc[4]=90;
array_rc[5]=170;
array_rc[6]=90;
array_rc[7]=170;
rc_moto_control(array_rc); delay(50);
}
然后打开SYSTASK.C 文件,将处于最后的main()函数进行细微改动。 int main(void)
{
Sys_Init();
WORK_LED_ON;
while(1)
{
//system_task();
user_task();
}
}至此我们就顺利完成了用c 语言实现机器人关节运动控制。但是机械手舵4个,因此要求同学根据以上程序增加舵机的控制,并记录修改的程序。 机不止
实验总结
现在我们的机械手可以完成一定的工作了。这只是一个最原始的机器人,只
有5 个自由度(包括末端手爪),并且不具备传感器,无法根据工作情况来调整
自己的反应。从这个意义上来说,它甚至不应该被称为“机器人”。但是我们还
要继续组装这样的各种构型的机器人。我们目的是通过这些组装和学习,掌握“创
意之星”套件的使用,最终用这个套件设计和组装出自己的机器人。
实验报告内容
记录自己的动作程序
15
实验三 简易四足机器人 实验目的
(1)熟悉四足机器人,使用配套光盘中提供的动作程序机器人; (2)熟悉UP-MRcommander 软件调试机器人运动步态的技巧。 (3)掌握“创意之星”机器人套件的搭建技巧。
(4)熟悉并掌握舵机控制函数rc_moto_control()以及延时函数delay()的使用方法,理解其函数定义
(5)熟悉并掌握利用函数调试机器人的步态
实验环境:
UP-MRcommander 控制软件
实验器材:
计算机 1台
MultiFLEX 控制卡 1块
控制卡电源线 1根
串口下载线 1根
232电缆 1根
USB转232电缆 1根
舵机 4个
舵机延长线 4根
实验步骤
1 结构组装
本实验中需要组装的简易四足机器人三视图及轴测视图如下:
从图中可以看到,机器人具有4 个自由度(DOF1~DOF4),使用4 个基本构形A 构成了机器人的身体,它们之间使用I 形连接件连接。每个舵机的输出轴上
16
连接了一个I 形连接件,作为机器人的腿。如果大家对机器人刚度有较高要求的各部件连接件最好用螺纹副固定。在腿的末端使用了橡胶防滑垫,以增大腿部与地面的摩擦力。机器人的装配爆炸图如下图所示:
2 连接电缆
按下表所示顺序连接指定关节的舵机的电缆到MultiFLEX 控制卡上:
3 调整初始姿态
与前面的实验相同,在完成机器人的组装后,为了使用配套光盘中附带的动作程序,我们需要手动调整每个关节的初始姿态。调整方法如前面实验所述。调整完毕后各关节的初始姿态应该如下图所示:
4 写入动作程序
调整之后,再次打开电源。我们应该看到组装完成的机械手保持如上图所示的状态。此时在UP-MRcommander 软件中调入“\UP-MRcommander\蛇形机器人\10
17
关节蠕动-步距0.125波长-正弦波.mra”这个动作文件,并下载执行。此时把机器人放到地上,注意观察它的运动方式。
通常情况下,使只有4 个自由度的四足机器人运动起来并且能够前进、后退,是一个很困难的事情。普通的四足机器人至少有8 个自由度,有些甚至有12 个自由度。这个4 自由度的简易四足机器人能够前进、后退,甚至能够笨拙地转弯。本实验中我们只提供了前进的程序,后退、转弯的程序请读者自己编写。 编写C 程序实现对舵机的控制
用“创意之星”机器人套件搭建的机器人的主要关节都是由舵机驱动的,我们选择USERTASK.C 对其进行编辑。输入如下程序:
#include "Public.h"
#include "Usertask.h"
void user_task(void)
{
uint8 array_rc[23]={0}; array_rc[0]=90+20;
array_rc[1]=170;
array_rc[2]=90-20;
array_rc[3]=170;
array_rc[4]=90-20;
array_rc[5]=170;
array_rc[6]=90+20;
array_rc[7]=170;
rc_moto_control(array_rc); delay(50);
array_rc[0]=90;
array_rc[1]=170;
array_rc[2]=90;
array_rc[3]=170;
array_rc[4]=90;
array_rc[5]=170;
array_rc[6]=90;
array_rc[7]=170;
rc_moto_control(array_rc); delay(50);
}
然后打开SYSTASK.C 文件,将处于最后的main()函数进行细微改动。 int main(void)
{
Sys_Init();
WORK_LED_ON;
while(1)
{
18
//system_task();
user_task();
}
}
至此我们就顺利完成了用c 语言实现机器人关节运动控制。但是以上程序只能实现4 个舵机会在两种状态中往复切换,且运动状态两两相反,不能使四足机器人行走,因此需要同学增加及修改动作以实现行走。
5 实验总结
本实验中我们搭建了一个简易的四足机器人,并且使用运动程序让他能够往前爬动了。这并不是一个典型的四足机器人,但是他却很简单,也能够完成运动的功能。请读者思考一下,如何让他后退,向左及向右转弯, 实验报告内容
记录自己的动作程序
19
实验四 轮式机器人运动控制实验 实验目的
(1)了解轮式机器人的概念和了解采用全向驱动方式在生活、科研、工作中的
应用;
(2)熟悉轮式机器人;使用配套光盘中提供的动作程序,然后自己为机器人编
写动作;在UP-MRcommander 软件中,熟悉直流电机的控制; (3)掌握对于具有多种执行器(舵机、电机或者其他)的机器人,掌握搭建和
调试要领。
(4)掌握“创意之星”机器人套件的搭建和调试要领。 (5)熟悉并掌握电机控制函数dc_moto_control()的使用方法 (6)熟悉并掌握利用函数dc_moto_control()控制4 路直流伺服电机 实验环境:
UP-MRcommander 控制软件
实验器材:
计算机 1台
MultiFLEX 控制卡 1块
控制卡电源线 1根
串口下载线 1根
232电缆 1根
USB转232电缆 1根
舵机 4个
舵机延长线 4根
实验步骤
1 结构组装
组装完成的挖掘机器人应该如下图所示:
20
2 连接电缆
按下表所示顺序连接指定关节的舵机的电缆到MultiFLEX 控制卡上:
3 调整初始姿态
打开控制卡的电源,机器人会锁定初始姿势。为了使用配套光盘中附带的动作程序,我们需要手动调整每个关节的姿势,调整方法如前面实验所述。调整完毕后应该如下图所示:
21
4 写入动作程序
调整之后,再次打开电源。我们应该看到组装完成的挖掘机器人保持如上图所示的状态。此时在UP-MRcommander 软件中调入“UP-MRcommander\全向四驱小车+机械臂\机械臂+四驱车.mra”这个动作文件,并下载执行。挖掘机器人就可以运动起来了。
5 建立自己的动作程序
观察机器人的运动,并且通过UP-MRcommander 软件的在线调试功能,弄清楚每个舵机、直流电机与软件界面中相应滑块的对应关系。
把机器人的轮子架空,拖动软件界面上的电机调速滑块和电机运行时间滑块,观察电机在不同速度运行的情况,以及不同的运行时间。可以用手握住轮子,体会一下不同速度时电机的力量大小。
熟悉了电机的控制操作之后,我们可以编写自己的运动程序,控制机器人按照一定的顺序运动。
完成一个运动程序的演示。该程序的运行效果是:机器人可以从固定位置把一个烟盒大小的物体抓起,然后前进,转弯,前进。最后在指定的半径60cm 的圆圈中把物体放下。
自行设计一个只有两个主动轮(即只用两个直流电机,左右差动式)的轮式机器人,并让他运动起来。观察并思考两轮机器人的运动与四轮有什么优缺点。 编写C 程序实现对4 路电机的控制
电机是机器人非常重要的组成部件之一,我们已经知道了怎样用“创意之星”机器人套件提供的上位机程序通过控制卡对电机进行控制。 在本实验中,我们都只讨论怎么对USERTASK.C 进行编辑,其余步骤跟前面相同,不再赘述。对四路电机进行控制的USERTASK.C 如下所示:
#include "Public.h"
#include "Usertask.h"
22
void user_task(void) {
uint8 array_dc[7]={0}; uint8 i;
array_dc[0] = 0;
array_dc[1] = 30;
array_dc[2] = 0xFE; array_dc[3] = 30;
array_dc[4] = 0;
array_dc[5] = 30;
array_dc[6] = 0xFE; array_dc[7] = 30;
dc_moto_control(array_dc); delay(150);
for(i=0;i<(128/10+1);i++) {
array_dc[0] = 0+i*10; array_dc[1] = 2;
array_dc[2] = 255-i*10; array_dc[3] = 2;
array_dc[4] = 0;
array_dc[5] = 2;
array_dc[6] = 0;
array_dc[7] = 2;
dc_moto_control(array_dc); delay(10);
}
array_dc[0] = 0x80; array_dc[1] = 2;
array_dc[2] = 0x80; array_dc[3] = 2;
array_dc[4] = 0x80; array_dc[5] = 2;
array_dc[6] = 0x80; array_dc[7] = 2;
dc_moto_control(array_dc); delay(10);
delay(50);
}
整个程序运行的结果为电机1、3 以最大速度正转3s,同时电机2、4 以最大
速度反转3s;然后电机1、2、3、4 在2.6s 内均匀减速至0,然后定顿1s。整个
工程编译后电机将按以上规律循环运动。因此机器人是无法运动的,要求同学根
23
据UP-MRcommander 软件中调入“UP-MRcommander\全向四驱小车+机械臂\机械臂+四驱车.mra”这个动作文件中的参数设置,修改并增加C 程序对4 路电机的控制程序。
实验报告内容
记录自己的动作程序
24
实验五 机器人传感系统实验 实验目的
(1)熟悉关于AVR 单片机的A/D 口的概念、作用 (2)熟悉并掌握函数ADC_Read(uint8 Channel,uint8 *data)的使用方法,理解
其函数
定义
(3)熟悉并掌握利用函数ADC_Read()读取来自MultiFLEX 控制卡A/D 口的模拟
信号
实验环境:
UP-MRcommander 控制软件
实验器材:
计算机 1台
MultiFLEX 控制卡 1块
控制卡电源线 1根
串口下载线 1根
232电缆 1根
USB转232电缆 1根
舵机 4个
舵机延长线 4根
实验步骤
1.控制卡的AD0 与光强传感器连接(连接方式参见实验指导书)
2.控制卡PWM0 与舵机连接
3.控制卡与电脑之间用并口下载线正确连接 4.控制卡电源线正确连接
5.建立自己的程序1
#include "Public.h"
#include "Usertask.h"
void user_task(void)
{
uint8 AD0_in;
uint8 rc_array[23]={0};
uint16 temp;
25
uint8 i;
for(i=0; i<24; i=i+2)
{
rc_array[i]=90;
rc_array[i+1]=128;
}
while(1)
{
ADC_Read(0,&AD0_in);
temp=((uint16)AD0_in*180)/255;
rc_array[0]=(uint8)temp;
rc_array[1]=80;
rc_moto_control(rc_array);
delay(25);
}
}
整个实验的运行结果应为:开机后,PWM0口的舵机在0-180度之间运动,其
位置与外部光照强度成正比(外部光照强度通过光强传感器采集,采集频率2Hz)。
我们可以用手遮住或用光照光强传感器,观察现象。
建立自己的程序2
#include "Public.h"
#include "Usertask.h" void user_task(void)
{
uint8 AD0_in;
uint8 rc_array[23]={0};
uint8 i=0;
while(1)
{
ADC_Read(0,&AD0_in);
rc_array[0]=i*180;
rc_array[1]=AD0_in;
rc_moto_control(rc_array);
delay(25);
i++;
if(i>1) i=0;
}
}
实验结果:开机后,舵机在0-180度之间往复运动,其运动速度与外部光照
强度成正比(外部光照强度通过光强传感器采集,采集频率2Hz)。
26
6.同时控制多个舵机
参考上述程序,编写程序同时使用4个光强(或温度)传感器分别控制4个舵
机的转角位置。
实验报告内容
记录自己的动作程序的分步动作参数
实验六 自主避障机器人实验 实验目的
(1)回顾控制卡的各种控制函数
27
(2)提高灵活应用各种控制函数控制机器人各种执行器的能力 (3)提高搭建只能程序,使机器人拥有一定人工智能的能力
实验环境:
UP-MRcommander 控制软件
实验器材:
计算机 1台
1块 MultiFLEX 控制卡
控制卡电源线 1根
串口下载线 1根
232电缆 1根
USB转232电缆 1根
舵机 10个
舵机延长线 10根
实验步骤
1 结构组装
由上图可知,整个全向运动作业机器人由1 个机器手构型,1 个控制盒,4 个基本构型D,4 个零件I9 以及相应的连接件构成。为简化起见,上图中并没有显示出具体的连接件,大家可以在考虑机器人系统刚性的情况下采用自己喜欢的连接方式。本实验的全向运动作业机器人结构主体和前面实验7.3 里面的四轮小车基本相似,下部的驱动部分大不相同,采用的是前面介绍的基本构型D。请同学们组装的时候认真体会这种驱动结构的优缺点。
组装好后的全向作业机器人如下图所示:
28
在此我们将其机器手部分去掉,为其加上两个检测障碍物用的红外传感器。加上的红外传感器装配图如下图所示:
加上的红外传感器装配体由1 个L5-3,2 个V2-2 以及两个红外传感器构成,各零件之间用螺纹副连接(红外传感器与V2-2 之间靠过盈配合)。为了增加系统刚性,红外传感器装配体与全向运动机器人之间也用螺纹副连接。改装好的机器人如下图所示:
29
改装后的全向运动机器人的各个舵机以及电机与控制卡的连接顺序以及开机后各舵机的初始位置依然同7.7 的全向运动机器人一样,不做改动(机器手部分忽略),而加上的两个红外传感器则分别插在控制卡的IO0 以及IO1 上。至此我们的机器人就改装完毕了。
2. 逻辑
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
(程序框架搭建)
“创意之星”的红外传感器在出厂之前初始化了探测距离(大概20cm),当此距离之内有障碍物的话传感器输出电平会发生变化。在安装红外传感器之后我们的全向运动机器人已经有拥有了探测障碍物的能力,那么当机器人探测到障碍物怎样执行器怎样反应才能实现自主避障呢,这就需要我们进行逻辑分析。
当传感器遇到障碍物之后,由于传感器自生延时以及处理器的需要处理时间,所以机器人会由于惯性继续向前运动一段距离,我们就需要机器人推后一定的补偿距离,以保证和障碍物之间的距离为一个确定的范围。
其次机器人会根据检测到障碍物的传感器不同而采取不同的策略:如果是左边传感器检测到障碍物之后,机器人应该向右转避开障碍物;如果是右边的传感器检测到障碍物的话机器人应该向左转;如果两个传感器都有障碍物的话机器人应该随机采取一个旋转方向(为简化程序,我们假设此时机器人仍向右转)。并且机器人左转与右转的角度不应该相同,否则在特殊情况下机器人会陷入死循环,在一个地方不停的循环的左转右转。请大家思考一下什么情况下机器人会陷入死循环。
当机器人转向后,如果机器人前方仍然有障碍物的话机器人应该重复后退专项操作,如果前方已经没有障碍物的话机器人应该继续向前引动。经过分析后,我们得到了如下逻辑:
30
这就是我们的自主避障机器人的程序框架。我们可以用c语言编写Usertask.c 文件来实现以上逻辑。实际上,用c 语言实现以上逻辑是一件不太麻烦的事情,无非是些if、else 的组合,最困扰我们的是在经过某种判断之后如何让机器人执行特定动作,我们无法简单的确定各种控制卡函数的参数(例如舵机控制函数中舵机的运动角度,舵机运动速度)。只要这个问题解决了,我们编写自主避障小车程序也就容易多了。其实通过我们创意之星的新版上位机程序UPMRobot.exe 的在线调试功能就能很容易的解决以上问题。
2 连接电缆
按下表所示顺序连接指定关节的舵机的电缆到MultiFLEX 控制卡上:
31
3 C 语言程序编写
打开我们的上位机程序UPMRobot.exe,用串口线将控制卡与电脑连接好,给机器人通上电,在上位机程序里打开设置相应串口并且打开在线调试功能。
通过在线调试,我们可以把机器人调整到假设机器人遇到某种情况时所需要执行的运动状态,然后我们点击如下图所示的红框框住的指令栏,分别点击舵机、电机、I/O 输出、蜂鸣器会弹出不同的窗口,这个窗口就是上位机给控制卡发出的使机器人执行当前运动设置的指令,这个指令遵守模块化机器人电脑与控制卡之间的通讯
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
(这个协议是博创公司自行定制的协议),大家通过查阅“创意之星”实验指导书配套光盘里的模块化机器人通讯协议,经过简单分析,就可以提取出在Usertask.C 中调用的控制函数的参数,将这些控制参数提交给控制函数并执行,机器人就会如现在在线调试般运动。通过在线调试提取机器人运动信息,可以使我们的程序编写过程大大简化。
32
在这里,我们只简单介绍一下怎么提取舵机运动信息以及电机运动信息。
我们先在在线调试模式下设定一个机器人的运动状态,然后电机指令栏里的舵机按钮,会弹出如下信息:
而在博创公司的模块化机器人通讯中关于舵机指令的规定如下:
通过分析,我们可以看到在弹出窗口里舵00——舵11 之间的24 个数据,实际上就是让机器人运动到此状态下的舵机控制函数rc_moto_control()的运动参数。将此24 个数依次赋予一个拥有24 项的数组(例如unsigned char rc_array[23];),然后将此数组数组名(数组地址)传递给舵机函数,在Usertask.C 中调用命令“rc_moto_control(array);”即可使机器人按照当前在线调试状态所设置的运动状态运动。
类似的,我们在在线调试模式下设定一个机器人的运动状态,然后电机指令栏里的舵机按钮,会弹出如下信息:
33
在博创公司的模块化机器人通讯中关于电机指令的规定如下:
经过简单分析,我们很容易的知道M00-M03 之间的8 个数就是在Usertask.C 中调用dc_moto_control()函数实现当前运动状态的参数。我们不妨建立一个数组“unsigned chardc_array[7];” 然后将上述数据依次赋予此数组, 然后再Usertask.C 调用语句“dc_moto_control(dc_array);”机器人机会按照当前在线调试所确定的状态运动。通过反复尝试,最终我们建立的使全向运动机器人实现自动避障的USERTASK.C 如下所示:
#include "public.h"
#include "Usertask.h"
void user_task(void)
{
uint8 array_dc[7]={0};
uint8 array_rc[23]={0};
uint16 temp16;
gpio_mode_set(0);
temp16 = read_gpio();
if((temp16 & 0x0003)==3)
{
array_dc[0] = 0;
array_dc[1] = 50;
array_dc[2] = 0xFE;
array_dc[3] = 50;
array_dc[4] = 0;
array_dc[5] = 50;
array_dc[6] = 0xFE;
array_dc[7] = 50;
dc_moto_control(array_dc);
34
}
else if(((temp16&0x0003)==2)||((temp16&0x0003)==0))
{
beep_set(5);
array_dc[0] = 0xFE; array_dc[1] = 5;//0.5 秒
array_dc[2] = 0;
array_dc[3] = 5;
array_dc[4] = 0xFE; array_dc[5] = 5;
array_dc[6] = 0;
array_dc[7] = 5;
dc_moto_control(array_dc); delay(30);
array_rc[0]=90+20; array_rc[1]=170;
array_rc[2]=90-20; array_rc[3]=170;
array_rc[4]=90-20; array_rc[5]=170;
array_rc[6]=90+20; array_rc[7]=170;
rc_moto_control(array_rc); delay(50);
array_dc[0] = 0x80+55; array_dc[1] = 10;
array_dc[2] = 0x80+55; array_dc[3] = 10;
array_dc[4] = 0x80+55; array_dc[5] = 10;
array_dc[6] = 0x80+55; array_dc[7] = 10;
dc_moto_control(array_dc); delay(50);
array_rc[0]=90;
array_rc[1]=170;
array_rc[2]=90;
array_rc[3]=170;
array_rc[4]=90;
array_rc[5]=170;
array_rc[6]=90;
35
array_rc[7]=170;
rc_moto_control(array_rc); delay(50);
}
else
{
beep_set(5);
array_dc[0] = 0xFE; array_dc[1] = 5;
array_dc[2] = 0;
array_dc[3] = 5;
array_dc[4] = 0xFE; array_dc[5] = 5;
array_dc[6] = 0;
array_dc[7] = 5;
dc_moto_control(array_dc); delay(30);
array_rc[0]=90+20; array_rc[1]=170;
array_rc[2]=90-20; array_rc[3]=170;
array_rc[4]=90-20; array_rc[5]=170;
array_rc[6]=90+20; array_rc[7]=170;
rc_moto_control(array_rc);
delay(50);
array_dc[0] = 0x80-55; array_dc[1] = 15;
array_dc[2] = 0x80-55; array_dc[3] = 15;
array_dc[4] = 0x80-55; array_dc[5] = 15;
array_dc[6] = 0x80-55; array_dc[7] = 15; dc_moto_control(array_dc); delay(50);
array_rc[0]=90;
array_rc[1]=170;
array_rc[2]=90;
array_rc[3]=170;
array_rc[4]=90;
36
array_rc[5]=170;
array_rc[6]=90;
array_rc[7]=170;
rc_moto_control(array_rc);
delay(50);
}
}
下载完成后,如果操作正确,我们会看见拥有自主避障功能的全向运动小车
在地面运动。
实验报告内容
记录自己的动作程序的分布动作参数
37
实验七 追光的机器爬虫
实验目的
(1)回顾控制卡的各种控制函数
(2)提高灵活应用各种控制卡函数控制机器的能力
(3)提高搭建c 程序,使机器人拥有一定人工智能的能力
实验环境:
UP-MRcommander 控制软件
实验器材:
计算机 1台
1块 MultiFLEX 控制卡
控制卡电源线 1根
串口下载线 1根
232电缆 1根
USB转232电缆 1根
舵机 10个
舵机延长线 10根
实验步骤
1 结构组装
机器爬虫的结构组装如下图所示:
38
机器爬虫每个腿部构型由2 个基本构型B,1 个L1-1,一个L3-1 以及相应的连接件构成。四只腿两两对称,组装的时候需注意。机器爬虫的头部构型由1 个基本构型B,2 个光强传感器(本实验只涉及机器人步态,关于传感器的使用将在第八章专门进行介绍),1 个L3-3,2 个V2-2 以及相应的连接件构成。机器爬虫控制盒由2 个电路板底座,6 个U1-2-1,1 块电路板以及相应的连接件构成。整个机器爬虫由1 个头部构型,4 个腿部构型,1 个控制盒,1 个支撑架,1 个L5-1,1 个电池组以及相应的连接件构成。建议腿部与躯干用螺钉连接以保证机体的稳定性。
组装好后的机器爬虫如下图所示
由于两个光强传感器平行不利于分辨光源方向,所以我们要对机器爬虫的头部进行改装。改装的机器人头部如下所示:
39
机器人头部由1 个U1-2-1,一个V2-2,两个D8x6 轮轴,两个红外传感器以及一些连接螺钉装配而成,两传感器之间呈大概30 度夹角(这样更有利于辨别光源方向)。改装后的机器爬虫如下所示:
四只腿中八个舵机与控制卡的连接顺序还是和前面的四足爬虫一样(同7.1.3)。头部的左、右(以爬虫为基准的左右)光强传感器分别连接至控制卡的AD0 和AD1 接口上。
2. 逻辑分析(程序框架搭建)
下面让我们来进行机器爬虫追寻光线行为的逻辑分析(为了降低分析难度,我们先假设开机后爬虫未正对光源方向)。总体来讲,机器人的追光行为应该细分为寻找光源、追逐光源等基本行为,在两个基本行为之中又夹杂着若干的逻辑
40
判断,例如周围光源是否达到人造光源光强标准,是否追踪到光源,光源是否丢失等等。其具体分析如下问所述:
器爬虫开机复位后,首先应该开始寻找光源:机器人开始采集传感器数据,并沿某方向(例如向左)原地打转直至传感器采集的数据大于某一阈值δ(在自然条件下环境光比较温和,传感器采集数据处于一个比较低的范围,若传感器采集值忽然增大,说明机器人逐渐朝向光源方向),然后机器人继续转相,直至两传感器采集数据之差小于或等于另一阈值Δ 时说明机器人现在已经朝向光源方向。
当机器爬虫锁定光源大概方向后即开始追光:爬虫朝光源方向运动,运动过程中不断根据传感器采集的数据修正自己的方向:如果两传感器采集数据之差仍不大于Δ 时说明光源未丢失;如果光源之差大于Δ(光源移动等原因导致)说明机器人已经丢失光源,如果此时单个传感器值仍大于δ 则机器人朝次方向转向,如果两个传感器的数据均小于δ 则说明光源已经彻底丢失,机器人应该重复追光行为。
用文字描述次行为大家可能会感到特别复杂紊乱,看起来让人缺乏耐心,那么我们来试着搭建一下机器爬虫追光行为的逻辑图(程序框架图)。初步的框架图如下所示(仅作参考,很多情况未考虑进去。读者可自己分析出更全面的逻辑图):
其中方框1 中的是机器人的寻光行为(不断的左转寻找光源),方框2 中的是机器人锁定光源的行为(大概找到光源后,哪边信号强机器人就往哪边转,知道两传感器信号大致相等),方框3 是机器人的追光行为(找到光源后向光源运动,如果光源丢失再寻找光源)
3. 程序框架优化
41
经过分析我们可以看见方框1 中的爬虫左转只是我们人为规定机器人最初的寻光方向,对于机器人决策实际上是无关紧要的,如果我们将其改为向左的话完全可以和方框2 中的右转合并,这是值得我们优化的地方。
其次,方框3 中我们用到了绝对值运算,在单片机c 语言编写中,用到了数学运算的话需要加入“math.h”头文件,增加这个头文件会加大程序空间,如果我们只用到了少数几个简单的、完全可以用其他途径实现判断或者计算的话(例如绝对值)就尽量不要包含“math.h”头文件,这点对于编程空间紧张的情况下尤为重要,并且在GCC 的math.h 中绝对值函数运用了double 数据类型,这会大大的增加单片机的运算时间(单片机的浮点运算能力不强)以及存储空间,如果单片机要进行大量的实时计算与实时逻辑判断的话,采用大量的浮点运算是不符合时间要求的,所以我们在单片机编程时尽量采用整形数据以及优化算法(能a<<1 的就不要用a×2,(这种情况在创意之星程序中除了usertask.c 的其他.c 文件中也有体现,有兴趣的读者可自行研究)这也是需要优化的地方。经过优化的程序框架图如下所示:
经过简化的流程图看起来可能比以前更“复杂”了一点,但是实际上程序编制的结果却是更简单,更有效,单片机的程序空间占用率更小。 2 连接电缆
按下表所示顺序连接指定关节的舵机的电缆到MultiFLEX 控制卡上:
42
3 C 语言程序编写
借助上位机软件在线调试步通过反复尝试,最终我们建立的使四足机器爬虫
实现追光行为的USERTASK.C 如下所示:
#include "public.h"
#include "Usertask.h"
uint8 move_on_flag=0;
void move_on1(void)
{
uint8
rc_array[10][24]={{0xAD,0x67,0x5A,0x67,0x11,0xDC,0x5C,0xD9,0xAD,0x67,0x67,0x67,0x0A,0x67,0x60,0x67},
{0xAD,0x67,0x50,0x67,0x11,0x67,0x66,0x67,0xAD,0x67,0x5D,0x67,0x0A,0x67,0x6A,0x67,0x5A ,0x80},
{0xAD ,0x67 ,0x4B ,0x67 ,0x11 ,0x67 ,0x6B ,0x67 ,0x8F ,0xDC ,0x71 ,0xD9 ,0x0A ,0x67 ,0x6F ,0x67 },
{0xAD ,0x67 ,0x46 ,0x67 ,0x11 ,0x67 ,0x70 ,0x67 ,0xAD ,0xDC ,0x85 ,0xD9 ,0x0A ,0x67 ,0x74 ,0x67 },
{0x8F ,0xDC ,0x5A ,0xD9 ,0x11 ,0x67 ,0x75 ,0x67 ,0xAD ,0x67 ,0x80 ,0x67 ,0x0A ,0x67 ,0x79 ,0x67},
{0xAD ,0xDC ,0x6E ,0xD9 ,0x11 ,0x67 ,0x7A ,0x67 ,0xAD ,0x67 ,0x7B ,0x67 ,0x0A ,0x67 ,0x7E ,0x67},
43
{0xAD ,0x67 ,0x69 ,0x67 ,0x11 ,0x67 ,0x7F ,0x67 ,0xAD ,0x67 ,0x76 ,0x67 ,0x28 ,0xDC ,0x6A ,0xD9},
{0xAD ,0x67 ,0x64 ,0x67 ,0x11 ,0x67 ,0x84 ,0x67 ,0xAD ,0x67 ,0x71 ,0x67 ,0x0A ,0xDC ,0x56 ,0xD9},
{0xAD ,0x67 ,0x5F ,0x67 ,0x2F ,0xDC ,0x70 ,0xD9 ,0xAD ,0x67 ,0x6C ,0x67 ,0x0A ,0x67 ,0x5B ,0x67},
{0xAD ,0x67 ,0x5A ,0x67 ,0x11 ,0xDC ,0x5C ,0xD9 ,0xAD ,0x67 ,0x67 ,0x67 ,0x0A ,0x67 ,0x60 ,0x67}};
uint8 i;
for(i=0;i<10;i++)
{
rc_moto_control(rc_array[i]);
delay(6);
}
}
void move_on2(void)
{
uint8
rc_array[10][24]={{0xAD ,0x67 ,0x5A ,0x67 ,0x11 ,0xDC ,0x5C ,0xD9 ,0xAD ,0x67 ,0x67
,0x67 ,0x0A ,0x67 ,0x60 ,0x67},
{0xAD ,0x67 ,0x50 ,0x67 ,0x11 ,0x67 ,0x66 ,0x67 ,0xAD ,0x67 ,0x5D ,0x67 ,0x0A ,0x67 ,0x6A ,0x67},
{0xAD ,0x67 ,0x4B ,0x67 ,0x11 ,0x67 ,0x6B ,0x67 ,0xAD ,0x67 ,0x58 ,0x67 ,0x28 ,0xDC ,0x56 ,0xD9},
{0xAD ,0x67 ,0x46 ,0x67 ,0x11 ,0x67 ,0x70 ,0x67 ,0xAD ,0x67 ,0x53 ,0x67 ,0x0A ,0xDC ,0x42 ,0xD9},
{0xAD ,0x67 ,0x41 ,0x67 ,0x2F ,0xDC ,0x5C ,0xD9 ,0xAD ,0x67 ,0x4E ,0x67 ,0x0A ,0x67 ,0x47 ,0x67},
{0xAD ,0x67 ,0x3C ,0x67 ,0x11 ,0xDC ,0x48 ,0xD9 ,0xAD ,0x67 ,0x49 ,0x67 ,0x0A ,0x67 ,0x4C ,0x67},
{0xAD ,0x67 ,0x37 ,0x67 ,0x11 ,0x67 ,0x4D ,0x67 ,0x8F ,0xDC ,0x5D ,0xD9 ,0x0A ,0x67 ,0x51 ,0x67},
44
{0xAD ,0x67 ,0x32 ,0x67 ,0x11 ,0x67 ,0x52 ,0x67 ,0xAD ,0xDC ,0x71 ,0xD9 ,0x0A ,0x67 ,0x56 ,0x67},
{0x8F ,0xDC ,0x46 ,0xD9 ,0x11 ,0x67 ,0x57 ,0x67 ,0xAD ,0x67 ,0x6C ,0x67 ,0x0A ,0x67 ,0x5B ,0x67},
{0xAD ,0xDC ,0x5A ,0xD9 ,0x11 ,0x67 ,0x5C ,0x67 ,0xAD ,0x67 ,0x67 ,0x67 ,0x0A ,0x67 ,0x60 ,0x67}};
uint8 i;
for(i=0;i<10;i++)
{
rc_moto_control(rc_array[i]);
delay(6);
}
}
void move_on(void)
{
if(move_on_flag==0) move_on1();
else move_on2();
move_on_flag++;
if(move_on_flag>1) move_on_flag=0;
}
void turn_left(void)
{
uint8
rc_array[10][24]={{0xAD ,0xDC ,0x5A ,0xD9 ,0x11 ,0x67 ,0x5C ,0x67 ,0xAD ,0x67 ,0x67 ,0x67 ,0x0A ,0x67 ,0x60 ,0x67},
{0xAD ,0x67 ,0x64 ,0x67 ,0x11 ,0x67 ,0x66 ,0x67 ,0xAD ,0x67 ,0x71 ,0x67 ,0x0A ,0x67 ,0x6A ,0x67},
{0xAD ,0x67 ,0x69 ,0x67 ,0x11 ,0x67 ,0x6B ,0x67 ,0xAD ,0x67 ,0x76 ,0x67 ,0x28 ,0xDC ,0x56 ,0xD9},
{0xAD ,0x67 ,0x6E ,0x67 ,0x11 ,0x67 ,0x70 ,0x67 ,0xAD ,0x67 ,0x7B ,0x67 ,0x0A ,0xDC ,0x42 ,0xD9},
{0xAD ,0x67 ,0x73 ,0x67 ,0x2F ,0xDC ,0x5C ,0xD9 ,0xAD ,0x67 ,0x80 ,0x67 ,0x0A ,0x67 ,0x47 ,0x67},
{0xAD ,0x67 ,0x78 ,0x67 ,0x11 ,0xDC ,0x48 ,0xD9 ,0xAD ,0x67 ,0x85 ,0x67 ,0x0A ,0x67 ,0x
45
4C ,0x67},
{0xAD ,0x67 ,0x7D ,0x67 ,0x11 ,0x67 ,0x4D ,0x67 ,0x8F ,0xDC ,0x71 ,0xD9 ,0x0A ,0x67 ,0x51 ,0x67},
{0xAD ,0x67 ,0x82 ,0x67 ,0x11 ,0x67 ,0x52 ,0x67 ,0xAD ,0xDC ,0x5D ,0xD9 ,0x0A ,0x67 ,0x56 ,0x67},
{0x8F ,0xDC ,0x6E ,0xD9 ,0x11 ,0x67 ,0x57 ,0x67 ,0xAD ,0x67 ,0x62 ,0x67 ,0x0A ,0x67 ,0x5B ,0x67},
{0xAD ,0xDC ,0x5A ,0xD9 ,0x11 ,0x67 ,0x5C ,0x67 ,0xAD ,0x67 ,0x67 ,0x67 ,0x0A ,0x67 ,0x60 ,0x67}};
delay(10);
uint8 i;
for(i=0;i<10;i++)
{
rc_moto_control(rc_array[i]);
delay(6);
}
}
void turn_right(void)
{
uint8
rc_array[10][24]={{0xAD ,0x67 ,0x5A ,0x67 ,0x11 ,0xDC ,0x5C ,0xD9 ,0xAD ,0x67 ,0x67 ,0x67 ,0x0A ,0x67 ,0x60 ,0x67},
{0xAD ,0x67 ,0x50 ,0x67 ,0x11 ,0x67 ,0x52 ,0x67 ,0xAD ,0x67 ,0x5D ,0x67 ,0x0A ,0x67 ,0x56 ,0x67},
{0xAD ,0x67 ,0x4B ,0x67 ,0x11 ,0x67 ,0x4D ,0x67 ,0x8F ,0xDC ,0x71 ,0xD9 ,0x0A ,0x67 ,0x51 ,0x67},
{0xAD ,0x67 ,0x46 ,0x67 ,0x11 ,0x67 ,0x48 ,0x67 ,0xAD ,0xDC ,0x85 ,0xD9 ,0x0A ,0x67 ,0x4C ,0x67},
{0x8F ,0xDC ,0x5A ,0xD9 ,0x11 ,0x67 ,0x43 ,0x67 ,0xAD ,0x67 ,0x80 ,0x67 ,0x0A ,0x67 ,0x47 ,0x67},
{0xAD ,0xDC ,0x6E ,0xD9 ,0x11 ,0x67 ,0x3E ,0x67 ,0xAD ,0x67 ,0x7B ,0x67 ,0x0A ,0x67 ,0x42 ,0x67},
46
{0xAD ,0x67 ,0x69 ,0x67 ,0x11 ,0x67 ,0x39 ,0x67 ,0xAD ,0x67 ,0x76 ,0x67 ,0x28 ,0xDC ,0x
56 ,0xD9},
{0xAD ,0x67 ,0x64 ,0x67 ,0x11 ,0x67 ,0x34 ,0x67 ,0xAD ,0x67 ,0x71 ,0x67 ,0x0A ,0xDC ,0x
6A ,0xD9},
{0xAD ,0x67 ,0x5F ,0x67 ,0x2F ,0xDC ,0x48 ,0xD9 ,0xAD ,0x67 ,0x6C ,0x67 ,0x0A ,0x67 ,0x
65 ,0x67},
{0xAD ,0x67 ,0x5A ,0x67 ,0x11 ,0xDC ,0x5C ,0xD9 ,0xAD ,0x67 ,0x67 ,0x67 ,0x0A ,0x67 ,0x
60 ,0x67}};
delay(10);
uint8 i;
for(i=0;i<10;i++)
{
rc_moto_control(rc_array[i]);
delay(6);
}
}
void user_task(void)
{
uint8 light_sensor_left;
uint8 light_sensor_right;
uint8 light_gate=130;
int8 sub_gate=30;
int8 int8_temp;
while(1)
{
ADC_Read(0,&light_sensor_left);
ADC_Read(1,&light_sensor_right);
if(light_sensor_left>light_gate)
{
if(light_sensor_right>light_gate)
{
int8_temp=(int8)(light_sensor_left - light_sensor_right);
if(int8_temp)
{
if(int8_temp>sub_gate) turn_left();
else move_on();
}
else
47
{
int8_temp=0-int8_temp;
if(int8_temp>sub_gate) turn_right();
else move_on();
}
}
else turn_left();
}
else turn_right();
}
}
下载完成后,如果操作正确,我们会看见拥有追光行为的四组机器爬虫在地面运动,我们可以不断的变换手电筒的位置(仍照向机器爬虫),检验编程效果。
实验报告内容
记录自己的动作程序的分布动作参数
48
实验八 开放性实验:设计自己的机器人 实验目的
(1)回顾控制卡的各种控制函数
(2)提高灵活应用各种控制卡函数控制机器的能力
(3)提高搭建c 程序,使机器人拥有一定人工智能的能力
(4)回顾“创意之星”机器人套件的搭建和调试要领。 实验环境:
UP-MRcommander 控制软件
实验器材:
计算机 1台
MultiFLEX 控制卡 1块
控制卡电源线 1根
串口下载线 1根
232电缆 1根
USB转232电缆 1根
舵机 4个
舵机延长线 4根
实验步骤
(1)根据自己的爱好搭建出自己喜欢的机器人
(2)将自己设计的机器人的各个舵机与控制卡相连,舵机与控
制卡端口的对应关系请参见实验指导书
(3)将自己设计的机器人的传感器分别插在控制卡上
(4)控制卡与电脑之间用并口下载线正确连接
(5)编程、下载、运行。观察结果。 实验报告内容
记录自己的动作程序的分布动作参数
49