木果创客
我们一直在努力!

mBot算法系列:一条灯带的5种精彩mblock图形化编程玩法!

20170205144433

1 singleColor
顾名思义就是简单颜色。亮灯方式为,从第1盏LED点亮起,陆续点亮第30盏。不难发现,这和我们课堂上学过的幸运大转盘是一样一样的。

QQ截图20170205145036

这样的效果是在瞬间发生的,在ledstrip脚本中,不能直接调节两盏灯之间的点亮间隔时间,我们可以在mBot脚本中重复执行的最后一行加入等待0.3秒的脚本。

算法解析:

效果1虽然简单,但是后面效果2、3、4、5的基础。在mBlock图形化编程中,首先建立了变量i,每次灯带只亮第i盏灯,点亮后将i的值增加1,方便点亮下一盏。循环中每次完成一个程序动作之后,为下一次动作做好充分准备,是这个简单范例的精髓。

2 breathe
呼吸灯带。亮灯方式为,灯带上的每一盏灯,都是从暗到亮,再从亮到暗,循环往复,就像人的呼吸一样:呼……吸……。

QQ截图20170205144514

算法解析:

在效果2中,所有LED灯是一起点亮的,但是每次循环点亮的亮度值不同:先是由暗到亮,再由亮到暗。也就是说,RGB值先从0开始逐渐增加,到最大值255之后保持一段时间,再逐渐减小到0。因此,循环中每次LED亮度值增加或减少的量,可以用RGB值除以循环次数决定。
编程中,需要考虑各个值的情况,但有时候不必先确定某个值,而是自顶向下推断出某个值。

3 marquee
滚动灯带,还有一种说法是叫跑马灯。其实第1种singleColor效果就是幸运大转盘似的简单跑马灯,那么这个效果3算得上中级难度的跑马灯了。由视频可见,亮灯方式为:以4盏灯为一组,由强减弱,依次从灯带开头亮到末尾,再从末尾亮到开头,循环往复。PS:如果你还看不清的话,吴老师告诉你一个小技巧,按一下mCore控制板上的RESET键,可以重启程序造成短暂的暂停效果。

d30bb7a05db4f844b32fa6392232f4bc

算法解析:
在效果3中,当按下RESET键之后,可以看见亮灯情况是4盏灯,由强光到弱光,所以4+1=5,需要建立一个5次的小循环,让前4盏LED亮度减弱,第5盏LED灭。加上灯带依次点亮的变量,至少需要2个变量i、j才能完成这次的效果。
其中需要注意3个问题。首先是整条灯带的循环次数不再是30,而是30+5,才能让滚动部分走完整条灯带。至于灯带亮度减弱方面,可以充分利用变量j;其次,小循环亮灯时从灯带起始位置开始,那么5次小循环应该是依次点亮i-j位置的LED,反过来从灯带尾部亮灯到起始位置,5次小循环应该是依次点亮i+j位置的LED;最后一个问题,是要判断何时亮灯,前面的亮灯位置值的范围,应该在-4到35之间,也就是必须大于-4小于35。
在编程中,要根据最终目标分解出一个个小目标,找出其中的内在规律。另外建议在mBlock图形化编程中添加一定的注释文字,增强程序可读性。
从该脚本注释来看,是比较容易理解的。小循环4盏LED灯的亮度,用了RGB值除以变量j,原计划是直接发布这个脚本的,不过在实际运行中,发现有2处问题,细心的你找到没?问题一:变量i、j初始值是0,使用该脚本有潜在的危险,因为数学运算中,如果0作为被除数是没有意义的;问题二:小循环4盏LED灯和视频中,也就是ledstrip的效果并不相同,4盏LED强弱过渡不明显。  对于问题一,我们先来检测一下是不是有危险:

  运行100除以0的值,直接输出Infinity,Infinity 表示正无穷大的数值,填入灯带脚本RGB参数里是不点亮LED的。在编程中我们应该避免这种情况的发生,解决方法也十分简单:将变量i、j的初始值设置为1。  对于问题二,则需要添加3个临时变量colorR、colorG、colorB。这三个变量在呼吸灯里面也用过。其作用是,每次大循环(numLEDs+5)时读取RGB初始值,每次小循环(4),除以变量j,并且赋值给自身。换句话说,就是每次亮4盏LED滚动灯时,第1盏灯为设定值,下一盏灯是前一盏灯亮度的j分之一。

4 rainbow
双向渐变彩虹灯带。这种最梦幻的效果,就是让老师思考半个多月的难题了——咳咳也是因为太忙。亮灯方式为:从第1盏灯到底30盏灯渐变彩虹色点亮,并且每一盏灯渐变彩虹色点亮。也就是说每一盏灯都在随时发生色彩变化,甚是好看。如何实现这种效果呢?这次真的要狠下功夫!

