K210(SiPEED MaixBit)MicroPython使用参考(八、超声模块HC-SR04驱动)

1.HC-SR04是一款极其常见的超声测距模块,便宜又好买,探测距离短至2cm,远至4m。如图,有4个引脚,电源2个,目前新版本支持3.3和5V电压,Trig是触发引脚,Echo是回声(检测)引脚,可看作是数据引脚。K210(SiPEED MaixBit)MicroPython使用参考(八、超声模块HC-SR04驱动)_第1张图片

其时序图如下:

K210(SiPEED MaixBit)MicroPython使用参考(八、超声模块HC-SR04驱动)_第2张图片

给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错误(无数据时产生的错误),如下所示:

K210(SiPEED MaixBit)MicroPython使用参考(八、超声模块HC-SR04驱动)_第3张图片

其原因就是未给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方法要更通用。

K210(SiPEED MaixBit)MicroPython使用参考(八、超声模块HC-SR04驱动)_第4张图片

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

你可能感兴趣的:(Python,K210,单片机,嵌入式硬件)