树莓派小车之---超声波模块(HC-SR04)(一)

 

 4个引脚:

  1. 4 个引脚由 2 个电源引脚(Vcc 、GND)和 2 个控制引脚(Trig、Echo)组成。
  2. Vcc 和 Gnd 接 5v DC 电源,但不推荐用独立电源给它供电,应使用树莓派或单片机的 GPIO 口输出 5v 和 Gnd 给它供电。不然会影响这个模块的运行。
  3. Trig 引脚用来接收来自树莓派的控制信号。开始设置为低电平--,高电平工作。接任意 GPIO 口。
  4. 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()

猜你喜欢

转载自blog.csdn.net/JLwwfs/article/details/126104288
今日推荐