1、移动机器人基础培训,第一节 微控制器(MCU)基础,任务1,让LED按照规定的时序闪亮,完成任务的步骤,明确任务 分析任务 构思解决方案 安装硬件 编写程序 下载、运行、测试 总结与讨论,一、明确任务,LED,Light Emitting Diode 发光二极管 A 阳极 (比较长的那根管脚) K 阴极 (比较短的那根管脚) 下面的电路可以使LED发光,A,K,470欧姆,5伏,470,5V,接地 电势零点,二、分析任务,本任务要求LED按照如下的时序图闪亮实际上是要求Va按照如下的时序变化,470,Va,三、构思解决方案,解决方案,Micro Control Unit 微控制器 Input-
2、Output Port 输入输出端口 MCU能按顺序执行命令(程序)让I/O口按照规定的时序输出电压。,470,接地 Vss,I/O口,电源,MCU,开关,程序,让指定的I/O口输出5V电压 延时1秒 让I/O口输出0V电压 延时1秒 让I/O口输出5V电压 延时2秒 让I/O口输出0V 结束,四、安装硬件,教学底板,Basic Stamp 2 MCU,电池盒,电池,Pin 1: SOUT在编程或者调试(DEBUG)时传送串口数据,Pin 2: SIN在编程时接收串口数据,Pin 3: ATN连接到串口DTR(数据终端准备)信号线 通知可以给Stamps编程了,Pin 4: VSS信号地 (0
3、V).,P0,P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12,P13,P14,P15,Pin 21: VDD整定的5V输入脚,Pin 22: RES复位脚- 低电平复位,Pin 23: VSS电源地 (0V),Pin 24: VIN 直流电源输入(5.5-15V),Basic Stamp 2 MCU,教学底板,面包板,电机连接插座,5V 稳压器,外接电源插口,串行接口,三位开关,复位开关,电源指示灯,I/O插座,电源和接地插座,安装硬件 1、把Basic Stamp 2 插入教学底板上的24脚插座上,注意BS2上的白色标志点与插座上的缺口相对应。,白色标志点,缺口
4、,安装硬件 2、确认教学底板上的电源开关处在关闭位置(0),连接电源。,电源开关,安装硬件 3、安装LED电路。 (1)LED阴极连接到电源和接地插座上的Vss插孔; (2)LED阳极连接到面包板; (3)找出一只470电阻,电阻上的色环为黄-紫-黑-黑(五环)或黄-紫-棕(四环) (4)电阻的一端接到与LED阳极相通的面包板插孔,另一端连接到I/O插头上的P15插孔。,470,P15,Vss,普通电阻用四个色环表示其阻值和允许的偏差。第一、二环表示有效数字,第三个环表示倍率(乘数),与前三个环距离较大的第四环表示精度。 精密电阻采用五个色环表示。第一、二、三环表示有效数字,第四个环表示倍率(
5、乘数),与前四个环距离较大的第五环表示精度。,颜色 有效数字 被率(乘数) 黑 0 100 棕 1 101 红 2 102 橙 3 103 黄 4 104 绿 5 105 蓝 6 106 紫 7 107 灰 8 108 白 9 109,安装硬件 4、连接计算机,串口线一端连接到教学底板上的串行接口,另一端连接到PC机上的COM口插座。,安装硬件 5、检查 、测试硬件连接。 (1)检查电源连接。打开教学底板上的电源开关(1),电源指示灯应点亮。 (2)检查与PC机之间的通讯。,打开Basic Stamp 编辑器 第一次打开编辑器时,编辑器会询问几个问题,只需点击按钮 使用菜单选项RunIdent
6、ify 或者直接点击按钮,口连接确认框应当如下图所示: 如果四个栏目中有任何一个的显示内容与上图不同,都说明连接有问题,需要检查连接。,五、编写程序,编写PBasic程序,让第15号I/O口输出5V电压 延时1秒 让第15号I/O口输出0V电压 延时1秒 让第15号I/O口输出5V电压 延时2秒 让第15号I/O口输出0V 结束,HIGH 15 PAUSE 1000 LOW 15 PAUSE 1000 HIGH 15 PAUSE 2000 LOW 15 END,把程序键入到编辑器,添加必要的说明语句, $STAMP BS2 $PBASIC 2.5 HIGH 15 PAUSE 1000 LOW
7、15 PAUSE 1000 HIGH 15 PAUSE 2000 LOW 15 END,保存到你自己的文件夹,文件名:Task1.bs2 文件夹:,六、下载运行测试,下载运行,脱机运行,关闭教学底板的电源 断开串口线 重新打开教学底板电源、按一下复位键 观察LED的亮灭,检查是否完成预定任务。 关闭教学底板的电源(任何一个试验完成后),电源开关,复位开关,七、总结与讨论,完成工程任务的顺序,明确任务 分析任务 构思解决方案 安装硬件 编写程序 下载、运行、测试 总结与讨论,讨论,在上述过程中,PC机和BASIC Stamp软件的作用是什么? A)控制MCU执行程序,按照时序输出5V或0V电压。
8、 B)提供一个编写程序的平台,并把程序翻译成MCU能执行的代码下载给MCU,由MCU独立运行。,X,编译环境,讨论,什么是程序?,让第15号I/O口输出5V电压 延时1秒 让第15号I/O口输出0V电压延时1秒让第15号I/O口输出5V电压延时2秒让第15号I/O口输出0V结束,程序是一系列按照一定顺序执行的命令。,讨论,什么是PBasic程序? 用PBasic语言书写的程序。 怎么看懂和编写PBasic程序? 记住常用语句和语法; 使用帮助。, $STAMP BS2 $PBASIC 2.5 HIGH 15 PAUSE 1000 LOW 15 PAUSE 1000 HIGH 15 PAUSE
9、2000 LOW 15 END,帮助按钮,Syntax: PAUSE Duration Function Pause the program (do nothing) for the specified Duration. Duration is a variable/constant/expression* (0 - 65535) that specifies the duration of the pause. The unit of time for Duration is one millisecond.,Explanation PAUSE delays the execution o
10、f the next program instruction for the specified number of milliseconds. For example: Flash: LOW 0 PAUSE 100 HIGH 0 PAUSE 100 GOTO Flash This code causes pin 0 to go low for 100 ms, then high for 100 ms.,任务2,让LED按照规定的时序循环闪亮,重复10次,明确任务 分析任务 这个任务与任务1类似,可以在任务1的基础上通过修改程序完成。 构思解决方案 硬件与任务1相同 编写程序,重复执行下列命令
11、10次:让第15号I/O口输出5V电压延时1秒让第15号I/O口输出0V电压延时1秒让第15号I/O口输出5V电压延时2秒让第15号I/O口输出0V延时1秒让第15号I/O口输出5V延时3秒让第15号I/O口输出0V延时1秒 结束,设置重复次数为10; 当重复次数大于0时重复执行下列命令:让第15号I/O口输出5V电压延时1秒让第15号I/O口输出0V电压延时1秒让第15号I/O口输出5V电压延时2秒让第15号I/O口输出0V延时1秒让第15号I/O口输出5V延时3秒让第15号I/O口输出0V延时1秒重复次数减少1次 结束,RepeatNum=10; DO WHILE (RepeatNum0)
12、 HIGH 15PAUSE 1000LOW 15PAUSE 1000HIGH 15PAUSE 2000LOW 15PAUSE 1000HIGH 15 PAUSE 3000LOW 15PAUSE 1000 RepeatNum= RepeatNum-1 LOOP END,RepeatNum=10; DO WHILE (RepeatNum0) HIGH 15PAUSE 1000LOW 15PAUSE 1000HIGH 15PAUSE 2000LOW 15PAUSE 1000HIGH 15 PAUSE 3000LOW 15PAUSE 1000 RepeatNum= RepeatNum-1 LOOP E
13、ND,变量 Variable,一个变量是程序中一个保存数据的地方,对应MCU中一个存储数据的地方,由编辑器负责安排; 每个变量都有自己的名字,我们要在程序的前面声明这个变量,也就是告诉编辑器我们的程序要使用这样一个变量;,变量的类型,每个变量都在MCU中占用一个存储数据的空间,空间的大小是用bit(比特)或者byte(字节)为单位的。 1 byte=8 bit。 Basic Stamp 2 内共有32个字节的存储空间,其中只有28个字节可以供我们的程序使用。为了节约存储空间,我们要根据变量的取值范围告诉编译器这个变量需要多大的空间,即声明变量的类型。 PBASIC语言把变量分为以下4种基本类型
14、:Bit 可以用来存储0或者1 占用1bitNib 可以用来存储0到15 占用4bitByte可以用来存储0到255 占用8bitWord 可以用来存储0-65535 占用16bit 声明变量的语法:变量名 VAR 变量类型RepeatNum VAR Nib, $STAMP BS2 $PBASIC 2.5 RepeatNum VAR Nib RepeatNum=10 DO WHILE (RepeatNum0) HIGH 15PAUSE 1000LOW 15PAUSE 1000HIGH 15PAUSE 2000LOW 15PAUSE 1000HIGH 15 PAUSE 3000LOW 15PAU
15、SE 1000 RepeatNum= RepeatNum-1 LOOP END,键入程序 保存到task2.bs2 下载运行 测试结果,改进方案,控制循环的其他方法, $STAMP BS2 $PBASIC 2.5 RepeatNum VAR Nib FOR RepeatNum=1 TO 10HIGH 15PAUSE 1000LOW 15PAUSE 1000HIGH 15PAUSE 2000LOW 15PAUSE 1000HIGH 15 PAUSE 3000LOW 15PAUSE 1000 NEXT END,改进方案,添加常数, $STAMP BS2 $PBASIC 2.5 RepeatNum
16、VAR Nib TimeUnit CON 1000 FOR RepeatNum=1 TO 10HIGH 15PAUSE TimeUnitLOW 15PAUSE TimeUnitHIGH 15PAUSE 2*TimeUnit LOW 15PAUSE TimeUnitHIGH 15 PAUSE 3*TimeUnitLOW 15PAUSE TimeUnit NEXT END,改进方案,添加注释, Task2 by Fei Yuenong $STAMP BS2 $PBASIC 2.5 RepeatNum VAR Nib Number of repeat i VAR Nib FOR RepeatNum=
17、1 TO 10FOR i=1 TO 3HIGH 15 Make P15 output 5V PAUSE i*1000 Wait for i second(s) LOW 15PAUSE 1000NEXT NEXT END,调试方法,通过调试终端了解程序的运行状态 DEBUG, Task2 by Fei Yuenong $STAMP BS2 $PBASIC 2.5 TimeUnit CON 1000 RepeatNum VAR Nib Number of repeat i VAR Nib FOR RepeatNum=1 TO 10DEBUG “RepeatNum=”,DEC RepeatNum,
18、CRFOR i=1 TO 3HIGH 15 Make P15 output 5V PAUSE i* TimeUnit Wait for i TimeUnit(s) LOW 15PAUSE TimeUnitNEXT NEXT END,总结与讨论,DO WHILE( )LOOP变量 常量,FOR NEXTDEBUG,练习1,让程序在完成第n次重复的时候在调试终端上显示“Repeat n completed.” 提示:已经完成第n次重复的时候,练习2,让LED按照规定的时序循环闪亮,重复无限次,提示:用DO LOOP,下课前将实验设备整理好,关闭计算机 断开串口线 断开教学底板的电源线 机器人套件的
19、各个零部件放入实验箱 已经安装好的部分可以不拆开,移动机器人基础培训,第二节 机器人组装,任务3,组装机器人,用装配图记录组装过程,写装配说明书。,一 明确任务,组装机器人 记录组装过程,二 分析任务,观察已组装好的机器人的实物照片 了解机器人结构,将组装过程划分成几个步骤 用装配说明书记录组装过程,三 方案,一、安装机器人底盘 二、拆除伺服喉 三、安装电机 四、安装轮子&电池盒 五、安装电路板,按照安装步骤安装,并记录安装过程:,步骤一、安装机器人底盘,找零件、工具 安装 记录安装过程,装配说明书,为什么要画这个说明书 说明书需要体现哪些信息 这些信息如何体现在说明书上一些细节如何处理,装配
20、说明书,图形 零件列表 工具列表 安装步骤说明,步骤二、拆除伺服喉,找零件&工具 安装 记录安装过程,装配说明书,图形 零件列表 工具列表 安装步骤说明,步骤三、安装电机, ,装配说明书,这个图有什么问题?,步骤四、安装轮子&电池盒, ,装配说明书,缺少的内容自己补齐,步骤五、安装电路板, ,装配说明书,缺少的内容自己补齐,移动机器人基础培训,第三节 电机控制,任务4,设计制作一个双轮独立驱动的机器人,具备以下功能: 直线前进一个给定的距离 直线后退一个给定的距离 原地向右转90度 原地向左转90度,明确任务,双轮独立驱动的机器人 结构特点 运动方式,分析任务,机器人套件提供了必要的机械结构件
21、、电动机和MCU,本任务可以分解为以下2个子任务: 1)控制电动机的速度和方向 2)调试机器人,子任务1 控制电动机的速度和方向,任务分析,伺服电动机Parallax Servo,伺服电动机Parallax Servo的内部结构 电动机 减速箱 驱动器 控制器,教学底板的右上角(面包板上方)提供了伺服电动机的接口,控制信号的作用:,1.3 ms的控制脉冲序列使电机顺时针全速旋转,转速约为60RPM 1.5 ms的控制脉冲序列使电机转速为零,可用调零电位器调零 1.7ms的控制脉冲序列使电机逆时针全速旋转,转速约为60RPM,1.5 ms的控制脉冲序列使电机转速为零,可用调零电位器调零,子任务1
22、 “控制电机的速度和方向” 转化为让MCU输出一串具有给定宽度的脉冲。 PULSOUT Pin, Duration Pin is a variable/constant/expression (0 - 15) that specifies the I/O pin to use. Duration is a variable/constant/expression (0 - 65535) that specifies the duration of the pulse. The unit of time for Duration is 2 s.,试验验证,目的:验证上述电动机的控制方法 试验方法
23、:一、先调零调节参数在750左右,使得电机速度为零二、让接在P12上的电动机连续顺时针全 速转动三、让接在P13上的电动机连续逆时针全速转动,试验步骤: 编写并保存程序DO LOOP 把一个电动机连接到教学底板上的伺服电机插座 (X5-12或13),注意电机连接线的颜色与插座上标出的颜色一致 把教学底板上的电源开关拨到2的位置 下载运行程序,观察并记录电机的转动情况 改变程序的脉冲时间参数,观察并记录电机的转动情况,$STAMP BS2 $PBASIC 2.5pulseWidth VAR WordDEBUG “Enter pulse width: ” DEBUGIN DEC pulseWidt
24、hDOPULSOUT 12, pulseWidthPAUSE 20LOOP END,电机调零,调节参数在750左右,使得电机速度为零 若脉冲参数在750左右时电机速度不为零,需要用螺丝刀调节电机上的调零旋钮。,试验验证,试验记录:试验结论,实验一 测定左右电机的传输曲线,实验目的:测定电机转速与脉冲参数之间的关系 实验方法:让电机以不同的脉冲参数运行,测量并记录转过的圈数,计算转速。 实验步骤: 分别记录左右电机的转动圈数 实验总结:用图表说明脉冲参数与电机转速的关系,常用的绘图软件,Excel Matlab Origin Powerpoint,问题1 找不到硬件:,USB连线问题。一般应该连
25、接到电脑后面的接口 电池的电压不够,更换电池 没开电源 电源盒里没有电池 电路板问题,需更换电路板,问题2 电机测试程序出错,变量名前后不一致 程序中没有pause 20语句,会导致电机工作不正常,运行时间短 Pulsout 语句后面没写逗号,如:pulsout 12 pulsewidth 版本号写错 Debugin 写错 Debug 后面没有双引号(半角),问题3 电机问题,参数750时没有办法调零,需更换电机 任何参数下电机都不转,两种可能,一电机的电源线断,换电机;另一种可能为P12或P13端口异常,需要换P14或P15试一试 任何参数下,转速基本不变,电机里面的齿轮箱损坏,更换电机,子
26、任务2 调试机器人,设计制作一个双轮独立驱动的机器人,具备以下功能: 直线前进一个给定的距离 直线后退一个给定的距离 向右转 向左转,分析任务,加上轮子,电机的转动转换成车子的运动。 确定速度与脉冲参数之间的关系 控制运行的时间,改变车速 左转 、右转(转弯半径),车头视图,D:My DocumentsMy D:My DocumentsMy PicturesDSC_0022.JPGPictures卫生间.jpg,D:My DocumentsMy Pictures卫生间.jpg,车尾视图,右侧视图,顺,逆,车子的运动方向,左轮电极接12,右轮电极接13 为了统一、方便,逆,顺,顺,逆,车子直行,
27、保证左右轮同速,否则走不直 根据左右轮关系,左右轮对应的脉冲关系:左轮脉冲 = 1500 - 右轮脉冲,实验二 测定车子速度,实验目的:测定车子速度与脉冲参数之间的关系 实验方法:让电机以不同的参数运行一段时间,测量并记录,计算车子速度。 实验步骤: 调零 编写程序,让左右电机各转动6秒钟 分别记录车子前进或后退的距离,填写实验记录 实验总结:用图表说明脉冲参数与车子速度的关系,电机转动时间,实验方法:让电机运行一段时间 6s FOR COUNT=1 TO 244PULSOUT 12, 850 1.7ms PULSOUT 13, 650 1.3ms PAUSE 20 20ms 代码执行时间 1
28、.6ms NEXT,$STAMP BS2 $PBASIC 2.5 counter VAR Word pulseWidth VAR Word pulseWidthComp VAR WordDEBUG “Enter pulse width: “DEBUGIN DEC pulseWidthpulseWidthComp=1500-pulseWidthFOR counter=1 TO 244PULSOUT 12, pulseWidthPULSOUT 13, pulseWidthCompPAUSE 20NEXT,练习1、让机器人直线前行30cm,确定直线前进的距离与(时间)循环次数之间的关系。 在给定脉冲
29、参数和循环次数的条件下,测量直线前进的距离。 步骤: 编写程序让机器人前行 ?秒钟(循环次数=?)根据前面的实验数据理论计算 调整脉冲参数,保证直线运动 测量并记录运动距离 调整循环次数,再次测量记录运动距离 扩展:让机器人后退一定的距离,如何消除拨动开关带来的干扰?,FREQOUT 4, 1000, 3000 (循环前面加这个语句) 在P4口输出一个3000Hz的方波,持续1000ms,$STAMP BS2 $PBASIC 2.5counter VAR WordFREQOUT 4, 1000, 3000FOR counter=1 TO 244 根据具体需要设置PULSOUT 12, 850P
30、ULSOUT 13, 650PAUSE 20NEXT END,练习2、实现车子左转右转,目的:控制车子实现左转右转分别实现以下六种转动: 1、原地左传 2、原地右转 3、以左轮为轴顺时针旋转 4、以左轮为轴逆时针旋转 5、以右轮为轴顺时针旋转 6、以右轮为轴逆时针旋转,练习3、实现车子匀变速运动,匀变速运动:逐渐增加或减少车子转速 两种:匀加速运动,匀减速运动 8种:匀加速前进,匀加速后退,匀加速原地左传,匀加速原地右转,匀减速前进,匀减速后退,匀减速原地左传,匀减速原地右转, 实现匀加速前进运动 $STAMP BS2 $PBASIC 2.5 counter VAR Word FREQOUT4
31、,2000,3000FOR counter=1 to 100PULSOUT 12, 750+counterPULSOUT 13, 750-counterPAUSE 20NEXT END,练习4、用子程序简化,$STAMP BS2 $PBASIC 2.5DEBUG “Before subroutine”,CR PAUSE 1000 GOSUB My_Subroutine DEBUG “After subroutine”,CR ENDMy_Subroutine: DEBUG “Command in subroutine”,CR PAUSE 1000 RETURN,$STAMP BS2 $PBASI
32、C 2.5counter VAR WordFREQOUT 4,2000,3000GOSUB ForwardGOSUB LeftGOSUB RightGOSUB BackwardENDForward :FOR counter 1=64PULSOUT 12, 850 PULSOUT 13, 650 PAUSE 20NEXTPAUSE 200RETURNLeft:FOR counter 1=64,PULSOUT 12, 650PULSOUT 13, 650PAUSE 20 NEXT PAUSE 200 RETURNRight : FOR counter 1=64PULSOUT 12, 850PULS
33、OUT 13, 850PAUSE 20 NEXT PAUSE 200 RETURNBackward: FOR counter 1=64PULSOUT 12, 650PULSOUT 13, 850PAUSE 20 NEXT PAUSE 200 RETURN,第一阶段作业要求,电机实验报告 评分标准:测试目的、原理、方法、步骤描述清楚、有条理,测试数据翔实,测试结果表述清楚。 机器人装配说明书 评分标准:装配关系正确、装配顺序合理、能正确运用文字说明和装配示意图表达装配关系和装配顺序。,工作记录,时间 事件 参加人员 具体内容或结果 时间 事件 参加人员 具体内容或结果 。,定点比赛误差分析,产生
34、误差的原因 怎么减少误差 导航技术,导航技术,机器人在无感觉的情况下行走 机器人根据传感器检测到的信息进行导航(触须、 红外传感器、光敏电阻等) (1)触觉导航 (2)红外传感器导航 (3)光敏电阻导航,(一) 触觉导航技术,许多自动化机械设备都依赖于各种触觉开关。 将在机器人上安装一个称为胡须的触觉开关。将对机器人编程来监视触觉开关的状态,以及决定当它遇到障碍物时如何动作。 最终的结果就是通过触觉给机器人自动导航。,任务1:安装并测试机器人的胡须,称它为胡须,是因为这些缓冲开关看起来象胡须,尽管有些人争论说它更象触角。无论如何,安装好的胡须如图所示。胡须让机器人有能力通过接触来判断周边的环境
35、,很象蚂蚁的触角,或是猫的胡须。元件清单 安装胡须 搭建电路 测试,胡须电路及装配 收集胡须硬件,如图所示元件清单: (1) 须状金属丝 2 根 (2) 平头M4-40螺丝钉 2 个 (3) 圆形套管 2 个 (4) 尼龙垫圈 2 个 (5) 3-pin公-公接头个 (6) 220电阻 2 个 (四环:红-红-棕;五环:红-红-黑-黑) (7) 10k电阻 2 个(四环:棕-黑-橙;五环:棕-黑-黑-红),安装胡须 参考右图,进行下面操作:1 拆掉连接教学板与前支架的两颗螺钉 2 往螺丝钉上依次套上尼龙垫圈、圆形套管 3 螺钉穿过主板上的圆孔之后,拧进教学板下面的支架中,但不要拧紧 4 把一根
36、须状金属丝一端钩在一个螺丝钉的尼龙垫圈之上,另一个钩在螺丝钉的尼龙垫圈之下,调整它们的位置使它们横向交叉但又不接触 5 将螺丝钉拧紧到支架上,安装机器人触觉胡须,胡须电路示意图,参考接线图,搭建胡须电路。,确定两条胡须比较靠近,但又不接触面包板上的3-pin头。 推荐保持3 mm的距离。,测试胡须观察一下胡须电路示意图,每条胡须都是一个机械式、接地常开的单刀单掷开关。胡须接地(Vss)是因为教学板边缘的安装孔(镀有金属)都连接到Vss。金属支架和螺丝钉提供电气连接给触觉胡须。当胡须没有被压下,连接胡须的I/O管脚的电压是5V;当胡须被压下时,I/O短接到地,所以I/O管脚的电压是0V。,测试胡
37、须输入寄存器 IN0、 IN1、 IN2、 IN3、 IN4 、 IN5 、 IN6 、 IN7 IN14 、 IN15如果I/O脚上的电压为5V(胡须没有压下),则其寄存器存储1;如果电压为0V(胡须被压下),则存储0。可以用调试终端显示这些数值。连接到P5管脚的触须开关状态值1或者0存储在一个名叫IN5的变量中。可以使用指令DEBUG BIN1 IN5来查看存储在该变量中的值。BIN1是DEBUG格式符,告诉调试终端显示的是一个二进制值(1或者0)。, TestWhiskers.bs2 Display what the I/O pins connected to the whiskers
38、sense $STAMP BS2 Stamp directive. $PBASIC 2.5 PBASIC directive.DEBUG “WHISKER STATES“, CR, “Left Right“, CR, “- -“ DODEBUG CRSRXY, 0, 3,“ P5 = “, BIN1 IN5,“ P7 = “, BIN1 IN7PAUSE 50 LOOP,脱机测试胡须,脱机测试胡须触觉。由于没有计算机的调试终端,你该怎么办?一种解决的办法是对BASIC Stamp微控制器编程,让它根据其接收到输入信号发送一个相对应的输出信号。下面利用一对LED显示电路和一段程序,由程序基于胡须
39、触觉的输入打开或者关闭LED。所需元件: (1) 220电阻(红-红-棕)2个 (2) 红色LED 2个 搭建LED胡须测试电路 搭建如图所示的LED 电路。 对LED胡须测试电路编程 ,IFTHEN句法,PBASIC语言中有个条件判断指令语 句IFTHEN,其句法是: IF (condition) THENELSEIF (condition)ELSEENDIF 句中“”的意思是,你可以在此放置一个代码段(由一条或多条指令组成)。, TestWhiskerswithLed.bs2 Display what the I/O pins connected to the whiskers sense
40、. $STAMP BS2 Stamp directive. $PBASIC 2.5 PBASIC directive. DEBUG “WHISKER STATES“, CR, “Left Right“, CR, “- -“ DODEBUG CRSRXY, 0, 3,“P5 = “, BIN1 IN5,“ P7 = “, BIN1 IN7PAUSE 50IF (IN5 = 0) THENHIGH 10ELSELOW 10ENDIFIF (IN7 = 0) THENHIGH 1ELSELOW 1ENDIF LOOP,任务3 用胡须实现触觉导航,机器人向前走直到碰到障碍物。此时,机器人用它的一根或者
41、两根胡须碰障碍物,当遇到障碍物胡须被压下。一旦胡须被压下,机器人就探测到了障碍物,然后可以调用基本动作子程序使机器人倒退或者转弯,以避开障碍物重新向前行走,直到遇到另一个障碍物重复上述的过程。下面的例程会基于胡须的输入状态做出选择,然后调用相关子程序使机器人动作。 IF (IN5 = 0) AND (IN7 = 0) THENGOSUB Back_Up GOSUB Turn_LeftELSEIF (IN5 = 0) THENGOSUB Back_UpGOSUB Turn_RightELSEIF (IN7 = 0) THENGOSUB Back_UpGOSUB Turn_LeftELSEGOSU
42、B Forward_Pulse ENDIF, RoamingWithWhiskers.bs2 $STAMP BS2 $PBASIC 2.5 pulseCount VAR ByteFREQOUT 4, 2000, 3000 - MainRoutine -DOIF (IN5 = 0) AND (IN7 = 0) THEN GOSUB Back_UpGOSUB Turn_LeftELSEIF (IN5 = 0) THENGOSUB Back_Up GOSUB Turn_RightELSEIF (IN7 = 0) THEN GOSUB Back_UpGOSUB Turn_LeftELSEGOSUB F
43、orward_Pulse ENDIFLOOP, - Subroutines - Forward_Pulse: PULSOUT 12,650 PULSOUT 13,850PAUSE 20RETURN Turn_Left:FOR pulseCount = 0 TO 10PULSOUT 12, 650 PULSOUT 13, 650PAUSE 20NEXTRETURN Turn_Right:FOR pulseCount = 0 TO 10 PULSOUT 12, 850PULSOUT 13, 850PAUSE 20NEXTRETURN Back_Up: FOR pulseCount = 0 TO 2
44、0PULSOUT 12, 650PULSOUT 13, 850PAUSE 20NEXTRETURN,可以修改IFTHEN 语句让前面任务中的LED指示灯来指示机器人的动作。通过添加HIGH 和 LOW 命令来控制LED电路。举例说明:IF (IN5 = 0) AND (IN7 = 0) THEN HIGH 10 HIGH 1 GOSUB Back_Up GOSUB Turn_Left ELSEIF (IN5 = 0) THEN HIGH 10 GOSUB Back_Up GOSUB Turn_Right ELSEIF (IN7 = 0) THEN HIGH 1 GOSUB Back_Up GO
45、SUB Turn_Left ELSE LOW 10 LOW 1 GOSUB Forward_Pulse ENDIF,机器人迷路时的人工智能决策,你或许已注意到机器人迷失在墙角里的情况。当机器人进入墙角时,左胡须触墙,于是它右转。当小车再向前行走,右胡须触墙,于是左转。然后它又前进又会碰到左墙,再次碰到右墙等等。这时你只能把动手把它从困境中解救出来。,编程逃离墙角,胡须交替压下的总次数。重要的一点是程序必须记住每个胡须在上次压下时处于什么状态,并和当前压下的状态对比。如果状态相反,就在总数上加1。如果这个总数超过了程序中预先给定的阀值,那么就该做一个“U”型转弯,并且把胡须交替计数器复位。IFT
46、HEN嵌套语句IF condition1 THENCommands for condition1IF condition2 THENCommands for both condition2 and condition1ELSECommands for condition1 but not condition2ENDIF ELSECommands for not condition1 ENDIF, $STAMP BS2 $PBASIC 2.5 pulseCount VAR Byte counter VAR Nib old7 VAR Bit old5 VAR Bit FREQOUT 4, 2000
47、, 3000 counter = 1 old7 = 0 old5 = 1 - MainRoutine - DOIF (IN7 IN5) THENIF (old7 IN7) AND (old5 IN5) THEN counter = counter + 1old7 = IN7old5 = IN5IF (counter 4) THENcounter = 1 GOSUB Back_Up GOSUB Back_UpGOSUB Turn_LeftGOSUB Turn_Left,ENDIF ELSEcounter = 1 ENDIF ENDIFIF (IN5 = 0) AND (IN7 = 0) THEN
48、 GOSUB Back_Up GOSUB Turn_LeftELSEIF (IN5 = 0) THEN GOSUB Back_UpGOSUB Turn_RightELSEIF (IN7 = 0) THEN GOSUB Back_UpGOSUB Turn_LeftELSEGOSUB Forward_Pulse ENDIFLOOP, - Subroutines - Forward_Pulse: PULSOUT 12,650 PULSOUT 13,850PAUSE 20RETURN Turn_Left:FOR pulseCount = 0 TO 10PULSOUT 12, 650 PULSOUT 13, 650PAUSE 20NEXTRETURN Turn_Right:FOR pulseCount = 0 TO 10 PULSOUT 12, 850PULSOUT 13, 850PAUSE 20NEXTRETURN Back_Up: FOR pulseCount = 0 TO 20PULSOUT 12, 650PULSOUT 13, 850PAUSE 20NEXTRETURN,