牟晓东
对于许多经常进行开源硬件编程的中小学创客而言,具备扎实的学科知识是入门的基础技能,比如算法的设计与程序代码调试、物理电学部分基础理论和一定的实验动手能力等等。通常从一个创意的设想到实验过程的设计,再到图形化或Python代码编程的运行测试,以及最终的实验改进与程序升级,每个环节几乎都离不开各种知识的综合应用。以树莓派滑杆映射操控“流水灯带”为例,需要设计者对模数转换器、滑杆传感器和灯带等设备比较熟悉,同时又要具备一定的数学知识应用(比如数字范围的映射、取整等),最终实现灯带随滑杆所处的不同位置而点亮对应不同数量灯珠的动态“流水”效果。
实验器材包括树莓派和古德微扩展板各一块,滑杆传感器模块一个,WS281x灯带一条,ADS1115模数转换器一个,杜邦线若干。
首先,将古德微扩展板正确安装于树莓派上,并且将模数转换器插入扩展板的Up引脚列;接着,通过杜邦线将滑杆的VCC端、GND端和OTB(或OTA)端分别连接至扩展板24号引脚的VCC端、GND端和A0模拟端,再将灯带的起始端插入18号引脚,注意三根引线的标注要正确对应;最后,给树莓派连接数据线,通电启动操作系统(如图1)。
登录进入古德微机器人“积木”界面,开始图形化编程。
首先对灯带进行初始化设置,从“智能硬件”—“灯带”中找到“设置GPIO”模块,将参数设置为灯带与扩展板连接的引脚号18,并且将可控制灯珠的个数设置为60,亮度为50;然后建立一个“重复当‘真’”的循环结构,将变量滑杆值赋值为从A0模拟端获取的滑杆位置数据进行“先映射、后取整”,因为其原始数据范围是从0到32767,而灯带的灯珠数量是60(编号为从0到59),所以要进行数据范围的重新映射;对映射后得到的数据再进行“取整”处理,目的是防止出现非整数而不能正确对应编号为整数范围的灯珠序号;接着再建立一个循环结构,变量i的初值为0,终值为变量滑杆值,步长为1,执行的操作是设置灯带的前i个灯珠颜色均为红色,注意一定要添加“灯带刷新显示”模块;为了实现灯带灯珠发光后再随滑杆的滑动而动态显示滑杆的对应位置,需要再添加一个循环结构来完成熄灭刚刚点亮的所有灯珠功能,对应的RGB值均设置为0即可;最后,在循环结构中添加一条“等待0.01秒”的延时等待模块(如图2)。
程序编写完毕后,点击“保存”按钮将程序保存为“滑杆映射操控‘流水灯带’”;点击“连接设备”后再点击“运行”按钮(记得打开LOG调试区),此时调节滑杆的位置,灯带上就会亮起对应位置的红灯,同时会在调试区显示有滑杆值。比如当滑杆处于大约中间位置时,调试区会显示数字29(或30),此时也会亮起30个发红光的灯珠;多次测试均会实现滑杆映射操控“流水灯带”的效果(如图3)。
通过Windows的“远程桌面连接”登录进入树莓派操作系统,打开IDE开始Python代码编程。
首先,仍是导入相关的库模块并进行初始化设置:为了防止出现“SyntaxError: Non-ASCII character ‘\xe5’ in file”之类的编码提示错误,建议先添加一行“# -*- coding: utf-8 -*-”代码;导入模数转换器库模块:“import Adafruit_ADS1x15”,导入能够控制灯带的rpi_ws281x 库:“import rpi_ws281x as ws”,导入时间库:“import time”;然后,新建变量adc生成模数转换器的具体实例:“adc = Adafruit_ADS1x15.ADS1115()”;新建变量LED_COUNT和LED_PIN,分别赋值为60和18,对应标准灯带的60个灯珠数量和连接扩展板的引脚号18;创建灯带对象strip并进行实例化:“strip = ws.PixelStrip(LED_COUNT,LED_PIN)”,将变量LED_COUNT和LED_PIN的数据作为参数传递进去;“strip.begin()”代码的作用是对灯带进行初始化。
接着,建立一个“while 1:”循环结构,通过变量Sliding_Bar来实现从A0模拟端读取滑杆位置数据,为其赋值为:“adc.read_adc(0, gain=1)”;再新建变量numbers,赋值为“int(Sliding_Bar/547)”,完成从0-32767范围到0-59范围的映射及取整(其中的547作为除数的目的是将32767映射为59,等等),并且将变量Sliding_Bar和numbers通过print()均打印输出;再建立一个点亮对应数量灯珠的for循环,在range()函数中将终值设置为变量numbers,循环语句为“strip.setPixelColor(i,ws.Color(0,255,0))”,作用是设置对应灯珠的RGB颜色为“0,255,0”,即绿色;然后,通过语句“strip.show()”对灯带进行刷新操作;第二个for循环实现的功能是熄灭刚刚点亮的灯珠,因此其中设置的RGB颜色为“0,0,0”;最后,添加延时0.01秒的语句“time.sleep(0.01)”。
将程序保存为“滑杆映射操控‘流水灯带’.py”,但需要注意的是,此时如果直接在IDE界面中点击Run按钮进行程序的测试,会出现“Can’t open /dev/mem:Permission denied”的拒绝访问错误提示(如图4)。
此時,可以到命令行模式下使用超级用户权限sudo来运行程序——先通过“cd pycode”命令进入程序的保存目录,再输入“sudo python 滑杆映射操控‘流水灯带’.py”命令后回车,然后再不断调节滑杆的位置,命令行窗口开始有一对一对的数据产生,也就是变量Sliding_Bar和numbers的值;同时,灯带也会对应亮起相关数量的灯珠,发光颜色是绿色(如图5)。
效果与图形化编程所实现的滑杆映射操控“流水灯带”几乎是一样的,大家不妨一试。值得注意的是,由于在Python代码编程时使用了“while 1:”循环结构,其中并未设置任何跳出循环的动作响应,因此中止程序的运行方式可直接在命令行模式下按“Ctrl+C”组合键来强行中断程序。