Ansifa 发表于 2011-9-6 01:29:39

Arduino学习笔记A2 - Arduino连接超声波传感器测距

本帖最后由 Ansifa 于 2013-6-3 12:25 编辑

Arduino连接超声波传感器测距

注:方法已经过时,新方法使用timer去计时,请看https://code.google.com/p/arduino-new-ping/

超声波传感器适用于对大幅的平面进行静止测距。普通的超声波传感器测距范围大概是2cm~450cm,分辨率3mm(淘宝卖家说的,笔者测试环境没那么好,个人实测比较稳定的距离10cm~2m左右,超过此距离就经常有偶然不准确的情况发生了,当然不排除笔者技术问题。)

测试对象是淘宝上面最便宜的SRF-04超声波传感器,有四个脚:5v电源脚(Vcc),触发控制端(Trig),接收端(Echo),地端(GND)
附:SRF系列超声波传感器参数比较
http://www.acroname.com/robotics/info/articles/devantech/srf.html


模块工作原理:

[*]采用IO触发测距,给至少10us的高电平信号;
[*]模块自动发送8个40KHz的方波,自动检测是否有信号返回;
[*]有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间.测试距离=(高电平时间*声速(340m/s))/2;
电路连接方法:


Arduino程序例子:

const int TrigPin = 2;
const int EchoPin = 3;
float cm;
void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
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();
delay(1000);
}



philhoo 发表于 2013-5-27 20:57:40

做了这个实验,让测试结果在1602液晶屏上显示。用了SR04的库。
#include "SR04.h"
#define TRIG_PIN 8
#define ECHO_PIN 9
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
SR04 sr04 = SR04(ECHO_PIN,TRIG_PIN);
long a;

void setup() {
   lcd.begin(16, 2);
   delay(1000);
}

void loop() {
   a=sr04.Distance();
lcd.clear(); //清屏
lcd.print("Now Range is"); //使屏幕显示文字
lcd.setCursor(0, 1) ; //设置光标位置为第二行第一个位置
lcd.print(a);   //显示温度
lcd.print("CM"); //显示字母
   delay(1000);
}

竹空闻樱 发表于 2013-5-21 20:54:09

好贴,支持一下。:)

piaozhiling 发表于 2011-9-16 19:20:12

是否可以加上电脑上返回的信号图片

Ansifa 发表于 2011-9-17 00:05:19

piaozhiling 发表于 2011-9-16 19:20 static/image/common/back.gif
是否可以加上电脑上返回的信号图片

这个超声波在公司,星期一才贴图片,大概结果就是
10cm
20cm
22cm
100cm
105cm
类似这样.有换行

━__Neo_ˇ 发表于 2011-11-23 19:11:54

:lol还成....再加上红外避障就完美了

esuncloud 发表于 2011-11-24 09:20:33

Kinect上用的红外距离传感器实现有人了解么?

wali 发表于 2011-11-24 10:21:19

我看国外的视频有三个脚的超声波传感器,G V S 那我想要是把这trig和echo连载一个pin上,改下代码 能工作么

树·水·风 发表于 2012-1-17 19:51:06

wali 发表于 2011-11-24 10:21 static/image/common/back.gif
我看国外的视频有三个脚的超声波传感器,G V S 那我想要是把这trig和echo连载一个pin上,改下代码 能工作么

两个pin的模式不一样,应该不能接在一起的吧。不确定

heiketiguo 发表于 2012-3-27 22:08:11

very Good!!!!!!!!!:victory:

alextime 发表于 2012-4-3 17:03:46

cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
cm = (int(cm * 100.0)) / 100.0; //保留两位小数
Serial.print(cm);
Serial.print("cm");
Serial.println();
delay(1000);

这段代码看不懂 为什么要除以58呢 楼主给说明一下吧~

咱家宝的大胖熊 发表于 2012-4-7 10:59:03

alextime 发表于 2012-4-3 17:03 static/image/common/back.gif
cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm
cm = (int(cm * 100.0)) / 100.0; //保留两位 ...

我原来也有同问。
看了arduino cookbook就知道了。
long microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}
声速是340m/s换算一下就是29ms/cm了。

alextime 发表于 2012-4-10 16:49:00

