找回密码
 马上注册

QQ登录

只需一步,快速开始

楼主: James.Yang

[教程] LEGO MINDSTORMS NXT编程指南(完整中文版)——自主翻译

   火.. [复制链接]
 楼主| 发表于 2012-11-7 20:49:42 | 显示全部楼层
本帖最后由 James.Yang 于 2012-11-7 20:51 编辑

第6章 发出一些声音!
声音可以使机器人更有个性。想想R2-D2如果没有唧唧声和口哨声是多么的无聊。还好,我们可以使用声音模块让你的机器人大量说话。然而,声音不只是给机器人一些字符。声音判断机器人过迷宫时是一种非常有用的方式,例如当机器人左转或者遇到死胡同时,可以编程让机器人发出特定的声音,以判断机器人的进展情况。如果你发现你的机器人所需要的声音不存在——幸运的是,NXT-G 2.0用户将会发现一个新功能,通过声音模块,他们能够记录和使用自定义的声音!下面将详细介绍声音模块的细节。
声音模块
当你将声音模块放置到顺序条时,相应的配置面板将会显示在下面,如图6-1所示。

图6-1  声音模块的配置面板
动作设置
首先介绍的第一部分为动作部分。动作部分你有两种选择:声音文件或音效。
声音文件
选择声音文件选项,如图6-2所示。看到文件部分了吗?单击声音文件选项时就打开文件部分,该文件中包含了大量预先录制的声音集,机器人可以通过智能积木块的扬声器播放他们。点击某个声音文件,如果你的电脑有扬声器,你会听到播放的声音文件。在列表中有超过100个以上独特的声音文件供选择。

图6-2  声音文件选项允许在文件列表中选择声音


注意:如果你使用的是NXT-G 2.0,我会在本章的后面告诉你如何使用内置的声音编辑器,来修改现有的声音或创建你自己的声音!如果你仔细按照要求来做,任何新增的声音都会出现在图6-2中的文件列表中。

音效
现在,选择另一个选项——音效。请注意,原来的文件部分将出现音符(见图6-3)。

图6-3  音效选项允许在音符中选择音效
音符设置
音符部分提供了几个选项。最简单的方法是简单地按一下某个琴键。如果你的电脑上有扬声器,你会听到按下的音符声。请注意,当你按下一个键,你按下键的音符将以字母A,B,C,D,E,F或G(包括高音黑键)的形式显示在音符上面的文本框中。
音符部分可供选择的其它功能是,定义音符持续的时间。在文本框内输入指定音符持续的时间。
这就是动作部分。声音模块的其余部分(控制,音量,功能和等待)不管对选择声音文件还是音调,都是相同的。下面将介绍其余的各部分。
控制设置
声音模块的第二部分是控制部分。该部分有两个选项:播放和停止(见图6-4)。

图6-4  声音模块的控制部分

播放选项很简单。选中它,任何在动作部分选择的声音文件或音调都将播放。不是很困难,是吧?
停止选项需要较多的解释。为了解释这一点,我需要向前跳转到功能部分(见图6-5)。

图6-5  声音模块的功能部分
功能设置
功能部分只有一个选项:重复。如果选中复选框,声音文件或音效会持续播放,直到程序结束,或遇到另一种声音模块且控制部分中选择停止选项。如果不选中复选框,声音文件或音效只播放一次。
所以,你可以看到停止选项只是当有另一个声音模块在持续播放时是有用的。
音量设置
好了,下面介绍音量部分。在图6-6中,你可以看到通过使用滑块或在文本框中输入一个值(0-100)来进行音量改变。你将不得不多多练习音量控制,以确定最适合你机器人的音量。但请记住,响亮的声音将比以较低的音量播放的声音使用更多的电池功率。

图6-6  声音模块的音量部分
等待设置
声音模块的最后部分是等待部分(见图6-7)。当你选择一个声音文件或音效来播放时,且重复选项(功能部分)复选框没有被选中,等待完成复选框就可使用。


图6-7  声音模块的等待部分

如果你选中了等待完成复选框,在你选择的声音文件或音效没有播放完之前,任何后续的模块都不会被执行。让我用伪代码给你举个例子:SPOT,播放C音符10秒钟,再往前走5圈。
现在,下面我将伪代码转换为一个NXT-G程序。首先,我拖放了一个声音模块,并配置它来播放一个C音符10秒钟(见图6-8)。不选中等待完成复选框,将音量设为75。

图6-8  SPOT首先将播放C音符10秒钟

接下来,我拖放了一个移动模块(见图6-9)。我将配置这个移动模块让电机B和C向前转动5圈,然后刹车停止。功率设置为50。

图6-9  SPOT将向前旋转5圈
接下来,我保存程序,把它上传到SPOT,并运行它。请你为你的机器人也创建和运行同样的程序。发生了什么?
好吧,我按下Run按钮,C音符开始播放。但在C音符停止之前,电机B和C开始转动。为什么会这样呢?
回到图6-8,注意到等待完成复选框未选中。这意味着,当声音模块开始播放声音时,程序将继续运行到移动模块来旋转电机。但是,这不是我想要SPOT做的。再看一看伪代码:SPOT,播放C音符十秒钟,然后再往前走5圈。
我想让SPOT在播放C音符10秒钟后,再向前迈进。要做到这一点,我只需要回到声音模块,选中等待完成复选框。这会告诉SPOT,等到声音模块结束(10秒)后,然后再继续执行程序。所以,我重新进行了配置(见图6-10),并再次运行该程序。

图6-10  将声音模块只作一个变动将解决这个问题

这一次,SPOT做的正是我想让它做的。他播放了C音符十秒钟,当声音模块完成后,电机B和C旋转,SPOT向前移动5圈。完美!
现在,你可以给你的机器人添加声音文件和铃声以给予他们更多的个性。但是,在我们结束本章之前,我还想告诉你,声音可以用于调试机器人。例如,在一个复杂的程序中,你可以添加一个声音模块,来了解机器人什么时候达到了程序的某个部分。比方说,你要知道,你的机器人什么时候运行到了要决定左转还是右转的部分。你可以在程序中直接在移动模块前面,添加一个声音模块,并给左转添加一个声音,给右转添加一个不同的声音。当你已经测试并验证程序能正常工作后,你可以删除这个声音模块,按正常方式运行程序。在这个例子中,声音模块给你一个听得见的警报来了解目前程序运行到什么位置,这是测试机器人程序和故障排除非常有用的方法。
自定义声音
NXT-G配备了超过100个预存的声音可供选择,但你也许希望有一些不在列表中的独特声音。如果是这样,且你运行的是NXT-G 2.0版本,那你很幸运!最新版本的NXT-G配备了一个内置工具,称为声音编辑器,这将允许你创建自己的声音供你的机器人使用——时间长达5秒。单击工具菜单,选择声音编辑器,新的工具将会打开,如图6-11所示。

图6-11  使用NXT-G的工具菜单打开声音编辑器

如果没有内置的麦克风,你必须为你的计算机或笔记本电脑外接麦克风。按下录制按钮,开始录制你自己的声音或其他音效。请记住,最终的声音长度将被限制在五秒钟,但你可以尽你喜欢进行记录,在保存文件之前,你会被要求对声音进行编辑。再次按下录制按钮将停止录制过程。
图6-12显示我的录音:“看起来很危险的!”我已经录制了很多遍,所以我可以找到一个最佳的声音记录。我可以用播放按钮来听我的录音。

图6-12 在屏幕中心显示了一段录制声音的波形
接下来,使用图6-13所示的左、右剪辑条来剪辑你所录制声音的一个5秒钟的片断。如果两个剪辑条之间的声波是红色的,表明声音文件仍然太长。继续拖动左、右剪辑条,直到声波变为绿色。

图6-13  通过剪辑条来减短你的声音长度

现在剩下的就是保存你的声音文件,这样你就可以使用它。点击保存按钮,会出现一个窗口,如图6-14所示。如果你想让你的机器人使用该声音,不要对文件路径进行任何更改,默认路径保存的文件可以通过声音模块来进行选择。

图6-14  给你的声音文件一个名字并保存到你的计算机

给你的声音起一个简短且容易记住的名字,单击保存按钮。我将我的声音命名为“Dangerous”。现在,看一下是否可以使用该文件。我拖了一个声音模块到程序中,如图6-15所示,选择文件选项。正如你在图6-15中可以看到,“Dangerous”的声音文件已出现在列表中。

图6-15  在文件列表搜索你的声音文件

利用声音编辑器还可以做其它事情。你可以点击打开按钮,打开一个现有的声音文件(不管是预先配置的声音还是你自己的声音),使用左,右剪辑条,对其进行增加或减少长度的编辑。你可以使用音量滑块来预设你的新声音的音量,也可能使用放大(缩小)按钮来微调录制的声音,并最大限度地减少它的长度。对这些按钮多加练习,你会发现声音编辑器是很容易使用的。

注意:你应该知道,使用声音编辑器保存到你的计算机上的声音文件都是以.RSO为扩展名的文件。这意味着你可以在互联网上搜索其他NXT使用者创建和共享的保存为.RSO格式的声音效果,如果你找到一个你喜欢的,把它保存到你的硬盘驱动器,打开音效编辑器,单击打开按钮,浏览到该声音文件,并根据需要对其进行编辑。

练习
这就是声音模块,下面我要给你几个简单的练习,给你一些动手实践这个新模块的锻炼。在本章结尾部分,你可以找到我的解决方案。
练习6-1
编写一个程序,让你的机器人转圈,同时不断播放一个声音文件。限制移动模块旋转20圈,然后程序结束。
练习6-2
编写一个程序,让你的机器人向前转动两圈并停止,然后大喊“1!”重复动作两次,并分别喊“2!”和“3!”
下一步内容?
现在,在我们进行新模块介绍前,我想总结一下机器人接收输入的方式——包括电机,传感器,定时器,以及智能积木块上的按钮。在本书后面介绍的其它模块,在某种意义上来说,都取决于你对传感器,电机和按钮是如何来发送和接收信号的理解。对第7章的良好理解,将有助于你为你的机器人创建一些非常强大的和有趣的程序,让我们继续向前。
练习解决方案
以下是几个可能练习的解决方案。请记住,你的解决方案可能与我的方案不同。
练习6-1
图6-16和图6-17显示了程序,以及我在练习6-1的解决方案中使用的两个配置面板。请注意,该声音文件设置为循环,所以它会一遍又一遍地播放。由于等待完成复选框没有选中,开始播放声音文件后,移动模块将立即启动机器人旋转,15-20圈后,程序终止。

图6-16  完整的程序和声音模块的配置面板


图6-17  移动模块的配置面板
练习6-2
图6-18到图6-23显示了程序以及在我的解决方案中使用的六个配置面板。在所有这三个声音模块中,我都选择了等待结束复选框,这将保持移动模块与其相匹配的声音模块执行一致。

图6-18  完整的程序和第一个移动块的配置面板


图6-19  第一个声音模块的配置面板


图6-20  第二个移动模块的配置面板


图6-21  第二个声音模块的配置面板


图6-22  第三个移动模块的配置面板

图6-23  第三个声音模块的配置面板
图6-1.JPG
图6-2.JPG
图6-3.JPG
图6-4.JPG
图6-5.JPG
图6-6.JPG
图6-7.JPG
图6-8.JPG
图6-9.JPG
图6-10.JPG
图6-11.JPG
图6-12.JPG
图6-13.JPG
图6-14.JPG
图6-15.JPG
图6-16.JPG
图6-17.JPG
图6-18.JPG
图6-19.JPG
图6-20.JPG
图6-21.JPG
图6-22.JPG
图6-23.JPG
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-11-12 19:32:33 | 显示全部楼层
本帖最后由 James.Yang 于 2012-11-12 19:33 编辑

第7章 数据线
我听到最多的问题都涉及到数据中心和数据线——并且有很好的理由!模块的数据中心会引起混淆,特别是当一个模块接头有许多选项时尤其明显。数据线同样很难搞清楚。
在本章中,我将暂停对新的NXT-G编程模块介绍,只想给你一些如何使用数据中心和数据线的背景知识和提示。当然,我会用到一些你已经学过的NXT-G模块,这样你能看到魔力般的称为数据线是如何工作的。我希望你学完本章后,你原先的混乱将被一扫而空。
存在的问题
为了帮助你了解数据中心和数据线,我们引入一个称为颜色模块的虚拟编程模块。该模块如图7-1所示。

图7-1  颜色模块

这个假想的模块是你碰到的最简单模块。它包含一种颜色。现在该模块为蓝色,且一直为蓝色,没有别的颜色。你没有办法来改变颜色。甚至更糟的是——该模块没有办法与机器人分享这个颜色。看看模块四周的实心墙,将阻止了所有信息的输入与输出,这是一个很沉闷的、无用的模块。
一个简单的解决方案
怎样使我的颜色模块变得对我们有用呢?嗯,首先,能够改变颜色就好了。我最喜欢的颜色是绿色,所以我想至少让模块改变成绿色。目前为止,我还不可以对模块做任何事情,但它至少要包含我最喜欢的颜色!要做到这一点,我需要一种方法来穿过这堵包围模块的墙。
图7-1中的模块缺乏的功能之一,就是如何进入模块内部,将蓝色改变为绿色。如果创建的颜色模块允许我可以在任何时间改变它,这是多神奇啊(因为它是一个假想模块)。我打算做的第一件事情是将一个小的颜色键盘连接到模块,这样我就可以改变颜色。然而,这种颜色键盘是一种特殊的键盘,它只让我输入颜色。如果我尝试键入“吉姆”或“五”,键盘会发出蜂鸣声,让我知道不会与我合作。看看更新的颜色模块,如图7-2所示。

图7-2  我添加了一个假的颜色键盘,可以将蓝色模块改变为绿色模块。

非常完美!现在,我可以输入绿色。以后,如果我想改变为黄色或红色,我只需简单地输入新的颜色,模块将相应改变。
现在,我已经改变了颜色,我有一个绿色模块。除了看看它,我对它还是没有什么可做。就像我增加了一个假想的颜色键盘,现在我想给颜色模块连接一个假想的颜色显示屏幕,并将里面存储的颜色显示到屏幕上。这个屏幕如同我的特殊键盘,它只显示颜色。(如果我有一个“方向屏幕”,把它连接到模块,它对颜色不知道做什么,但如果我把它连接到一个方向模块,它具有北,东,西,南,那它一定会工作!)
图7-3 显示了我连接到绿色模块的新彩色屏幕。

图7-3  彩色屏幕让我看到存储在颜色模块中的颜色

现在,让我们回顾一下这是如何工作的:颜色模块只可容纳一种颜色,不是一个数字或一天或一个名称。
接着,对颜色模块添加了颜色键盘。我可以改变颜色模块持有的颜色,但只能通过这个特殊的键盘,这款键盘只允许我输入颜色。
最后,对颜色模块添加了颜色屏幕。这个特殊的屏幕只会显示颜色而不是其它,不是名称或食物种类。
如果我撤掉颜色键盘,我还可以显示模块拥有的颜色吗?可以,只要我仍然连接颜色屏幕。
如果我撤掉颜色屏幕,我还可以改变颜色模块内的颜色吗?还是可以,只要我仍然连接颜色键盘。
让我给你描述这种颜色模块的另一种方式:
        颜色模块可以接受从键盘输入的颜色。
        颜色模块同时提供输出到屏幕上的颜色。
在这个描述中给你一些编程术语:输入和输出。当在考虑模块时,请记住,任何提供给模块的信息称为输入,任何由模块给出(分享)的信息称为输出。
NXT-G解决方案
现在,让我们来看一看有更多选项的模块。我们一起来看一下图7-4所示的虚拟茶杯模块。

图7-4  茶杯模块要稍微复杂一些

茶杯模块可容纳三个方面的信息:杯子的颜色,以英寸为单位的高度,以及代表杯子是空的回答Yes或者代表杯子不是空的回答No。这就是它的乐趣所在。
请看一下图7-5,颜色模块为我提供了一个给杯子模块更简单的输入和输出方法。这就是所谓的一个接头。

