宝贝车机器人实习报告西北农林科技大学_第1页
宝贝车机器人实习报告西北农林科技大学_第2页
宝贝车机器人实习报告西北农林科技大学_第3页
宝贝车机器人实习报告西北农林科技大学_第4页
宝贝车机器人实习报告西北农林科技大学_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

宝贝车机器人实习报告评阅实习任务:宝贝车机器人评阅时间:2023.7.5-2023.7.23地点:工程训练中心201一、实习目的、任务及要求1.1实习目的①通过训练,了解一个完整的、可以运动的机器人应由那几局部组成。理解每一个机器人都是根据特定要求而设计的,设计的第一步就是将使用要求分析清楚,确定设计时需要考虑的参数,包括:机器人的运动路径、定位精度,重复定位精度、任务执行参数等。②了解目前机器人的能量供应的各种形式,掌握控制局部和执行局部的供电方式。③理解机器人的运动系统的构成及其原理。④了解机器人探测周边环境的传感器有那些,掌握传感器的信号如何传送给单片机的。⑤理解机器人是如何根据传感器的信息做出决策。⑥掌握机器人如何运动,并且了解机器人运动的其它方法。⑦理解机器人与用户交换信息的各种方法。⑧通过训练,学会独立完成开发一个基于单片机控制的机电系统。⑨尽可能的在组装好的宝贝机器人上实现不同情况的开发。⑩培养团队协作和独立工作能力。1.2实习任务及要求①熟悉宝贝机器人的组成局部,组装并测试好宝贝机器人。②宝贝机器人的前进、后退单方向行走距离不小于10米,可以左转弯、右转弯,并在允许范围内可调节速度。③陈述清楚宝贝机器人如何实现运动。④掌握宝贝机器人的控制局部和运动局部的供电方式,并画出这两局部的电路示意图。⑤理清宝贝机器人的人机交互关系,陈述清楚宝贝机器人如何实现人机交互〔通过串口调试软件实现人机交互〕。⑥陈述清楚宝贝机器人有那些传感器,传感器的信息是如何传送到单片机的。⑦完成宝贝机器人的触觉导航、光敏电阻导航、红外线导航、距离检测这四个任务,并陈述清楚其原理。⑧能在实验中迅速排除各种故障。⑨鼓励创新,在完成前八个任务的前提下,尽量能做出新的开发,如果现有硬件条件不满足,可以陈述清楚创新原理。二、实习准备2.1实验设备硬件:PC机一台、AT89S52型单片机、机器人组件、ISP下载电缆、串口线、电池软件:KeiluVision4IDE集成开发环境、SL-ISP软件下载工具、串口调试软件2.2机器人的组装和软件的安装及初步应用2.2.1组装宝贝车机器人“龙人宝贝〞是由许多部件组成的一款机器人,在使用及编程控制其运动之前,首先要进行组装,步骤如下:(1)安装机器人底盘硬件零件列表:宝贝车底盘、螺柱、盘头螺钉、13/32英寸的橡胶圈将13/32英寸的橡胶套圈插到宝贝车底盘中心的孔内,确保底盘中心孔的边缘嵌在橡胶圈的凹槽中;用4个螺钉将螺柱固定在底盘上。(2)撤除伺服喉,将电机安装在底盘上零件列表:宝贝车底盘〔已局部组装好〕、连续旋转电机、螺钉3/8英寸4-40、螺母4-40用螺钉和螺母将电机固定在底盘上,为了最好性能,需从里面将电机放入底盘。由于底盘空间小,螺钉也小,所以螺丝起子不容易进去,螺钉的安装需要有一定的耐心;用标签纸表示左右电机轮。(3)安装电池盒和轮子零件列表:宝贝车底盘、平头螺钉3/8英寸4-40、螺母4-40、带有插头的电池盒、开口销、球状尾轮、橡皮圈、塑胶轮子安装电池盒比拟简单,注意的就是在将电源线和伺服电机线穿过橡胶圈的孔时,由于两条线的接头比拟大,可先将橡胶圈取出便于穿出,当线穿过之后再将橡胶圈安在底盘的空上;安装尾轮,用开口销作为轴,穿过底盘左侧、尾轮、底盘右侧的孔,将球状尾轮固定在底盘上,并将开口销的一端弯曲;安装驱动轮,只要将两个轮子有凹槽的一面压在输出轴上,并用螺钉固定即可,注意给轮子安橡胶圈时,为了便于安装将橡胶圈可裁窄一些。(4)安装教学底板零件列表:宝贝车机器人底盘、平头螺钉、带控制器的教学板连接伺服电机到教学底板上的电机接口处;将贴着“L〞的插头接到PC3端口,贴着“R〞的插头连接到PC2端口。对于新版的“龙人宝贝〞在一块底板上有两块芯片AVR和C51,我们选择了比拟熟悉的C51单片机,将贴着“L〞的插头接到P1.0端口,贴着“R〞的插头连接到P1.1端口;将主板放在四个支架上使其与四个孔对齐,确保面包板接近驱动轮而不是尾轮;用平头螺钉连接主板和支架;整理伺服电机线和电池线,放到适宜的位置。2.2.2安装软件及其初步应用本次实验需要用到3款软件:KeiluVision4IDE集成开发环境、SL-ISP下载软件、串口调试软件。以安装KeiluVision4为例简述安装步骤:执行KeiluVision4安装程序,选择EvalVersion版进行安装;在后续出现的窗口中全部选择Next按钮,将程序默认安装在C:\ProgramFiles\Keil;将光盘“头文件〞文件夹的文件复制到C:\ProgramFiles\Keil\C51\INC文件夹里〔注意一定要是C51文件夹里的头文件,否那么在创立程序时就会出现失败〕。其他软件安装类似。在软件安装好以后,应有串口的连接和ISP下载线的连接,以实现编程和交互。KeiluVision4软件的使用:启动KeiluVision4ProjectNewProject在文件名中输入“001〞,保存在想保存的位置选择AT89S52,确定选择不加载“否〞单击新建按钮,将编号的程序写入保存001.c在工程文件夹在目标工程工程中,右键“SourceGroup1〞单击AddFilestoGroupSourceGroup1Add右键Target1选择Optionfortarget‘Target1’单击output,选择CreateHEXFi:确定运行,没有错误即创立成功文件名为001.hex,这个文件就是将来可以烧录到C51单片机中的可执行程序。ISP的使用:选择下载软件,本书使用并口LPT1,选择下载速度为TURBO模式,下载速度最快,单片机型号选择AT89S52。单击Flash按钮,选择要下载的可执行hex文件----001.hex,选择后单击编程开始下载,如果是第二次下载程序,先选中擦除复选框。此软件是指用户把已编译好的程序代码通过一条“下载线〞直接写入到器件的编程〔烧录〕方法已经编程的器件也可以用ISP方式擦除或再编程。串口调试软件的使用:翻开串口调试终端,选择COM1后单击“翻开串口〞,在程序运行时,在接收区就会看到单片机向PC发出的信息。此软件用来显示单片机与计算机的交互信息,在硬件上要有串行接口或USB接口来与单片机教学板的串口连接。三、实习任务3.1伺服电机的控制3.1.1单片机的输出测试在做实验之前,先了解一下具有彩色环带的电阻阻值如何确定,可以用欧姆表来测量比拟简单,再没有欧姆表的条件下,可以通过如下方法识别:首先不同颜色的含义为黑0棕1红2橙3黄4绿5蓝6紫7灰8白9,及金银无色的含义,然后是环带的个数的含义,这里只针对五环电阻,前三位代表数值,第四环代表倍率乘数,第五环是容差,例如五环电阻为红黄白银棕,银代表的倍率为1/100,棕代表容差为1%,故为249×1/100=2.49欧,±1%,利用这种方法可以一一分辨出所给电阻的阻值。单片机的输出测试是通过控制单灯闪烁实现的根据图1搭建LED电路:图1通过编程控制单灯闪烁、两灯同时闪烁和两灯交替闪烁,以及其闪烁的时间,只要让两个LED灯分别接到P1_0和P1_1,电路连接方式相同,通过对P1_0和P1_1赋值,并改变delay_nms(time)即可实现以上各种控制,例如两灯交替闪烁,间隔时间为1s,程序如下:#include<BoeBot.h>//头文件#include<uart.h>//头文件intmain(void){uart_Init();//初始化串口printf("TheLEDconnectedtoP1_0isblinking!\n");//通过串口调试软件while(1){P1_0=1;//P1_0输出高电平P1_1=0;//P1_1输出低电平delay_nms(500);//延时500msP1_0=0;//P1_0输出低电平P1_1=1;//P1_1输出高电平delay_nms(500);}//延时500ms3.1.2伺服电机的标定在测试控制伺服电机转速的信号之前,一定要对伺服电机标定〔调零〕,其程序如下:对右轮标定#include<BoeBot.h>#include<uart.h>intmain(void){uart_Init();//初始化串口printf("TheLEDconnectedtoP1_0isblinking!\n");while(1){P1_0=1;//P1_0输出高电平delay_nus(1500);//延时1.5msP1_0=0;//P1_0输出低电平delay_nms(20);//延时20ms}}此程序使左轮静止不动,如果左轮缓慢动,应用起子对其调整,具体步骤:将教学底板上的三位开关扳到2,调整底盘下边伺服电机的调零螺钉,调整时要缓慢,直到标定的轮子静止不动。对左轮标定#include<BoeBot.h>#include<uart.h>intmain(void){uart_Init();//初始化串口printf("TheLEDconnectedtoP1_0isblinking!\n");while(1){P1_1=1;//P1_1输出高电平delay_nus(1500);//延时1.5msP1_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来发出伺服电机的控制信号,控制信号通过控制线来控制左右伺服电机的转动,从而实现机器人以不同的速度及方向运动。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触须电路原理图电路原理:由原理图可知,每条胡须都是一个常开开关。连接到每个胡须电路的I/O引脚监视着10k上拉电阻上的电压变化。当胡须没有被触动时,连接胡须的I/O管脚的电压是5V,当胡须被触动,I/O短接到地,所以I/O管脚的电压是0V。单片机可以读入相应的数据,进行分析、处理、控制机器人运动。在进行胡须测试之前需将串口电缆连接好,需用到调试终端以显示左右胡须状态,调用相关程序进行测试。3.3.2胡须导航两个胡须状态有三种,需分情况讨论,需用到if语句。程序中应用的子程序〔Ox代表十六进制数〕:获取P1_3的状态,即左胡须intP1_3state(void){return(P1&0x08)?1:0;}获取P1_2的状态,即右胡须intP1_2state(void){return(P2&0x04)?1:0;}向前子程序voidForward(void)左转子程序voidLeft_Turn(void)右转子程序voidRight_Turn(void)后退子程序voidBackward(void)循迹左转voidLeft_Turnsmall(void)循迹右转voidRight_Turnsmall(void)左拐180度voidLeft_Turn180(void)右拐180度voidRight_Turn180(void)小幅度左拐voidLeft_Turn111(void)小幅度右拐voidRight_Turn111(void)停车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〔〕;实现向后并向左转。函数调用的过程中其实是通过连接在单片机引脚上的两个伺服电机控制线,向伺服电机发送不同的脉冲序列,从而实现电机的不同运动。3.4红外线导航清单列表:两个红外探测器、两个IRLED、四个470欧电阻、两个9013三极管3.4.1红外导航电路图及其工作原理按照图6建立电路图:图6电路工作原理:在连接三极管时注意三极管的管脚分别属于什么极,由电路可以看出,三极管相当于一个开关:当P1_3(P3_6)置高时,从集电区到基区到发射区电路导通,加载在IRLED上的电压为VCC,IRLED向外发射红外线,当P1_3(P3_6)置低时,电路又断开,IRLED停止发射。探测器只能接收频率为38.5kHz的红外信号,当没有红外信号返回时,探测器的输出状态为高,当它检测到被物体反射的38.5kHz的红外信号时,它的输出为低。探测器的输出作为单片机引脚的输入,根据单片机两个引脚不同的输入,通过伺服电机控制线分别向伺服电机发送不同的脉冲序列,从而控制伺服电机的不同运动。发送完信号后立即将IR探测器的输出存储到变量中,这些存储的值会显示在调试终端或被机器人用来导航。3.4.2探测和避开障碍物红外探测与触须的输出非常相像,没有检测到物体时,输出为高,检测到物体时,输出为低。根据左右探测器接收到红外线的情况可以分情况讨论其运动形式。注意:为了使IRLED发射红外线的频率更精确,可采用空函数_nop_(void),它能延迟1us,减少了由于调用延时函数产生的延时。程序中应用到的子程序:IRLED发射红外线子程序IRLaunch〔‘L’〕;左边发射IRLaunch〔‘R’〕;右边发射向前行走子程序Forward(void);左转子程序Left_Turn(void);右转子程序Right_Turn(void);后退子程序Backward(void);红外探测程序流程图如下:图7说明:通过调用IRLED红外发射器和探测器子程序翻开发射器和探测器,在机器人运动过程中,当两个探测器同时探测到障碍物时,通过给伺服电机发送相应的脉冲,使机器人后退并转180度;当左边探测器检测到障碍物时,通过给伺服电机发送右转的脉冲,使其向右转;当机器人右边探测器检测到障碍物时,通过给伺服电机发送向左的脉冲,使其左转。即可实现红外线导航。3.5光敏电阻导航3.5.1光敏电阻工作原理光敏电阻又称光导管,它几乎都是用半导体材料制成的光电器件。光敏电阻没有极性,纯粹是一个电阻器件,使用时既可加直流电压,也可以加交流电压。无光照时,光敏电阻值〔暗电阻〕很大,电路中电流〔暗电流〕很小。当光敏电阻受到一定波长范围的光照时,它的阻值〔亮电阻〕急剧减少,电路中电流迅速增大。一般希望暗电阻越大越好,亮电阻越小越好,此时光敏电阻的灵敏度高。3.5.2光敏电阻应用导航基于光敏电阻的工作原理,可以将其应用于机器人的导航,如下电路图:分压电路如图8:R为光敏电阻,光敏电阻在受到光照时,电阻会减小,那么R上的分压减小,V0增大,当大于1.5V时为高电平;当没有光照时,光敏电阻阻值很大,R上分压也大,V0减小,当小于1.5V时为低电平。光检测电路如图9:P1_5、P2_3为与光敏电阻连接的引脚,当在空白有光处,光敏电阻阻值很小,与之所连接的引脚为高电平;当遇到阴影处,光敏电阻阻值很大,与之连接的引脚为低电平。根据引脚的上下电平可以避开阴影区从而实现光敏电阻导航。图8图9心得:实际应用时光敏电阻距离路线图距离需要反复调节到达最优距离,使检测更精确,因为有时候程序是完全正确的,可能会因为检测信号的不稳定使小车不能完成预定任务。四、机器人走迷宫4.1硬件准备在走迷宫之前首先应该确定四个传感器OUT1、OUT2、OUT3、OUT4与P1_4、P1_5、P1_6、P1_7引脚如何对应,最终选择四个传感器OUT1、OUT2、OUT3、OUT4分别对应C51单片机的P1口的4、5、6、7位。这样选的原因:因为从左到右的四个传感器正好对应P1口由低到高的四个位,便于识别,调试程序方便。4.2校园游迷宫4.2.1原理此次实验的最终结果是完成机器人成功走出预设的迷宫,迷宫中有许多路口:T字路口、十字路口、直角,还设有许多障碍物,这需要机器人能够识别路径,避开障碍物,完成左转、右转、前进、后退,并能成功回到起点。这需要编程实现控制,使机器人始终沿着黑色路成功完成任务。具体如下:1、宝贝车的底盘前下方安装四个红外传感,有发射器和探测器,通过从地表反射回来的红外线探测路况,当传感器下方是白色时,红外线反射给探测器,那么与此探测器连接的引脚输出为低电平0;当传感器下方是黑色时,红外线被吸收,探测器接收不到红外光,那么于此探测器连接的引脚输出为高电平1。通过编程实现机器人沿着黑色胶带路运动,而不会跑到外边。2、让机器人避开障碍物,采用触须导航即可实现,将触须导航电路连接,设置程序使之成功避开。4.2.2程序分析迷宫程序中所用到的子程序:右触须状态检测子程序intP1_2state(void){return(P1&0x04)?1:0;}左触须状态检测子程序intP1_3state(void){return(P1&0x08)?1:0;}机器人底盘下边的四个探测器的状态检测intP1_4state(void)//p1_4-P1_7四个传感器{ return(P1&0x10)?1:0;}intP1_5state(void){ return(P1&0x20)?1:0;}intP1_6state(void){ return(P1&0x40)?1:0;}intP1_7state(void){ return(P1&0x80)?1:0;}前进voidForward(void)小左拐voidLeft_Turn111(void)小右拐voidRight_Turn111(void)左拐180度voidLeft_Turn180(void)右拐180度voidRight_Turn180(void)小向前子程序〔脉冲为2〕Forward_small(ints)注:通过改变s变量的值,可以实现不同向前距离的改变。双轮左转弯90度Left_Turn(void)循迹左转Left_Turnsmall(void)双轮右转90度Right_Turn(void)循迹右转Right_Turnsmall(void)后退子程序Backward(void) 停止子程序Stop_car(void)碰到十字路口选择转向子程序Choice(void)迷宫程序流程图10:图10说明:为了流程图能看的清楚,判断语句以0或1表示,其中从左到右对应的单片机的引脚依次为P1_4P1_5P1_6P1_7,分别从左到右对应小车的4个传感器。例如:0000表示全白;1000表示左边一个传感器感应到黑色,向右依次为白色;1110表示从左边前3个传感器感应到黑色,右边一个为白色等等。“校园游〞完整程序如下:#include<uart.h>#include<Boebot.h>intP1_2state(void)//右触须{ return(P1&0x04)?1:0;}intP1_3state(void)//左触须{ return(P1&0x08)?1:0;}intP1_4state(void)//p1_4-P1_7四个传感器{ return(P1&0x10)?1:0;}intP1_5state(void){ return(P1&0x20)?1:0;}intP1_6state(void){ return(P1&0x40)?1:0;}intP1_7state(void){ return(P1&0x80)?1:0;}voidForward(void) //前进{P1_1=1; delay_nus(1700);P1_1=0; P1_0=1; delay_nus(1300); P1_0=0; delay_nms(20);}voidForward_small(ints) //小前进{ inti; for(i=1;i<=s;i++) {P1_1=1; delay_nus(1600);P1_1=0; P1_0=1; delay_nus(1400); P1_0=0; delay_nms(20); }}voidBackward(intb) //后退{inti;for(i=1;i<=b;i++) { P1_0=1; delay_nus(1600);P1_0=0; P1_1=1; delay_nus(1400); P1_1=0; delay_nms(20); }}voidLeft_Turn111(void) //小幅度左拐90{inti;for(i=1;i<=2;i++) { P1_1=1; delay_nus(1400);P1_1=0; P1_0=1; delay_nus(1400); P1_0=0; delay_nms(20); }}voidRight_Turn111(void) //小幅度右拐90{inti; for(i=1;i<=2;i++) { P1_1=1; delay_nus(1600);P1_1=0; P1_0=1; delay_nus(1600); P1_0=0; delay_nms(20); }}voidLeft_Turn(void) //左拐90{inti;for(i=1;i<=28;i++) { P1_1=1; delay_nus(1400);P1_1=0; P1_0=1; delay_nus(1400); P1_0=0; delay_nms(20); }}voidRight_Turn(void) //右拐90{inti; for(i=1;i<=28;i++) { P1_1=1; delay_nus(1600);P1_1=0; P1_0=1; delay_nus(1600); P1_0=0; delay_nms(20); }}voidLeft_Turnsmall(void) //循迹左转{ P1_0=1; delay_nus(1400);P1_0=0; P1_1=1; delay_nus(1400); P1_1=0; delay_nms(20);}voidRight_Turnsmall(void) //循迹右转{ P1_0=1; delay_nus(1600); P1_0=0; P1_1=1; delay_nus(1600); P1_1=0; delay_nms(20);}voidLeft_Turn180(void) //左拐180{inti;for(i=1;i<=56;i++) { P1_0=1; delay_nus(1400);P1_0=0; P1_1=1; delay_nus(1400); P1_1=0; delay_nms(20); }}voidRight_Turn180(void) //右拐180{inti;for(i=1;i<=56;i++) { P1_0=1; delay_nus(1600);P1_0=0; P1_1=1; delay_nus(1600); P1_1=0; delay_nms(20); }}voidStop_car(void) //停车一段时间{ inti; for(i=1;i<=80;i++) { P1_0=1; delay_nus(1500); P1_0=0; P1_1=1; delay_nus(1500); P1_1=0; delay_nms(20); }}intmain(void){ inta=0;//景点计数 uart_Init(); while(1) { if((P1_2state()==0)&&(P1_3state()==0)) //触须碰到调头 { a=a+1; Backward(10); Left_Turn180(); //左转180可修改 Backward(7); } elseif(P1_3state()==0) { a=a+1; Backward(10); Left_Turn180(); //左转180可修改 Backward(7); } elseif(P1_2state()==0) { a=a+1; Backward(10); Right_Turn180(); //右转180可修改 Backward(7); } elseif((P1_5state()==1)&&(P1_6state()==0)) { Left_Turnsmall();//0100左循迹 } elseif((P1_5state()==0)&&(P1_6state()==1)) { Right_Turnsmall(); //0010右循迹 } elseif((P1_4state()==1)&&(P1_5state()==0)&&(P1_6state()==0)&&(P1_7state()==0)) { Left_Turnsmall();//1000左循迹 } elseif((P1_4state()==0)&&(P1_5state()==0)&&(P1_6state()==0)&&(P1_7state()==1)) { Right_Turnsmall();//0001右循迹 } elseif((P1_4state()==1)&&(P1_5state()==1)&&(P1_6state()==0)&&(P1_7state()==0)) { Left_Turnsmall();//1100左循迹 } elseif((P1_4state()==0)&&(P1_5state()==0)&&(P1_6state()==1)&&(P1_7state()==1)) { Right_Turnsmall();//0011右循迹 } elseif((P1_4state()==1)&&(P1_5state()==1)&&(P1_6state()==1)&&(P1_7state()==1)) { if((a==5)||(a==9)) //两处直走的地方!!! { Forward_small(22); //直走 Forward(); } elseif(a==6) {a=7; //左转90可修改 Forward_small(15); Left_Turn(); } elseif(a==7) { //右转90,到最上边的景点!!!! Forward_small(15); Right_Turn(); } elseif(a==10) {a=11; //左转90可修改 Forward_small(15); Left_Turn(); } elseif(a==11) { //左转90可修改 Forward_small(15); Left_Turn(); } elseif(a==12) {a=13; Forward_small(22); //直走 Forward(); } elseif(a==13) { Forward_small(15); //左转90可修改 Left_Turn(); } elseif(a==18) { Forward_small(15); //左转90可修改 Left_Turn(); } else { Forward_small(15); //右转90可修改 Right_Turn(); } } elseif((P1_4state()==1)&&(P1_5state()==1)&&(P1_6state()==1)&&(P1_7state()==0)) { Left_Turn111(); Forward_small(4); if((P1_4state()==1)&&(P1_5state()==1)&&(P1_6state()==1)&&(P1_7state()==0)) {Forward_small(13); Left_Turn(); }//1110左转90度可修改 else { Forward(); } } elseif((P1_4state()==0)&&(P1_5state()==1)&&(P1_6state()==1)&&(P1_7state()==1)) { Right_Turn111(); Forward_small(4); if((P1_4state()==0)&&(P1_5state()==1)&&(P1_6state()==1)&&(P1_7state()==1)) {Forward_small(13); Right_Turn();} //0111右转90度可修改 else {Forward();} } elseif((P1_4state()==1)&&(P1_5state()==0)&&(P1_6state()==0)&&(P1_7state()==1)) { Left_Turn180(); //左转180可修改 Backward(30); Stop_car();//1001停车 }else { Forward(); } }} 注:这个程序没有用到数组,只是对景点计数。迷宫示意图如图11:图114.3指定三点编程 指定三点:如图11,指定三点5〔右〕、15、17。 完成这个任务采用数组,且检测到0111、1110、1111全部计数,即全部采用Choice()子函数。程序如下〔前面相同的子函数已省略〕:#include<uart.h>#include<Boebot.h>charNavigation[60]={'R','L','F','F','R','F','F','L','R','L','R','F','L','L','R'};intaddress=0;……voidChoice(void){if(Navigation[address]!='Q') { switch(Navigation[address]) { case'F':Forward_small(22);break; case'L':Forward_small(15);Left_Turn();break; case'R':Forward_small(15);Right_Turn();break; } address++; }}intmain(void){ uart_Init(); while(1) { if((P1_2state()==0)&&(P1_3state()==0)) //触须碰到调头 { Backward(10); Left_Turn180(); //左转180可修改 Backward(7); } elseif(P1_3state()==0) { Backward(10); Left_Turn180(); //左转180可修改 Backward(7); } elseif(P1_2state()==0) { Backward(10); Right_Turn180(); //右转180可修改 Backward(7); } elseif((P1_5state()==1)&&(P1_6state()==0)) { Left_Turnsmall();//0100左循迹 } elseif((P1_5state()==0)&&(P1_6state()==1)) { Right_Turnsmall(); //0010右循迹 } elseif((P1_4state()==1)&&(P1_5state()==0)&&(P1_6s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论