C51单片机应用与C语言程序设计第五章 (2)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第四章单片机输入接口与机器人触觉导航深圳市鸥鹏科技有限公司黄曦2009.3.21©2008Open-Tech.Allrightsreserved.摘要•触觉导航与单片机输入接口•任务一安装并测试机器人胡须–位操作符–if语句–?操作符•任务二通过胡须导航–关系与逻辑运算符•任务三机器人进入死区后的人工智能决策•工程素质和技能归纳•科学精神的培养©2008Open-Tech.Allrightsreserved.触觉导航与单片机输入接口•工作原理:当单片机启动或复位时,所有的I/O插脚缺省为输入。也就是说,如果将胡须连接到单片机某个I/O管脚时,该管脚会自动作为输入。作为输入,如果I/O脚上的电压为5V(当胡须没有被碰到时),则其相对应的I/O口寄存器中的相应位存储1;如果电压为0V(当胡须被碰到时),则存储0。单片机根据读到的相应数据,进行分析、处理,控制机器人的运动。©2008Open-Tech.Allrightsreserved.任务一安装并测试机器人胡须•本任务是通过搭建简单电路的测试触须的作用和工作原理。要求学生能学会触须导航的硬件搭建和简单电路测试。•要准备的元器件:1、金属丝2根2、平头M3×22盘头螺钉2个3、13mm圆形立柱2个4、M3尼龙垫圈2个5、3-pin公-公接头2个6、220Ω电阻2个7、10kΩ电阻2个©2008Open-Tech.Allrightsreserved.任务一安装并测试机器人胡须•硬件安装:•拆掉连接主板到前支架的两颗螺钉•如右图所示,进行下面操作•螺钉依次穿过M3尼龙垫圈、13mm圆形立柱•螺钉穿过主板上的圆孔之后,拧进主板下面的支架中,但不要拧紧•把须状金属丝的其中一个钩在尼龙垫圈之上,另一个钩在尼龙垫圈之下,调整它们的位置使它们横向交叉但又不接触•拧紧螺钉到支架上©2008Open-Tech.Allrightsreserved.任务一安装并测试机器人胡须•搭建胡须电路:•注意:右边胡须状态信息输入是通过P1口的第4脚完成,而左边胡须状态信息输入是通过P2口的第3脚完成•确定两条胡须比较靠近,但又不接触面包板上的3-pin头。推荐保持3mm的距离。•下左图是原理电路图,下右图是实际参考接线图。©2008Open-Tech.Allrightsreserved.任务一安装并测试机器人胡须•测试胡须通过编程让单片机探测什么时候胡须被触动。由图4-3可知,连接到每个胡须电路的I/O引脚监视着10K上拉电阻上的电压变化。当胡须没有被触动,连接胡须的I/O管脚的电压是5V;当胡须被触动时,I/O短接到地,所以I/O管脚的电压是0V。•源程序:参照教材P63的TestWhiskers.c此例程是用来测试胡须功能是否正常。首先,定义了两个无参数有返回值子函数intP1_4state(void)和intP2_3state(void)来获取左右两个胡须的状态。要理解这个函数我们需要学习新的C语言知识——位操作符©2008Open-Tech.Allrightsreserved.任务一安装并测试机器人胡须•位操作符位操作符是对字节或字中的位(bit)进行测试、置位或移位处理,这里的字节或字是针对C标准的char和int数据类型而言的。位操作符不能用于实型、空类型或其他复杂类型。下表给出了位操作的位操作符。•该你了取某一位的值,上面应用的是位运算,或运算也可以达到同样的效果,想想该怎么做呢?另外,查找相关资料,思考其实几种运算符的用法。位操作符含义&与|或^与或~补右移左移©2008Open-Tech.Allrightsreserved.任务一安装并测试机器人胡须•if语句它根据给定的条件进行判断,以决定执行某个分支程序段。if语句其中之一的形式为:if(表达式)语句1;else语句2;其语义是:如果表达式的值为真,则执行语句1,否则执行语句2。©2008Open-Tech.Allrightsreserved.任务一安装并测试机器人胡须•?操作符C语言提供了一个可以代替某些“if-else”语句的简便易用的操作符“?”。该操作符是三元的,其一般形式为:表达式1?表达式2:表达式3它的执行过程如下:先求解表达式1,如果为真(非0),则求解表达式2,并把表达式2的结果作为整个条件表达式的值;如果表达式1的值为假(0),则求解表达式3,并把表达式3的值作为整个条件表达式的值。•如:return(P1&0x10)?1:0;就相当于如下条件判断语句:if(P1&0x10)return1;elsereturn0;©2008Open-Tech.Allrightsreserved.任务一安装并测试机器人胡须测试步骤:•接通教学板和伺服电机的电源•输入、保存并运行程序TestWhiskers.c•这个例程要用到调试终端,所以当程序运行时要确保串口电缆已连接好•检查图4-3,弄清楚哪条胡须是左胡须,哪条是右胡须•注意调试终端的显示值;此时显示为:“右边胡须的状态:1左边胡须的状态:1”,如下图:©2008Open-Tech.Allrightsreserved.测试步骤•把右胡须按到3-pin转接头上,注意显示为:“右边胡须的状态:0左边胡须的状态:1”,如下图:右胡须碰到©2008Open-Tech.Allrightsreserved.测试步骤•把左胡须按到3-pin转接头上,注意显示为:“右边胡须的状态:1左边胡须的状态:0”,如下图:左胡须碰到©2008Open-Tech.Allrightsreserved.测试步骤•同时把两个胡须按到各自的3-pin转接头上,显示为:“右边胡须的状态:0左边胡须的状态:0”,如下图:左右胡须均碰到©2008Open-Tech.Allrightsreserved.通过胡须导航本任务中将根据检测到的胡须是否被触动的信息对机器人进行运动导航。在机器人行走过程中,如果有胡须被触动,那就意味着碰到了什么。导航程序需要接受这些输入信息,判断它的意义,调用一系列使机器人倒退、旋转朝不同方向行走的动作子函数以避开障碍物。©2008Open-Tech.Allrightsreserved.通过胡须导航•编程使机器人基于胡须的触觉导航为了实现这些功能,需要编程机器人来做出选择,此时要用到if语句的另一种形式,if-else-if形式,它可以进行多分支选择。它的一般形式为:if(表达式1)语句1;elseif(表达式2)语句2;elseif(表达式3)语句3;……elseif(表达式n-1)语句n-1;else语句n;本代码的语义为:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序;如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。©2008Open-Tech.Allrightsreserved.任务二通过胡须导航•关系与逻辑运算符关系与逻辑运算符概念中的关键是True(真)和Flase(假)。C语言中,非0为True;0为Flase。使用关系与逻辑运算符的表达式对Flase和True分别返回值0和1。下表给出了常用的关系与逻辑运算符。运算符与逻辑运算符含义大于=大于等于小于=小于等于==等于!=不等于&&与||或!非©2008Open-Tech.Allrightsreserved.任务二通过胡须导航•例程:尝试让机器人行走,当在其路线上遇到障碍物,它将后退、旋转并转向另一个方向。•源程序:参照教材P70例程RoamingWithWhiskers.c带着胡须机器人怎样行走主程序中的语句首先检查胡须的状态。如果两个胡须都触动了即P1_4state()和P2_3state()都为0,调用Backward(),紧接着调用Left_Turn()两次;如果只是右胡须被触动即只有P1_4state()==0,程序调用Backward(),然后再调用Left_Turn();如果左胡须被触动即只有P2_3state()==0,程序调用Backward(),然后再调用Right_Turn();如果两个胡须都没有触动,在这种情况下,在else中调用Forward()语句。©2008Open-Tech.Allrightsreserved.通过胡须导航该你了–调整Left_Turn()和Right_Turn()中for循环的循环次数,增加或减少电机的转角–在空间比较狭小的地方,调整Backward()中for循环的循环次数来减少后退的距离©2008Open-Tech.Allrightsreserved.任务三机器人进入死区后的人工智能决策当机器人进入墙角时,左胡须触墙,于是它右转,向前行走,右胡须触墙,于是左转前进,又碰到左墙,再次碰到右墙……。如果不是你把它从墙角拿出来,它就会一直困在墙角里而出不来。•编程逃离墙角死区源程序:参考教材P74例程EscapingCorners.c这个程序使机器人在第四次或第五次交替探测到墙角后,完成一个“U”形的拐弯,次数依赖于哪一个胡须先被触动。©2008Open-Tech.Allrightsreserved.任务三机器人进入死区后的人工智能决策•例程EscapingCorners.c是怎样工作的int型变量counter用来存储交替探测的次数。例程中,设定的交替探测的最大值为4。int型变量old2、old3存储胡须旧的状态值。程序赋counter初值为1,当机器人卡在墙角此值累计到4时,counter复位为1。old2和old3必须赋值以至于看起来好像两根胡须的其中一根在程序开始之前被触动了。这些工作之所以必须做,是因为探测墙角的程序总是对比交替触动的部分,或者P1_4state()==0,或者P2_3state()==0。与之对应,old2和old3的值也相互不同。©2008Open-Tech.Allrightsreserved.

1 / 25
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功