图7-5  茶杯模块具有连接数据的数据中心

在图中你可以看到的,数据中心左侧有三个输入端口(也叫接头)和右侧有三个输出端口。这里就是我要连接键盘,屏幕和其他项目的地方。
我想花一些时间给你展示一个真正的NXT-G模块数据中心。图7-6给出了三个扩展了数据中心的模块。 (正常情况下,NXT-G模块的数据中心是收拢的。)

图7-6  移动模块,声音模块和录制/播放模块的数据中心


注意:大多数NXT-G模块有数据中心,但不是所有的。每一个你看到的数据中心左侧向下展现的小方块接头就是一个数据输入端口。右侧的小方块接头就是数据输出端口。有些模块比其它模块有更多的数据端口,但所有端口都是以同样方式工作的,它们都是一种向模块发送数据和从模块接收数据的方式。我将在以后具体介绍模块的章节中介绍大多数的数据端口,但现在我只是想让你对前面章节中提到过的数据中心有个基本了解。


现在,让我们回到我们的颜色模块和茶杯模块的例子,并对输入和输出数据端口进行一些练习。
就象颜色模块一样,茶杯模块对什么类型的设备连接到它是很挑剔的。对颜色输入接头,我只能连接能够提供颜色的设备。我们已经知道,颜色键盘是满足这个要求的。我可以将颜色键盘连接上,并将茶杯颜色从蓝色改变为绿色。但是,我们还有更好的办法!
还记得我们前面练习的颜色模块吗?好的,它同样有一个数据中心,它只是藏起来了。如果我点击颜色模块的左下边缘,颜色模块数据中心就会弹出,如图7-7所示。

图7-7  颜色模块也有数据中心。

颜色模块左侧的输入接头,就是我可以连接颜色键盘来改变颜色模块内部颜色的地方。右边的输出接头可以连接到一个颜色屏幕,但是,事实上,它可以连接到任何可以接受颜色的输入接头。注意到茶杯模块有一个可以接受颜色输入的接头!因此,我可以用一根简单的数据线将颜色模块的输出接头,连接到茶杯模块的输入接头上,而不是将颜色键盘连接到茶杯模块上。(参见图7-8)。

图7-8  颜色模块与茶杯模块连条数据线

我同样可以连接一个数字键盘,该键盘仅用于输入以英寸为单位的茶杯高度的数字。如果我尝试输入数字以外的其它文字,键盘不能正常工作。我还连接了一个逻辑键盘到表示杯子空闲的输入接头。逻辑键盘是一个非常特殊的键盘,它只能被用来提供真或假的答案(不是也许或有时,只能是真或假。)。
一个例子
我将茶杯模块连接到一个屏幕,该屏幕能显示以下两者之一(但不能同时显示):
        给[颜色]茶杯倒指定[高度]英寸的水。
        [颜色]茶杯不是空的。
要做到这一点,我可以使用一个屏幕来显示由茶杯提供的颜色和高度(图7-9显示了我目前的设置)。

图7-9  所有的数据线都连接好并准备使用
但在显示颜色和高度之前,我需要另一个特殊模块,用来检查茶杯的内容,并确定它是否为空。现在,我将展示我的新检查模块,如图7-10所示。

图7 -10  新的检查模块

检查模块执行很有技巧。它接受一个真或假的答案(逻辑答案),根据答案,来执行动作1或动作2。如果答案是真(杯子是空的),则执行动作1;如果答案是假则执行动作2(要了解逻辑的更多信息,请跳到第8章)。
我可以用这个模块来检查茶杯的内容。它会先看一下标记为空的数据接头。如果空数据接头提供的数据是真,检查模块将使用“检查=真”的屏幕。如果数据是假,则模块将使用“检查= 假”的屏幕。
运行此程序,屏幕上将显示“给蓝色杯子加5英寸水。”如图7-10所示。这样做是因为检查模块接收到茶杯模块发来的真数据。然后,它按真信号的回答执行动作。
如果我返回并改变颜色为黄色和茶杯高度改为三(使用颜色键盘和高度键盘),这些信息将会从茶杯模块传递到检查模块。如果我用逻辑键盘改变逻辑的答案从真到假,检查模块将从茶杯模块收到假信号,并执行假信号规定的动作:屏幕上将显示“黄色茶杯不空”。
我可以创建很多虚拟模块,但我希望你已经开始了解模块是如何接收输入数据和提供输出数据的。两种数据(输入和输出)都可以由你提供(通过输入信息或在配置面板中选择选项),或通过数据线由其它模块提供。
数据类型
你听到这些信息会很高兴:我已创建了一堆可以接受颜色和高度的虚拟模块。我还可以创建了一堆虚拟类型的输入数据。但幸运是的,因为LEGO有时有比我更好的判断。对NXT-G来说,你只需要了解三种类型的数据:
        文本:字母,单词,语句,甚至数字文本。
        数字:数字可以是正数或负数,有时他们被限制为整数(只允许如-3,0,4,8,或10,没有小数,如4.3或8.5)。
        逻辑:这可以是是或否(另一种说法是真或假)。


注意:对于数字数据,一些模块有一个范围。例如,移动模块的功率设定值只能在0到100的范围内。如果移动模块的功率输入数据接头连接了数据线,且输入接头接收到一个大于100的值,则该值会自动减小为100。要记住一个事实,即一个模块可以接收数据数值并不意味着该数值将被接受。


在编程时,可以在模块之间传递的数据只能是文本,数字和逻辑类型(是/否或真/假),只有这三种!就象茶杯模块不会让你使用一个逻辑键盘输入颜色,模块输入和输出数据接头对他们能接受的数据类型是非常挑剔的。好消息是,如果你试图将数据线从一个接头连接到一个不兼容的接头(例如:尝试将一个文本接头连接到逻辑接头),数据线将会被打断。我的意思是,该数据线将变成灰色虚线,表示你犯了一个错误。请参照图7-11。

图7-11  逻辑,数字和文本数据的数据线
变量
请注意图7-11中左起第三个模块——称为变量模块,将在第18章介绍——有一根灰色虚线。它试图发送一个是或否信号到移动模块控制左边电机的端口。该输入数据端口只需要数字(具体地值为1,2,或3,其中1等同电机A,2等同电机B,和3等同电机C)。
同样,左起第二个模块(也是变量模块),也试图将文本数据发送到控制右边电机的端口。这也将失败,因为该输入端口要求的值也是1,2,或3。
只有左起的第一个变量模块设置为提供一个数字,是一根黄实线。这是因为它连到了移动模块功率值的数据输入端口。功率数据输入端口可以接收从0到100的值(任何超过100的值将降到100,任何小于的值0将被转换为0)。因为我将第一个变量模块的输出数据端口连接到了功率数据输入端口,数据线显示为实线,表明已正确连接。
现在,如果你正确连接了数据线,数据线将会显示出一种颜色。这种颜色取决于通过数据线传送的数据类型:
        黄色数据线为数字数据类型。
        橙色数据线为文本数据类型。
        绿色数据线为逻辑数据类型。
        如果是数据线为灰色(且是虚线),数据线连接中断,将无法正常工作。
对接头到接头拖动且连接数据线需要多加练习。有时候,数据线会出现一些奇怪的现象,会往一些奇怪的地方去。你需要多加练习,直到能正确控制它们。
一个真正的NXT-G模块
现在是回到真正的NXT-G模块的时候了。你会在我提供的图中,很多时候,我会打开模块的数据中心。如果你将鼠标指针悬停在数据接头上,就会显示数据接头的名称(就象上面例子中的“空”或“高度”)。
对于一些接头(或端口——可以使用你喜欢的名称),很容易知道它们使用什么数据类型(就象数字接头需要数字数据类型)。但有些是很难弄清楚需要什么数据类型。你可以查阅帮助文件,它提供了对模块数据中心中各接头以及它们能接受的数据类型的详细描述,也可以用数据线多加实践;如果连接正确,数据线的颜色能够给出接头的数据类型,若是灰色,表明你还得再试一次。
最后一个好消息是,你不能运行具有错误数据线连接的程序!如果你连接的数据线不兼容,只需点击一下数据线的输入端(数据线总是有一个输入端和输出端),数据线将会消失。所以不用担心!
这里有大量的信息要消化,目前你只接触到了数据线的一些表面东西。但是,数据线有强大的功能!数据线可以对现存的数据重复使用以节省时间;数据线可以分割,这意味着你可以将同一数据分割后将同一个数据提供给两个不同的模块!当NXT-G检测到你从一个已有数据线的接头再拉一根数据线时,就会自动分割。在图7-12中,你可以看到这样的例子。从已连接到输入端口的数据输出端口拉一根线,数据线自动分割为两根。

图7-12  数据线可以分割并提供相同的数据到多个端口
你还需要知道帮助文档包含了对每个数据端口的完整描述,包括每个数据端口的图片,能发送和接收的数据类型,存在的任何限制(如数字范围或文本长度)。图7-13显示了移动模块及其8个数据端口的帮助文档的一个片段。

图7-13  请查阅帮助文档来查看数据端口能接受的数据类型

数据线也可以倒过来拉,所以你可以从程序末尾的输出端口拉一根数据线到程序开头的输入端口!在整本书的学习过程中,要多加观察学习使用数据线的新方法。通过自己不断实验,你会发现数据线的更多用途。
本章没有任何练习,只需要花一些时间,尝试用手在屏幕上左右拖动数据线。如果你在周围拖了足够的数据线,你有机会看到数据线会自动保持相互之间的间距以及如何避让其它数据线。不用担心,在后续章节中,你有很多在实际程序中使用数据线的机会。
下一步内容?
接下来的第8章将讨论机器人如何使用是和否的回答进行决策的方法。将介绍我在本章前面提到的逻辑模块。逻辑模块非常有用,因为很多NXT-G电子元件(电机和传感器)能够通过它们的NXT-G模块来回发送是或否的信号给其它模块。逻辑模块给你的机器人具有根据多个输入进行决策的能力,而这只是让你的机器人完全自主完成功能的第一步。
图7-1.JPG
图7-2.JPG
图7-3.JPG
图7-4.JPG
图7-5.JPG
图7-6.JPG
图7-7.JPG
图7-8.JPG
图7-9.JPG
图7-10.JPG
图7-11.JPG
图7-12.JPG
图7-13.JPG
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-11-19 20:33:14 | 显示全部楼层
本帖最后由 James.Yang 于 2012-12-5 19:50 编辑

第8章 真或假?
以下两个问题之间有什么区别?
        天空是什么颜色呢?
        天空是蓝色的吗?
是的,它们有很多差异:例如,第一个问题有八个字,第二个问题有七个字。我问这两个问题的真正要点是要表明第一个问题是开放式的,天空可以是蓝色的,或灰色的,或任何其它可能的答案。而第二个问题却只有两个可能的答案:是或否。
当涉及到你的机器人编程时,你要明白,很多时候你的机器人只可以为你提供这两个答案:是或否。在其他时候,你的机器人也只能理解是或否的答案。了解如何采用“是/否”的回答,并用它来对你的机器人进行编程,是本章的重点。
这个或者那个
让我们与SPOT进行一场问/答:
我:SPOT,你面前的盒子是什么颜色?
[SPOT坐在那里,没有任何反应。]
我:SPOT,你的触摸传感器按键是什么状态?
[SPOT仍然坐在那里,没有任何反应。]

嗯…… SPOT今天看起反应不是很灵敏。但是,我记得SPOT好象喜欢是/否的问题,所以让我再试一次:
我:SPOT,你面前的盒子是蓝色的吗?
SPOT:是的[显示在液晶显示屏上]。
我:SPOT,你的触摸传感器按键是按下的吗?
SPOT:不是[显示在液晶显示屏上]。

好的,现在看来我们取得了一些进展。SPOT确实喜欢用是或否与我沟通。另一种说法是,SPOT喜欢用逻辑回答来进行沟通,逻辑回答只是简单的是或否。

注意:一些计算机和机器人使用真或假,但其实是一样的:是=真,否=假。还有一些计算机和机器人甚至可以使用1或0作为一个作为逻辑答案,其中1 =真,0 =假。甚至还有另一种方法:打开或关闭!在这种情况下,打开=真,关闭=假。但对本章及编程目的来说,我们采用是/否或者真/假。

传感器:是或否
让我们与SPOT进行又一次对话:
我:SPOT,你的超声波传感器检测到你前方6英寸地方有物体吗?
SPOT:真。
我:SPOT,你的右键被按下了吗?
SPOT:假。

显然,SPOT的传感器有能力给SPOT返回一个逻辑答案,并传递给我。 SPOT侦听他的传感器条件并以真或假进行回应。
那么,对编程来说该做些什么呢?答案是:你的NXT机器人的传感器,电机,按钮,和其他项目可以发送和接收逻辑信号。请参见图8-1的例子。

图8-1  触摸传感器的配置面板

你在图8-1中看到的是触摸传感器模块和它的配置面板。还要注意的是触摸传感器模块的数据中心是可见的(参见第7章的数据中心讨论和第9章对传感器更详细的讨论)。如果在数据中心只看到一个数据输出接头,再次单击数据中心,将完全展开数据中心。
在数据中心,你会看到一些小的数据输入和输出接头。如果你将鼠标指针悬停在从上数起的第三个接头,将会出现 “是/否”字样。这就告诉你,这个数据接头可以提供一个逻辑数据类型的输出(通过使用数据线)。
但你怎么知道输出的将是是还是否?当传感器发回这个或那个答案时,你怎么知道它代表什么意思?简单——答案是基于你正监测传感器什么内容。
在图8-1中,注意到触摸传感器的动作部分,选中了按下选项。这意味着,如果触摸传感器的按钮被按下(没有释放),是/否逻辑接头将提供是的响应。如果按钮没有按下,是/否逻辑接头将提供否的响应。
变量和逻辑类型
回想第7章,我告诉你,当你用一根数据线连接两个模块的输入和输出数据接头时,数据接头必须具有相同的数据类型。在这种要求下,如果你想从是/否数据接头拉出一根数据线,它必须要连接到具有逻辑数据类型输入接头的模块中。作为一个例子,请参见图8-2的新模块。

图8 – 2  我在顺序条放置了一个变量模块

这个新模块是一个变量模块。我将在第18章详细讨论变量模块,但现在你对变量模块所需要知道的就是,它可以接受三种数据类型:逻辑,数字,或文本。在图8-2中,我为变量模块配置存贮一个逻辑值。我已展开了数据中心,所以你可以清楚地看到,它有一个是/否输入数据接头。我所要做的就是用数据线将它连接到触摸传感器模块(见图8-3)。

图8-3  用数据线连接两个模块

当在程序中使用数据线连接模块时,始终牢记,只有当它被连接到相同的数据类型(逻辑,数字,或文本)的输入和输出接头,数据线才起作用。我还需要指出的是,许多模块将真或假值作为默认设置。例如,在图8-2的变量模块默认设置值为假。但是你可以很容易地把它更改为真(在本书的后面还有更多的例子,你可以配置真/假值)。
很多模块都有逻辑数据类型,特别是传感器模块(见图8-4)。传感器模块都有一个提供是/否响应的接头。这些接头都有一个复选标记和一个“X”,这象征着是/否回答。

图8-4  这四个模块(触摸,声音,灯光和超声波传感器)都具有逻辑数据接头


注意:NXT 2.0机器人套件不包括声音传感器。它已被一个额外的触摸传感器所替换。同样,NXT 2.0套件没有光线感应器,但它包含了颜色传感器,它也可以被配置为光线感应器进行工作。

然而,逻辑数据类型真正派上用场,是在循环模块和开关模块(这些内容将分别在第11和12章介绍)。逻辑数据类型在编程时让机器人自己做决定是非常有用的,循环和开关模块都可以使用是/否响应(作为输入),让机器人的行为变得更复杂,并能自己进行控制。机器人可以检查传感器,电机,或其他类型的输入,根据是/否响应的内容,决定下一步的动作。
使用逻辑来配置设定
在我们完成本章之前,让我们再来看几个使用是/否逻辑数据类型的NXT-G模块的例子。请记住,大多数模块使用是或否的回答来控制行动。在这种情况下,一个是或否的答案没有太多肯定或否定的答复成份,因为它只是让模块在两种动作之间进行选择的一种方法。下面的例子就是一个很好的例子。图8-5显示了一个移动模块的数据中心。

