码丁实验室,一站式儿童编程学习产品,寻地方代理合作共赢,微信联系:leon121393608。
创客行动在国内方兴未艾,如火如荼,很多青少年都加入到创客学习中来。常见的项目包括机器人、Scratch、Arduino、3D打印、单片机等。在硬件编程学习过程中,最常用的案例就是跑马灯了。
跑马灯又名走马灯、串马灯。走马灯古称蟠螭灯(秦汉)、仙音烛和转鹭灯(唐)、马骑灯(宋),中国特色工艺品,亦是传统节日玩具之一,属于灯笼的一种。常见于除夕、元宵、中秋等节日。
由毛竹编织成马头,马尾;系在身上糊上颜色鲜艳的纸,如今已由丝绸取代。在过去,走马灯一般在春节等喜庆的日子里才表演,由二十来位11—14岁小孩组成,边跳边唱,根据节奏快慢形成不同阵势,有喜庆、丁财两旺、五谷丰登的寓意。
灯内点上蜡烛,烛产生的热力造成气流,令轮轴转动。轮轴上有剪纸,烛光将剪纸的影投射在屏上,图像便不断走动。因多在灯各个面上绘制古代武将骑马的图画,而灯转动时看起来好像几个人你追我赶一样,故名走马灯。
由于走马灯仿佛几个人在你追我赶,也用来比喻来往穿梭不停的事物。在日本传统文学中,走马灯是夏季的季语。
电子制作里面的跑马灯是通过控制器,让若干个发光二极管(LED)依次点亮或熄灭,形成灯光追逐的动态效果。控制器可以是时序电路或者单片机。因为常用的单片机是八位的,我们使用8个LED来进行模拟。
学习跑马灯核心的知识是学习对寄存器的控制,主要包括初始化、左移、右移等操作。要用Arduino来做跑马灯,孩子们需要具备一定的数字电路基础知识,还需要购买相关硬件,包括1块主板、1块面包板、8个LED、8个限流电阻、若干根导线等。这对于初学者来说颇为不便。
作为一名创客,应该善于运用掌握的知识,利用即有的条件来进行创作。我们何不使用Scratch来模拟一款跑马灯呢?
先来看看效果吧。
1 本案例适合对象
本样例适合3年级及以上,且已经学习完Scratch基础课程,具有一定数字电路基础知识的孩子。
2 拆解跑马灯
2.1 舞台布局
在这个例子中,我们使用了“LED灯”、“控制器”、“启动/复位按钮”、“滑动电位器”、 “指示灯”等角色。舞台布局如下图。
2.2 电路图
本例以Arduino或者单片机(以下统称为控制器)来进行模拟,真实的跑马灯是通过设置IO端口值来控制LED灯点亮或熄灭的。当IO端口值为1时(高电平),LED灯点亮;当IO端口值为0时(低电平),LED灯熄灭。8个IO端口对应了一组寄存器,这组寄存器存在于控制器内,包括了8个存储单元。寄存器编号为P20至P27,IO端口编号为D1至D8,两者一一对应,参照下图所示。
2.3 寄存器
当控制器通电复位后,程序会进行IO设置,包括把IO端口设置为输出状态,寄存器修改为初始的数值。这组数值为二进制数据,不是0就是1。
以初始化把P20设置为1,P21至P27设置为0为例。当跑马灯的程序运行后,寄存器里的值依从低位(P20)向高位(P27)移动,P27移动至P20(溢出),每秒移动1次(移动频率)。由此可以实现灯光向右移动的效果。
同理,寄存器里的值依从高位(P27)向低位(P20)移动,P20移动至P27(溢出),每秒移动1次(移动频率)。由此可以实现灯光向左移动的效果。
灯光右移或左移的效果,就是我们模拟的核心内容。
Scratch的列表就像寄存器一样,是一组连续的存储单元。为了控制8个LED灯,我们需要建立一个具有8个数据的列表,取名为“存储器”。第1个数据对应P20,第2个数据对应P21,以此类推。为了方便编写程序,增加1个数据单元用来存放溢出数据,这样“寄存器”列表一共就有9个数据。
程序刚开始运行时,我们需要把“寄存器”全部初始化为0,程序如下。
2.4 LED灯
LED灯在IO端口低电平(寄存器为0)时熄灭,在IO端口高电平(寄存器为1)时点亮。相当于LED灯角色有2个造型,第一个造型代表熄灭,第二个造型代表点亮。
我们可以用Scratch的造型工具绘制圆形的LED灯,白色代表熄灭,红色代表点亮。
用鼠标点击LED灯,可以设置该灯对应存储单元的数值,即“寄存器”数列中相应位置的数值。可以从0到1,再从1到0,点击一次,切换一次。
舞台上一共需要8盏LED灯,所以直接复制角色并修改其初始化位置和部分判断积木就可以了。
2.5 控制器
我们添加一个“控制器”角色,造型使用一张Arduino主板的图片。为了方便理解,我们把控制LED灯左移动、右移动等核心功能在这里实现。这个例子中,我们将实现灯光从左向右移动到第8盏灯,然后从右向左移动到起始位置。
其主要程序如下。
因为我们是通过鼠标设置每盏LED灯的状态,所以在每次修改LED灯状态之后,都需要检查LED灯移动的起始位置,其程序如下。
2.6 启动/复位按钮
在舞台上增加一个“启动/复位按钮”角色,造型有2种,分别代表开、关两种状态。当它被鼠标点击时,依次循环切换两个状态。
按钮的主要作用是用来发出“复位”、“开始”指令。其造型和程序如下。
2.7 滑动电位器
为了控制灯光追逐的速度,增加了一个滑动电位器。它主要由两部分组成,分别为“电位器”和“导电片”。
真实的滑动电位器是通过滑动导轨上的导电片,改变输出的电阻值。单片机通过采集电阻值的变化来控制LED灯追逐的速度。
本例中通过按下键盘的左键、右键来控制导电片向左、向右移动,并同时修改间隔时间值。需要注意以下几点。
1、导电片移动时不能超过电阻器的范围。
2、导电片的位置对应着间隔时间值,应避免按下左键或右键不松手导致间隔时间值和位置变化不同步的情况。
通过调整电位器的大小,控制导电片能够水平移动的距离为100步,若每次移动2步,一共可以移动50次。间隔时间值的修改范围从0到1秒,那么每移动一次就修改1/50=0.02秒。
假设导电片的初始位置在电阻器的中心,且间隔时间值为0.5秒。导电片左移端点位置的x坐标值为18,则初始位置的x坐标为:18+2*25=68。
角色布局及程序如下。
2.8 指示灯
“指示灯”角色用来模拟控制器主板上的指示灯,在程序开始运行后按照每秒1次的频率闪烁。可以参照“LED灯”角色的绘制方法自行制作。其造型和程序如下。
2.9 舞台背景
为了让画面更逼真,采用了带有面包板的背景图片。如下所示。
3 运行调试
编写程序的过程是一个反反复复调试的过程,每一次调试都可能发现新问题,没关系,不要气馁,一个一个解决就行了。
经过一番“折腾”,激动人心的时刻就要到了,拿起鼠标点击绿旗,让“马儿”跑起来吧。手里虽然没有Arduino,但是看着跑马灯能跑起来,是不是很嗨啊!
4 总结
使用Scratch模拟Arduino常见的应用,有利于让没有硬件条件的孩子学习相关知识,同时这个过程也是一个创造的过程,非常有意义。
在调试过程中,为了减少灯光追逐的延迟,我尝试将“左移一步”、“右移一步”积木设置为“运行时不刷新屏幕”,但是却发现各LED灯闪烁的节奏变得混乱,达不到预期的效果。估计是因为该积木对列表操作太快,导致LED灯刷新跟不上其节奏所致。要解决这个问题,可以将操作列表的积木和控制LED灯造型的积木放在同一个自定义积木内,有兴趣的朋友可以去尝试一下。而我选择了另一个取巧的方法,将程序运行设置在“加速模式”,这样效果也不错哦。
谢谢大家关注。转载是对我最大的鼓励。谢谢!
(文中部分图片来自于网络,对作者表示感谢。若有版权问题请联系我,我将予以纠正。)
5 程序链接
跑马灯:https://kada.163.com/project/1455349-954149.htm