469bd3e9df1e397aa2e5d238bbadd53e
8b00a9af394f3e57a2faf676dd3d44b4
4彩虹灯带Rainbow-30珠-冗余代码版源程序下载
算法分析:
我们可以用一个简单的思维导图来整理出变化规律。
在效果4中,其实点亮LED有两个方向的参数变化,一个是横向变化:从第1盏到第30盏LED七彩变化,我们可以看做X轴变化,需要设置变量R-X、G-X、B-X这3个变量;第二个是纵向变化:第1盏灯自身LED七彩变化,我们可以看做Y轴变化,需要设置变量R-Y、G-Y、B-Y这3个变量。6个变量如何协同工作?或者说X轴和Y轴有何联系呢?这是需要深入思考的第一个问题,第二个问题是七彩变化如何控制RGB的有效参数值?
通过测试可以发现ledstrip的Rainbow效果是按照紫、蓝、青、绿、黄、橙、红的顺序变化的,为了符合人的一般认知和编程简便,我们按照红、橙、黄、绿、青 、蓝、紫的顺序编程。
为了解决问题一,我们需要找找规律。我们可以假设一粒种子:第1盏灯的RGB值。当这盏灯点亮之后,横向的X轴按照红橙黄绿青蓝紫的顺序七彩渐变。纵向的Y轴也按红橙黄绿青蓝紫的顺序七彩渐变。也就是说,每一次渐变,都从这个种子值出发,只要确定了种子值,两个方向的七彩渐变就确定了。而其中变化的间隔值,就是控制两种颜色变化速度的变量。
问题二,七彩变化的RGB值控制问题。这里显然需要使用逻辑判断,在RGB三个参数满足一定条件,才能设置灯带脚本。我们知道,RGB值的范围都是0~255,例如:(255,0,0)显示是大红,按红橙黄绿青蓝紫的顺序,后面的变化是从橙色开始,例如:(200,40,0)橙色RGB值和红色RGB值看出规律来了吗?没错,R值在减小,G值在增加,B值不变。照此规律发展,红色可以渐变为橙、黄、绿,还剩下青、蓝、紫3种颜色了。绿到青、蓝的变化规律是:G值在减小,B值在增加,R值不变。蓝到紫、红的变化规律是:B值在减小,R值在增加,G值不变。
在编程中面对复杂的问题,可以运用思维导图工具,从核心问题出发,引出各个小的分支问题,逐一击破,然后进行组合从而解决最终问题。与此同时,要注意观察变量之间的规律,然后将生活语言转换为计算机语言。这个过程也许不是一朝一夕达成,但只要努力,这种敏锐的洞察力完全可以养成。

5 rainbowmarquee
双向渐变彩虹+滚动灯带。这种效果,实际上是在彩虹灯带的基础上变化而来的,解决了彩虹灯,这个相对来说就容易多了。

450338cd7705a169af4bd835b8dd795c
算法解析:
在最后一个效果中,我们可以观察到,灯带的色彩变化依然是彩虹灯。唯一的区别是,LED并不是从头亮到尾的。如果你暂停视频或者按下板载RESET按钮,就会发现规律是亮1盏空2盏,也就是3盏灯一组,第1盏亮,后2盏灭。
回到图形化编程中来,我们需要控制亮灯的间隔为3盏一组。一个巧妙的方法是:用位置变量i除以3取其余数,余数为间隔位置变量j时,分别设置i、i-1、i-2位置的LED为亮、灭、灭。
该文章由星空创客空间吴鑫老师提供!非常感谢!
以下为公众号源文连接(会有效果视频):

算法系列:从一条灯带说起(一)

http://mp.weixin.qq.com/s/hLD6De-XmAS8rVBgYPtoXg

算法系列:从一条灯带说起(二)

http://mp.weixin.qq.com/s/F4n3rZ4N0VWU8eJmu-3I-g

算法系列:从一条灯带说起(三)

http://mp.weixin.qq.com/s/5Xgr7IcdxP6ZcpeYgGNLMw

makeblock灯带购买链接:

https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-9825283652.53.bj0lJW&id=534692622197

q11

 

未经允许不得转载:木果创客mbot机器人 » mBot算法系列:一条灯带的5种精彩mblock图形化编程玩法!

分享到:更多 ()

评论 抢沙发

评论前必须登录!

 

木果创客 mBot机器人 服务教学 更专业 更用心!

购买mBot木果创客淘宝店