树莓派+HC-SR04超声波测距
入了一只树莓派,B板,顺便又在淘宝入了几只传感器玩玩。收到货第二天才发现当初最想买的温度湿度传感器由于网络问题没放到购物车!
超声波测距的那只简单好玩,就先拿它练练。
型号:HC-SR04 如图:
VCC:+5v
Trig:开关,高电平开始测距
Echo:从发射超声波开始为高电平,收到回声为低电平
GND:接地
环境是 Raspbian,开箱即用。
按照 RPi Low-level peripherals 的接口定义这样接的线:
VCC --- P1-02
Trig --- P1-16 (GPIO23)
Echo --- P1-18 (GPIO24)
GND --- P1-06
思路很简单,设置Trig为高电平,检查Echo电平变化情况,记录高电平持续时间,这个时间就是超声波来回所用时间,距离=声速×时间/2
,声速就不考虑温湿度气压的影响了取340m/s
。
下面上代码
#!/usr/bin/python
#coding: utf-8
# 使用 HC-SR04 超声波测距模块测距
# VCC : P1-02
# GND : P1-06
# Trig: GPIO23 - P1-16
# Echo: GPIO24 - P1-18
import RPi.GPIO as GPIO
import time
# config
GPIO_PORT_TRIG = 23
GPIO_PORT_ECHO = 24
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_PORT_TRIG,GPIO.OUT)
GPIO.setup(GPIO_PORT_ECHO,GPIO.IN)
isExit = False
# 完成测距标志
def my_callback(channel):
# GPIO_PORT_ECHO 变高电平的时候,该函数被调用
global isExit
e= 0 #声波返回时间
s= time.time() #声波出发时间
while True:
# 循环等待 GPIO_PORT_ECHO 变为低电平(声波返回)
x = GPIO.input(GPIO_PORT_ECHO)
if x==GPIO.LOW:
e= time.time()
break
print '%sm' % round((e-s)*340/2,2)
isExit= True # 可退出程序
GPIO.add_event_detect(GPIO_PORT_ECHO, GPIO.RISING , callback=my_callback)
# 设置 GPIO_PORT_ECHO 变为高电平的时候调用 my_callback
GPIO.output(GPIO_PORT_TRIG,GPIO.HIGH)
# 设置 GPIO_PORT_TRIG 高电平,启动测距传感器
time.sleep(0.1)
GPIO.output(GPIO_PORT_TRIG,GPIO.LOW)
# 恢复低电平
# 程序保持运行最多5s或直到测速完成 isExit == True
k=time.time()
while not isExit:
time.sleep(0.05)
if time.time()-k>5:
break
需要用 Superuser 权限来运行这段程序,GPIO.setup需要 root 权限。
pi@raspberrypi ~/program $ python test_range.py
Traceback (most recent call last):
File "test_range.py", line 13, in
GPIO.setup(GPIO_PORT_TRIG,GPIO.OUT)
RuntimeError: No access to /dev/mem. Try running as root!
运行结果:
pi@raspberrypi ~/program $ sudo python test_range.py
0.17m
pi@raspberrypi ~/program $ sudo python test_range.py
0.2m
pi@raspberrypi ~/program $ sudo python test_range.py
37.65m