开源硬件编程实现“手势操控”三例
文/牟晓东
在Arduino、树莓派、掌控板等常见的开源硬件编程中,我们可以通过功能丰富的外接或内置式传感器,借助于代码编程或图形化编程,最终可以制作出非常多创意十足的创客作品。以“手势操控”为例,根据“捕捉”到的不同手势(比如不同方向的挥手动作、顺时针或逆时针画圈动作等),做出预先设置的不同响应动作,比如控制PPT课件的上下翻页、灯带中不同灯珠的亮灭、OLED显示屏出现对应的信息提示等。
一、树莓派+Python“手势操控”PPT课件翻页
实验器材包括:树莓派3B+和古德微扩展板各一块,HC-SR04超声波传感器一个,绿色和红色LED灯各一支。
1.实验装置连接
首先,将古德微扩展板正确安装在树莓派上,注意四周小心均匀用力;接着,将超声波传感器安装于扩展板的20号和21号插孔,注意VCC、Trig、Echo和GND引脚要一一对应,负责超声波发射和接收的两个“圆孔”方向朝外;然后,将绿色LED灯插入5号插孔,将红色LED灯插入6号插孔,注意“长腿正、短腿负”的规则;最后,给树莓派通电,启动操作系统(如图1)。
2.安装PyAutoGUI库模块
运行Windows的“远程桌面连接”,输入树莓派的IP地址(比如:192.168.1.116)登录进入树莓派的操作系统。由于手势操控是通过将超声波传感器所检测到的测距数据作为输入控制信号,然后“驱动”系统的键盘上下方向键(或者鼠标的左键单击),因此需要安装PyAutoGUI库模块——点击运行树莓派的“LX终端”进入命令行模式,输入“pip3 install pyautogui”命令进行安装(如图2)。
3.进行Python代码编程
运行Thonny Python IDE,新建文件hand_PPT.py,输入代码开始编程:
首先,通过四行import代码导入待用的库模块:“from gpiozero import DistanceSensor,LED”、“import pyautogui”、“from signal import pause”和“from time import sleep”;接着,分别为插接在5号、6号、20和21号引脚的绿色和红色LED灯、超声波传感器建立对应的变量:“green = LED(5)”、“red = LED(6)”、“sensor = DistanceSensor(21, 20)”;然后建立“while True:”循环结构,为变量dis进行超声波传感器测距赋值(取两位小数):“dis = round(sensor.distance,2)”,并且打印输出:“print(dis)”;接着通过if语句进行测距值是否在0.2-0.5米的区间内的判断:“if (dis > 0.2 and dis <= 0.5):”,如果条件成立,则先调用PyAutoGUI库执行按下键盘的向下方向键操作——对应PPT课件播放时的向下翻页操作:“pyautogui.press(down)”,再亮绿色LED灯进行提醒:“green.on()”,0.2秒钟之后再将其关闭:“sleep(0.2)”、“green.off()”;再建立elif判断语句,对测距值是否在0.2米内进行判断:“elif dis <= 0.2:”,条件成立的话则先按下键盘的向上方向键——对应PPT播放时的“回翻”操作:“pyautogui.press(up)”,然后亮红色LED灯,持续0.2秒钟后关闭:“red.on()”、“sleep(0.2)”、“red.off()”;最后,为循环结构再添加一个等待0.5秒钟的语句:“sleep(0.5)”(如图3)。
(4)测试PPT课件播放时的手势操控
程序代码保存后点击“运行”按钮,接着打开待测试的“Python数据分析基础.pptx”文件播放(如图4)。
此时在Python IDE下方的Shell区每隔0.5秒钟就会生成有一个测距值,如果在超声波传感器前方0.2-0.5米的区间范围内挥手,PPT课件就会向下翻页,挥一次手就会翻一页PPT,与使用鼠标点击或是翻页笔遥控的效果是完全一致的;如果翻页错误,想“回翻”的话,则在0.2米内的范围内挥手,PPT课件就会切换至上一页;在超过0.5米的范围外,手势操控是“无效”的不响应状态。
二、树莓派+图形化编程“手势操控”交通多变灯带
实验器材包括:树莓派3B+和古德微扩展板各一块,GY-PAJ7620手势传感器一个,60个灯珠的可编程ws281x灯带一条。
1.实验装置连接
保持扩展板插接在树莓派不动,将手势传感器插接至扩展板的I2C引脚区,注意VIN接VCC电源正极、GND接地、SCL与CLK连接、SDA与DATA连接;然后将灯带的输入端插入扩展板的18号引脚,注意检查三根引线的标注(+5V、GND和Din)与扩展板的VCC、GND和D端必须一一对应;最后,给树莓派通电,启动操作系统(如图5)。
2.在古德微机器人网站进行图形化编程
在浏览器中访问古德微机器人网站(http://www.gdwrobot.cn/),登录账号后进入“积木”编程区,开始拖动对应的功能模块语句进行图形化编程:
首先,分别新建六个最“底层”的功能函数,分别是“左右方向”、“上下方向”、“顺时针”、“逆时针”、“靠近”和“远离”,对应的手势操控动作分别是向左或向右、向上或向下四个方向的挥手动作,顺时针、逆时针转动和靠近与远离动作,显示效果分别是:左右两组共30个灯珠发绿光、上下两组的其它30个灯珠发红光——“左右绿灯通行、上下红灯禁行”,上下两组的30个灯珠发绿光、左右两组的30个灯珠发红光——“上下绿灯通行、左右红灯禁行”,“顺时针”和“逆时针”函数则是分别控制四组灯珠从第一个灯珠同时出现(发黄光)“跑马灯”的顺时针、逆时针效果,而“靠近”和“远离”函数分别控制随机色的“花灯”效果和熄灭所有灯珠的效果(如图6)。
接着,在主程序中先对灯带和PAJ7620超声波传感器进行初始化操作;然后,添加一个名为“灯带显示”的子线程,对应的同名函数是一个六分支选择结构,实现的功能是对在“重复当‘真’”循环结构中每隔0.1秒钟就检测一次的变量“手势信息”进行判断,并且根据其返回的数据值进行对应函数的调用,比如当其值为“left”或“right”时,说明手势传感器检测到用户发出了向左或向右的挥手指令,此时便调用“左右方向”函数,出现“左右绿灯通行、上下红灯禁行”的灯带显示效果(如图7)。
3.测试“手势操控”交通多变灯带
将程序保存为“‘手势操控’交通多变灯带”,点击“连接设备”后再点击“运行”按钮,对程序进行各种手势操控的测试,灯带会随之显示出各种预设的效果(如图8)。
三、掌控板Mind+图形化编程:“手势操控”交通信号
实验器材包括:掌控板2.0和百灵鸽扩展板各一块,GY-PAJ7620手势传感器一个,小型面包板一个,公对母异色杜邦线四根。
1.实验装置连接
首先,将手势传感器插接至面包板上;接着,从百灵鸽扩展板(与掌控板已经插接好)的I2C区域接出四根杜邦线,根据G(接地)、V(电源正极)、SCL(控制线)和SDA(数据线)的标注分别插接至面包板,与手势传感器的GND、VIN、SCL和SDA一一对应;最后,通过数据线将掌控板与电脑的USB接口连接(如图9)。
2.在Mind+中进行图形化编程
运行Mind+,首先通过点击左下角的“扩展”按钮将“掌控板”和“PAJ7620U2手势传感器”库添加至左侧模块区域;接着,在“ESP32主程序”和“循环执行”之间进行初始化设置,包括关闭全部的LED灯、屏幕第2行显示“‘手势操控’交通信号”提示信息、设置手势传感器的运行模式为“高速”;然后,在循环体中控制手势传感器进行“获取一次数据”的动作,并且对该动作的返回数据进行判断:当用户发出“向左挥手”或“向右挥手”动作时,程序调用执行“左右方向”函数;当用户发出“向上挥手”或“向下挥手”动作时,程序则调用执行“上下方向”函数;两个函数的代码非常相似,执行的动作分别是在掌控板的OLED屏上显示“红灯,停!”、“绿灯,行!”文字信息,三支LED灯发红光、发绿光,蜂鸣器发出“滴”的提醒音。
值得注意的是,在Mind+的窗口右侧会自动生成与图形化编程对应的Arduino C代码,比如程序先是通过“#include <MPython.h>”和“#include <DFRobot_PAJ7620U2.h>”导入库文件,然后就像是在Arduino的IDE中进行编程一样,有“void setup()”和“void loop()”函数,分别对应程序的初始化设置和循环体执行(如图10)。
3.测试“手势操控”个性交通信号
将程序保存后点击“连接设备”按钮,出现类似于“COM8-CP210x”的掌控板设备名称后再点击“上传到设备”按钮,右下角的窗口就会提示开始向掌控板中写入代码(同时有上传进度条)。当代码写入完毕后,在掌控板的OLED屏上先显示有“‘手势操控’交通信号”的文字提示信息;接着,尝试在手势传感器的上方感应区进行向左或向右挥手、向上或向下挥手,掌控板就会随之做出不同的亮灯、显示提示信息和蜂鸣器提醒音的响应(如图11)。