图8-5  移动模块有两个使用逻辑数据类型的数据端口

对移动模块来说,你可以使用配置面板来配置方向(向前或向后),只需在方向部分单击向上或向下箭头来指定旋转方向。但是还可以通过对方向数据接头发送是或否信号来控制旋转方向(见图8-5)。是信号被解释为向前,否信号被解释为向后。同样的概念适用于下一步行动部分——你可以使用是信号让机器人刹车停止,或者否信号让机器人滑行停止!
你将会如何使用呢?在图8-6中,我创建了一个小程序。它包含了前面提到的触摸传感器。触摸传感器的内容将在第9章介绍,但现在只关注触摸传感器的数据中心。我已经在是/否输出接头连了一根数据线到移动模块的方向输入接头。
这个程序除了根据触摸传感器按键是否被按下,让电机向前或向后旋转10秒钟外,没有其它动作。当我运行该程序时,如果我按住触摸传感器按键,电机将将向前旋转10秒钟,然后结束程序。如果在图8-6中,将触摸传感器的配置面板中动作部分改为释放选项,你认为在开始运行程序后,当我按下按键时会发生什么情况呢?

图8-6  程序中使用触摸传感器来控制电机的旋转方向

仔细想一想——如果目前测试的触摸传感器动作设置为释放,那么当按钮被按下时,表明它没有释放,对不?这意味着触摸传感器将给移动模块发送否信号(或假信号)。否信号意味着电机向后旋转!
你将在下一章中了解各种传感器及它们是如何工作的。一旦你掌握了它们的功能以及它们的数据中心是如何工作的,你将能够使用数据线给其它模块发送是或否信号,从而使你的机器人具有一些令人惊异的决策能力。你的机器人将能够实现互动,避免撞墙,检测房间的光亮,以前其它更多情况。而所有这些都使你的机器人具有使用是和否的逻辑回答来做出决定的能力。
练习8-1
在进入第9章之前,给你做个练习,来帮助你更好地理解如何使用是/否信号,并决定做什么。如果你觉得困难,我在本章结尾给出了参考答案。
图8-7显示了我创建了一个小程序及四个NXT-G模块和四个配置面板。阅读程序,并确定机器人在下述情况下将采取什么样的行为:
        触摸传感器按钮没有按下.
        光线传感器检测到房间的灯都打开
仔细看,因为设置上有点棘手!

图8-7  完整的程序和触摸传感器的配置面板


图8-8  光线传感器的配置面板


图8-9  移动模块的配置面板


图8 – 10  等待时间模块的配置面板
下一步内容?
这一章就对逻辑数据做了简短介绍。正如我所说的,在第11和12章的循环和开关模块中你会得到如何使用逻辑数据类型的更详细的介绍。现在,在第9章,让我们先改变一下方向,介绍一些能与NXT智能积木块进行通讯的一些项目:传感器,按钮和计时器。
练习解决方案
在我们运行程序,并确定将会发生什么之前,先看一下每个模块。首先,触摸传感器模块配置为,如果按下按钮,将发送一个是信号到模块的下一步动作输入端口(图8-7)。接下来,配置了光线传感器,如果房间的灯都打开,将发送一个是信号到移动模块的方向输入端口(也见图8-7)。(没有太过深入的说明,我只设置了传感器检测到的光线是否大于50(参见图8-8);光线传感器检测房间光线级别,被分配为一个介于0和100之间的值。如果灯都打开且足够亮,光线读数通常在70-80左右,意味着光线传感器检测到的光线值大于50,是(或真)信号将发送到移动模块)。
现在,检查图8-9中的移动模块的配置面板。我已经配置了移动模块的电机B和C向前旋转,结束时滑行停止。(等待时间模块将使电机在等待五秒钟,停止程序前完成他们的动作)。
因此,如果触摸传感器按键被按下(是信号),移动模块的下一个动作的输入数据接头将收到该信号。是信号告诉电机刹车停止。我不是在配置面板中设置电机滑行停止吗?是的,如果有数据线用来接收信号,配置面板中的设置将被忽略。因此,是信号覆盖了配置面板中滑行停止设置,机器将以刹车停止替代。
光线传感器又如何呢?不错,它发送了一个是信号给方向输入数据接头,其对应于向前旋转设置。我已经配置了移动模块向前旋转(见图8-9),所以此设置没有改变。
所以,当程序运行时,电机将旋转3圈(功率设置为50),然后电机将刹车停止。机器人将坐在那儿五秒钟,然后程序结束。
图8-1.JPG
图8-2.JPG
图8-3.JPG
图8-4.JPG
图8-5.JPG
图8-6.JPG
图8-7.JPG
图8-8.JPG
图8-9.JPG
图8-10.JPG
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-11-21 19:48:48 | 显示全部楼层
本帖最后由 James.Yang 于 2012-12-5 19:48 编辑

第9章 反馈
你的LEGO MINDSTORMS NXT套件配有电机和传感器组合。NXT智能积木块有三个内置的定时器以及一些在智能积木块上的按钮。当你学习后知道所有这些项目都能够提供某种反馈到NXT的智能积木块时是否会令你大吃一惊?传感器能反馈还好理解,传感器被设计为对外部条件如光,触摸,颜色或声音进行反应以及将信息报告给智能积木块。但是,电机怎么反馈呢?定时器是怎样给智能积木块进行输入或反馈的呢?所有这些问题,将在本章进行解答。这一章要比大多数章节要长,但你会发现这些信息给予机器人对外部条件(包括时间)进行监测的能力以及让机器人自己决策是非常有用的。
你的状态是什么?
让我们从状态这个词开始。交通信号灯有三种状态:红色,黄色和绿色。灯开关有两个状态:开和关。就使用这两个简单的例子,我可以给SPOT一些伪代码:

我:SPOT,向前走直到交通信号灯变成红色。
我:SPOT,在LCD屏幕上显示“灯亮”字样直到灯开关关闭。

在这两个例子中,我假设SPOT有眼睛,可以看到交通信号灯或灯开关。如果SPOT没有眼睛,那么需要一种方式来将交通信号灯或灯开关状态提供给SPOT。也就是说交通信号灯和灯开关能够提供反馈信息或输入给SPOT。
要求交通信号灯提供输入是不现实的,但NXT机器人确实有接受传感器等项目反馈的能力。所以,我可以改变给SPOT的伪代码:

我:SPOT,向前走直到光传感器反馈值为20。
我:SPOT,显示文字“Hello”直到触摸传感器反馈按钮被按下并释放(触碰)。
我:SPOT,当超声波传感器检测到6英寸前有物体时发出C音符声音。

电机,也能提供反馈:

我:SPOT,旋转电机A直到电机B旋转10圈。
我:SPOT,当电机C旋转5圈后,显示“5圈”。

我在前面提到智能积木块有三个内置的定时器及三个按钮可供使用,所以我也可以写下以下伪代码:

我:SPOT,20秒后,转90度。
我:SPOT,如果我按左边的按钮,发出B音符;按下右边的按钮,发出C音符。

现在,你可以看到,传感器,电机,按钮,定时器,可以给智能积木块提供输入以控制其他行动(移动模块,声音模块和其他模块)。你可以根据这些项目的状态,给你的机器人编写执行特定的动作。就像你知道一个电灯开关有两个状态,开和关一样,你需要知道传感器,按钮,定时器,电机具备的,并可以反馈给智能积木块的各种不同状态。
因此,本章的其余部分,我将解释对这些项目的设置,这样你就会知道如何正确地配置它们。将来将介绍的一些模块,包括等待,循环,和开关模块,将取决于你对如何正确配置状态的理解。
我要介绍的方法是相当简单:我将对每个项目进行描述(传感器,电机,按钮,等等),并对可以在配置面板中修改的设置进行了描述。请注意,我还提供了所谓的传统项目的一些信息:Mindstorms的早期版本(机器人技术发明系统,或RIS),包括电机,传感器和灯泡。NXT机器人可以使用这些RIS项目,但需要特殊的转换电缆连接到NXT智能积木块。我称他们为“传统项目”,因为他们是从早期的Mindstorms系统留下的,但他们仍然是非常有用的,且与NXT系统完全兼容。


注意:现在只有NXT教育版套件还具有传统/ RCX项目的软件支持。如果你使用的是零售版本,可以通过访问http://mindstorms.lego.com/Support/Updates/ 下载RCX电机和传感器的NXT编程模块。点击屏幕左侧的补丁选项,在传统模块部分下载你所需语言(目前仅有英语,德语,法语,日语,和荷兰语可供选择)的文件。

传感器配置
让我们从传感器开始——NXT触摸传感器,RIS触摸传感器,NXT声音传感器,NXT光线传感器,RIS光线传感器,NXT超声波传感器,NXT旋转传感器,RIS旋转传感器,NXT颜色传感器,和RIS温度传感器——这些传感器都有一些有趣的规则要遵循。
首先,传感器检测状态变化。状态可以是光线值的变化,球的颜色从蓝色变为红色的变化,声音音量的变化(声音),或者一个运动位置的变化(移动)。传感器只是简单的“观察”其状态的变化。例如,光线传感器,可以检测室内照明水平的变化。超声波传感器检测它前面的物体或墙壁与它之间距离的变化。
其次,在某一时刻,传感器编程模块只能响应一个状态。当你把一个传感器模块放到NXT-G程序中,它必须被配置为测试一个条件。例如,一个单个的光线传感器,不可以被配置为检测房间里的光线值是否小于80和大于50。为了检测这两个状态,你必须在你的程序中使用两个光线传感器模块。
在第8章中,我们已经学过如何通过使用数据接头,在NXT-G模块间发送及接收逻辑数据。不错,传感器能够按照他们相应配置面板中程序设定的检测状态提供逻辑类型的响应,真或假。想想我们提到的交通信号灯。让我们假设每一辆车顶部都安装了特殊的交通信号灯传感器。这些信号灯传感器被用来检测交通信号灯的状态。当信号灯为绿色时,汽车可以移动,而当信号灯为红色时停止。如果信号灯是黄色的,汽车将减速。

注意:传感器可以提供更多类型的信息。例如,光线传感器可以提供房间里相对于光线值的一个数字值。声音传感器可以提供一个分贝值。所有类型可以通过传感器数据中心的数据接头提供。我将在本书的后面做解释,但本章只涉及传感器和电机提供是或否(真或假)信号给其他模块的能力。


然而,这些交通信号灯传感器,可以检测到三种可能的状态之一:绿色,黄色或红色。NXT传感器只可以检测一种状态,所以,如果使用NXT交通信号传感器,每台车需要三个信号灯传感器:
        如果第一个信号灯传感器检测到绿色,车子可继续前进。
        如果第二个信号灯传感器检测到黄色,汽车的速度开始减慢。
        如果第三个信号灯传感器检测到经色,汽车应该停止。
请注意,在任何特定时间,只有一种状态是真的;信号灯在同一时间不可能是绿色和红色。因此,当检测绿色的传感器被触发,黄色和红色传感器不能被触发。因此,我们可以检查传感器对配置要求检测的条件作出真/假逻辑数据类型响应。
现在,让我们来详细介绍各个传感器。
NXT触摸传感器
NXT触摸传感器的配置面板如图9-1所示。

图9-1  NXT触摸传感器的配置面板

在端口部分,选择NXT触摸传感器连接的端口。触摸传感器的默认端口为端口1。
在动作部分中,你可以选择按下,释放,或碰撞。请记住,碰撞时指快速的按下和释放——持续时间不超过 0.5 秒。
NXT触摸传感器的数据中心如图9-2所示。记住,你可以将鼠标指针悬停在数据接头上,就可以知道接头的名称。

图9-2  NXT触摸传感器的数据中心

端口号可以配置为使用数据接头和输入值为1,2,3,或4的一根数值类型数据线。该值也可以通过在输出端口数据接头拉一根数据线进行输出。。
动作数据接头可以使用值0表示按下,1表示释放,或2表示碰撞的数值数据。
是/否数据接头能够提供真或假的输出值。它可以发送和接收逻辑数据类型。
原始值数据接头能够提供一个0-1024之间的数字数值输出。
逻辑数据接头提供了1表示按下,0表示释放的数值。但是,这个数据是数字数据类型,而不是逻辑数据类型。


注意:在NXT-G 1.0版本软件中不包含逻辑数据接头。这个接头从2.0版本软件中才具有。知道你使用的是哪个版本的NXT-G比较好,但如果存在一个本书介绍的,但你的软件中不存在的数据接头,很可能你运行的软件为1.0版本。


在本章剩下的其它模块,我将不再介绍模块的数据中心,只介绍模块的配置面板(我只是想告诉你,传感器模块可以通过自己的数据中心,可以有很多选项而不仅仅是发送和接收逻辑数据信号)。许多数据接头在模块与模块之间是相同的,所以你可能会发现,只要学习其中的一些接头,你可以认识全部接头。但是,如果你到现在还不熟悉任何数据中心,单击帮助菜单,选择目录和索引选项,来查看帮助文件。在屏幕的左侧,选择一个编程模块(参见图9-3)。模块数据中心的详细信息,将显示在该模块的帮助文档的底部(如图9-3所示)。你可以参考这个帮助文档,以确定各种数据接头的数据类型(数字,逻辑,或文本)。

图9-3  触摸传感器数据中心的详细说明。
RIS触摸传感器
传统的RIS触摸传感器的配置面板,如图9-4所示。

图9-4  RIS触摸传感器的配置面板

在端口部分,选择RIS触摸传感器连接的端口。触摸传感器的默认端口为端口1。
在动作部分,你可以选择压下,释放,或碰撞。
NXT声音传感器
NXT声音传感器的配置面板,如图9-5所示。

图9-5  NXT声音传感器的配置面板

在端口部分,选择NXT声音传感器连接的端口。声音传感器的默认端口是端口2。
在比较部分,你必须配置声音值(0-100)以及传感器要监测的实际值是大于还是小于配置值。你可以使用滑动条,来选择相应的值或在文本框中输入一个0到100之间的数值。从下拉菜单中选择小于号(<)或大于号(>),或者单击左边或右边的单选按钮来配置此数值。
NXT光线传感器
NXT光线传感器的配置面板,如图9-6所示。

图9-6  NXT光线传感器的配置面板

在端口部分,选择NXT光线传感器连接的端口。光线传感器的默认端口是端口3。
在比较部分,你必须配置光线值(0-100)以及传感器要监测的实际值是大于还是小于配置值。你可以使用滑动条,来选择相应的值或在文本框中输入一个0到100之间的数值。从下拉菜单中选择小于号(<)或大于号(>),或者单击左边或右边的单选按钮来配置此选项。
如果你选中发光复选框,光线传感器器将打开其内置的LED光源提供一个人工光线源,来帮助测定光线值。如果不选该复选框,光线传感器将只检测四周光线值——也就是说,正常光照条件。
RIS光线传感器
RIS光线传感器的配置面板,如图9-7所示。

图9-7  RIS光线传感器的配置面板

在端口部分,选择RIS光线传感器连接的端口。光线传感器的默认端口是端口3。
在比较部分,你必须配置光线值(0-100)以及传感器要监测的实际值是大于还是小于配置值。你可以使用滑动条,来选择相应的值或在文本框中输入一个0到100之间的数值。从下拉菜单中选择小于号(<)或大于号(>),或者单击左边或右边的单选按钮来配置此选项。
NXT超声波传感器
NXT超声波传感器的配置面板,如图9-8所示。

图9-8  超声波传感器的配置面板

