2019-11-26
21:37:49
一、所需
- 树莓派3B
- (HC-SR04)超声波测距模块
- 电阻1KΩ,2KΩ各一个
- 杜邦线,面包板
关于HC-SR04
HC-SR04模块的测距为3cm - 4m,精确度可达3mm。改模块包括超声波发射器、超声波接收器和控制电路三部分。
A、引脚4个:
- VCC
- TRIG
- ECHO
- GND
B、工作原理
1、采用IO口TRIG触发测距,给10us的高电平信号;
2、模块自动发送8个40khz的方波,自动检测是否有信号返回;
3、有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
C、与树莓派工作过程
1、树莓派向Trig脚发送一个持续10us的脉冲信号。
2、HC-SR04接收到树莓派发送的脉冲信号,开始发送超声波,并把Echo置为高电平。然后准备接收返回的超声波。
3、当HC-SR04接收到返回的超声波时,把Echo置为低电平。
4、记录发送到接收之间的时间就可以测算距离了。
二、连接树莓派与HC-SR04
4个引脚:
VCC连接5V针脚
GND连接任意板上任意GND针脚
Trig连接GPIO18(BCM编码对应的针脚)
Echo连接GPIO23(BCM编码对应的针脚)
由于Echo输出为5V信号,而树莓派的GPIO输入最高允许3.3V,所以应该接一个分压电路。
上图为树莓派实验室的HC-SR04教程的图片,我是学习他的分压接法,只是我使用的GPIO引脚不同罢了,Echo输出降到3.3V左右。
连接完成。
三、编写代码(Python)
import time # 导入 GPIO 库 import RPi.GPIO as GPIO # 设置 GPIO 编码模式为 BCM模式 GPIO.setmode(GPIO.BCM) # 定义 GPIO 引脚 Trig = 18 Echo = 23 # 设置 GPIO 的工作模式(IN / OUT) GPIO.setup(Trig, GPIO.OUT) GPIO.setup(Echo, GPIO.IN) def distance(): # 发送高电平信号到 Trig 引脚 GPIO.output(Trig, True) # 持续 10us time.sleep(0.00001) GPIO.output(Trig, False) start_time = time.time() stop_time = time.time() # 记录发送超声波的时刻1 while GPIO.input(Echo) == 0: start_time = time.time() # 记录收到超声波的时刻2 while GPIO.input(Echo) == 1: stop_time = time.time() # 记录超声波的往返时间 = 时刻1 - 时刻2 time_distance = start_time - stop_time # 声波的速度为 343m/s, 转化为 34300cm/s distance = (time_distance * 34300) / 2 return distance if __name__ == "__main__": try: while True: dis = distance() print("Measured Distance = {:.2f} cm".format(dis)) time.sleep(1) # Reset by pressing CTRL + C except KeyboardInterrupt: print("Measurem stopped by User") GPIO.cleanup()