(6)ESP32+Python 做一个超声波探测器
2022-01-16 本文已影响0人
ScottX
我们经常在智能小车上都能看到一个长这么样得一个东西。
image.png这个东西就是一个超声波测距模块,一共有4个引脚VCC,Trig,Echo,Gnd。
VCC:接VCC电源,一般都是5V,但是现在市面上也有支持3.3V的
Trig: 给这个引脚输入一个10us的高电平,就可以触发测距。
Echo: 在测距结束时,这个引脚会输出一个高电平。电平的宽度经过计算的后,就是测距的距离
GND:接地
这里有一个计算公式:
测距距离 = (高电平的时间 * 音速【340M/S】/2)
简单的来讲实现原理是当我们需要测试距离时,
-
把Trig输入10us的高电平,然后拉低。测距开始。
-
当Echo收到发出的信号后,会把引脚的电平拉高。
-
计算第一步和第二步的时间差。
-
套入公式,计算距离(音速的时间是340米每秒,第一步和第二步的时间是US,所以计算时要用10000计算回来)
注意,超声波是一种波,并不是百分之百的和下面的图一样,发送的是直线。
image.png在了解好原理后,把传感器和硬件进行连接,然后开始写代码吧。
第一个实现,我们还是采用原生的写法。
from machine import Pin
import utime
class ORGHCSR04:
trig = None
echo = None
def __init__(self):
global trig, echo
trig = Pin(25, Pin.OUT)
echo = Pin(26, Pin.IN)
trig.off()
echo.off()
def start_scan(self):
while True:
self.start_hc()
utime.sleep_ms(800) # 这里根据需要设定SLEEP时间
print('>_<')
def start_hc(self):
global trig, echo
trig.on()
utime.sleep_us(10)
trig.off()
while echo.value() == 0 :
pass
start_us = utime.ticks_us()
while echo.value() == 1 :
pass
end_us = utime.ticks_us()
rang_us = utime.ticks_diff(end_us,start_us)/10000
dist = rang_us*340/2
print("dist is: %0.2f CM" % dist)
完成后烧录到开发板进行测试
image.png
如果要用HAAS进行,首先需要在board.json当中进行定义
{
"name": "haasedu",
"version": "1.0.0",
"io": {
"hc_triger":{
"type": "GPIO",
"port": 25,
"dir": "output",
"pull": "pulldown"
},
"hc_echo":{
"type": "GPIO",
"port": 26,
"dir": "input",
"pull": "pulldown"
}
},
"debugLevel": "ERROR",
"repl": "disable"
}
Haas 实现代码如下:
import utime
from driver import GPIO
class HAASHCSR04:
triger_gpio = None
echo_gpio = None
def __init__(self):
global triger_gpio, echo_gpio
triger_gpio = GPIO()
triger_gpio.open('hc_triger')
triger_gpio.write(0)
echo_gpio = GPIO()
echo_gpio.open('hc_echo')
echo_gpio.write(0)
def start_scan(self):
while True:
self.start_hc()
utime.sleep_ms(800) # 这里根据需要设定SLEEP时间
def start_hc(self):
global triger_gpio, echo_gpio
triger_gpio.write(1)
utime.sleep_us(10)
triger_gpio.write(0)
while(echo_gpio.read()==0):
pass
start_us = utime.ticks_us()
while(echo_gpio.read()==1):
pass
end_us = utime.ticks_us()
rang_us = utime.ticks_diff(end_us,start_us)/10000
dist = rang_us*340/2
print("dist is: %0.2f CM" % dist)
但是,上面代码的输出都是通过print输出的,不太灵性。之前我们有做过连接OLED,这里我们可以把OLED也用起来。
效果如下,我们还可以把之前的红绿灯也插上去。红灯停,绿灯行。哈哈。
image.png