在端口部分,选择NXT超声波传感器连接的端口。超声波传感器的默认端口是端口4。
在比较部分,你必须配置距离值以及传感器要监测的实际值是大于还是小于配置值。你可以使用滑动条,来选择范围为0-100之间的值,你也可以在文本框中输入一个下限为0,但上限大于100的数值。使用滑动条限制了你的范围为0-100,但你可以输入一个大于100的值。从下拉菜单中,选择小于号(<)或大于号(>),或者单击左边或右边的单选按钮来配置此选项。
在显示部分,从下拉菜单中选择厘米或英寸。
NXT旋转传感器
NXT旋转传感器的配置面板,如图9-9所示。请记住,旋转传感器内置在NXT电机里,所以不要去寻找实际的NXT旋转传感器本身。

图9-9  NXT旋转传感器的配置面板

在端口部分,选择NXT电机(旋转传感器)连接的端口。旋转传感器的默认端口为端口A。
在动作部分,如果你想内置的旋转传感器监测传感器返回的值(圈数),你应该选择读取选项。选择重置选项将重置传感器计数值为零。
在比较部分,选择要监视的电机旋转方向(正向或反向)。从底部的下拉菜单中选择度数或圈数,并在文本框中输入一个数值。从另一个下拉菜单中,选择传感器要监测的实际值是大于还是小于配置值(通过是/否数据接头,根据你在配置面板中的设置,可以得到一个真/假逻辑响应)。
RIS旋转传感器
RIS旋转传感器的配置面板,如图9-10所示。

图9-10  RIS旋转传感器的配置面板

在端口部分,选择RIS旋转传感器连接的端口。旋转传感器的默认端口为端口A。
在动作部分,如果你想内置的旋转传感器监测传感器返回的值(圈数),你应该选择读取选项。选择重置选项将重置传感器计数值为零。
在比较部分中,选择要监视的电机旋转方向(正向或反向)。在文本框内输入你要监*控刻度数数值,一圈有16个刻度。你还必须从下拉菜单中,选择传感器要监测的实际值是大于还是小于配置值。


注意:NXT-G 1.0软件的用户会发现,旋转传感器模块只允许以圈数为单位进行比较。NXT-G 2.0软件已经更新,允许旋转传感器模块除了圈数单位进行比较外,还可以用度数为单位进行比较。

NXT颜色传感器
NXT颜色传感器是NXT 2.0套件的新设备。它的配置面板如图9-11所示。

图9-11  NXT颜色传感器的配置面板
在端口部分,选择颜色传感器连接的端口。颜色传感器的默认端口是端口3。
在动作部分,你可以选择光线传感器选项,这将使颜色传感器当光线传感器使用。当作为光线传感器时,配置面板将改变为模拟的光线传感器的配置面板,但增加了选择反射光——红,蓝,或绿色。
如果在动作部分保留颜色传感器,单击下拉菜单中的比较部分,选择范围内或范围外。然后,你可以使用两个小滑块来定义要检查的单一的颜色还是颜色范围。图9-12显示了我将颜色传感器配置为查找绿色和红色外的颜色,这将意味着,黄色也将被忽略。(我选择的是范围外的比较,因此当检测到的颜色落在该范围以外,颜色传感器将发送一个真的信号。)

图9-12  NXT颜色传感器可检测颜色范围。
RIS温度传感器
RIS温度传感器的配置面板,如图9-13所示。

图9-13  RIS温度传感器的配置面板

在端口部分,选择RIS温度传感器连接的端口。温度传感器的默认端口是端口4。
在比较部分,你必须在文本框中输入温度值,或使用滑动条来设置温度值。摄氏温度范围为-20度(零下20度)到70度。华氏温度必须在-4度(零下4度)至158度的范围内。从下拉菜单中,选择小于号(<)或大于号(>),或点击向左或向右的单选按钮来配置此选项。
在显示部分,从下拉菜单中选择华氏度或摄氏度。温度传感器能监*控的温度值范围由该选项决定。

是/否与离散值

到目前为止我所描述的配置面板,都被编程用于产生一个条件。当该条件满足时,通过数据线,该模块能够发送真(或是)的信号到另一个模块。当该条件不满足时,在程序中也是使用数据线,发送一个假(或否)的信号。
但是,如果你想使用传感器产生的是一串非逻辑数据,你会怎么做呢?例如,你如何使用光线传感器的强度值(0-100)来控制电机的速度? (这样,明亮的房间将会让机器人移动更快,黑暗的房间,会让机器人移动缓慢)。
敬请期待——我将在本章的后面的一节称为“数据中心功能”解释一下非真/假数据。在那里,你将看到如何使用传感器的是/否结果,及其强度值来控制机器人的不同方面。

其它输入类型
还有三个方法可以用于给你的NXT机器人提供反馈。这些方法包括NXT按钮,NXT定时器,通过智能积木块使用接收消息编程模块,使用蓝牙技术来接收消息。我将在第25章介绍接收消息模块(及其配套的发送消息模块),所以本章在详细介绍NXT按钮和计时器后结束。
你的NXT智能积木块在其面板上有4个按钮:向左按钮,向右按钮,回车按钮(橙色),和取消按钮。取消按钮不能被用作输入,其功能只是取消一个正在运行的程序,或者如果你正在浏览屏幕上的LCD工具,它可以用来翻到前一个页。剩下的向左、向右和回车按钮可以为你创建的任何程序提供输入。
图9-14显示了NXT按钮模块的配置面板。

图9-14  NXT按钮的配置面板

在按钮部分,从下拉菜单中选择按钮(回车,向左或向右)。默认选择是回车键。
在动作部分,选择按下,释放,或碰撞。这些工作方式与触摸传感器相同。现在你的机器人可以检测任何按钮的条件,并发送真/假信号到其他模块,从而可以执行更多的操作。
NXT智能积木块同样具有三个内置的定时器。这些定时器从你按下回车键开始运行程序时开始计时。图9-15显示了定时器模块的配置面板。

图9-15  NXT定时器配置面板

在定时器部分,从下拉菜单中选择1,2或3,选择你要使用的定时器。默认定时器为1。
在动作部分,选择读取选项来获得当前的定时器的值。如果你选择复位选项,当该定时器被执行时,定时器将被重置为零。
在比较部分,允许你指定一个值(以秒为单位)作为检测的触发值。从下拉菜单中,选择大于选项或小于选项,现在定时器模块将提供一个真/假逻辑数据类型响应。例如,如果你为定时器1配置了大于10秒,在定时器1到达十秒钟之前,逻辑数据接头将提供假的响应。超过10秒钟后,数据接头将提供一个真的响应
数据中心功能
好了,现在你知道如何配置各种传感器模块来检测状态,并通过使用数据线提供一个逻辑信号(真或假)。如果你已经编程配置好了光线传感器来检测光照值是否大于50,并从它的是/否数据输出接头,连接数据线到一个移动模块的是/否数据输入接头,当光照值确实大于50时(在数据线上发送一个是的信号),电机向前旋转,或当光线值小于50时,电机向后旋转(在数据线上发送一个否的信号)。
只要记住,当在配置面板中配置的条件满足时,将会通过是/否数据接头发送一个真(是)的逻辑信号。当条件不满足时,将发送一个假(或否)的逻辑信号。
但传感器模块的其它数据接头有什么用呢?很高兴你能这么问。看一下图9-16到图9-18,这是我为SPOT创建的一个小程序。

图9-16  程序使用数据接头进行控制以及触摸传感器的配置面板


图9-17  光线传感器的配置面板


图9-18  移动模块的配置面板

让我们仔细分析一下这个程序。首先注意,当程序执行时,若按钮被按下,触摸传感器将通过数据线发送一个是信号给移动模块。一个是信号会告诉移动模块执行刹车停车而不是滑行停止。在程序执行时,如果按钮没有被按下,数据线将发送一个否信号,表明电机在程序要求它们停止时,以滑行方式停止。(本例中,旋转5圈后)。
接下来,光线传感器将按1-100的比例读数光照值(强度),并将这个值发送给移动模块的功率数据接头。同时,如果它检测到的光照强度大于50,它会发送一个是信号(通过逻辑数据线)给移动模块的方向数据接头,并使电机向前旋转。(否信号将使电机向后旋转)。
在这里,你可以看到我是如何将控制电机速度(功率)与通过光线传感器检测到的光照强度关联起来的。在一个较暗的房间(光照强度值大于0但小于50),机器人不仅速度较慢,而且是向后移动!
最后,当电机完成自己的动作,程序将暂停10秒钟后结束。
现在你是否明白模块的每个数据接头都可以用来控制其他模块?对于这种工作,传感器是最有用的,因为他们有如此多的不同数据接头来提供不同的信号。通过一些尝试,你可以很容易给机器人进行编程,当它的声音传感器检测到响亮的掌声时,他们就向左转!
或者,你也许想让你的机器人逃避手电光?简单——只要让其光线或颜色传感器模块检测到一个明亮的光线照到表面时,告诉机器人向后退来远离光线。
通过提供给你的各种传感器,你有能力给你的机器人一些真正的决策能力。想远离光线或声响?靠近并检查?关机并休眠?检测附近的墙壁?靠近或远离?
你使用数据线的创造力和技能是你唯一的限制。到目前为止,在你的程序中还没有包括大部分NXT-G模块!一旦你知道所有模块是如何工作的,你会进入功能强大的实际编程领域,你的机器人一定会创造惊奇。
现在,在结束本章前,可以尝试创建一个小程序,来满足练习9-1规定的要求。
练习9-1
创建一个小程序,当程序第一次执行时,它检测声级(范围为0到100),并用它来控制电机功率。机器人同时使用超声波传感器来看看在它5英寸正前方是否有其它物体。当在5英寸或更近的地方,有其它物体时,机器人将远离它而不是靠近它。机器人的电动机共旋转10圈。
下一步内容?
本章向你介绍了如何使用配置面板对一小部分模块进行配置,并提供了使用数据线的小技巧。使用这些技巧的真正功效将来自与其它模块的配合使用,如循环,等待,及开关模块。
第11章将告诉你如何使用循环模块来重复某些任务。当使用循环模块时,你可以让模块永远循环,也就是说,一遍又一遍地执行任务,直到你取消该程序。配置循环模块的另一种方式是,当满足一定的条件时,停止循环——例如,当光线传感器检测到的光照强度低于20,声音传感器检测到80以上的噪音,或者电机旋转超过20度(旋转传感器)。
等待和开关模块是相同。这些模块都可以让你用本章中学到的东西,使你的机器人具有决策能力。
所以,在第10章将学习等待模块。
练习解决方案
图9-19至图9-21显示了在此程序中使用的模块和三个配置面板。请注意,声音传感器给移动模块的功率设置发送了数字数据类型的值(黄色数据线),超声波传感器给移动模块的方向设置发送了一个逻辑数据类型的值(绿色数据线)。

图9-19  完整的程序和声音传感器的配置面板


图9-20  超声波传感器模块的配置面板


图9-21  移动模块的配置面板、
图9-1.JPG
图9-2.JPG
图9-3.JPG
图9-4.JPG
图9-5.JPG
图9-6.JPG
图9-7.JPG
图9-8.JPG
图9-9.JPG
图9-10.JPG
图9-11.JPG
图9-12.JPG
图9-13.JPG
图9-14.JPG
图9-15.JPG
图9-16.JPG
图9-17.JPG
图9-18.JPG
图9-19.JPG
图9-20.JPG
图9-21.JPG
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-11-26 19:47:09 | 显示全部楼层
本帖最后由 James.Yang 于 2012-11-26 19:49 编辑

第10章 等待
等待是机器人最有用的动作之一。是的,你没听错——等待。不相信我吗?好吧,想想以下一些事例:
&#61599;        SPOT正走向一条红线,等待颜色传感器来检测线的颜色。
&#61599;        SPOT正准备向目标扔球,等待触摸传感器按下和释放。
&#61599;        SPOT向墙移动,等待超声波传感器检测墙面。
&#61599;        SPOT坐在起跑线上,等着我按下左键使其向前移动。
你是否看到,等待是机器人程序的重要组成部分?你的机器人可能会永远等待某些事情发生。它可能只是简单的等待你按下智能积木块上的回车键或类似前面的例子一些动作。所有这一切的等待都使用等待模块来完成,所以请继续阅读,明白如何在程序中让你的机器人“等待!”
等待模块
在讨论等待模块时,你需要了解一个重要的概念:当满足特定条件时,等待模块将停止等待。在条件满足之前,等待模块将从根本上暂停程序,并停止执行其它任何模块。
这与你是使用颜色传感器、声音传感器、触摸传感器、超声波传感器、光线传感器,还是一个简单时间限制无关。当你使用等待模块时,你必须告诉等待模块结束等待所需满足的条件。
那么,在给你介绍等待模块如何工作之前,让我给SPOT更多的伪代码:
[我]:SPOT,一直向前走,直到发生什么事情。
是不是很模糊?“发生什么事情”是什么意思?好的,它可以是任何事情:
&#61599;        经过5秒钟
&#61599;        声音传感器检测到一声巨响
&#61599;        超声波传感器检测到在它前面8英寸的地方有物品
&#61599;        颜色传感器检测到地面上有一张蓝色卡片
你理解了吗?我想让SPOT在满足特定条件前,一直前进。在NXT-G程序里,这些条件可以通过使用从传感器,NXT按钮,或一个时间限制等数据获到。我将对他们逐一介绍,让你了解到如何来配置条件。为了示范不同的条件,我首先为SPOT(或者你自己的机器人)创建一个非常简单的程序。
打开NXT-G软件,开始一个新程序。拖放一个移动模块到设计区,将其配置为无限制旋转电机B和C,功率设置为50(见图10-1)。

图10-1  SPOT的新NXT-G程序

现在我们将介绍一些让SPOT停止运动的条件。等待模块是最佳选择。


注意:当我讨论等待模块时,我将在等待模块前面或后面加上另一个名字,让你明白我将如何配置它。例如,一个时间等待模块将使用时间作为条件。如果我想使用声音传感器来结束等待,我将使用一个声音传感器等待模块。OK?


等待模块可以在公共模块区找到。当你将鼠标指针移动到等待模块上面时,会弹出一个有六个选项的菜单(见图10-2)。

图10-2  有6个等待模块可供选择。


注意:如果你使用的是NXT-G 1.0版本的软件,你看不到图10-2最右边的颜色传感器等待模块的图标。


让我从最简单的开始配置——时间等待模块。图10-3显示增加了时间等待模和它的配置面板的程序。

图10-3  时间等待模块和配置面板

在时间等待模块上有两个项目可配置。第一个是控制部分的下拉菜单。如果你点击它,你就能看到,等待模块可以设置为传感器或时间等待。现在不要改变它,但要注意,如果选择传感器,你可以将时间等待模块改变为传感器等待模块。
时间等待模块可以配置的另一个选项为直到部分。你将注意到,有一个等待你输入你希望等待模块等待的秒数文本框。
图10-3显示我已经配置了时间等待模块等待十秒钟。完成后,保存程序,上传到你的机器人,然后运行它。发生了什么?
电机是否运行了10秒钟,然后停了下来?如果没有,检查程序确保配置了等待模块10秒钟,这是最容易出现问题的。
好的,这就是时间等待模块。下面,让我们来看看传感器等待模块。
对于基本的传感器等待模块,我将介绍配置面板和相应的选项。我强烈建议你在刚刚创建的程序中进行练习:用接下来章节中介绍的每个传感器等待模块替代时间等待模块。练习并配置每个传感器等待模块,将他们上传到你的机器人,看看它是如何工作的。


注意:接收消息等待模块将在本书后面介绍使用蓝牙技术在智能积木块之间发送和接收消息时一起介绍。


作为开始,让我给你一个改变等待模块类型的快捷方式。返回具有移动模块及时间等待模块的程序(如图10-3所示)。单击时间等待模块进入配置面板。单击控制部分的下拉菜单,选择传感器,不要选时间。当你更改为传感器,你现在拥有另一个下拉菜单的新配置面板部分(称为传感器)。单击这个下拉菜单,看看其中的选项(如图10-4所示)。

图10-4  传感器部分下拉菜单中可以选择的选项


注意:你可能在屏幕上看不到图10-4中显示的下拉菜单中列出的所有选项。1.0版本软件用户将有一个稍微不同的列表,如果你没有安装传统模块(见第9章),这些模块也不会显示在列表中。


