4个引脚:
- 4 个引脚由 2 个电源引脚(Vcc 、GND)和 2 个控制引脚(Trig、Echo)组成。
- Vcc 和 Gnd 接 5v DC 电源,但不推荐用独立电源给它供电,应使用树莓派或单片机的 GPIO 口输出 5v 和 Gnd 给它供电。不然会影响这个模块的运行。
- Trig 引脚用来接收来自树莓派的控制信号。开始设置为低电平--,高电平工作。接任意 GPIO 口。
- Echo 引脚用来发送测距结果给树莓派。接任意 GPIO 口。--进行检测,高电平工作
工作原理图如下:
- 首先Trig引脚由低电平转为高电平-------通知我要工作了啊!
- 然后
- 1.采用IO触发测距,通电后会保持低电平,当检测到障碍物后会变为高电平,高电平信号的时间至少要10us
- 2.模块自动发送8个40Khz的方波,自动检测是否有信号返回。
- 3.检测障碍物距离的公式:高电平触发的时间 X 声音传播的速度340m/s / 2
- (高电平持续的时间就是超声波从发射到返回的时间)
- (通过阶段时刻--相减来计算时间间隔)
测量2cm--3cm之间进行避障,
基本测试代码:
import RPi.GPIO as GPIO
from pin_dic import pin_dic
import time
class HC_SR04(object):
def __init__(self,pin_trig,pin_echo):
self.pin_trig = pin_trig
self.pin_echo = pin_echo
GPIO.setup(self.pin_trig, GPIO.OUT)
GPIO.setup(self.pin_echo, GPIO.IN)
self.time_tol = 3 #设置时间间隔确保正常工作范围在3s内
def get_distance(self):
s_time = time.time() #当前时刻起开始时间
# 在TRIG引脚上输出一个正向脉冲
GPIO.output(self.pin_trig, 0)#开始为低电平
time.sleep(0.000002)
GPIO.output(self.pin_trig, 1)#trig引脚改为高电平
time.sleep(0.00001)
GPIO.output(self.pin_trig, 0)#有设置为低电平
#次阶段可以视为通知模块----我开始工作了!!!!准备接收
# 等待ECHO引脚上高电平出现
while GPIO.input(pin_echo) == 0:
if time.time()-s_time > self.time_tol:
return False
#跳出循环就是有高电平
# 记录此时高电平出现时间
time1 = time.time()#时间间隔time1
# 等待ECHO引脚上高电平结束
while GPIO.input(pin_echo) == 1:
if time.time()-s_time > self.time_tol:
return False
#跳出高低ping
# 记录高电平结束时间
time2 = time.time()
# 计算ECHO引脚上高电平持续时间
during = time2 - time1
# 计算距离 单位cm
dis = during * 344 / 2 * 100
return dis #整个函数方法就是用来测距
def destory(self):
GPIO.cleanup()
if __name__ == "__main__":
pin_trig = pin_dic['G6']#板子就是38和40
pin_echo = pin_dic['G5']
GPIO.setmode(GPIO.BOARD)
m_HC_SR04 = HC_SR04(pin_trig,pin_echo)#一个对象及其属性
try:
# 主循环
while True:
dis = m_HC_SR04.get_distance()
if dis:
print('%.2f cm'%(dis))
print (' ')
else:
print("Error")
time.sleep(1)
except KeyboardInterrupt:
print('\n Ctrl + C QUIT')
finally:
m_HC_SR04.destory()