树莓派+古德微“多线程”硬件编程二例
2020-09-17牟晓东
牟晓东
我们在使用电脑时,可以在播放音乐的同时进行文字编辑和PPT制作,其实这种同时运行多个软件的能力,就是系统的“多线程”——“并发执行”运行机制。它可以直接理解为“同时”、“并行”,多个线程任务同时在运行但相互间几乎没有干扰。几乎所有的编程语言都提供有“多线程”编程方式,比如在Python中是通过threading模块来创建线程和调用方法来实现多线程的,但对于很多初学者(比如中学生)而言这是有一定难度的。如果用树莓派+古德微的“积木”图形化硬件编程的话,理解和使用起来就显得容易得多,而且可以解决许多单纯使用单线程较难解决的问题,在此以实现“不同频”闪烁LED灯阵和“双向”警报器为例。
一、 “不同频”闪烁LED灯阵
1. 实验目的及器材连接
通过多线程运行方式控制四支LED灯同时闪烁,但各自的频率不同:第一支亮0.1秒、再灭0.1秒,第二支亮0.2秒、再灭0.2秒,第三支亮0.5秒、再灭0.5秒,第四支亮1秒、再灭1秒。
先将古德微扩展板正确插入树莓派(注意四周均匀小心用力),再将红绿黄蓝四支异色LED灯分别插入到5号、6号、12号和16号插孔(注意LED灯的长脚为正极、短脚为负极),最后给树莓派通电启动系统。
2. 实验步骤
(1)在浏览器中访问古德微机器人平台(http://www.gdwrobot.cn),登录后点击“设备控制”进入“积木”编程界面并进行“连接设备”操作。
建立四个子线程,名称分别为LED5、LED6、LED12和LED16(注意既不能使用中文命名也区分英文大小写),分别对应四个同名的子函数,每个子函数分别控制对应的LED灯进行亮灭交替——通过设置不同的等待时间来实现不同的闪烁频率。各自的亮、灭等待时间分别为0.1秒、0.2秒、0.5秒和1秒(如图1)。
(2) 该程序在运行时,左侧的四个子线程会在极短时间内依次得到“执行”的权限,而每个子线程都会独自快速去调用自己所对应的子函数,于是宏观上就相当于四个子线程对应四个子函数在多线程运行,就会达到四支LED同时以各自的频率在闪烁的实验效果。点击“运行”按钮进测试,四支LED灯互不干扰地以各自的频率进行闪烁(如图2)。
二、 “双向”警报器
1. 实验目的及器材连接
通过多线程运行方式分别控制超声波传感器检测前方障碍物距离并控制蜂鸣器报警,同时实现红外线传感器检测上方障碍物并控制LED灯亮报警。
先将一支红色LED灯插入古德微扩展板5号插孔,再将红外线传感器插入24号插孔(注意电源正极VCC、接地GND和信号输出OUT三个引脚正确对应);接着,将超声波传感器插入20、21号插孔(注意四个引脚与扩展板插孔也要正确对应);借助三根公对母杜邦线将低电平触发(3.3V)的蜂鸣器连接好(I/O端接入25号插孔的D数据端),最后给树莓派通电启动系统。
2. 实验步骤
(1) 在古德微机器人平台中建立两个子线程,分别为Speaker和Led,同样对应同名的子函数,功能分别是超声波检测障碍物距离报警和红外线检测障碍物报警。前者通过变量“超声波”的数值是否小于10来进行条件判断,成立的话则进行文字信息警示“警报:前方危险!”,并且控制蜂鸣器在“沒电”和“有电”间切换(产生嘀嘀声);后者通过变量“红外线”的数值是否为0来进行条件判断,成立的话同样也进行文字信息警示“注意:上边儿有人!”,并且控制5号红色LED灯闪烁(如图3)。
(2) 该程序在运行时,Speaker和Led子线程就会像第一个案例中的四个控制LED灯闪烁的子线程一样,去调用对应的同名子函数,使得超声波检测障碍物距离报警和红外线检测障碍物报警均处于“监听”状态。当二者中任意一个或都有障碍物进入检测范围时,就会触发对应的蜂鸣器或LED灯进行报警,互不干扰(如图4)。