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);
}
做了这个实验,让测试结果在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);
}
好贴,支持一下。:) 是否可以加上电脑上返回的信号图片 piaozhiling 发表于 2011-9-16 19:20 static/image/common/back.gif
是否可以加上电脑上返回的信号图片
这个超声波在公司,星期一才贴图片,大概结果就是
10cm
20cm
22cm
100cm
105cm
类似这样.有换行 :lol还成....再加上红外避障就完美了 Kinect上用的红外距离传感器实现有人了解么? 我看国外的视频有三个脚的超声波传感器,G V S 那我想要是把这trig和echo连载一个pin上,改下代码 能工作么 wali 发表于 2011-11-24 10:21 static/image/common/back.gif
我看国外的视频有三个脚的超声波传感器,G V S 那我想要是把这trig和echo连载一个pin上,改下代码 能工作么
两个pin的模式不一样,应该不能接在一起的吧。不确定 very Good!!!!!!!!!:victory: 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呢 楼主给说明一下吧~ 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了。 咱家宝的大胖熊 发表于 2012-4-7 10:59 static/image/common/back.gif
我原来也有同问。
看了arduino cookbook就知道了。
long microsecondsToCentimeters(long microseconds ...
谢了啊 呵呵 alextime 发表于 2012-4-10 16:49 static/image/common/back.gif
谢了啊 呵呵
支持,正好找了一个传感器,用手水平转了一圈扫的数据~~
右上的平面是电脑的屏幕,旁边突出来的是热水壶,右下应该是本人(那个尖尖是啥玩意{:soso__15007980067068905509_1:}),左下的平面是座位的隔板,左边的突出是我的包。左上是空档,超过100cm的都按100算了。
这种方式可以用来做为智能车判断路径的依据哎,一边走一边分析数据,就像即时战略游戏的战争黑雾设计一样,我们的小车就是一个探路兵。{:soso__10846275550858121775_4:}
这个是我用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-27 11:58 static/image/common/back.gif
这个是我用3个超声波传感器做的壁障探测小车,我的目标是做6个超声波传感器的,但是这个程序为什么在3个超声 ...
谢谢问题我解决了··还有个问题那个怎么把超声波收到的数据用matlab连起来呢? 求教,用的超声波传感器和您的一样,程序用的也是您的。但是不知道为什么,输出的总是0.00cm。求指导,谢谢!!!