1.HC-SR04是一款极其常见的超声测距模块,便宜又好买,探测距离短至2cm,远至4m。如图,有4个引脚,电源2个,目前新版本支持3.3和5V电压,Trig是触发引脚,Echo是回声(检测)引脚,可看作是数据引脚。
其时序图如下:
给Trig引脚一个10us以上的高电平,启动模块发出8个40kHz的超声脉冲,超声脉冲遇到物体会反射进入模块,而此时模块Echo会输出一个高电平,其持续时间即为超声波从发射到返回的时间,进而得到检测距离distance=(高电平时间tc*声速(340m/s))/2=tc(us)*0.017(cm)。
2.以下代码只有一个可被调用的函数getDistance(),用来获得检测距离。将该文件保存为HCSR04.py(注意是大写),并“发送文件到开发板”以备调用。
from time import sleep_us, ticks_us
class HCSR04():
def __init__(self, trig, echo):
self.trig = trig
self.echo = echo
def getDistance(self):
distance = 0
self.trig.value(1)
sleep_us(11)
self.trig.value(0)
while self.echo.value() == 0:
pass
if self.echo.value() == 1:
ts = ticks_us() # 开始时间
while self.echo.value() == 1:
pass
te = ticks_us() # 时间结束
tc = te - ts
distance = tc * 0.017 # 距离计算(单位: cm)
return distance
分别将超声模块的Trig和Echo连接到开发板的6、7脚,接3.3V电源。运行以下代码,在“串口终端”里,按照1秒的周期打印距离值,单位是cm:
from fpioa_manager import fm
from Maix import GPIO
from HCSR04 import HCSR04
import time
#引脚配置
fm.register(6, fm.fpioa.GPIO0)
fm.register(7, fm.fpioa.GPIO1)
Trig = GPIO(GPIO.GPIO0, GPIO.OUT)
Echo = GPIO(GPIO.GPIO1, GPIO.IN)
HC = HCSR04(Trig, Echo)
while (1):
distance = HC.getDistance()
print( distance, 'cm')
time.sleep(1)
3.MaixPy自带modules.ultrasonic,即超声波测距模块,代码要更简练一些,通过设置unit = ultrasonic.UNIT_INCH还可输出英制单位值,不管是cm和英寸,输出结果都是整数。特别要指出的是,原程序只适用于柴火的Grove模块,因其只有1个信号引脚SIG(即Echo),和HC-SR04并不相同,如果直接运行原程序,会出现OSError:time out错误(无数据时产生的错误),如下所示:
其原因就是未给Trig信号,导致模块没有发出超声波,为此,可采取变通的方法,在原程序中人为增加Trig控制信号,高电平持续11us后再次拉低:
Trig.value(1)
time.sleep_us(11)
Trig.value(0)
同时将结果显示到屏上,先import lcd,随后lcd.init(),使用lcd.draw_string方法。好处是无需字库,但缺点是不能调整字体大小。全部代码如下:
from fpioa_manager import *
from modules import ultrasonic
from Maix import GPIO
import time
import lcd
lcd.init()
#引脚配置
fm.register(6, fm.fpioa.GPIO0)
fm.register(7, fm.fpioa.GPIO1)
Trig=GPIO(GPIO.GPIO0, GPIO.OUT)
device = ultrasonic(fm.fpioa.GPIO1)
Trig.value(1)
while True:
Trig.value(1)
time.sleep_us(11)
Trig.value(0)
distance = device.measure(unit = ultrasonic.UNIT_CM, timeout = 30000)
lcd.draw_string(120, 100, "{} cm".format(distance))
print(distance,'cm')
time.sleep(1)
官网上demo用的GPIOHS,即高速端口,其实大可不必,如上程序,改为GPIO亦可,已得以验证。
4.Roberto(rsc1975)在GitHub - rsc1975/micropython-hcsr04: Micropython driver for ultrasonic sensor HC-SR04
上发布了一个HC-SR04的驱动,是基于ESP866/ESP32的,比较规范严谨,里面的定时用到了time_pulse_us,这个是在machine包里面的,K210并不支持,相比来说,上面定时所用的ticks_us方法要更通用。
5.众所周知,超声模块测距精度不高,其中原因之一就是没有考虑到不同温度下声音传播速度并不相同,特别是距离较远时误差增大,因此所设参数应该适当调整,如下:
温度 | -20 | -10 | 0 | 10 | 20 | 30 | 40 |
声速 | 319 | 325 | 331 | 337 | 343 | 349 | 355 |
tc*参数 | 0.016 | 0.016 | 0.017 | 0.017 | 0.017 | 0.017 | 0.018 |