我将介绍大部分选项及其相应的配置面板。关于传感器,NXT按钮,定时器配置面板的详细信息,请参阅第9章。
光线传感器等待模块
图10-5显示了光线传感器等待模块和它的配置面板。

图10-5  光线传感器等待模块和配置面板

在这个例子中,等待模块被配置为:等待直到光线传感器检测到的光线值小于20。当条件满足时,SPOT的电机将停止转动,并停止前进。
NXT按钮等待模块
图10-6显示了NXT按钮等待模块和它的配置面板。

图10-6  NXT按钮等待模块和配置面板

在这个例子中,等待模块配置为:等待直到左键被释放。当条件满足时,SPOT的电机将停止转动,并停止前进。
旋转传感器等待模块
图10-7显示了旋转传感器等待模块和它的配置面板。

图10-7  旋转传感器等待模块和配置面板

在这个例子中,等待模块被配置为:等待直到电机A反方向旋转180度及以上。当条件满足时,电机B和C将停止转动,SPOT停止前进。
声音传感器等待模块
图10-8显示了声音传感器等待模块和它的配置面板。


图10-8  声音传感器等待模块和配置面板

在这个例子中,等待模块被配置为:等待直到声音传感器检测到的声音值低于30。当条件满足时,电机B和C将停止转动,SPOT停止前进。
定时器等待模块
图10-9显示了定时器等待模块和它的配置面板。

图10-9  定时器等待模块和配置面板

在这个例子中,等待模块被配置为:等待直到定时器2超过20秒。所有的定时器在你运行一个程序时开始立即计数。所以,一旦你按下NXT智能积木块上的橙色回车键运行程序,在程序继续运行前,等待模块一直等待直到定时器2的值等于20。当条件满足时,电机将停止转动,SPOT停止前进。
稍后,你将学习如何重置计时器,但现在,你只需要知道,所有三个定时器——定时器1,定时器2,定时器3从程序开始时开始计数。
触摸传感器等待模块
图10-10显示了触摸传感器等待模块和它的配置面板。

图10 -10  触摸传感器等待模块和配置面板

在这个例子中,等待模块被配置为:等待直到触摸传感器按钮被碰撞(快速按下和释放)。当条件满足时,电机B和C将停止转动,SPOT停止前进。
超声波传感器等待模块
图10-11显示了超声波传感器等待模块和它的配置面板。

图10 -11  超声波传感器等待模块和配置面板

在这个例子中,等待模块被配置为:等待直到超声波传感器检测到它前面的物体(或障碍物)小于64厘米。当条件满足时,电机B和C将停止转动,SPOT停止前进。
颜色传感器等待模块
图10-12显示了颜色传感器等待模块和它的配置面板

图10 -12  颜色传感器等待模块和配置面板

在这个例子中,颜色传感器等待模块被配置为:等待直到颜色传感器检测到一个黄色的物体(胶带,一张纸,一个球等)。当条件满足时,电机B和C将停止转动,SPOT停止前进。
这就是等待模块!现在,你可以配置你的机器人来等待各种不同条件。你知道如何使用传感器,内置定时器,和NXT按钮来触发一个等待模块以停止等待。
现在,是给你练习的时候了。我想让你给SPOT一个场景,你需要使用各种传感器让机器人来完成一个非常具体的运动。在本章结尾部分,我提供了一个参考的解决方案。
练习10-1
SPOT将通过一个杂乱的地板。图10-13显示了SPOT将要通过的小一块地方的鸟瞰图。

图10-13  要求SPOT从起点线运行到终点线。

将SPOT放置在起点线后面,并朝向地板上粘贴的经色胶带。当程序启动时(选择程序,然后按回车键),SPOT在开始向前移动前等待触摸传感器按钮被按下和释放(碰撞)。保持SPOT向前移动直到颜色传感器检测到红色胶带。当检测到红色胶带后,SPOT停止,左转(90度),然后朝墙移动。SPOT要一直向前移动,直到超声波传感器检测到墙面离机器人三英寸为止。然后SPOT停止,左转(90度),并向前移动,直到它跨过终点,你按下触摸传感器按钮。
下一步内容?
现在,让我问你一个问题。你知道如何让你的机器人等待,等待,等待,但你知道如何让机器人一遍又一遍做一些事情吗?要做到这一点,你就需要使用一种称为循环的模块。我将在第11章介绍循环模块是如何工作的。
练习解决方案
图10-14至图10-21显示了练习10-1完整的程序和配置面板。但要记住,你要安装的超声波传感器应该朝前(这样可以检测到墙),颜色传感器应该朝下,这样可以检测到地板上的胶带。触摸传感器可以安装在任何不妨碍机器人运动或其他传感器的地方。你还需要在第2个和第4个移动模块多次试验角度值,以让机器人有一个真正的90度拐弯。

图10 -14  完整的程序和触摸传感器等待模块的配置面板


图10-15  第1个移动模块的配置面板


图10 -16  颜色传感器等待模块的配置面板


图10 -17  第2个移动模块的配置面板


图10 -18  第3个移动模块的配置面板


图10 -19  超声波传感器等待模块的配置面板


图10 -20  第4个移动模块的配置面板


图10 -21  第5个移动模块的配置面板


图10 -22  第2个触摸传感器等待模块的配置面板
图10-1.JPG
图10-2.JPG
图10-3.JPG
图10-4.JPG
图10-5.JPG
图10-6.JPG
图10-7.JPG
图10-8.JPG
图10-9.JPG
图10-10.JPG
图10-11.JPG
图10-12.JPG
图10-13.JPG
图10-14.JPG
图10-15.JPG
图10-16.JPG
图10-17.JPG
图10-18.JPG
图10-19.JPG
图10-20.JPG
图10-21.JPG
图10-22.JPG
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-12-2 21:10:55 | 显示全部楼层
本帖最后由 James.Yang 于 2012-12-2 21:12 编辑

第11章 循环
本书到目前为止,我们几乎已经完成了公共模块的介绍。在本书的剩余部分,我将向你介绍其它模块和概念,让你构建更复杂的程序,让机器人做更多的动作而不是简单地前进,后退,或转圈。
现在,先休息一下,给你介绍另一个概念。我尽量让其充满乐趣。然后,我会介绍一个新的NXT-G编程模块,相信你会很喜欢。
一遍又一遍地做……
让我们回到我们友好的机器人——SPOT。再一次,我们假装他有一双耳朵,能够理解口头指令。我想给他一套不寻常的命令:
[我]:SPOT,我想让你向前转6圈,停止,右转90度。
[SPOT向前转了6圈,停止和右转。]
[我]:SPOT,向前转6圈,停止,右转90度。
[SPOT向前转了6圈,停止和右转。]
[我]:SPOT,向前转6圈,停止,右转90度。
[SPOT向前转了6圈,停止和右转。]
[我]:SPOT,向前转6圈,停止,右转90度。
[SPOT向前转了6圈,停止和右转。]
现在, SPOT到了哪里?对了,他回到了出发点。他走的是一个正方形路线,他再次等待我的指示。
如果你要为SPOT创建一个走正方形路线的NXT-G程序,你只需将8个移动模块拖到设计区(如图11-1所示),并以两套相同的设置来配置各个移动模块,是不是?一个移动模块让电机B和C旋转6圈,另一个移动模块让SPOT右转。我重复此模式三次,这样得到共8个移动模块。

图11- 1  让SPOT走正方形路径的NXT-G程序

是的,它能运行。但只是为了让SPOT走正方形,并回到他的出发位置,这些工作是否太多了。是否有更好的办法呢?
让我们来看看,我们是否可以稍微改变一下伪代码:
[我]:SPOT,我想让你向前转6圈后停止,并右转90度。
[SPOT向前转了6圈后停止,然后右转。]
[我]:SPOT,我要你重复第一套指令三遍。
[SPOT向前转了6圈后停止,然后右转。]
[SPOT向前转了6圈后停止,然后右转。]
[SPOT向前转了6圈后停止,然后右转。]
简单多了!我只需要告诉他一次指令,并要求他重复做三次。SPOT完成动作花了相同的时间,但我节省了口头指令!
在伪代码中,我给SPOT一些命令,并设定了一个条件。你应该能够找到给SPOT的命令:移动,停止,右转90度。但条件是什么呢?请记住,条件是一条你的机器人(SPOT)在程序继续执行或终止前必须遵循和遇到的简单规则。所以,我给SPOT的规则是“重复我第一套指令三次。”我可以让他重复2次或60次,但这并不重要,只要SPOT知道这个规则并遵循它就可以了。
除了告诉他重复三次,是否还可以使用其它条件?当然可以,下面是一些例子:
[我]:SPOT,请重复我的第一套指令直到你的触摸传感器被触发。
[我]:SPOT,请重复我的第一套指令直到内部定时器达45秒。
[我]:SPOT,我希望你一直重复我的第一套指令。
换种方式来看,我给了SPOT一遍又一遍又一遍要完成的指令,直到有些事情发生。这可能是触摸传感器按键被按下或颜色传感器检测到地面上的绿线或时间达到无穷大(但请相信我,SPOT的电池不会持续那么久,他最终会停止)!
如果SPOT一直这样一遍又一遍地做相同的事情,有人可能会说,“这机器人在转圈!”这完全正确,他在循环。他在执行一个循环!
什么是循环?在现实生活中,一个循环可能是一个赛马场或一根两端连接在一起的长长绳子——不管它的圈有多大,如果你沿着它的路径,你最终会回到原来的位置。一个程序循环非常类似。它自己会回到原处,无论是死循环,还是编程让他终止循环。
碰巧的是NXT-G软件有一个满足这种场合的模块——循环模块(见图11-2)。

图11-2  让SPOT沿正方形轨迹的新NXT-G程序

循环模块本身是很枯燥的。默认情况下,它被设置为永久循环。你可以在循环模块配置面板的控制部分看到这个设置。
现在,放置在该循环模块内的模块将一遍又一遍地不断重复。让我给你举个例子。


注意:当将一个模块放置到循环模块内时,持续按住鼠标按钮,将新模块放到循环模块内,直到循环模块扩展。


我将一个移动模块放置到循环模块内。这一移动模块将被配置为连接端口B和C的电机旋转1圈(见图11-3)。

图11-3  循环模块内的简单移动模块

然后,我保存程序,把它上传到SPOT,并运行它。SPOT向前旋转一圈,然后有一个短暂的停顿。接下来,SPOT又向前移动一圈,再是另外一个短暂的停顿。这种情况将持续下去,直到我看得无聊了,我取消了该程序。
停顿的发生,是当移动模块完成其动作后,循环模块检查条件(速度非常快)。请记住,条件是机器人必须遵守的规则。这个程序的规则是让循环一直继续下去,所以SPOT一遍又一遍地执行——你能想象这种情形。这解释了SPOT电机旋转之间短暂的停顿。SPOT在检查,看它是否能结束循环;因为这个循环被设置为永久,程序跳回到循环模块的开始部分,再次执行移动模块。
现在,让我们改变一下条件。我们如何让SPOT执行移动模块4次?
看一下循环模块的配置面板。控制部分有一个下拉菜单。点击这个菜单,你会看到一些选项(如图11-4所示)。

图11-4  循环模块的控制部分

选项包括永久,传感器,时间,次数和逻辑。让我从中选一个最简单的——时间。从控制部分下拉菜单中选择时间,配置面板将发生变化(见图11-5)。

图11-5  循环模块的控制部分被配置为时间

当你选择时间作为控制,你将会进入到另一个部分。直到部分将要求在文本框中输入一个时间(以秒为单位)。这是该循环模块内的任何模块运行时间的总和。我在前面提到循环将无限执行下去,除非编程设置一个跳转。通过设置此时间限制,你可以跳离循环。这种跳转有另一个术语——循环中止。
当循环停止时就是循环中止。循环中止后,程序将继续执行下一个编程模块,或当循环模块为程序中的最后一个模块时,程序将停止。很简单,是不是?如果你取消程序,循环可以中止,但它也可以被配置为满足特定条件时中止循环。在我前面的例子之一中,我告诉SPOT,触摸传感器按钮被碰撞时停止。触摸传感器将中止循环模块。
我需要重点指出:如果在循环模块中有多个模块,在中止循环前,所有的模块必须都执行完毕。所以,如果你配置了运行循环模块25秒,但循环模块内部需要40秒才能完成一次运行,在执行完内部模块之前,25秒的时间限制将到达,因此循环模块不会再次循环。
如果循环模块内部需要15秒能运行完毕,哪会发生什么情况?那么,当该循环模块开始时,计时器开始从25倒计时。当循环模块内部的模块完成第一遍运行后,定时器仍然有10秒种。因此,该程序跳回到的循环模块的开始位置,并再次运行内部模块。但是,这一次,在内部模块完成执行之前,定时器将降到0。当内部模块执行完毕后,该循环模块检查定时器,此时时间已到达,循环中止。
另一部分,显示部分,有一个选项:你可以启用或禁用计数器。循环模块每循环1次,计数器值增加1。如果选中该选项,循环模块将提供一个小的数据接头(见图11-6)。我在第7章中介绍过数据中心和数据接头,但对此选项你所需要知道是你可以使用数据接头提供一个数字数据类型的输出。这个数值是循环模块已执行的循环次数。当你需要追踪一个循环模块执行的次数并用它来进行决策的复杂程序中,这个数值是非常有用的。例如,你可能会建立一个程序,考虑使用计数器提供的数值来增加超声波传感器扫描的距离。在循环中,你可以将计数器接头用数据线连接到超声波传感器的触发点输入数据接头。每执行一次循环,超声波传感器会增加1的扫描距离(以英寸或厘米为单位)。

图11- 6  如果选择显示选项,就会出现一个小的数据接头

让我们一起来看看循环模块另一个简单的控制选项——永远循环设置,如图11-7所示。

图11-7  一个循环模块设置为永远

如果你配置一个循环模块永远运行下去,将会发生以下事情:循环模块内的任何模块将一遍又一遍地重复执行,直到你取消该程序或电池耗尽。
现在,单击控制部分的下拉菜单,选择传感器,然后,单击传感器部分的下拉菜单,将看到如图11-8所示的下拉菜单。

图11-8  传感器输入的循环模块配置

正如你看到的,传感器部分的下拉菜单提供了许多选项,包括光线传感器,NXT按钮,接收消息,旋转传感器,声音传感器,定时器,触摸传感器,颜色传感器以及超声波传感器。大多数都在第9章中介绍过,并且使用很方便。在你选择这些选项之一后你要做的就是配置中止循环的触发条件。
例如,在图11-9中,我从传感器部分的下拉菜单中选择了NXT按钮选项。

图11-9  循环模块配置为当左键按下时中止循环

在这个例子中,我将循环模块配置为当NXT智能积木块上的左键按下时,中止循环。在循环中,我配置了一个移动模块,让SPOT向前移动一圈。同时增加了一个会发出短促的蜂鸣声的声音模块。一旦程序运行,SPOT将向前移动一圈并发出蜂鸣声,他将一直重复这些动作,直到按下左键。(我必须跟随他以便可以按下左键!)


注意:在某些情况下,循环模块的中止必须发生在循环模块检查其中断条件发生的精确时间。例如,在图11-9中,如果我跟随机器人移动,并且在移动模块或声音模块执行过程中,按一左键,循环不会中止。我必须在机器人发出蜂鸣声之后,但在再次移动之前按下左键。我将在本章的后面介绍如何解决这个问题。


要记住,当你从传感器部分选择一个选项,你所配置的条件必须在循环中止之前执行。
下一个可以中止循环的选项是计数器。从控制部分的下拉菜单中选择计数器(如图11-10)。

图11-10  循环模块配置为使用计数器中止循环

当使用计数器选项时,你必须在直到部分的文本框中输入一个整数值。你不能使用负数,只有零和正整数(1,2,3,等等)。
在图11-10中,我已经配置为当计数值到达12时中止循环。当我运行该程序时,SPOT将第一次执行移动模块和声音模块。当这些模块执行完毕后,计数值从0增加到1,并再次开始循环。移动模块和声音模块再次执行,计数器值增加到2。当所有模块一共执行了12次(计数值= 12),循环将中止,程序将停止。
中止循环的最后一个选项是逻辑设定,如图11-11所示。

