牟晓东
汽车的倒车雷达系统能够根据车尾与障碍物的间距进行声音报警,间距值越小,蜂鸣器的“滴滴”啸叫频率越高。类似的,我们可以借助于Arduino开发板来制作一个小型“超声波警示灯”系统,利用超声波传感器来检测和显示与障碍物的间距,并且能够根据不同的间距值来控制不同颜色的LED发光:距离远,非常安全,亮绿灯;距离减小,处于警示区间范围,亮黄灯;距离接近于警示临界点,比较危险,亮红灯。
实验器材:Arduino UNO主板一个,HC-SR04超声波传感器一个,绿色、黄色和红色LED灯各一支,面包板一块,各种颜色的杜邦线若干。
首先,将Arduino的5V电源正极和GND通过杜邦线连接至面包板;HC-SR04超声波传感器有四个引脚,其中的VCC和GND分别插接至面包板的正极和负极,Trig信号发射引脚和Echo信号接收引脚分别插接至Arduino的2号和3号数字引脚;绿色、黄色和红色LED的长腿(正极)通过面包板分别连接至Arduino的4号、7号和8号数字引脚,短腿(负极)与GND连接;最后,通过数据线将Arduino与计算机USB接口连接(如图1)。
在Arduino IDE中首先进行变量的定义,与超声波传感器相关的语句包括“int TrigPin = 2;”“int EchoPin = 3;”和“float distance;”,前两个分别声明它的信号发射与接收引脚为2号和3号数字引脚,定义的浮点型变量distancd是用来存储超声波传感器所测量的间距值;接着再定义三个整形变量:“int GreenLED = 4;”“int YellowLED = 7;”和“int RedLED =8;”,分别对应绿色、黄色和红色LED的三个数字引脚(4号、7号和8号)。
在setup()函數中,先通过语句“Serial.begin(9600);”来设置串口监视器的波特率,目的是实时显示出超声波传感器所监测的间距数据;然后是五个pinMode()引脚模式设置语句,除超声波传感器的EchoPin设置为INPUT输入模式外,将它的TrigPin和三个LED灯(GreenLED、YellowLED、RedLED)均设置为OUTPUT输出模式(如图2)。
在loop()函数中,首先要控制超声波传感器的发射端进行信号的触发,即使用“低-高-低”的短时间脉冲:语句“digitalWrite(TrigPin, LOW);”和“delayMicroseconds(20);”的作用是控制发射端保持20微秒的低电平;然后通过语句“digitalWrite(TrigPin,HIGH);”和“delayMicroseconds(20);”,控制发射端再保持20微秒的高电平(即触发一个20微秒的高脉冲);最后的语句“digitalWrite(TrigPin, LOW);”是控制发射端再次处于低电平状态。
接着,为存储间距值的变量distance进行赋值:“distance=pulseIn(EchoPin,HIGH) * 340/2/
10000;”,计算方法是借助pulseIn()来实现——此时要特别注意它的单位是“微秒”(空气中的声速值按340米/秒计),有“米与厘米”和“秒与微秒”间的单位换算(相当于“除以10000”);而且超声波传感器所监测的间距值是“超声波从发射端发出、向前运动并碰到障碍物后、再返回至接收端”的往返值(要“除以2”),因此在表达式中要对“pulseIn(EchoPin, HIGH)”的值再进行“*340/2/10000”的计算。然后,在串口监视器中输出一行提示信息,语句为“Serial.print("与障碍物间的距离为:"); ”;接着再通过“Serial.print(distance); ”和“Serial.print(“cm”); ”两行语句,将distance变量和单位(“厘米”)在同一行显示输出;而后面的语句“Serial.println(); ”,作用是输出一个“换行”(相当于“回车”操作)。
接下来要构建一个“if…else if…else…”三分支选择结构,对变量distance的值进行区间范围判断:如果距离大于30厘米(“distance >= 30.00”),执行语句“digitalWrite(GreenLED,HIGH);”,控制绿色LED灯发光;如果距离在15厘米和30厘米之间(“distance < 30.00 and distance >= 15.00”),则执行语句“digitalWrite(YellowLED,HIGH);”,控制黄色LED灯发光;否则的话——相当于距离小于15厘米(“distance < 15.00”),则执行语句“digitalWrite(RedLED,HIGH);”,控制红色LED灯发光。
最后,添加一个“delay(500); ”语句,作用是控制每次循环均延迟500毫秒;而三个digitalWrite()语句则是向三个LED连接引脚写入低电平,作用是关闭所有的LED灯,从而为下一次循环的正确响应做好初始化准备(如图3)。