主题:
MicroPython 驱动 HC-SR04 超声波传感器
演示环境:
- 开发板 PYB Nano V1.1
- 固件版本: MicroPython V1.9.3
- 传感器HC-SR04 超声波传感器
https://github.com/ELE-Clouds/ModuleSampleCode_MPY
代码: 全选
# -*- coding: UTF-8 -*-
u'''
******************************************************************************
* 文 件:HCSR04.py
* 概 述:HCSR04超声波传感器模块功能模块
* 版 本:V0.10
* 作 者:Robin Chen
* 日 期:2018年4月27日
* 历 史: 日期 编辑 版本 记录
2018年4月27日 Robin Chen V0.10 创建文件
******************************************************************************'''
from pyb import Pin
from time import sleep_us,ticks_us,sleep
trig = Pin('A0',Pin.OUT_PP)
echo = Pin('A1',Pin.IN)
u'''
*************************************************************************
* 功 能:获取距离值
* 说 明:获取并返回超声波传感器所测值(单位:米)
* 输入参数:None
* 输出参数:None
* 返 回 值:
distance:距离(单位:米)
**************************************************************************'''
def getlang():
distance=0
trig.value(1)
sleep_us(20)
trig.value(0)
while echo.value() == 0:
pass
if echo.value() == 1:
ts=ticks_us() #开始时间
while echo.value() == 1:
pass
te=ticks_us() #结束时间
tc=te-ts #回响时间(单位us)
distance=(tc*170)/1000000 #距离计算(单位为:m) 计算公式为:距离=(声波来回总时间×声波在空气中的传播速度)/2 = (t*340)/2 注:此处t的单位为秒,代码中为微秒。
return distance
while True:
a = getlang()
print(u"与目标的距离:", a, u" m (约合:", a * 10, u"分米 ", a * 100, u"厘米 ", a * 1000, u"毫米)")
sleep(1)
在这次代码编写的过程中,遇到了几个问题,从而浪费了不少时间。现在此总结一下,方便遇到同样问题的朋友有一个参考,同时也有一些发现,一起分享吧:
- 为了方便标记文件名,我将文件名写成了与传感器型号一样的 HC-SR04.py,调用时始终报错,逐步排查,直到我将所有的代码都注释完,发现还是有问题,后尝试将文件名中间的 “-”去掉,问题解决;
- 为了方便整理和管理,我在新建项目时,采用文件夹对文件进行分类的方式,在主目录下新建了一个文件,未来还会有好多,在调用的时候,始终不成功。后来虚心向度娘请教,终于找到了问题所在,及解决办法。共有三种或更多种解决办法,在此我就不一一介绍了,只说其中一种被推荐的,即在需要被调用的文件所在的文件夹下建新一个__init__.py文件,内容可以为空,也可以在此做一些声明类的操作。然后,凡是含有__init__.py文件的文件夹,都会被micropython(对Python应该也一样)解释器视为一个模块,使用方法与模块一样。你可以直接 import 文件夹名,也可以 from 文件夹名 import py文件名。程序成功调用并运行。
- 当触发信号出现下降沿后,延迟4毫秒,出现回响脉冲上升沿,并且,当触发脉冲高电平持续时间超过或接近4毫秒时,将不会有回响脉冲出现(示波器测试结果,为防止有误,大家有机会可以复试一下,另外不知道其驱动芯片会有多少种);
- 在网上查资料的时候,网友提醒,连续采集周期建议60毫秒以上,否则上一次的回响信号残留可能会影响下一次采集的结果。