龙空技术网

多途径实现Arduino“超声波测距警示灯”

壹零社爱科学 173

前言:

眼前同学们对“双目测距 python”可能比较关注,看官们都想要了解一些“双目测距 python”的相关文章。那么小编同时在网上搜集了一些对于“双目测距 python””的相关内容,希望兄弟们能喜欢,姐妹们一起来学习一下吧!

文/山东省招远第一中学 牟晓东

汽车的倒车雷达系统能够根据车尾与障碍物的间距进行声音报警,间距值越小,蜂鸣器的“滴滴”啸叫频率越高。类似地,我们可以借助于Arduino开发板来制作一个小型“超声波警示灯”系统,利用超声波传感器来检测和显示与障碍物的间距,并且能够根据不同的间距值来控制不同颜色的LED发光:距离远,非常安全,亮绿灯;距离减小,处于警示区间范围,亮黄灯;距离接近于警示临界点,比较危险,亮红灯。

1.实验器材与电路连接

实验器材: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)。

2.Arduino IDE代码编程实现“超声波测距警示灯”

在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)。

将程序保存、编译并上传Arduino,对“超声波测距警示灯”进行测试(注意要点击打开右上角的“串口监视器”项):分别控制超声波传感器与障碍物间的距离在30厘米之外、15厘米与30厘米之间、15厘米以内,发现绿色、黄色和红色LED灯会根据不同的安全距离分别发光;同时,串口监视器中也会每隔0.5秒钟就显示有一行类似于“与障碍物间的距离为:32.00cm”的提示信息(如图4)。

3.Python代码编程实现“超声波测距警示灯”

在Python IDLE编程环境中,首先导入time和pinpong库:“import time”、“from pinpong.board import Board,Pin,SR04_URM10”,注意其中的“SR04_URM10”对应的是HC-SR04超声波传感器的“调用”;接着,仍是使用语句“Board("uno").begin()”,完成对Arduino uno板型的初始化操作。

建立TRIGER_PIN和ECHO_PIN两个变量,通过“TRIGER_PIN = Pin(Pin.D2)”和“ECHO_PIN = Pin(Pin.D3)”两个语句,声明超声波传感器连接引脚分别为D2和D3(超声波传感器的Trig与Echo引脚插接在Arduino的2号和3号数字引脚),再加上语句“sonar = SR04_URM10(TRIGER_PIN,ECHO_PIN)”,实现超声波传感器的初始化。然后对三支LED灯进行设置:“GreenLED = Pin(Pin.D4, Pin.OUT)”、“YellowLED = Pin(Pin.D7, Pin.OUT)”和“RedLED = Pin(Pin.D8, Pin.OUT)”,包括插接的数字引脚分别是4号、7号和8号,而且均作为信号输出端。

建立“while True:”循环结构,将读取到的超声波传感器检测间距数据存储至变量distance中:“distance = sonar.distance_cm()”(单位是厘米),并且通过print()函数将该值在屏幕上打印输出:“print("与障碍物间的距离为:{0:.2f} cm".format(distance))”;然后再建立“if…elif…else…”三分支选择结构,通过对变量distance值的大小进行判断来控制不同颜色LED灯的发光(向对应LED灯的数字引脚写入高电平“1”);最后仍然是添加 “time.sleep(0.5)”延迟语句,并且向三支LED灯的数字引脚均写入低电平“0”来完成“熄灯”操作。

将程序保存,按功能键F5运行程序来测试“超声波测距警示灯”,屏幕显示检测的间距值,同时也会亮起对应颜色的LED灯(如图5)。

4.Mind+图形化编程实现“超声波测距警示灯”

运行Mind+进入图形化编程界面,首先要点击左下角的“扩展”项,将Arduino Uno主控板和超声波测距传感器加载;接着,建立变量“超声波测距”,为其赋值为“读取超声波传感器距离”,注意要将模块中的trig和echo引脚分别设置为2和3号;再使用“设置串口波特率”和“串口字符串输出”四个语句,完成将变量“超声波测距”在屏幕上打印输出的功能;然后建立三分支选择结构,根据超声波测距的数值大小控制对应颜色的LED灯发光;最后是延迟0.5秒钟,并且熄灭所有的LED灯。

点击“上传到设备”项,出现“上传成功”提示后,再次测试Arduino的“超声波测距警示灯”:右下角出现“与障碍物间的距离为:93.00cm”的提示信息,同时也会亮起对应颜色的LED灯,效果与使用代码编程相同(如图6)。

标签: #双目测距 python