多途径实现Arduino“红外感应灯”
2021-08-11牟晓东
牟晓东
在Arduino开源硬件编程中,常规实现方法是在Arduino IDE环境中进行C语言(包括C++)式的代码编程,代码精简、效率比较高。中小学生通常是从图形化编程入手,通过将高度集成编译好的“积木”式模块进行组合来实现同样的编程效果,比如Mind+、Mixly等等。除此之外,我们还可以在Python中借助PinPong库模块的引入进行代码编程,也能够让Arduino控制各种外设来实现非常丰富的功能。以“红外感应灯”为例——当有物体靠近(默认为2~30cm范围)时,Arduino控制LED灯发光;否则,LED灯保持熄灭状态。
1.实验器材与电路连接
实验器材:Arduino UNO主板一个,红外线传感器一个,红色LED灯一支,三色公对母杜邦线各一根。首先将LED灯长腿(正极)插入13号引脚,短腿(负极)插入与之相邻的GND接地引脚;接着将三根杜邦线一端与红外传感器相连,红色线将VCC引脚与Arduino的5V引脚连接,黑色线负责接地(两端均连接GND),黄色线将红外传感器的OUT信号输出端与Arduino的7号引脚相连;最后,通过数据线将Arduino与计算机USB接口连接,准备开始编程(如图1)。
2.常规Arduino IDE代码编程实现“红外感应灯”
首先,在Arduino IDE中进行两个变量的定义与赋值,语句“int led = 13;”对应插接在13号引脚的红色LED灯,语句“int irSensorPin = 7;”对应插接在7号引脚的红外传感器;接着,在setup()函数中写入两个语句:“pinMode(led,OUTPUT);”的作用是声明LED灯的引脚(13号)为输出模式,而“pinMode(irSensorPin, INPUT);”的作用是声明红外传感器引脚(7号)为输入模式。
最后,在loop()函数中写入一个“if…else…”选择结构,其中的判断条件是“digitalRead(irSensorPin) == HIGH”,即判断从红外传感器中读取的数字信号是否为HIGH高电平;高电平是对应“没有物体进入检测范围”的情况,因此后面要写一个“digitalWrite(led,LOW);”语句,控制LED灯处于低电平的熄灭状态;如果条件不成立,说明红外传感器检测到“有物体进入”,则在else后面写一个“digitalWrite(led,HIGH);”语句,控制LED灯处于高电平的发光状态(如图2)。
将程序编译并上传,对红外感应灯进行检测:当没有物体靠近时,LED灯熄灭;而当有物体进入检测范围时,LED灯开始发光(如图3),直到物体移出后又熄灭。
3.Python代码编程实现“红外感应灯”
借助于PinPong第三方库模块,我们可以非常方便地在Python中对Arduino进行代码编程。首先需要在Python中进行PinPong库模块的安装,方法是在Python的脚本安装目录(比如:C:\Users\ZYYZ-BJ\AppData\Local\Programs\Pyth
on\Python38\Scripts)中按住Shift键的同时,在空白处点击右键并选择“在此处打开命令窗口”;接着在弹出的CMD窗口中输入命令“pip install pinpong”,回车后即可开始安装,成功后会显示“Successfully installed”的提示信息(如图4)。
首先,进入Python IDLE编程环境后新建一个Python文件,导入time和pinPong库模块:“import time”和“from pinpong.board import Board,Pin”;接着,通过语句“Board(“uno”).begin()”來实现对Arduino uno板型的初始化操作,同时还会自动识别端口号(比如COM9);然后,建立led和irSensor两个变量,语句“led = Pin(Pin.D13, Pin.OUT)”的作用是设置连接在13号引脚的LED灯为信号输出端,语句“irSensor = Pin(Pin.D7, Pin.IN)”的作用是设置连接在7号数字引脚的红外传感器为信号输入端。
最后,在“while True:”循环结构中先建立变量Sensor_Value,并为其赋值为“irSensor.read_digital()”,作用是读取红外传感器所监测到的数字信号;然后建立一个“if…else…”选择结构,对变量Sensor_Value的值进行“是否等于1”的判断,条件成立的话,说明未检测到有物体进入,则执行语句“led.write_digital(0)”,向LED灯的13号引脚写入低电平0,即保持熄灭状态;反之,则通过语句“led.write_digital(1)”向13号引脚写入高电平1,控制LED灯发光。语句“time.sleep(0.1)”的作用是控制每次循环运行均延迟0.1秒,防止消耗过多的系统资源而造成“死机”。
将程序保存后按功能键F5运行程序,Arduino红外感应灯开始“工作”:有物体靠近,亮灯;反之,熄灭。
4.Mind+图形化编程实现“红外感应灯”
运行Mind+进入图形化编程界面,难度比较低,直接通过“积木”块语句的拖动和组合:
首先在左侧通过点击“扩展”项添加“主控板”下的“Arduino Uno”,返回后在“循环执行”中建立一个“如果…那么执行…否则…”选择结构,同样是对插接在7号引脚的红外传感器进行数字信号读取;如果值为1,说明没有物体进入有效检测范围,则控制插接在13号引脚的LED灯熄灭——“输出为低电平”;反之,则“输出为高电平”,即控制LED灯发光(如图5)。
程序编写完毕后点击“上传到设备”项,当出现“上传成功”提示后,Arduino红外感应灯可以根据对物体的监测进行“熄灭、发光”的自动切换,与之前使用Arduino IDE和Python代码编程所实现的效果完全一致,大家不妨一试。