如上3个图,全部都是的mBot主程序,够长吧。下面我们看里面的数字标号:
① 里面是定义的一些全程变量或者局部变量。作用从上到下分别是:
Flag:模式标志变量,用于判断各个模式是否触发:手动模式、避障模式、巡线模式;
Factor:速度因素基量,比如按下9号键:速度为factor*9+minSpeed
Lineflag: 巡线状态变量(该变量作用是避免巡线传感器状态值偶尔出现乱码导致的误判断,在这起着缓冲作用)
当小车在黑线内,设置为10;
当小车偏右,数值不断减1;
当小车偏左,数值不断加1;
当小车完全脱离黑线,如果该值为10,就前进,否则执行上一个状态;
Speed:设置开机默认速度为200
Minspeed:设置最小速度为48
② 里面的一些函数功能是小车的开机标志现象,对应特定的声音和灯光。就是我们开机时间会听到蜂鸣器的几声响,还有相应的rgb灯闪烁。这些现象就是这几句函数实现的。
③ 当红外遥控器按下A键后,触发手动模式。这就属于一个功能函数块,被限制在一个条件语句里面,相当于C语言中的if语句。只有检测到遥控器按下这个按键后程序才会进入到这个模块内部执行。其内部的函数就是对应模式的功能设置,这里面是电机的速度设置、蜂鸣器音调设置、rgb灯的设置以及每个小功能的执行时间和控制启动或停止(此函数包含在一个while大循环中)。
④ 当红外遥控器按下B键后,触发避障模式。也是一个功能性函数块,同样被限制在条件语句内部,函数内语句功能同③类似,此处不多说(此函数包含在一个while大循环中)。
⑤ 当红外遥控器按下C键后,触发巡线模式。也是一个功能性函数块,同样被限制在条件语句内部,函数内语句功能同③④类似,此处不多说(此函数包含在一个while大循环中)。
⑥ 这4个积木可是至关重要的!没有他们mBot是不会那么智能的执行手动、避障、巡线的。
IR:判断是否按下A按键,是就执行手动模式;
Ultrasonic:判断是否按下B按键,是就执行避障模式;
Line:判断是否按下C按键,是就执行巡线模式;
但是他们是如何知道的并且进入到相应的功能函数中的呢?那就是标志位的功劳了,我们在给单片机编程的时候经常用到标志位。大家看到③④⑤中的flag这个变量没,在分别检测到A、B、C按键后分别给flag赋值为1,2,3。这就给程序执行过程中随时跳转到其他函数提供了方便,而要进入的函数开始就是要检测flag这个变量是1还是2还是3。如果是1,就进入到手动控制模式的函数内部了;如果是2,就进入到避障模式的函数内部了;如果是3,就进入到巡线模式的函数内部了(对应的每个模式功能函数在下面会进一步介绍)。
2、 定义IR函数(手动模式函数块)
⑦ 看到判断“flag是否等于1”这个积木没!!!!!!没错,就是他,当此函数检测到flag这个变量的值等于1的时候,那么程序就进到这里面去了。这就和上面说的主程序里面的flag赋值接上关系了。顺理成章,主程序就是这么和其他功能性函数接上了。
⑧ 进入子函数后分别判断红外遥控键盘按下的上下左右键,从而控制mBot的行走方向,达到控制的目的。有一个地方需要注意,里面的另外两个函数turnleft和rightleft,这是小车的左转和右转,在这里是调用了另外两个子函数,后面会介绍其函数内容。
3、 定义ultrasonic函数(避障模式函数块)
⑨ 依然是先判断标志位flag是否等于2,等于了就进去执行此子函数内容。
⑩ Distance:这是距离的意思,后面先将超声波返回的数据赋值给distance便于后面的距离判断和比较。
⑪ 开始用超声波返回的数据distance和自己要比较的数据进行大小比较,从而达到避开障碍物的目的,让小车做出前进后退、左转右转的动作。
4、 定义line函数(巡线模式函数块)
⑫ 依然是先判断标志位flag是否等于3,等于3就开始执行巡线的程序。
⑬ mBot的车头部分有一个巡线传感器,mBot在地面行驶时,在不碰到黑色物体的状态下,红外管发射出去的光可以被反射回去被旁边的接收器接收到,上面的两个指示灯都会亮。一旦碰到黑线或黑色物体,由于黑色是吸光色体,发射出去的红外光无法反射回,接收管也无法接收到光,会产生一个电平的变化,得到一个信号供处理器处理做出下一步的计算。这就是巡线的原理,程序中可以看到当小车在黑线里面行驶时就一直前进,直到有一边偏离黑线一定范围距离,对其进行修正,即一定时间的左转或右转。如图中的“如果state=1,小车偏右,则另lineflag减一,偏左则加一”,然后在下面判断对应的state的值,在一定范围内lineflag加一或减一。就这样一直使该变量处于一个动态的范围内,衍生到环境中就是一直在黑线内行走,这样就达到了巡线的目的!
5、 定义git_speed函数(调节速度档位函数块)
红色方格内都是检测红外遥控器按下的0~9按键值的条件语句,蓝色方格内的都是经过公式计算过后的速度值,赋给speed变量调节电机速度实现调速。
6、 定义turnleft函数(小车左转程序块)
这个函数就简单多了,做过智能小车的都知道转弯时的动作,就像该程序一样,左轮速度为0,右轮速度为speed,则小车就会一左轮为中心向左旋转。还有一种更方便的方式就是让左轮后转,右轮前转,这样也能达到目的,而且速度会比上面的更快,只不过是以小车车身的中心为原点旋转的。
7、 定义turnright函数(小车右转程序块)
原理和左转的一样,只需要把两个轮的顺序调转一下就行了。
----------------------------------------------------------------------------------------------------------------------------------分割线------------------------------------------
-----------------------------------------------------------------------------------------
上面就是出厂程序的解析。最后我想再说一说图形编程这方面的问题:
图形化编程的两面性:
优点:图形编程简明、了当、直接,因为我们不需要传感器等外围模块的驱动、启动工作模式、判断模块是否工作正常、变量的定义以及函数的返回值等等等等,这些都不需要我们去写,只需把其最终得到的结果通过一个变量放在积木里面拉出来就可以任意赋值使用了。
缺点: 图形化编程的积木体积占用了太多的编辑界面,看的时候浪费了我们的一些精力,因为这种编程方法有一部分是面向小朋友的,也是为了提高青少年的创新开发能力;还有一点就是这种方式会给人们带来太多的懒惰,让学习者慢慢堕落(长期使用的前提),因为太多的模块函数都已经被开发好集成在主板的处理器上了,给我们留出来的只有各个模块的最终接口——数据值。以前我们玩模块时,都是需要了解模块的工作原理、线路接口、工作模式、工作状态设定、数据的处理等一系列的工作,然而图形化编程的诞生给我们带来了方面,同时也造成了我们的积极开发探索的毅力!或许这也是以后解放人类工作量的一个趋势吧,就好像有手机了干嘛还要写信一样!
最后我再把出厂程序的代码传上来,如果你没有改程序或者不想在之前的帖子里找的话就直接在这拿走用好了!
另外,我把该教程的贴同时写成了Word文档,如果谁觉得查看不方便或者想下载下来在没网时间参考参考都是很方面的。