图11-11  循环模块配置为使用逻辑响应中止循环

在图11-11中,请注意,当在控制部分下拉菜单中选择逻辑选项,循环模块将会出现一个小的数据接头。
该数据接头只接受逻辑数据线作为输入。这意味着在直到部分你所选择的逻辑数据类型(真或假)满足要求时,循环模块将被中止。我将在下一节给你展示使用该选项的例子。
这些就是为单个循环模块的配置选项。但循环模块还有另外一种方法我要展示给你:嵌套循环。
嵌套循环
为了解释这个新概念,我将为SPOT创建一个简单的程序,我希望你能跟随我创建一个自己的程序。首先,让我用伪代码解释一下要SPOT做的事情:
[我]:SPOT,我要你沿着一个圆形轨迹向前移动3.5圈,然后使用你的扬声器发出蜂鸣声!再这样做两次(共三次),然后检查你的光线传感器检测到的光线强度是否大于90。如果光线传感器没有触发,重复整个过程。
我可以使用一个包含移动模块及声音模块的循环模块,这个循环模块将重复执行三次。如图11-12。

图11-12  循环模块包含一个移动模块和一个声音模块并使用3次作为计数。

我已经拖了一个移动模块和一个声音到这个循环模块内。在控制部分,你会看到,我选择了计数器选项,并将其设置为3。下一步我想做的是检查光线传感器是否被触发。我已经添加并配置了光线传感器,如图11-13。

图11-13  光线传感器被添加到程序中

但现在有个问题。如果你浏览程序,你可以看到,循环模块将执行三次:移动模块和声音模块将执行三次,然后循环中止。然后光线传感器进行检测。如果光线强度大于90,则程序结束。但是,如果光线强度小于90将怎样呢?我怎样可以让程序再次执行呢?一种简单的做法是让SPOT再次执行程序。我必须按下智能积木块上的回车键以再次运行程序,这可以达到要求。但这是非常恼人的。应该有更简单的方法,确实是有的。
看一下图11-14,你会发现,我刚刚创建的整个程序将包含在另一个循环模块之内。

图11-14  现有一个循环模块在另一个循环模块之内

这就是所谓的嵌套循环,意味着在一个循环中还有另一个循环。当程序运行时,所有在外循环内的模块将会执行,包括内循环模块!首先,内循环模块将运行三次(执行它里面的移动模块和声音模块),然后中止循环。然后光线传感器会发送一个真/假逻辑响应到外循环模块的数据接头。如果光线传感器检测到的光照强度小于90,外循环模块不会中止,将再次执行它内部的任何模块。
请注意,在图11-14中有一个数据线连接了光线传感器和外循环模块。在外循环模块的控制部分,我选择了逻辑选项,并编程让它等待,直到它从光线传感器模块接收到一个真信号。如果光线传感器模块没有检测到大于90的光线强度,是/否数据接头将发送一个假信号给外循环模块,从而使外循环模块循环一次。
作为我的最后一个例子,图11-15显示了一种复杂的情况。你能确定会发生什么?

图11-15  循环模块无处不在

是的,这是循环内有循环再有内循环的三重循环模块!如果你仔细研究这个程序,你应该可以分析出程序运行时,将会发生什么。
首先,最内层的循环模块执行一个移动模块,直到触摸传感器被触发(在这个程序中是碰撞)。然后最内层的循环模块中止。接下来,中间循环模块开始执行一个移动模块,直到超声波传感器被触发。这时中间循环模块中止。然后,外循环模块开始执行一个移动模块,直到声音传感器被触发。最后,当声音传感器被触发,外循环中止,程序结束。
循环模块是一个非常有用和强大的模块,你必须花一些时间去尝试练习所有不同的选项。当你希望你的机器人重复某些模块时,你会经常使用循环模块。
现在,我有一个稍微复杂的练习来检查你的学习效果。在本章前面我曾提到一种情况,就是我必须在循环模块内最后一个NXT-G模块执行完毕后的准确时刻,按下左键——否则循环模块不能检测到有按钮按下,它会再次循环执行该程序。我们该如何解决这个问题呢?
练习11-1
仔细看一下图11-16。对你来说,它看起来可能有点奇怪,在主程序上方有一些额外的模块。你能明白程序是如何工作的?我使用了一个可能对你来说是全新的模块——变量模块。我将在第14章中详细介绍,但现在只跟随我并按我所述的进行配置。通过检查程序并修改它,以使当颜色传感器检测到一条红线时,中止循环。

图11-16  这个程序总是检查左键是否按下

我增加了一个额外的顺序条来创建这个程序。要做到这一点,将鼠标指针移到顺序条的开始端,如图11-17所示。

图11-17  在一个现有的顺序条的开始端再建一条新的顺序条

按住Shift键,单击并按住鼠标左键,一直拖动到新顺序条的第一个拐弯处。如图11-18。

图11-18  在新程序上拖出一条新顺序条
然后,放开鼠标左键并向右拖动指针。拖动它以增加新顺序条的长度,它将与下方的主顺序条并行运行。双击鼠标左键结束新顺序条的创建。如图11-19。

图11-19  向右拖动顺序条并与主顺序条平行

现在,放置一个NXT按钮等待模块到新的顺序条,如图11-20所示。(增加新的模块将自动向右延长顺序条。)

图11-20  添加NXT按钮等待模块到新顺序条

任何添加到新顺序条的模块将与主顺序条的模块并行执行。接下来,在顺序条上添加一个变量模块,并对其进行配置,如图11-21所示。

图11-21  添加一个变量模块到新顺序条并配置它读取Logic 1值

请注意,变量模块的配置面板将其动作部分设置为写,值部分设置为真。此外,在列表框中选择Logic 1值。
最后,在循环模块内添加另一个变量模块。从它的是/否数据接头拖一根数据线,如图11-22所示,按配置面板中显示的配置进行配置。

图11-22  在循环模块内添加一个变量模块并配置它来读取Logic 1值。

现在,当程序运行时,循环模块内的所有模块将被执行,直到变量模块发送一个真信号来中止循环。变量模块怎样得到真信号呢?在上面的顺序条中,当左键被按下后,它后面的变量模块将给称为Logic 1的变量写入一个真值。默认情况下,变量模块拥有一个假值。当左键被按下后,Logic 1值从假变到真...,然后当循环模块完成声音模块的执行,检测变量模块中Logic 1值,它现在拥有一个真值,循环将中止!
下一步内容?
现在你知道如何让你的机器人重复某些动作,如左转,向前走10圈。在接下来的第12章中,我将告诉你如何让你的机器人有做出选择的能力: SPOT应该左转,向前走5个圈,还是右转,向前走2圈?
练习解决方案
图11-23和图11-24显示了完整的程序和循环模块、颜色传感器等待模块及变量模块的配置面板(你可以将移动模块和声音模块按你的喜好进行配置)。再次请注意,我使用的循环模块配置为,当它检测到循环模块内的变量模块有一个逻辑真值时中止循环。对于颜色传感器配置面板,我通过拖动包围红色的左,右滑动条,并将比较部分设置为内部范围来检测红色。如果你想了解变量模块,可以直接跳到第14章,当结束第14章后,再回到这个练习。

图11-23  完整的程序和颜色传感器等待模块的配置面板

图11-24  循环模块的配置面板


图11-25  上部变量模块的配置面板


图11-26  底部变量模块的配置面板(循环内)
图11-1.JPG
图11-2.JPG
图11-3.JPG
图11-4.JPG
图11-5.JPG
图11-6.JPG
图11-7.JPG
图11-8.JPG
图11-9.JPG
图11-10.JPG
图11-11.JPG
图11-12.JPG
图11-13.JPG
图11-14.JPG
图11-15.JPG
图11-16.JPG
图11-17.JPG
图11-18.JPG
图11-19.JPG
图11-20.JPG
图11-21.JPG
图11-22.JPG
图11-23.JPG
图11-24.JPG
图11-25.JPG
图11-26.JPG
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-12-5 19:39:28 | 显示全部楼层
本帖最后由 James.Yang 于 2012-12-5 19:46 编辑