咱家宝的大胖熊 发表于 2012-4-7 10:59 static/image/common/back.gif
我原来也有同问。
看了arduino cookbook就知道了。
long microsecondsToCentimeters(long microseconds ...

谢了啊 呵呵

黑马 发表于 2012-4-18 15:10:52

alextime 发表于 2012-4-10 16:49 static/image/common/back.gif
谢了啊 呵呵

支持,正好找了一个传感器,用手水平转了一圈扫的数据~~

右上的平面是电脑的屏幕,旁边突出来的是热水壶,右下应该是本人(那个尖尖是啥玩意{:soso__15007980067068905509_1:}),左下的平面是座位的隔板,左边的突出是我的包。左上是空档,超过100cm的都按100算了。

这种方式可以用来做为智能车判断路径的依据哎,一边走一边分析数据,就像即时战略游戏的战争黑雾设计一样,我们的小车就是一个探路兵。{:soso__10846275550858121775_4:}

饥渴的 发表于 2012-5-27 11:58:08

这个是我用3个超声波传感器做的壁障探测小车,我的目标是做6个超声波传感器的,但是这个程序为什么在3个超声波的时候程序就失效了,只有2个超声波传感器有效int inputPin=2;
int outputPin=3;
//////////////
int inputPin1=12;
int outputPin1=13;

////////
int inputPin2=0;
int outputPin2=1;
///////
int distance;
int distance1;
int distance2;
void setup()
   {
   Serial.begin(9600);
   //第一个超声波
   pinMode(inputPin,INPUT);
   pinMode(outputPin,OUTPUT);
   //第2个超声波
   
      pinMode(inputPin1,INPUT);
   pinMode(outputPin1,OUTPUT);
   //
      pinMode(inputPin2,INPUT);
   pinMode(outputPin2,OUTPUT);
   
   //小车运动
      pinMode(8,OUTPUT);
      pinMode(9,OUTPUT);
      pinMode(11,OUTPUT);
      pinMode(5,OUTPUT);
      pinMode(6,OUTPUT);
      pinMode(7,OUTPUT);
   }
void loop()
    {
    //第一个超声波
    digitalWrite(outputPin,LOW);
    delayMicroseconds(2);
    digitalWrite(outputPin,HIGH);
    delayMicroseconds(10);
    int distance=pulseIn(inputPin,HIGH);
    distance=distance/58;
    //第二个超声波
    digitalWrite(outputPin1,LOW);
    delayMicroseconds(2);
    digitalWrite(outputPin1,HIGH);
    delayMicroseconds(10);
    distance1=pulseIn(inputPin1,HIGH);
    distance1=distance1/58;
   //第3个超声波
    digitalWrite(outputPin2,LOW);
    delayMicroseconds(2);
    digitalWrite(outputPin2,HIGH);
    delayMicroseconds(10);
    distance2=pulseIn(inputPin2,HIGH);
    distance2=distance2/58;
   
    //
    //Serial.print("distance = ");
    //Serial.println(distance);
    //
    Serial.print(",distance = ");
Serial.println(distance1);
    //
    Serial.print(",distance = ");
    Serial.println(distance2);
   
   
   Goahead();
   delay(20);
   if( distance >= 50)
    {
   // digitalWrite(ledpin,HIGH);
    // delay(100);
   Goahead();
    }
    else
    {
   // digitalWrite(ledpin,LOW);
   //delay(100);
    Turn_left();
   }
   
   if( distance1 >= 50 )
    {
   // digitalWrite(ledpin,HIGH);
    // delay(100);
    // Goahead();
    }
    else
    {
   // digitalWrite(ledpin,LOW);
   //delay(100);
   //Stop();
   Turn_right();
    }
   
   
   if( distance2 >= 50)
      {
      // digitalWrite(ledpin,HIGH);
      // delay(100);
       Goahead();   
      }
    else
       {
         // digitalWrite(ledpin,LOW);
      //delay(100);
         Stop();
      }
   
   
    }
   
///////////////////////////////
void Goahead()
   {
   analogWrite(5,145);
   digitalWrite(6,HIGH);
   digitalWrite(7,LOW);
   analogWrite(11,160);
   digitalWrite(8,HIGH);
   digitalWrite(9,LOW);
    }


void Stop()//停止程序
   {
    digitalWrite(6,HIGH);
    digitalWrite(7,HIGH);
    digitalWrite(8,HIGH);
    digitalWrite(9,HIGH);
    }

void Turn_right()//右转
    {
    analogWrite(5,165);
    digitalWrite(6,LOW);
    digitalWrite(7,HIGH);
    analogWrite(11,140);
    digitalWrite(8,HIGH);
   digitalWrite(9,LOW);
   }

void Turn_left()
   {
    analogWrite(5,165);
    digitalWrite(6,HIGH);
    digitalWrite(7,LOW);
    analogWrite(11,160);
    digitalWrite(8,LOW);
    digitalWrite(9,HIGH);
   
   }

饥渴的 发表于 2012-5-31 15:16:50

饥渴的 发表于 2012-5-27 11:58 static/image/common/back.gif
这个是我用3个超声波传感器做的壁障探测小车,我的目标是做6个超声波传感器的,但是这个程序为什么在3个超声 ...

谢谢问题我解决了··还有个问题那个怎么把超声波收到的数据用matlab连起来呢?

arduino-tinker 发表于 2012-6-23 21:20:12

求教,用的超声波传感器和您的一样,程序用的也是您的。但是不知道为什么,输出的总是0.00cm。求指导,谢谢!!!
页: [1] 2 3 4 5 6 7 8
查看完整版本: Arduino学习笔记A2 - Arduino连接超声波传感器测距