树莓派 HC-SRO4超声波测距模块的使用

先上个图

这个模块的针脚跟之前玩的那三个有所区别,除了VCC和GND两个针脚,还多了两个Trig和Echo针脚,分别是输出和输入,Trig我接的是20针脚,Echo是21

该模块的工作原理为,先向TRIG脚输入至少10us的触发信号,该模块内部将发出 8 个 40kHz 周期电平并检测回波。一旦检测到有回波信号则ECHO输出高电平回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式: 距离=高电平时间*声速(340M/S)/2。

下面是代码

 1 import RPi.GPIO as GPIO
 2 import time
 3 
 4 Trig_Pin = 20
 5 Echo_Pin = 21
 6 
 7 GPIO.setmode(GPIO.BCM)
 8 GPIO.setup(Trig_Pin, GPIO.OUT, initial = GPIO.LOW)
 9 GPIO.setup(Echo_Pin, GPIO.IN)
10 
11 time.sleep(2)
12 
13 def checkdist():
14     GPIO.output(Trig_Pin, GPIO.HIGH)
15     time.sleep(0.000015)
16     GPIO.output(Trig_Pin, GPIO.LOW)
17     while not GPIO.input(Echo_Pin):
18         pass
19     t1 = time.time()
20     while GPIO.input(Echo_Pin):
21         pass
22     t2 = time.time()
23     return (t2-t1) *340/2
24 
25 try:
26     while True:
27         print 'Distance:%0.2f m' % checkdist()
28         time.sleep(3)
29 except KeyboardInterrupt:
30     GPIO.cleanup()

发现那个捕捉的异常是针对Crtl+C触发的,之前我那几个模块如果正在输出就Ctrl+C的话还是会持续的输出,我只能另外写个脚本来关闭对应针脚的输出,有了这个异常捕捉,就方便多了

实际测出来的距离是偏低的

方法都是照抄的,原文地址:http://bbs.elecfans.com/forum.php?mod=viewthread&tid=451330

 

转载于:https://www.cnblogs.com/New-world/p/4614954.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于51开发板和HC-SRO4超声波测距模块的超声波距离报警系统的代码实现: ```c #include <reg51.h> #define uint unsigned int #define uchar unsigned char sbit D1 = P1^0; // D1灯接口 sbit BEEP = P1^1; // 蜂鸣器接口 sbit TRIG = P2^0; // 超声波测距模块TRIG引脚 sbit ECHO = P2^1; // 超声波测距模块ECHO引脚 void Delay10us(uint t) // 延时函数 { while(t--); } void Init_Timer0() // 初始化定时器0 { TMOD &= 0xF0; TMOD |= 0x01; // 16位定时器模式 TH0 = 0xFC; // 定时500ms TL0 = 0x66; TR0 = 1; // 启动定时器 ET0 = 1; // 允许定时器0中断 EA = 1; // 允许总中断 } void Start_Trigger() // 启动超声波测距模块 { TRIG = 1; Delay10us(5); TRIG = 0; } uint Get_Distance() // 获取距离值 { uint distance; while(!ECHO); // 等待ECHO引脚变高 TR0 = 1; // 启动定时器0 while(ECHO); // 等待ECHO引脚变低 TR0 = 0; // 停止定时器0 distance = TH0; distance <<= 8; distance |= TL0; // 计算距离值 distance /= 58; // 转换为厘米单位 return distance; } void main() { D1 = 0; // 初始状态为灭 BEEP = 0; // 初始状态为不响 Init_Timer0(); while(1) { Start_Trigger(); // 启动超声波测距模块 uint distance = Get_Distance(); // 获取距离值 if(distance > 40) // 超过40cm,系统不做出响应 { D1 = 0; BEEP = 0; } else if(distance > 30) // 30cm-40cm,D1灯闪烁 { D1 = ~D1; BEEP = 0; } else if(distance > 20) // 20cm-30cm,D1灯常亮 { D1 = 1; BEEP = 0; } else if(distance > 10) // 10cm-20cm,蜂鸣器报警(频率较慢) { D1 = 1; BEEP = ~BEEP; } else // 小于10cm,蜂鸣器报警(频率较快) { D1 = 1; BEEP = (BEEP + 1) % 3; } } } void Timer0_ISR() interrupt 1 // 定时器0中断服务程序 { TH0 = 0xFC; // 定时500ms TL0 = 0x66; TR0 = 0; // 停止定时器 TF0 = 0; // 清除中断标志位 } ``` 该代码实现了基于51开发板和HC-SRO4超声波测距模块的超声波距离报警系统,并能够实现要求的各种功能。需要注意的是,在实际使用中,需要根据具体硬件设备和开发板来进行调整和编写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值