(17)用树莓派B+连接HC-sr04超声模块测距
2015-05-30 13:34
267 查看
截止到目前为止,我的B+板上已经连接了2个L298N驱动板,1个DS1302实时时钟模块,1个DHT11温湿度模块,总共使用的GPIO端口(除电源VCC和GND外)2*6 + 1 + 3 = 16个,再除去12个电源接口,还剩12个GPIO可用。如下图:
现在,我们再使用2个GPIO接口来连接一个超声测距模块,这样,我们的树莓派到现在已经可以控制四驱车、采集温度湿度、重启后还能校准时间、USB摄像头采集图像的功能,加上超声测距,已经具有了比较完成的功能。
超声测距模块为HC-sr04,4个引脚分别为:VCC-5V输入,Trig控制输入端,Echo信号输出端,GND,探测距离2cm~450cm,最高精度达0.3cm。
模块的工作原理:
1)采用I/O出发测距,给Trig至少10us的高电平信号;
2)模块自动发送8个40KHz的方波来检测是否有信号返回;
3)如果有信号返回,通过Echo输出一个高电平,高电平持续时间就是超声波从发射到返回的时间,测试距离=(高电平时间*声速340m/s) / 2
模块引脚和原理明白以后,我们就可以连接电路图了,参考如下:
我使用了第32引脚来接HC模块的Echo引脚,第36引脚来接HC模块的Trig引脚。
超声测距模块也是需要通过时序信号来计算时间,但是因为其逻辑比较简单,只用测试高电平持续时间即可,所以我们依然采用RPi.GPIO库就可以实现测距功能。
#!/usr/bin/python2
#coding=utf-8
import RPi.GPIO as GPIO
import time
def init():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(32, GPIO.IN)
GPIO.setup(36, GPIO.OUT, initial=GPIO.LOW)
def getdistance():
GPIO.output(36, GPIO.HIGH)
# 等待10us以上
i = 0
i += 1
GPIO.output(36, GPIO.LOW)
while GPIO.input(32) == GPIO.LOW:
pass
# 从高电平开始计时
start = time.time()
while GPIO.input(32):
pass
end = time.time()
print 'time:', end-start
return (end - start) * 340 / 2
if __name__ == "__main__":
try:
init()
print getdistance()
except KeyboardInterrupt, e:
pass
finally:
GPIO.cleanup()
实测:
分别用直尺测量距离超声模块5cm、10cm、15cm、30cm、50cm,然后用程序测得的距离大约是4.2cm、9cm、14cm、48cm,误差在2cm以内。
实物图如下:
现在,我们再使用2个GPIO接口来连接一个超声测距模块,这样,我们的树莓派到现在已经可以控制四驱车、采集温度湿度、重启后还能校准时间、USB摄像头采集图像的功能,加上超声测距,已经具有了比较完成的功能。
超声测距模块为HC-sr04,4个引脚分别为:VCC-5V输入,Trig控制输入端,Echo信号输出端,GND,探测距离2cm~450cm,最高精度达0.3cm。
模块的工作原理:
1)采用I/O出发测距,给Trig至少10us的高电平信号;
2)模块自动发送8个40KHz的方波来检测是否有信号返回;
3)如果有信号返回,通过Echo输出一个高电平,高电平持续时间就是超声波从发射到返回的时间,测试距离=(高电平时间*声速340m/s) / 2
模块引脚和原理明白以后,我们就可以连接电路图了,参考如下:
我使用了第32引脚来接HC模块的Echo引脚,第36引脚来接HC模块的Trig引脚。
超声测距模块也是需要通过时序信号来计算时间,但是因为其逻辑比较简单,只用测试高电平持续时间即可,所以我们依然采用RPi.GPIO库就可以实现测距功能。
#!/usr/bin/python2
#coding=utf-8
import RPi.GPIO as GPIO
import time
def init():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(32, GPIO.IN)
GPIO.setup(36, GPIO.OUT, initial=GPIO.LOW)
def getdistance():
GPIO.output(36, GPIO.HIGH)
# 等待10us以上
i = 0
i += 1
GPIO.output(36, GPIO.LOW)
while GPIO.input(32) == GPIO.LOW:
pass
# 从高电平开始计时
start = time.time()
while GPIO.input(32):
pass
end = time.time()
print 'time:', end-start
return (end - start) * 340 / 2
if __name__ == "__main__":
try:
init()
print getdistance()
except KeyboardInterrupt, e:
pass
finally:
GPIO.cleanup()
实测:
分别用直尺测量距离超声模块5cm、10cm、15cm、30cm、50cm,然后用程序测得的距离大约是4.2cm、9cm、14cm、48cm,误差在2cm以内。
实物图如下:
相关文章推荐
- Fedora 下nginx和php的安装
- jQuery实现复选框全选功能
- 小糖出品:对方法的补充(2)
- MapReduce程序提示在MapTask或ReduceTask处,Error: java.lang.NullPointerException
- 福尔摩斯的的约会
- iOS开发人员单元测试要求
- jqgrid删除多行数据问题
- 福尔摩斯的的约会
- 第五次作业
- iOS编码问题
- git 学习
- 关于PHP写APP接口的安全问题探讨(一)
- 查比自己小,但是在比自己小的所有数据里面最大的记录
- 第13周项目1—动物这样叫2.3
- _WIN32_WINNT 0x0500 导致 CFileDialog 异常问题
- hdu 2086 A1 = ?(数学题)
- jdk在eclipse中链接源码配置
- linux与secureCRT连接配置
- 工业控件的链接
- mysql 数据同步Slave_IO_Running:No处理方法