Arduino论坛
直播中

魏成杰

12年用户 187经验值
擅长:电源/新能源
私信 关注
[经验]

【mBot试用体验】mBot小车软件部分解析

`上个星期没有更新mBot小车的试用报告,把2015年的事情留到了2016年,真的很抱歉,相信其他试用者已经完成的差不多了,希望我的帖子还有些可取的地方供大家了解学习。上一期的帖子主要分析了mBot小车的硬件部分,包括结构和电路板,本期将对mBot的软件部分进行下分析,这也是很有趣的部分,底层驱动再次被包装,可以用图形文字的方式编程,虽然算不上是对程序员编程的革新,但能让更多的业余爱好者编写自己的代码,在兴趣培养和学习教育方面是种不错的尝试。

前几期试用报告链接:
开箱报告https://bbs.elecfans.com/forum.php?mod=viewthread&tid=531676&extra=
硬件解析https://bbs.elecfans.com/forum.php?mod=viewthread&tid=535049&extra=

首先,作为一名懵懂的试用者,按照mBot小车配套的教材开始学习。在《学前准备》这一章,重点讲述了mBlock软件的安装、使用和常见的小问题。mBlock是基于Scratch 2.0开发的软件,我们使用它来控制mBot身上的mCore主控板,从而实现相应的功能,所以我们先去官网下载mBlock软件http://www.mblock.cc/download。我当时下载的时候版本还是V3.1,今天去看已经是V3.2f,应该修补了一些Bug。由于使用V3.1版本的时候遇到一些问题,所以那会又下载了V2.2.1版本的,发现这些版本带的mBot源代码都不一样,为了一探究竟并保持最新,我毅然决然又安装最新版V3.2f,于是我所使用到的应用软件如图1所示。


软件程序.png

图1 所用到的应用软件

图1就是我试用mBot机器人过程中,到目前所用到的和mBot程序有关的应用软件。前三个均为mBot图形编程开发环境,其他的软件很多人都比较熟悉了:1、notepad++这是我用过的非常好的一款文本编辑软件,不多介绍了;2、UCompare文件比对软件,功能强大,我只用到很小的一部分,对不同版本的程序代码进行比对,能很容易看出不同版本有什么改动;3、Source Insight,这也是一款文本编辑软件,但比notepad强大很多,可以自动连接代码上下文,是看内核代码的神器;4、Configure Virtual是虚拟串口软件,在调试过程中非常好用;5、sscom32,串口调试助手,我很喜欢用的一款工具。这些软件都是程序员常用到的,后面用到的时候我还会再详细说明。


跟着教材继续往下做,先打开mBlock,大家可以使用最新版的,我把三个版本同时打开了。教材的内容虽然很多,但语言太简单,开始的跳跃性有点大,我摸索了好一会才搞懂上面说的步骤,对于第一次使用的用户还是有点难了,在前几章应该细致的手把手式的教,包括很多按钮的位置,建立角色过程,后面才可以正常的进行。打开软件以后,界面蛮不错的,简单整齐布局合理,如图2所示。

未命名.JPG

图2 mBlock主界

由于我的电脑没有蓝牙,所以我只能使用串口连接,将USB插在电脑上并打开mBot小车开关,按照教材上的方法连接串口,连接好后如图3所示,我的电脑上有很多串口,大家要根据实际情况选择正确的COM口。

连接串口.JPG

图3 连接串口


从教材的前几章就能看出来,教材内容与新的mBlock软件并不完全配套,书本更新比软件慢,但是大致不影响学习和使用。一边看教材一边搭积木,有几点需要说明一下,教材上只管让怎么做,没有告诉我们那些积木和按键的具体位置,其中最重要的一部分如图4,教材上所有的章节内容都是用表格介绍的,里面所有的积木均在脚本框内,然后一个一个去找就可以了,刚开始有点不习惯,后面熟悉了用起来会很快。还有些找不到的积木是“数据和指令”下自己建造的,这个大家得注意下。而这里大部分都用于Flash动画,只有“数据和指令”、“控制”、“数字和逻辑运算”、“机器人模块”这四项才是mBot机器人真正要使用的积木。

脚本.png

图4 软件核心


前段时间使用mBlockV3.1,做到第三章《算数大挑战》的“实例拓展”部分出现了问题,即使我没连接mBot小车,也没有按下红外遥控器,点击绿色小旗后,蝙蝠就会运动,这个问题在群里问过,但是其他人并没出现,后来在我安装了V2.2.1后也没这个问题了,所以就这样过去吧。接着把教材上其他的章节跟着做完,大部分可以按预期的实现,偶尔还是有些小地方有问题,但并不影响学习使用,用户可以自己修改,也是一种锻炼和提高。后面遇到一个最主要的问题,就是RGB灯的问题,再深入的东西还没有看,就从这个问题入手来说吧。


RGB相关的积木就是图5所示的这块了,三个版本的此积木外观看都一样,但是为什么效果却不同(V3.1和V3.2f都一样),那么哪个才是正确的呢。从教材和积木的选项上很显然,可以分别点亮红色、绿色、蓝色的LED灯,并且可以控制左边还是右边的灯,还有控制灯的亮度。



图5 RGB灯积木

从mBlockV2.2.1开始连接mBot小车串口线,设置LED板载+全部+红色20+绿色0+蓝色0,点击积木,mCore上左右两边的灯均亮,如图6所示。然后断开串口,用mBlockV3.1或mBlockV3.2f(最新版)连接串口,进行同样的设置,点击积木后mCore上只有左边的灯亮而且还是绿色的,如图7所示。接着试了很多次,V2.2.1的各个灯均正常,使用V3.1和V3.2f均不正常,那么导致这个问题的原因是什么,我们来找找问题的关键。

IMG_2074.JPG

图6 V2.2.1版RGB

312D34D9538F3685652094BDBF062175.png

图7 V3.1或V3.2f版RGB



由于mBlockV2.2.1是正常的,说明硬件是没有问题的,那么问题肯定出在了程序上,这也是程序更新后程序员很容易出现的一些小问题。我们先来看看点击积木后,mBlock做了什么导致的不同,这就需要到另一个模式“Arduino模式“下来看了。点击mBlock工具栏的“编辑”,最后一项就是“Arduino模式“,点击后界面会变成如图8所示。

arduino.JPG

图8 Arduino模式

在连接串口的前提下,现在大家点击左边“机器人模块”下的某些积木,会发现调试区出现了一些字符(注:调试区右上角可以转换二进制或字符模式),我们还是以RGB来说,分别点击刚才三个版本的RGB积木,调试区出现的字符分别是:

mBlockV2.2.1: 1-3 21:34:5.790  > ff 55 08 00 02 08 07 00 14 00 00

mBlockV3.1:   1-3 21:35:13.743 > ff 55 09 00 02 08 07 02 00 14 00 00

                        1-3 21:35:13.759 < ff 55 0d 0a
mBlockV3.2f:  1-3 21:35:46.665 > ff 55 09 00 02 08 07 02 00 14 00 00

                        1-3 21:35:46.665 < ff 55 0d 0a
从上面的字符可以看出来,前面都是日期和时间,>是上位机(也就是mBlock)发送的指令,<是下位机(也就是mCore)返回的指令,这些指令都是16进制形式显示。从这点我们明白了,原来mBlock的调试过程是一种模拟的形式进行的,以上位机下发指令,下位机做相应动作的过程完成,并非真实的硬件程序调试。继续看这些指令,mBlockV3.1和V3.2f发送、返回均一样,RGB灯也一样(左边绿色灯亮20),可是实际点击的积木是红色20、绿色0、蓝色0,我们知道十进制20的十六进制就是14,于是我们很容易分析出来,这三个指令的倒数第三个字节就是控制红色灯,数字大小是灯的亮度。有意思的是,V2.2.1发送的指令是没有返回的,但是结果却是正常的,另外两个有返回值表示下位机收到正确的指令,但是结果异常。从这3条指令可以看出来,V2.2.1是不一样的,第三个字节和字节个数与另外两个版本不同。经过对其他积木指令的对比发现,V2.2.1发出的指令和V3.1、V3.2f都不一样,并且没有返回值,但是小车做出了正确的动作。


既然整个调试过程是指令发出来的,那么我们就可以手动来模拟这个过程,可以用mBlock调试区下面的发送框发送二进制。首先依次照着mBlock发送的指令再发一次,结果是一样的,只是这次发送ff 55 08 00 02 08 07 00 14 00 00也有返回值了,这个并不影响什么。这样的话,我们就试着改动里面的指令看看结果怎样,我们把V3.x的指令ff 55 09 00 02 08 07 02 00 14 00 00的第9个字节改为14,第10个字节改为00,点击发送,这一次左边的灯正常了,我们再把第8个字节改为00,结果和V2.2.1一样了,是我们期望的正确的结果,两边的RGB均亮红灯20。再经过几次测试,我们就清楚的知道了,指令的第8个字节是选择左右灯,第9个字节是红色,第10个字节是绿色,第11个字节是蓝色。这个测试的结果和V2.2.1完全一致了,这也是导致V3.1和V3.2f调试过程中,RGB灯不正常的根本原因。那么为什么指令会有这些变化,而且结果却不正确,答案肯定就在mBot小车出厂代码中了。


我们现在就要找到mBot小车官方的出厂代码,在此次负责人“子不语”的一篇文章里,我看到了mBot出厂程序(mblock版本带注释),于是下载下来,这个文件是.***2的,需要用mBlock打开,界面如图9所示。

伪出厂程序.JPG

图9 某程序

这段程序很漂亮,而且有注释,是非常好的例子,而且有试用者对这些代码做了很详细的解释,大家可以去看看,可惜的是,这并不是我要找的真正的官方出厂代码,很简单的一点,手机APP连上小车蓝牙后,根本不能控制小车运动,因为这段代码中也没有这部分的内容,更不用说调试功能了,那么真正的官方代码在哪里。我们点击mBlock工具栏中的“连接”,里面有一项“查看源代码”如图10所示,点击后会看到一个“mbot_firmware.ino”的文件,这个就是mBot小车官方出厂源代码了,然后可以用我上面提到的软件“notepad++”打开这个文件,里面是C程序。

真出厂程序.JPG

图10 mBot出厂源代码

用上面的方法分别找到mBlockV2.1、V3.1和V3.2f的源代码,第一感觉就是这三个代码都不会一样,而且事实确实如此。这次就要用到“UCompare”文件比对软件了,分别将三份源代码拖入UCompare,点击比对后,两个程序的差异就被标记出来,如图11所示。代码还是比较长的,大家可以自己去看看,我就不具体分析了,后面的版本主要就是增加了一些新的功能模块,比如:指南针,温湿度,气体传感器,触摸传感器之类的。我们还是继续关注RGB,就是这么执着。

compare.JPG

图11 程序比对结果

通过UCompare很容易就找到了两个代码RGB不同的地方,如图12所示。

RGB程序.png

图12 RGB差异

从上面的差异可以看到,新的代码多了slot,其他的字节都依次向后推了一个数,看起来这样就没有问题了,那么为什么新的程序用旧的指令正常而新的指令反而不对,继续往下看,led.setColorAt(idx-1,r,g,b);和led.setColor(r,g,b);这两句调用就是实现RGB灯的语句,这两句并没有在此程序中定义,那么肯定调用了外部的文件,我们要找到它的上下文所调用和定义的地方,需要用到“Source Insight”,具体加入文件的过程大家可以百度,如果还是不会可以问我。用Source Insight打开分别打开这两个程序,把鼠标放在led.setColorAt(idx-1,r,g,b);语句上,Source Insight将自动找到这段语句定义的位置,所处的文件是MeRGBLed.cpp,这是C++的程序,我不是很懂,问题也许就出在两个MeRGBLed.cpp下的bool MeRGBLed::setColor(uint8_t red,uint8_t green,uint8_t blue)void MeRGBLed::setColor(uint8_t red, uint8_t green, uint8_t blue)



RGB调试的问题就到此为止了,mBot的程序员看见应该会修改的吧,不过这并不会影响到我们的正常使用,调试只是很小的一部,最主要的还是我们要把自己的代码写入到mCore中,经过测试,虽然同样的积木在代码区中的代码不同,但是结果都一样而且完全正常,所以我们下一次将进入主题,把自己的程序写入mBot小车,完成最后的项目任务。



总结,今天主要针对不同版本RGB积木调试出现的问题进行了解析,过程中提到了很多对编程有用的应用软件,还有寻找并处理问题的方法,希望对新手能有一些帮助,这也是一次对我自己的提升。总体来说,官方程序已经完成了大部分功能,虽然有点小瑕疵但并不影响我们学习和使用,mBot小车确实是个很好的学习开发工具,随着不断的更新改进,必将越来越完美。


` RGB.png

回帖(6)

王志睿

2016-1-4 10:58:44
深入很详细呀!这方面要向你学习
举报

魏成杰

2016-1-4 12:18:23
引用: 渴死的鱼儿 发表于 2016-1-4 10:58
深入很详细呀!这方面要向你学习

一起学习,加油
举报

willinn

2016-1-9 10:47:50
谢谢分享,貌似不错哦
举报

魏成杰

2016-1-9 13:25:12
引用: willinn 发表于 2016-1-9 10:47
谢谢分享,貌似不错哦

mBot小车确实不错,蛮好玩的
举报

更多回帖

发帖
×
20
完善资料,
赚取积分