基于Google App Inventor软件的Android手机遥感遥控乐高机器人
0赞

请先看第一篇文章:Android手机的Google App Inventor编程入门
文章地址: http://blog.chinaaet.com/detail/24202.html
第一篇文章讲解了,如何创建Google App Inventor编程环境;如何让Android手机与个人电脑同步联机;和如何进行App Inventor程序编制与运行。有了这些基础,再看这篇文章,容易理解些。
这篇文章主要讲如何编制程序,让Android手机读到乐高NXT机器人的传感器信息,如何让Android手机能够遥控驱动NXT伺服电机,以使机器人执行各种动作。
第一篇文章讲解了如何让Android手机与个人电脑同步联机,但是遥感遥控NXT机器人还要做到让Android手机与NXT控制器的联机,以下是具体步骤:
1、确认NXT控制器的蓝牙是否已开启。
2、Android手机→设置→无线和网络→蓝牙打勾。
3、Android手机→设置→无线和网络→扫描蓝牙设备。
4、点选想要配对的NXT控制器名称,NXT控制器会“嘟”一声,请按下控制器上的橘色按钮,接着在手机上输入联机确认码:1234。
5、配对完成后该NXT控制器状态会在您的Android手机上显示为“已配对,但尚未连接”。因为连线是由App Inventor程序发起,所以这样就算配对完成。
从第一篇文章知道,App Inventor程序分成两个部分:1)Designer外观设计页面;2)Blocks Editor程序编辑界面。Designer设计页面是用来布置输入输出元件,设计人机交互面板的地方;Blocks Editor程序编辑界面用来编写输入元件与输出元件之间程序逻辑的地方,即输入什么信息,然后经过什么样的程序逻辑的处理,产生什么输出。
看第一张图,我设计的Android手机人机交互界面,这个界面有一些输入输出元件,有按钮Button,列表ListPicker,文本Label,图片Label,还有非可视元件Non-visible components。现在我把程序中用到的元件以表格的形式展示出来,然后在讲下这个表格如何看明白。

例如:Button元件是从父类别库里提取出来的,Button的父类别是Basic,Button元件提取出来后,会自动命名为Button?,?即1或者2、3…,假如是Button1,Button1这样命名可读性不好,于是一般要重命名,比如:ButtonConnect,然后要对元件的属性进行设置,象ButtonConnect元件要修改的属性是:FontSize:20.0 Text:连线NXT Width:Fill Parent。
HorizontalArrangement1元件是一种水平布局元件,例如我把ButtonConnect元件和NXTlist元件放到Horizontal Arrangement1元件的矩形框里,这两个元件就可以水平排列了。
下图以ButtonConnect元件为例,展示了在Designer设计页面中该元件的创建路径。

上表中有两个Image图片元件,用到的图片请下载:
6030652019996.zip
要使用App Inventor来遥控乐高NXT机器人时,需要在Designer设计页面中加入一个BluetoothClient元件,它是用来处理手机与机器人之间的蓝牙通讯。还要加入NxtDirectCommands元件,把它的BluetoothClient属性指定为BluetoothClient。另外这个项目还用到了一个超声波传感器NxtUltrasonicSensor元件,和两个电机NxtDrive元件,记住它们的BluetoothClient属性都要指定为BluetoothClient,其它属性设置见下表。(表中的元件都与蓝牙功能相关)

Designer页面设计的只是人机交互面板,面板需要Blocks Editor程序支持,下面介绍如何打开Blocks Editor程序编辑界面,如何编辑程序。
看上篇文章介绍的那样,点击Designer页面设计右上角的“Open the Blocks Editor”,Google浏览器会自动下载,ApplnventorForAndroidCodeblocks.jnlp文档,点击它,就可以打开Blocks Editor界面。然后我们编程!

根据Designer页面,Blocks Editor界面的编程任务是:点选“搜索NXT” NXTlist,出现一个列表,选取BluetoothClient元件连接的NXT蓝牙设备,再点击“连接NXT”Button,Android手机与乐高机器人联机。实时显示超声波测距值,点击“前进”,“后退”和“停止”Button,机器人车会直线行走,超声波测距值会实时变化。
在Blocks Editor界面,在它的左上角有两个选项:内建指令(Built-in)与自订指令(My Blocks),点击之后会展开并显示其下的指令。内建指令是常用的标准指令,自订指令则是根据你刚才Designer页面设计中制作的元件来显示对应的指令。以下介绍的指令除了if指令和number指令外,都是从自订指令选项库里提取出来的。

