极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 65203|回复: 15

Arduino超声波测距模块控制蜂鸣器

[复制链接]
发表于 2013-6-12 13:40:09 | 显示全部楼层 |阅读模式
Arduino超声波测距模块控制蜂鸣器



这里和大家分享下使用Arduino超声波测距模块控制蜂鸣器,通过简单的程序来作为超声波控制的一个教学例程,希望大家多多批评。
测试对象是SRF-04超声波传感器,有四个脚:5v电源脚(Vcc),触发控制端(Trig),接收端(Echo),地端(GND)
对于超声波的相关技术文件大家了在网上搜,资源很多,只要多花几分钟看看,都可以掌握的,这里就不多说了。
电路连接原理如下:


程序如下:

[pre lang="arduino" line="1" file="超声波控制蜂鸣器"]const int TrigPin = 2;
const int EchoPin = 3;
float cm;
void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(8,OUTPUT);
}
void loop()
{
digitalWrite(8, LOW);

digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);

cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
cm = (int(cm * 100.0)) / 100.0; //保留两位小数
if (cm>=2 && cm<=10)
digitalWrite(8, HIGH);
} [/code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-6-12 17:29:24 | 显示全部楼层
我想请问一下楼主 frizing的这几个传感器都是怎么画出来的  是楼主自己画的么 还是有数据库从网上下载的呢  求链接啊 3q~~
回复 支持 反对

使用道具 举报

发表于 2013-6-12 22:33:06 | 显示全部楼层
不够有才 发表于 2013-6-12 17:29
我想请问一下楼主 frizing的这几个传感器都是怎么画出来的  是楼主自己画的么 还是有数据库从网上下载的呢  ...

AdaFruit Fritzing Library添加了98个元件。其中包含了两个超声波测距模块。但与LZ的不同样。
回复 支持 反对

使用道具 举报

发表于 2013-6-13 18:41:38 | 显示全部楼层
smching 发表于 2013-6-12 22:33
AdaFruit Fritzing Library添加了98个元件。其中包含了两个超声波测距模块。但与LZ的不同样。

谢谢你的链接那,不知道你还有元件库了?
回复 支持 反对

使用道具 举报

发表于 2013-6-13 21:00:38 | 显示全部楼层
code-AR 发表于 2013-6-13 18:41
谢谢你的链接那,不知道你还有元件库了?

没有了。
如有兴趣,你可以使用Fritzing parts editor自己设计。
回复 支持 反对

使用道具 举报

发表于 2013-9-8 21:45:40 | 显示全部楼层
楼主我请问您一个问题哈,我想把这个程序稍微改一下,改成距离小于十五厘米的时候电动机停转,应该怎么改啊?
回复 支持 反对

使用道具 举报

发表于 2014-1-23 14:13:02 | 显示全部楼层
弱弱问下楼主cm = pulseIn(EchoPin, HIGH) / 58.0;为什么是除58??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-4 20:40:56 | 显示全部楼层
工作折腾了大半年,这个论坛也有半年没进了,关于为什么除以58是这么计算的:声速是340m/s换算一下就是29ms/cm,这里需要的是每厘米所需的时间,因为我们的程序里时间单位为毫秒,距离单位为厘米,所以再除以2(我们只要单程)就是58了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-4 20:42:33 | 显示全部楼层
不够有才 发表于 2013-6-12 17:29
我想请问一下楼主 frizing的这几个传感器都是怎么画出来的  是楼主自己画的么 还是有数据库从网上下载的呢  ...

传感器啊,网上有的我就直接用了,蜂鸣器和引线是用FLASH CS5画的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-4 20:46:42 | 显示全部楼层
我就是阳光 发表于 2013-9-8 21:45
楼主我请问您一个问题哈,我想把这个程序稍微改一下,改成距离小于十五厘米的时候电动机停转,应该怎么改啊 ...

这个很简单,你用一个输出口作为电机电源的开关,如果你的电机功率比较大那就外接一个继电器开关,输出口控制继电器,继电器控制电机的电源,软件部分只要修改下判断语句就行了,很简单。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-4 20:47:39 | 显示全部楼层
Turbo 发表于 2014-1-23 14:13
弱弱问下楼主cm = pulseIn(EchoPin, HIGH) / 58.0;为什么是除58??

声速是340m/s换算一下就是29ms/cm,这里需要的是每厘米所需的时间,因为我们的程序里时间单位为毫秒,距离单位为厘米,所以再除以2(我们只要单程)就是58了。
回复 支持 反对

使用道具 举报

发表于 2015-2-8 09:58:27 | 显示全部楼层
const int TrigPin = 2;
const int EchoPin = 3;
float cm;
void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
pinMode(4,OUTPUT);
}
void loop()
{
digitalWrite(TrigPin, LOW); //低高低电平发一个短时间脉冲去TrigPin
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);

cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
cm = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print(cm);
Serial.print("cm");
Serial.println();
if(cm>100.0)
{  
digitalWrite(4,HIGH);
delay(100);
digitalWrite(4,LOW);
delay(1000);
}
if(cm>20.0 && cm<100.0)
{
digitalWrite(4,HIGH);
delay(100);
digitalWrite(4,LOW);
delay(1000-(100-cm)*12.5);
}
if(cm<20.0)
{
digitalWrite(4,HIGH);
}
}
没事闲着做的,
大家请见谅
回复 支持 反对

使用道具 举报

发表于 2015-4-23 10:16:21 来自手机 | 显示全部楼层
楼主为什么读的高电平时间,从发射到返回。这段时间接收端没信号不是低电平吗。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-5-21 10:14:34 | 显示全部楼层
snoopy0225 发表于 2015-4-23 10:16
楼主为什么读的高电平时间,从发射到返回。这段时间接收端没信号不是低电平吗。

发射端要发一个低高低脉冲电平,经过障碍物反射后,接收端接收到这段高低电平后计算发射和接收的时间差来计算距离,而发射端发出脉冲后,接收端确实是低电平,但是计算公式里需要的是低高低脉冲返回的时间!那么肯定是采集低高低电平里的高电平来计算时间了,所以cm = pulseIn(EchoPin, HIGH) / 58.0; 这条检测语句肯定要是高电平检测计算了,明白?
回复 支持 反对

使用道具 举报

发表于 2015-5-21 23:46:01 | 显示全部楼层
求助楼主会不会编超声波测距控制蜂鸣器的乐器的程序啊
具体问题在这里http://www.geek-workshop.com/thread-15034-1-1.html
多谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-16 19:58 , Processed in 0.063107 second(s), 27 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表