12 决策,决策
本章将介绍公用模块中的最后一个模块。当你完成本章后,你将具有可以给你的机器人创建一些复杂程序的能力,以使机器人移动,说话,听讲,碰撞,停止,等待及其它更多的动作。(但是还是有大量的NXT-G模块需要学习,所以不要停止学习!)
让我给你的机器人另一个智能——进行决策及从一堆可能的行为中进行选择。选择对你的机器人是非常重要的;随着机器人具有在2个或者更多选项中进行选择的能力,你的机器人可以完成更复杂的行为。
左或右?1号门还是2号门?
让我给SPOT的下一个任务一些伪代码:
[SPOT我要你向前转动3圈,然后停止。如果你的光线传感器检测到光线值大于30,则向左转。否则向右转。
到现在,你已经知道如何使用移动模块编程让SPOT向前移动3圈。但你如何使用光线传感器的光线值来帮助SPOT作出向左或向右转的决定?
回答很简单。你将使用如图12-1所示的开关模块。
12-1  开关模块让你的机器人作出选择
开关模块使用一个输入值来决定要执行的路径。这个值可能是一个数字,一些文本,或者是一个逻辑值(真或假)。且你也不限于两个路径。你可以配置开关模块来处理以下伪代码:
[SPOT,从15挑选一个随机数。
[:如果是数字1,向左转。
[:如果是数字2,向右转。
[:如果是数字3,旋转180度。
[:如果是数字4,旋转360度。
[:如果是数字5,继续前进。
在这个例子中,我让SPOT选择一个随机数。这将使用到第14章将要介绍的随机模块。但对目前来说,我们假定SPOT自己能够选择一个数字。现在,由于有5个潜在的数字(12345),它可以采取5个潜在的动作。在本章的剩余的部分,我将会使用路径这个术语来代替动作,因为开关模块允许你的机器人可以从它们所具有的不同路径中进行选择。
根据机器人选择的不同路径,将会有不同的动作发生。一个路径让你的机器人向前移动,并用超声传感器检测它前面的物体。选择不同的路径可能让同一个机器人作相反方向的运动,等待它的触摸传感器被按下,并记下电机旋转的圈数。这就是开关模块的强大之处。每个可能的路径选择可以拥有独特的编程模块,让你的机器人更加强大。(你可以在某一路径中再添加另一个开关模块,为你的机器人创建另一个路径选择!这就像嵌套循环模块,只不过这里用一个新的开关模块嵌入另一个已有的开关模块。)
平面视图和选项卡视图
现在,在我告诉你开关模块如何工作之前,我将提一下在开关模块配置面板中的一个特殊项目。请见图12-2
12-2  开关模块的平面视图
当使用开关模块时,你需要在平面视图和选项卡视图之间进行选择。当使用平面视图时,你需要选中平面视图的复选框(如图12-2所示)。 然而,必须注意,平面视图有一个限制。当使用平面视图时,你只有两条路径可供选择。注意图12-2中,有两条路径:一条路径带有“√”和另一条路径带有“X”。带有“√”的路径也被称为默认路径(稍后会作详细说明)。然而,如果使用传感器作为控制,默认路径和另外路径的图标会发生改变。我随后会展示一个简短的例子。
现在,在图12-3中,我已经取消平面视图的复选框,你现在可以看到,在开关模块顶部边缘有一些选项卡。
12-3  开关模块的选项卡视图
在选项卡视图,你必须点击一个选项卡以查看已放在它里面的程序模块(如果有的话)。然而,这是提供两个以上的选项能力所需要花的小代价。还记得上面提到的伪代码让SPOT挑选15之间的随机数?图12-4显示了一个包含5个选项卡的开关模块,每个选项卡对应于我要求SPOT完成的动作之一。
12-4  开关模块拥有5个不同路径的5个选项卡
选择
现在是时候向你介绍如何配置开关模块,以便于你用它来给你机器人一些选择。
在图12-5中,我已经放置一个开关模块,使用平面视图。这意味着我只能给我的机器人两种可能的路径。第一条路径(带有小花图标)在上部和第二条路径(带有小山图标)在底部。
12-5  开关模块有两个可能的路径。
这个例子也显示开关模块的功能。在控制部分,有一个能提供两个选项的下拉菜单:传感器和数值。选择传感器选项将配置为根据你所选择的传感器及其触发值来决定正确的路径。
在这个例子中,我选择了超声波传感器。我已经将超声波传感器配置为检测机器人面前小于64厘米(但不等于64)的地方是否有物体或障碍物。如果这一条件得到满足(真),开关模块将执行真路径上的所有模块(上部顺序条,小花图标)。如果条件没有得到满足(假),开关模块将执行假路径上的所有模块(下部顺序条,小山图标)。
目前,让我们假设SPOT安装了超声波传感器和声音传感器。我给SPOT以下的伪代码:
[SPOT,当你的超声波传感器在你面前小于64厘米的地方检测到一个物体时,如果你的声音传感器检测到的声级大于20,请左转。
我已经向你介绍了如何配置使用超声波传感器的第一个开关模块。让我们假设SPOT的超声波传感器在他的面前小于64厘米的地方检测到了物体。这意味着,在上部顺序条内的任何模块(真路径)将被执行。从伪代码知道,如果第一个条件得到满足,你要SPOT左转,必须在他的声音传感器探测到的声音大于20。你将如何做到这一点?简单 ——你将使用另一个开关模块!
首先,你拖放另一个开关模块到上部顺序条,并对其进行配置,如图12-6所示。
接着,配置第二个开关模块,使用声音传感器并检测声音是否大于20。如果条件得到满足,将执行第二个开关模块真路径(上部顺序条)上的任何模块。这里将是你放置移动模块并使SPOT左转的地方(如图12-7所示)。
12-6  使用声音传感器的第二个开关模块
12-7  当第一个和第二个开关模块的条件得到满足,SPOT将左转
这就是开关模块的嵌套。你还可以继续将开关模块嵌套下去。这将使你的机器人具有优秀的决策控制能力!
两个以上的条件
但是,如何编程让你的机器人测试多个条件?并非所有的情况下都只有两个选项,不是吗?让我们给SPOT另外一个例子。请见图12-8所示。
12-8  SPOT需做出几个决定
下面是伪代码:
[SPOT,当你到达走廊里的十字路口时,从13选一个数字。如果数字是1,向左转。如果数字是2,向右转。如果数字是3,继续向前。
要编程做到这一点,还记得若要使用两个以上条件时,不要选中开关模块平面视图的复选框。这是第一个要求。第二个要求是,当配置两个以上路径的开关模块时,开关模块必须被配置为使用数值选项。这可以在控制部分的下拉菜单中的找到,如图12-9所示。
12-9  开始一个不选平面视图的开关模块并使用数值选项
现在的开关模块拥有一个小的输入数据接头。此数据接头可以接受一个数字数据类型,一个文本数据类型,或一个逻辑数据类型,可以在类型部分的下拉菜单中选择数据类型。
使用伪代码,你可以看到三种可能的情况:
&#159;   如果SPOT选择1,向左转。
&#159;   如果SPOT选择2,向右转。
&#159;   如果SPOT选择3,继续向前。
在这个例子中,我将使用将在第14章中讨论的随机模块。现在,不用操心它是如何工作的,只要从模块共用区内拖放一个随机模块到顺序条,并将其放置在开关模块前面,如图12-10所示。(如果你确实想知道随机模块是如何工作的,就跳到第14章进行阅读,我会在这里等你。)
12-10  随机模块将生成123数值。
对于随机模块的配置面板,只需在最小值文本框内输入数值1,在最大值文本框中输入数值3,如图12-10所示。
从随机模块拖一根数据线到开关模块(如图12-11所示)。
12-11  用数据线将随机模块与开关模块连接
接下来,你需要对开关模块配置为可以接受两个以上条件。要做到这一点,再次点击一下开关模块(如果尚未选中),并看一下配置面板。在配置面板的左侧,你将看到条件部分(如图12-12所示)。
12-12  开关模块的条件部分
让我来解释一下你目前看到的内容。这是包含路径数值的路径列表。每个路径拥有一个开关模块要检查的默认值。在这个例子中,你会看到以下内容:
1.  0
2.  1
左边的12是可能条件,这个与你在开关模块上部边缘看到的选项卡数量是相匹配的。右边的01值是开关模块将用来选择路径的默认数字值。例如,如果输入到开关模块数据接头的数值是0,那么将选择第一个条件,并且执行第一个选项卡内的任何模块。
但是,你需要三个条件——对应于随机模块产生的数值123。要做到这一点,点击图12-12中的小小的加号按钮(+)。它将增加第三个条件,并自动配置它的默认值2。如图12-13所示。如果你单击新条件,你可以将默认值2改变为你喜欢的任意数字。下面你将要做这个动作。
12-13  有三种可能路径的开关模块
请注意,现在条件部分有一个新行:
1.  0
2.  1
3.  2
现在开关模块有三个选项卡。如果开关模块检测到数值2,将执行第3个选项卡内的模块。
这里有一个小问题:SPOT将只挑选数值123。但是,路径选项是012。你可以怎样改变它呢?如果你单击其中某一个条件,你可以在条件部分下部的文本框内改变它的值。首先,点击你想改变其值的条件(如图12-14所示)。
12-14  点击一个条件,改变它的值。
在这个例子中,选择了第三个条件,拥有一个默认值为2。在条件下面的文本框中输入数值3,如图12-15所示,然后按回车键。
12-15  点击你要改变数值的条件
你也可改变第一和第二个条件,分别将他们的值改为12,如图12-16所示。
12-16  更改所有条件的数值。
默认的决策
最后,你也许已经注意到条件旁边的钩。在图12-16中,它是在第二个条件(由数值2表示)旁边。“√”标记表示在开关模块不能做出决定时,该条件作为开关模块使用的默认值并选择它相对应的选项卡(以及它的模块)。例如,假设我已经配置随机模块选择15之间的一个值。但如果随机选择了45,没有配置特定的条件让他们做什么。假设你想让453一样处理。在这种情况下,将执行第三个选项卡上模块,因为你已经点击小星号(*)按钮选择了条件3,如图12-17所示。
12-17  配置开关模块的默认设置

注意:当遇到一个开关模块时,必定会发生一些动作。程序中必须有一个条件得到满足以便继续运行。因此,在大多数情况下,必须指定一个默认条件。你可以对某一个条件给条空路径,不包含任何NXT-G模块。当对某个条件不需要动作时,可以设置一条空路径并将其设为默认路径。因此,当一个传感器或随机模块或其它模块没有触发开关模块中指定的条件,默认条件就会被选中,没有模块被执行,结束开关模块并继续运行程序。

警告:必须注意,对同一个数字不能有两个或者两个以上的条件。这是因为开关模块会被搞混,不知道该走哪条路径。理解了吧?如果条件1对应数值1,条件2也对应数值1,如果随机模块发送数字1,开关模块将选择哪条路径?幸运的是,开关模块很聪明,不会让你犯这样的错误。
执行!
现在,你已经配置了三个条件以及默认条件(条件3),你可以放置让SPOT左转、右转及继续向前的移动模块。
如果SPOT选择1,他就左转。因此,点击第一个选项卡(如图12-18所示),放置一个可以让SPOT左转的移动模块。
12-18  如果SPOT选择1,将执行第一个选项内的移动模块
我会对第二个和第三个选项卡做相同的操作。当随机模块生成一个13的数字,这个数字传递到开关模块。开关模块取得这个数字,并与其条件部分中的数值进行比较。如果随机模块发送一个数字3,开关模块取得这个数字,并知道与第三个条件的3相等,然后执行第三个选项卡上所有模块。简单!
然而还有最后一个警告——如果随机模块发疯似的发送了一个数字45给开关模块,将会发生什么?没有条件与数字45相匹配,因此会发生什么?不错,还记得当你选择了一个条件,并点击了*键,条件旁边出现一个“√”标记吗?“√”标记指定了默认的条件。再回头看一下图12-17。“√”标记在第三个条件旁边。这意味着,如果随机模块提供了一个数字45,就会选择默认路径。因此,对数字45100,或任何其他非12的数字,将执行第三个选项卡内的模块。
开关模块是给你的机器人具有强大的决策能力的一个非常有用的模块。开关模块可以使用逻辑值(真或假),数字,文字,和传感器,由机器人来选择执行哪些路径。请记住,当你需要机器人具有根据不同类型的输入,做出不同决策能力时,需要使用开关模块。
随着编程技能的提高,你会发现开关模块是你最喜欢使用的工具之一。
现在,在结束本章内容进入一些更高级的NXT-G模块之前,我想让你尝试创建一个满足练习12-1要求的NXT-G程序。如果你有问题,我在本章末尾提供了答案。
练习12-1 向左还是向右?
编程让SPOT检查他的周围并根据传感器输入做出一些决定。SPOT应按以下规则在室内走动:
&#159;   向前移动直到颜色传感器检测到地板上有红色或黄色胶带。
&#159;   如果检测到红色胶带,左转90度并向前移动10圈。
&#159;   如果检测到黄色胶带,右转90度并向前移动10圈。
下一步内容?
在接下来的几章中,你将会学习一些特殊模块。你将学习到停止机器人程序执行的模块。不管你相信与否,停止及什么都不做,有时就是机器人要做的事情。学习完停止模块后,将学习随机模块。随后还有很多模块,所以不要停止。
练习解决方案
练习12-1的解决方案可以参见图12-19至图12-24。请注意,第一个等待模块是用来检测是否有有色胶带(红色或黄色),通过在颜色传感器等待模块配置面板上拖动条件滑动条来指定颜色。一旦发现一个红色或黄色的胶带,开关模块将检测胶带以确定它是否是红色。如果是红色,图12-21指定的条件为真,在开关模块上部的移动模块将被执行(见图12-22)。如果胶带不是红色,那么它必定是黄色的(因为颜色传感器等待模块只有是红色或黄色时才中止),这将导致开关模块底部的移动模块被执行,如图12-23所示,(机器人向右旋转)。当转弯结束后,最后一个移动模块将使机器人向前移动10圈(如图12-24所示)。
12-19  完整的程序和第一个移动模块的配置面板
12-20  颜色传感器等待模块的配置面板
12-21  开关模块的配置面板
12-22  真路径上的移动模块的配置面板
12-23  假路径上的移动模块的配置面板
12-24  最后一个移动模块的配置面板
图12-1.JPG
图12-2.JPG
图12-3.JPG
图12-4.JPG
图12-5.JPG
图12-6.JPG
图12-7.JPG
图12-8.JPG
图12-9.JPG
图12-10.JPG
图12-11.JPG
图12-12.JPG
图12-13.JPG
图12-14.JPG
图12-15.JPG
图12-16.JPG
图12-17.JPG
图12-18.JPG
图12-19.JPG
图12-20.JPG
图12-21.JPG
图12-22.JPG
图12-23.JPG
图12-24.JPG
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-12-10 21:39:56 | 显示全部楼层
本帖最后由 James.Yang 于 2012-12-10 21:41 编辑

第13章 停止
这将是另一较短的章节。对一个只是简单停止程序执行的模块你能讲多少呢?
停止模块
对停止模块你必须要知道的最重要的事是:当机器人在程序的任何地方遇到一个停止模块,机器人将停止在那个地方,不会有进一步的行动(只有一个例外,就是使用数据线,后面将作详细讲解)。
你为什么需要一个停止模块?除非你在程序中设置了一个使程序一直运行的循环模块,机器人在程序结束后总会停止(或者一个循环模块包含了程序中所有的模块,这将意味着程序将一直运行下去,除非按下取消按钮或者在程序内部遇到一个停止模块)。
但为什么要停止模块?这是因为一旦你开始了一个循环,你需要一种停止循环的方式。
一个循环例子
停止模块如图13-1所示。注意,在它的数据中心,只有能使用逻辑数据类型的一个输入接头及一个输出接头。

图13-1  停止模块及它的配置面板

正如我前面提到的,当程序遇到停止模块时,将立即停止该程序,除非数据线给停止模块的输入数据接头提供了一个假(信号)输入。让我们来看一看图13-2中的例子。

图13-2  使用停止模块的简单例子

在图13-2中,我给了SPOT一个小程序。程序是一个循环模块,包含了一个触摸传感器模块,一个停止模块,一个声音模块。当程序运行时,每当循环模块进行循环时,SPOT将发出蜂鸣声(通过声音模块)。这将一直持续到触摸传感器被按下。当触摸传感器按下后,将传递给(通过数据线)停止模块的数据输入接头一个真信号,程序将停止。只要触摸传感器不被按下,停止模块将一直从触摸传感器接收到一个假信号,程序就不会停止。简单!
无条件停止
如果我不将触摸传感器与停止模块进行数据连接,如图13-3所示,你认为将会发生什么?

图13-3  改变示例程序的数据线将整个改变运行结果

你可以上传程序并运行它,但是如果你对这个简单的程序进行视觉检查,我想你能指出结果。
当程序运行时,循环模块开始循环,触摸传感器执行,随后运行停止模块。程序是否会执行声音模块呢?答案是否定的。还记得我开始的规则:当程序执行到停止模块时,程序将停止,且不会有进一步的行动。这个程序将立即停止并且不会执行声音模块(运行你的程序来自己证实它)。
开关模块与停止模块
你也许在想在什么时候你需要在程序中加入一个停止模块。不错,一个回答涉及到开关模块。回想一下,使用开关模块可以使你的机器人选择不同的行为路径,一个路径可能使你的机器人执行一系列复杂的行为,但另一个路径可能只是简单的停止模块。请参见图13-4,它显示了一个描述这个过程的例子。

图13-4  一个开关模块最好需要一个停止模块以确保机器人的安全

在这个例子中,我将SPOT放置在一个高的桌子上,SPOT的触摸传感器朝下安装并碰到桌子,因此它的按钮一直被按着。当SPOT到达桌子边缘时,触摸传感器的按钮将不再被按下,对不对?(没有桌面来继续按着按钮。)
图13-4显示了一个循环模块包含了一个开关模块。我将开关模块配置为检测触摸传感器按钮是否被释放,如果按钮被释放,真路径将被执行;如果按钮被按下,假路径被执行。我希望当SPOT检测到按钮被释放后立即停止,所以我在真路径中放置了一个停止模块,在假路径中放置了一个移动模块。只要按钮被按住,SPOT将一直向前移动,但是为了SPOT的安全,一旦按钮被释放(说明SPOT到达了桌子边缘),我希望程序立刻停止。这个程序的决窍是将触摸传感器安装在SPOT前面较远的地方,这样当按钮被释放时,SPOT还能安全地远离桌子边缘。请试一下!
测试用停止模块
停止模块使用非常简单。作为一个测试工具,当你在测试一个程序,且不想让程序在某一点继续执行时,你可以放置一个停止模块。例如,让我假设你的机器人要完成3个独立的任务,一个接着一个。在第一个任务编程模块后面放置一个停止模块,将使你在运行程序来检查确保完成了相应的任务。如图13-5所示。如果程序运行正确,移除这个停止模块,在第二个任务编程模块后面放置另一个停止模块。现在你运行程序,你的机器人将执行第一个和第二个任务的所有步骤,但不包含第三个任务。

图13-5  在测试长程序时使用一系列的停止模块

在图13-5所示的程序中,SPOT将无限地向前移动,只有当声音传感器等待模块被触发时,SPOT将转动一个特定的角度。我想测试不同数值的转动角度,所以我在程序中放置了一个停止模块,这样SPOT就不会再向前移动(由程序中的第三个移动模块控制)。当我得到了第二个移动模块中配置的确切角度值,我将去除第一个停止模块,重新给SPOT上传一个新程序,将执行程序的下一部分(动作相同,只不过是由颜色传感器等待模块触发)。
停止模块在需要的时候都可以使用——为了测试,或者为了建立一种当某一条件满足(或不满足)时,让程序自动停止的方法。这是NXT-G最简单的模块之一,但同时也时非常有用的模块之一。
下一步内容?
现在是结束本章并移到下一章的时候了,它不是随机模块的章节,但它确实涵盖了随机模块。对不起,我无法避免。
图13-1.JPG
图13-2.JPG
图13-3.JPG
图13-4.JPG
图13-5.JPG
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-12-13 20:16:58 | 显示全部楼层
本帖最后由 James.Yang 于 2012-12-13 20:18 编辑

第14章 挑选任何一张牌
你是否遇到有人玩扑克游戏,要求你从一副牌中挑选一张扑克?一副标准的扑克共有52张扑克(大小王不算),如果扑克被正确的洗过,你应该能从一副牌中随机挑到一张扑克。
对掷一对骰子来说也一样。每个骰子可以掷到1到6之间的一个数。当你投掷一对普通的骰子时,出现的数字是随机的。一个骰子掷到2的机会与掷到6的机会是一样的。它们出现的可能性是一样的。出现这种情况的原因就是随机性。
你的机器人同样具有产生随机数字的能力。你也许想建造一个机器人可以投掷一对虚拟的骰子,或者从1到1000之间选一个数。继续学习如何让你的机器人产生一个随机数字并将他们显示在LCD屏幕上。
随机模块
你的机器人可以使用随机模块产生你所定义范围内(最小值和最大值)的数字。也可以通过使用数据线来提供产生随机数的 最小值及最大值。随机模块可以在完整面板数据弹出菜单中找到。参见图14-1的随机模块和它的配置面板。

图14-1  随机模块和它的配置面板

随机模块是另一个使用非常简单的模块。它没有太多的选项可供配置,但是它很重要。
配置面板中第一个要你注意的事项是在范围部分的最小值与最大值数字字段。在这两个文本框内,你可以输入你要求随机模块产生的随机数的上、下限。对NXT-G 1.0版本,最小值不能小于0,最大值不能大于32767。对NXT-G 2.0版本,最小值可以是负数。
还可以使用另一种方法来定义最小值和最大值。在最小值和最大值下方滑条上有两个小方块,你可以拖动最左边的小方块来设置最小值,拖动最右边的小方块来设置最大值。


注意:必须要注意的是,滑动条只能定义0-100之间的范围。如果你要定义的最大值超过100,你必须在最大值文本框内输入数字。如果你使用的是2.0版本,也必须在最小值文本框内输入负数,滑动条不能接受小于0的设置值。


现在使用伪代码给SPOT一个例子:
[我]:SPOT,产生一个20到80之间的随机数,并显示在LCD屏幕上,直到我按下左键。
为了完成这一点,我首先得拖放一个随机模块到顺序条(如图14-1所示)。我已告诉SPOT最小值不要小于20,所以我使用滑动条来设置最小值(如图14-2所示)。

图14-2  设置最小值为20的随机模块

现在,如果我想产生的数字在20到80之间,但不包含20,如何达到?记住,你所定义的最小值与最大值将包含在随机模块产生的可能的数字之中。因此,如果我不需要20作为一个可能的数字,我只需将滑动块移动一下,重新设置最小值为21即可。这样做以后,21可能会出现,但20再也不会出现。
最后一个步骤是设置最大值,拖动滑动块,设置最大值为80(如图14-3所示)。

图14-3  设置最大值为80的随机模块

现在剩下的事情就是让SPOT将数字显示在LCD屏幕上。为了完成这一点,我将引入另一个NXT-G编程模块:数字转文本模块。
数字转文本模块
数字转文本模块同样可以在完整面板数据弹出菜单中找到。我将其拖放到随机模块后面,这样你能看到其配置面板(如图14-4所示)。

图14-4  数字转文本模块用于将数字显示在LCD屏幕上

为什么我需要使用数字转文本模块?请记住,显示模块只能够显示图像,文本及图画,由于它不能显示数字,我们必须将数值转换为文本。文本值“1”与数字值“1”是不同的,——文本值“1”就同字母表中其它字符一样处理。
数字转文本模块需要将在LCD屏幕上显示的数字通过其单个输入数字接头输入或者在配置面板中的数字字段输入。然后数字将被转换为能通过显示模块进行显示的文本。所以,下一步将随机模块的输出数字数据接头拉一根数据线到数字转文本模块的输入数字数据接头。请参见图14-5。

图14-5  从随机模块拉根数据线到数字转文本模块

正如你能从图14-5中看到的,你想要显示的文本将从数字转文本模块的输出数据接头输出,我拖放了一个显示模块,并将从数字转文本模块的输出文本数据接头拉根数据线到显示模块的输入文本数据接头(如图14-6所示)。请记得将显示模块的配置面板中配置为显示文本,而不是图像或图画。
经常容易犯的一个错误是,从随机模块的数据输出接头拉一根数据线到显示模块的最后一个具有“#”标记,看起来是需要输入数字的数据接头。这个数据接头是控制圆的半径的(如果要在LCD屏幕上画个圆),因此,按上述方法进行数据连接的话,只是使用随机模块来控制圆的半径而不是将其数值显示在屏幕上。需要将随机模块产生的数字在屏幕上显示的唯一方法是使用数字转文本模块。

图14-6  从数字转文本模块拉根数据线到显示模块

这次我不采用前面例子中使用的时间等待模块来保持文本显示,而是使用NXT按钮等待模块,随机模块产生的随机数字将一直显示在LCD屏幕上,直到按下左键。
为了达到这一点,我拖放了一个NXT按钮等待模块,其配置面板如图14-7所示。

图14-7  产生的随机数将一直显示在LCD屏幕上直到按下左键
我将等待模块的控制部分设置为传感器。在传感器部分,我在下拉菜单中选择了NXT按钮。在按钮部分,从下拉菜单中选择左键,最后,在动作部分,我选择了按下。通过这种方式的配置等待模块,产生的随机数将一直显示在LCD屏幕上,直到按下智能积木块的左键,然后程序停止。
不是很复杂,嗯?
关于数字转文本模块最后需要指出的一点是其输出数字数据接头。这个模块仍然可以将产生的随机数保持为数字类型,你可能会在程序的其它部分用到这个数字。如果是这样的话,你可以从输出数字数据接头拉一根数据线——它仍然是个数字而没有变为文本。
现在你知道了如何使用及配置随机模块,例如:如果你需要机器人在房间在随意走动,你可以使用随机模块产生一个1到4之间的随机数,编程让机器人按以下方式走动:如果数字为1,机器人左转,如果数字为2,机器人右转,如果数字为3,机器人前进,如果数字为4,机器人后退。通过使用随机数来控制机器人的方向,可以使机器人具有一些不可预知的行为。参见第12章关于开关模块的讨论,使用象随机数一样的条件来控制运动。
现在来看一下你对随机模块是如何工作的 。仔细阅读练习14-1并为SPOT建立一个新程序。如果你卡住了,我在本章的结尾提供了一个可能的解决方案。
练习14-1
创建一个新程序,让你的机器人向前(从开始位置)移动一定的随机数角度(到结束位置)。然后让机器人向后随机移动一个距离,从而使它停止在开始位置与结束位置中间的某个位置。让机器人显示其向前移动的角度数(到结束位置),并显示其后退的圈数,并让它们一直显示在屏幕上。当运动结束后,使用等待模块,使你在程序结束前有时间去看屏幕上的数字。
下一步内容?
在接下来的第15章,我们将讨论比较模块。比较模块使用两种数据——数字数据及逻辑数据。它比较两个数值,得到一个逻辑数据类型——真或假——这取决于你如何配置要比较的两个数。有点混乱?在下一章将会清楚。
练习可能解决方案
图14-8到图14-16给你提供了练习14-1的完整程序及配置面板。

图14-8  产生的数字将一直显示在LCD屏幕上直到按下左键

在图14-8中,我配置了一个随机模块产生一个在90到180之间的随机数,因此机器人转动是最大角度为180度,最小角度为90度。

图14-9  产生的数字将一直显示在LCD屏幕上直到按下左键

图14-9为灰色因为我使用数据线为模块提供数据

图14-10  产生的数字将一直显示在LCD屏幕上直到按下左键

图14-10表明我在显示模块的动作部分选择了文本,对第一个显示模块,我选中了显示复选框(为了清除LCD屏幕)。

图14-11  产生的数字将一直显示在LCD屏幕上直到按下左键

图14-11表明机器人已被配置为使用角度来向前移动。

图14-12  产生的数字将一直显示在LCD屏幕上直到按下左键

图14-12显示了第二个随机模块。这次配置了范围为10到80。这是为了确保当机器人向后退时能停在开始位置与结束位置中间的某个位置。

图14-13  产生的数字将一直显示在LCD屏幕上直到按下左键

图14-13显示了另一个数字转文本模块。这将使产生的第二个随机数字传给下一个显示模块。

图14-14  产生的数字将一直显示在LCD屏幕上直到按下左键

请注意,在图14-14中,我没有选中显示部分的复选框,同时将显示第二 个数的行改为第6行。这可以确保原先产生的随机数与新的随机数能同时显示在LCD屏幕上。

图14-15  产生的数字将一直显示在LCD屏幕上直到按下左键

另一个移动模块用于让机器人向后退回一个随机角度,如图14-15所示。

图14-16  产生的数字将一直显示在LCD屏幕上直到按下左键

最后,当机器人完成它的动作后,两个随机数将一直显示在LCD屏幕上,直到用户(你)按下右键,配置如图14-16所示。
图14-1.JPG
图14-2.JPG
图14-3.JPG
图14-4.JPG
图14-5.JPG
图14-6.JPG
图14-7.JPG
图14-8.JPG
图14-9.JPG
图14-10.JPG
图14-11.JPG
图14-12.JPG
图14-13.JPG
图14-14.JPG
图14-15.JPG
图14-16.JPG
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2012-12-14 13:12:58 | 显示全部楼层
楼主 功德无量!!!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2012-12-15 20:47:21 | 显示全部楼层
楼主辛苦了,不好好学对不起楼主
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-12-16 20:18:24 | 显示全部楼层
谢谢楼上两位的支持,没有你们的支持,我会丧失动力的。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-12-16 20:18:59 | 显示全部楼层
本帖最后由 James.Yang 于 2012-12-16 20:20 编辑

第15章 苹果和桔子
有句谚语:“这就象拿苹果与桔子进行比较。”它的意思是指比较两样不相同的物体有时是不公平的。我说“有时”,是因为在其它时间是完全公平的。假设我给你一个苹果和一个桔子,哪个更重?哪个更大?这是都不是不公平的问题,对不?
因此,有时你是能够比较苹果与桔子的!当涉及到你的机器人时,同样也有让机器人比较事物的方式——不是苹果与桔子,而是数字。
逻辑
还记得我们在第8章讨论了逻辑的概念?真的还是假的?(如果你回答是否定的,那么你需要返回第8章重新学习!)
不错,NXT-G拥有一个称为比较模块的编程模块,它依赖于你对逻辑的理解。
假如我问你:“5比3大吗?”你的答案是:“是的。”当你编程时,给计算机或机器人同样的问题时要用陈述句形式,“5大于3。”对于机器人来说,这个陈述句可真可假。
同样地,如果我问你:“地球是方形的吗?”你的答案是:“不是的。”机器人不会这样问问题,而是告诉你:“地球是方形的。”最终得到的结果是否定的。
因此,有个重要的事实要记住:机器人用肯定或者否定来回答陈述句。要达到这个目的,机器人需要依赖于比较模块。
一个随机例子
在我介绍比较模块之前,让我们用伪代码给SPOT创建一个测试程序:
[我]:SPOT,请你用随机模块创建两个在1到9之间的随机数(数字A和数字B),将他们显示在LCD屏幕上,并告诉我A是否大于B。
为了完成这个要求,我们拖放两个随机模块(见第14章)到顺序条,如图15-1所示。我已将两个随机模块配置为相同的配置,如配置面板所示。

图15-1  两个随机模块将产生两个随机数进行比较


图15-2  将随机数字转换为文本

下一步,我通过数字转文本模块将他们转换为文本(如图15-2所示)。数字转文本模块的信息请复习第14章。
在进入比较模块之前,我使用文本模块创建一个“A大于B”形式的语句,如图15-3所示。文本模块允许你在A、B、C三个文本框内输入最多三条文本,见图15-3所示。你也可以使用数据线给这些文本框提供文本,我已将他们与数字转文本模块进行了连接(同样如图15-3所示)。

图15-3  创建一个在LCD屏幕上显示的文本语句

正如你在图15-3可以看到,第一个随机模块作为第二个数字转文本模块(左起第四个模块)的输入,第二个随机模块作为第一个数字转文本模块(左起第三个模块)的输入。
对文本模块,我将第一个数字(现在已转换为文本)作为A数据接头的输入。同样,我将第二个数字(现在已转换为文本)作为C数据接头的输入。我在B文本框内输入文字“大于”。这将创建一条语句(称为陈述句):A大于C(这里的A和C将是1到9之间的数字)。
现在我将这个组合的文本发给显示模块,显示模块被配置为在第三项X=2及Y=40的地方显示(见图15-4)。

图15-4  显示模块将在LCD屏幕上显示一条语句
比较模块
现在我们可以来看一下比较模块是如何工作的。(不好意思,拖了这么久才提到比较模块,但是比较模块本身不能完成任何事情——我们必须要有一个能进行比较的很好的例子来了解它的动作。)
我将创建一条平行运行的顺序条。为了达到这个目的,我按下Shift键并拖出一条额外的顺序条,如图15-5所示。

图15-5  一条额外的顺序条用来比较数字

这条并行的顺序条将使我对数字A与数字B进行文本转换的同时,进行比较。记住,我将检查语句“A大于B”是否正确,并决定它是真是假。因此,我不仅要将此语句显示在屏幕上,而且还要判断A是否真得大于B。
首先我需要做是拖放一个比较模块到新的顺序条上,如图15-6所示。

图15-6  比较模块将检查数字A是否大于数字B

注意到图15-6的比较模块有两个输入数据接头。我将从数字转文本模块的输出数字数据接头得到原始的随机数字,连接数据线到比较模块的两个输入数据接头。


注意:回到第14章,我曾经提到数字转文本模块有一个输出数字数据接头能够保持数字数据类型而不是文本类型。你现在可以使用这个能力将两个原始的随机数字输入到比较模块。


仔细的从第二个数字转文本模块(左起第四个模块)连接数据线到数值A的输入数据接头。同样将第一个数字转文本模块(左起第三个模块)连接数据线到数值B的输入数据接头。这个配置如图15-7所示。

注意:有时NXT-G会尝试调整你的布线以避免线条混乱。在图15-7中,你可能已注意到从随机模块出来的数据线已被分开。对我来说,这是自动发生的,即使我从数字转文本模块的输出接头拉数据线,一旦我放掉鼠标以完成数据线连接,NXT-G将改变他,将随机模块数据线进行分叉。



图15-7  使用原始数据作为比较模块的输入

现在点击比较模块来看它的配置面板(如图15-8所示)。

图15-8  比较模块的配置面板
比较模块配置面板在其操作部分有一个下拉式菜单,点击这个下拉菜单,你可以看见三个选项,小于,大于和等于。
如果你选择“小于”选项,比较模块将评估语句“A小于B”并判断它是真还是假。如果你选择“大于”选项,比较模块将评估语句“A大于B”并判断它是真还是假。如果你选择“等于”选项,将评估语句“A等于B”。
在我的例子中,我选择了“大于”选项,如图15-8所示。现在,我的程序将从A与B得到数据,检查并判断A是否大于B。比较模块完成比较后,它的答案将从输出结果数据接头输出。从该输出接头可以得到一个逻辑数据类型(真或假),并提供一个逻辑真或假的数据信号。
逻辑值的显示
如果我们回到伪代码,我们将看到我是希望真或假与原来的语句“A大于B”一起显示在LCD屏幕上。要达到这一点,我将使用第12章讲到的开关模块。
为了使之能正确运行,需要配置一系列项目。我拖放一个开关模块到比较模块后面,在其显示部分,选中平面视图复选框(见图15-9)。在控制部分,我选择了值,在类型部分,我选择逻辑。同时,我从比较模块的输出结果数据接头连了数据线到开关模块的输入数据接头。

图15-9  开关模块将帮助我显示真或假到屏幕上

下一步,我将决定当开关模块从比较模块得到一个真或假信号时将会发生什么。我们先从开关模块上部的真路径开始,如图15-9所示。
如果语句正确,我将发送一个字符“真”到LCD屏幕,我拖放了一个包含“真”字的显示模块,请参见图15-10。
同时,我没有选中清除复选框,这样“A大于B”的语句不会在LCD屏幕上被清除掉。我同时将文本显示在X=2和Y=8的位置,这样文字“真”将显示在原来语句“A大于B”的下方。

图15-10  包含文字“真!”的显示模块

现在我将配置开关模块下部的假路径的显示模块。图15-11显示了一个新的显示模块。

图15-11  包含文字“假!”的显示模块

图15-12显示了我如何配置这个“假!”显示模块——请注意,我将这个显示模块的文字显示在同一位置,X=2和Y=8,且不要选中清除复选框。

图15-12  “假!”显示模块的配置面板

最后,我拖放了一个NXT按钮等待模块并配置为等待左键按下,这将使我有时间看到显示在LCD屏幕上的结果(见图15-13)。
测试运行
让我们再次检查一遍程序并看看他是如何运行的。首先,两个随机模块将产生两个随机数A和B,这两个数字转换为文本(通过数字转文本模块),然后这两个“文本数字”组合成一过话“A大于B”,并将其输入到显示模块。
随机模块产生随机数后,这两个数同时输入到比较模块,并检查A数是否大于B数,如果A数大于B数,开关模块将执行真路径上的显示模块,并在LCD屏幕上显示文字“真!”。如果A数不大于B数,开关模块将执行假路径上的显示模块,并在屏幕上显示文字“假!”。

图15-13  最后的NXT按钮等待模块阻止程序停止

我鼓励你自己创建这个程序并测试它,你将会对使用数据线有更好的理解,你还可以修改它。尝试将条件改为“小于”或“等于”,看看结果会有什么改变。
你是否对比较模块有了清晰的认识?在进入下一章之前,请尝试完成练习15-1。如果需要帮助,我将在本章结尾处给出一个可能的解决方案。
练习15-1 高兴还是伤心
编程产生一个50-150之间的随机数,将这个数显示在屏幕上并同时显示“小于100?”当用户按下左键后,如果语句正确,显示一个笑脸,如果语句错误,显示一个皱眉的脸。将这个脸一直保持到用户按下右键,然后结束程序。
下一步内容?
结束本章后,我们将在下一章介绍范围模块。
练习解决方案
图15-14到图15-23提供了练习15-1解决方案的完整程序及配置面板。注意我对比较模块的B数人工输入了一个100。

图15-14  完整的程序和随机模块的配置面板


图15-15  数字转文本模块的配置面板


图15-16  第一个显示模块的配置面板


图15-17  第二个随机模块的配置面板


图15-18  比较模块的配置面板


图15-19  第一个NXT按键等待模块的配置面板


图15-20  开关模块的配置面板


图15-21  第三个(真路径)显示模块的配置面板


图15-22  第四个(假路径)显示模块的配置面板


图15-23  最后一个NXT按钮等待模块阻止程序结束
图15-1.JPG
图15-2.JPG
图15-3.JPG
图15-4.JPG
图15-5.JPG
图15-6.JPG
图15-7.JPG
图15-8.JPG
图15-9.JPG
图15-10.JPG
图15-11.JPG
图15-12.JPG
图15-13.JPG
图15-14.JPG
图15-15.JPG
图15-16.JPG
图15-17.JPG
图15-18.JPG
图15-19.JPG
图15-20.JPG
图15-21.JPG
图15-22.JPG
图15-23.JPG
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2012-12-19 09:14:40 | 显示全部楼层
等待中!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2012-12-19 19:26:57 | 显示全部楼层
努力进行中
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-11-21 16:48 , Processed in 0.109825 second(s), 19 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表