请从Blocks Editor→My block→NXTlist指令类中找到when NXTlist.BeforePicking与NXTlist.Elements指令;接着从BluetoothClient指令类中找到BluetoothClient.AddressAndNames指令,并如上图相互拼接。本段程序任务:把手机搜索到的NXT蓝牙设备加入到NXTlist列表中。这个程序段的编辑过程如图,此图也包含了所有的程序段。

下面我一个个程序段介绍它们完成的任务,就不细谈各元件的指令从哪里提取出来的。

ButtonConnect程序段任务是:点击ButtonConnect(文本属性:连线NXT)按钮,根据在NXTlist列表中点选的NXT蓝牙设备地址与该设备蓝牙连接,好像if指令可以不要。哈哈。

Button Forward程序段任务是:点击ButtonForward(文本属性:前进),B、C电机(MoveForwardindefinely)正转,功率B电机为70,C电机为67。两个功率数值之所以不同,是因为两个电机即使功率值设置得一样,两个电机的实际转速也不会完全一致,我的这个实验用NXT小车的功率数值,一个为70,一个为67,才勉强使小车走直线。number指令这样找到,Blocks Editor→Build-In→Math→number 123。

ButtonBack程序段任务是:点击ButtonBack(文本属性:后退),B、C电机(MoveBackwardindefinely)反转,小车后退。

ButtonStop程序段任务是:点击ButtonStop(文本属性:停止),B、C电机停止。

ButtonDisconnect程序段任务是:点击ButtonDisconnect(文本属性:断线NXT)按钮,中断蓝牙连线。

Clock程序段任务是:以Clock元件的TimerInterval:200ms为间隔,不断把超声波传感器的检测值更新于LightValue标签上。这样手机上就可以看到超声波测距值了。
项目安装文件,安装到您的手机上试试:
6052786375572.zip
Blocks Editor界面右上角的“Connect to device”,点选该按键后,Blocks Editor就会和手机开始传输,您所编写的程序出现在手机画面上了,完成了PC机与Android手机的程序同步。这时,您一旦修改了Designer页面的元件外观或者Blocks Editor界面的指令,马上在手机运行画面上就可以反映出来。但是一旦断开USB连线,手机的画面会消失。如何脱开PC机,把程序下载安装到手机上运行呢?看下图。

点击在Designer页面中的“红框”标注的“Download to Connected Phone”,这时就开始打包“Packaging”,等会时间会把这个程序自动下载并安装到您的手机里。
为什么在App Inventor程序目前仅支持乐高NXT机器人,答案看下图和解释文字。

乐高机器人教育到底能给我们带来什么?也许时代周刊2006 年2 月20 日封面文章“Inside Google Empire”能给我们一点启发。在Google 公司的一次营销会议中途休息期间,Time 杂志记者Adi Ignatius采访Google 的三核心掌门(Sergey Brin、Eric Schmidt和Larry Page)时,发现其会议桌上堆满了Lego 积木。
这三人都是有名的Lego 迷。Page 在学生时代就曾用Lego 积木设计出了一台喷墨打印机,现正聚精会神地设计一部无限上升的Lego 梯子,Brin 则在用Lego套装设计一个机器人,而Schmidt 在这方面似乎显得更为专业。当记者Ignatius 好奇于他们的行为时,Page说他希望设计一座Lego 核反应堆,但他认为应该有一辆装备火箭炮的机器人,Page 马上说“明白,Eric,我们来搭那个Lego 机器人吧”......针对记者的提问 “对于市值逾千亿美元、员工数千的Google 公司,他们还能一如既往掌控自如吗?”,三核心掌门都希望从Lego 积木中得到更多的灵感。Google还能做什么。
是的,不要功利心太强,不要马上成功,不要科学大跃进,要尊重自己的兴趣,要尊重创新的自然规律,这样才能真正强大。
