arduino超声波测距介绍

2017-08-19 13:37:53 mcuwangzai 阅读数 26333

  

       Arduino是一款便捷灵活、方便上手的开源电子原型平台。如果玩过51或者stm32的同学肯定会认为arduino是一款非常非常简单的开发入门单片机。非常适合没有系统学过编程和电气知识的人群作为单片机入门的一个法宝,可以说是能够0基础上手。大笑


arduino不同于51或者stm32,它可以完全不需要了解其内部硬件结构和寄存器设置,仅仅知道它的端口作用即可,可以不懂硬件知识,只要会简单的C语言,就可用Arduino 单片机编写程序。


比如51单片机要设置一个寄存器要设置好多管脚,但是arduino全都给我们包装好了,我们只要知道端口作用即可,往往51单片机要写几十行甚至上百行的代码,arduino一句语句就搞定了。


但是正是arduino的简便性,内部硬件结构和寄存器设置都不需要自己来设置,大大限制了它的能力。大哭也注定了它的功能和效率是和其他单片机没办法比的。  很多工程师不喜欢arduino,因为它简单,很多功能都不能达到最优化。   生气 个人认为:arduino适合没有单片机基础的人用于学习51,stm32之前的入门和兴趣培养是非常非常好的一个平台,也是对于一些非本专业的人士自己DIY一些创意电子产品的最佳选择!!!


言归正传,今天来分享一个arduino超声波测距的做法:

         材料:arduino板子一块,1602显示屏,超声波模块(我用的是HC-SRO4),面包板,杜邦线若干........................

1.arduino



2.超声波模块



 3.1602显示屏




     采用IO触发测距,给至少10us的高电平信号;模块自动发送8个40KHz的方波,自动检测是否有信号返回;

有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间;       

测试距离=(高电平时间*声速(340m/s))/2。


接线图:


我们先讲超声波测距,

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);       // delayMicroseconds在更小的时间内延时准确
	digitalWrite(TrigPin, HIGH); 
	delayMicroseconds(10); 
	digitalWrite(TrigPin, LOW); //通过这里控制超声波的发射
	
	cm = pulseIn(EchoPin, HIGH) / 58.0; //将回波时间换算成cm 
	cm = (int(cm * 100.0)) / 100.0; //保留两位小数 
	Serial.print("Distance:"); 
	Serial.print(cm); 
	Serial.print("cm"); 
	Serial.println(); 
	delay(1000); 
}

pulseIn函数用于读取引脚脉冲的时间长度,脉冲可以是HIGH或LOW。如果是HIGH,函数将先等引脚变为高电平,然后开始计时,一直到变为低电平为止。

返回脉冲持续的时间长短, 单位为ms。如果超时还没有读到的话, 将返回0。  pulseIn()单位为微秒,声速344m/s,所以距离cm=344*100/1000000*pulseIn()/2约等于pulseIn()/58.0

将结果打印到窗口上效果会更明显。



      接下来讲1602液晶屏显示:

接线图:


脚位连接说明:以上图为例,是从左到右第一脚开始数起:

1 Vss 接地 (0V)

2 Vdd 电源 (+5V)

3 Vo或与Vee - 对比度调整(0-5V), 可接一颗1K的电阻或接一个5K的电位器    

4 RS Register Select:   参数:{1: D0 – D7 设置为1时当作资料解释   0: D0 – D7 设置为0时当作指令解释}

5 R/W Read/Write mode:   参数:{1: 从LCD读取资料   0: 写资料到LCD(一般情况下很少从LCD读取资料,把这个脚接地可省I/O脚位)}

6 E Enable

7 D0 Bit 0 LSB

8 D1 Bit 1

9 D2 Bit 2

10 D3 Bit 3

11 D4 Bit 4

12 D5 Bit 5

13 D6 Bit 6

14 D7 Bit 7 MSB

15 A+ 背光(串联一个1K的电阻接地或串联一个5K的电位器调整背光)

16 K- 背光(GND)


由于这里的两条背光现接到了2,3管脚,占用了刚刚的超声波管脚,所以我们等下把两个合起来的时候,把超声波的两个管脚接到8,9,脚


代码:

#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);  //定义脚位
void setup()
{
  lcd.begin(16,2); //设置LCD显示的数目。16 X 2:16格2行。
  lcd.print("hello,world!"); //将hello,world!显示在LCD上
}
void loop()
{
  lcd.setCursor(0,1);  //将闪烁的光标设置到column 0, line 1 (注释:从0开始数起,line 0是显示第一行,line 1是第二行。)
  lcd.print(millis()/1000); //开机后屏幕现实以秒几时的时间
}


这样就可以实现1602显示的功能了。


最后把他们合起来:


这么短的代码能够实现这些功能也就arduino了

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //定义脚位
const int TrigPin = 8;
const int EchoPin = 9;
float cm;

void setup()
{
  Serial.begin(9600);
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
  lcd.begin(16, 2); //设置LCD显示的数目。16 X 2:16格2行。
  lcd.print("yuan pei!"); //将hello,world!显示在LCD上
}
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("Distance:");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  delay(1000);
  lcd.setCursor(0, 1); //将闪烁的光标设置到column 0, line 1 (注释:从0开始数起,line 0是显示第一行,line 1是第二行。)
  lcd.print("Dis:"); 
  lcd.setCursor(5, 1);
  lcd.print(cm); 
  lcd.setCursor(11, 1);
   lcd.print("cm");
}







2020-05-04 20:46:06 weixin_44996090 阅读数 656

Arduino实现超声波测距+LCD液晶屏实时显示

1、描述

利用HC-SR04超声波测距模块,基于Arduino实现测量距离,并将结果显示在LCD1602液晶显示屏上。

2、所用食材

一个HC-SR04模块、Arduino开发板、面包板、电阻及导线若干。

3、电路图

基于fritzing绘图软件实现
有一点需要注意一下,图中的电阻最好选用阻值在3k附近的电阻,这样会有更好的清晰度。当然如果接一个可变电阻上会更好,这样可以手动调节。

4、实物图

在这里插入图片描述

5、代码

#include <LiquidCrystal.h>

#define LM35 A0
#define Trig 8 //引脚Tring 连接 IO D8
#define Echo 9 //引脚Echo 连接 IO D9
 
float cm; //距离变量
float temp; // 

LiquidCrystal lcd(12,11,5,4,3,2);      //构造一个LiquidCrystal的类成员。使用数字IO ,12,11,5,4,3,2

int val = 0;        //存放AD变量值
float temp = 0;     //存放温度值的10倍

void setup()
{
  lcd.begin(16,2);    //初始化LCD1602
  lcd.print("Welcome to use!");   //液晶显示Welcome to use!
  delay(1000);        //延时1000ms
  lcd.clear();        //液晶清屏
  
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
}

void loop()
{
  //给Trig发送一个低高低的短时间脉冲,触发测距
  digitalWrite(Trig, LOW); //给Trig发送一个低电平
  delayMicroseconds(2);    //等待 2微妙
  digitalWrite(Trig,HIGH); //给Trig发送一个高电平
  delayMicroseconds(10);    //等待 10微妙
  digitalWrite(Trig, LOW); //给Trig发送一个低电平
  
  temp = float(pulseIn(Echo, HIGH)); //存储回波等待时间,
  //pulseIn函数会等待引脚变为HIGH,开始计算时间,再等待变为LOW并停止计时
  //返回脉冲的长度
  
  //声速是:340m/1s 换算成 34000cm / 1000000μs => 34 / 1000
  //因为发送到接收,实际是相同距离走了2回,所以要除以2
  //距离(厘米)  =  (回波时间 * (34 / 1000)) / 2
  //简化后的计算公式为 (回波时间 * 17)/ 1000
  cm = (temp * 17 )/1000; //把回波时间换算成cm
  
  lcd.setCursor(0,0);       //设置液晶开始显示的指针位置
  lcd.print("Now Distance:"); //液晶显示“LM35 temp =”
  lcd.setCursor(0,1);       //设置液晶开始显示的指针位置,在下一行显示
  lcd.print(cm);  //液晶显示距离
  
  
  delay(1000);              //延时1000ms
}

写在最后

希望对屏幕前的您有帮助。如果您有任何的疑问,欢迎在下方留言或者私信我,第一时间将会对您的疑问做出回应。
生命不息,折腾不止!学习之路的孤单你我共知。本人目前是大二一名普通学生,如果您愿意的话,能进一步交流可谓好之又好!

2019-03-04 10:12:47 woshi_ziyu 阅读数 811

测距仪是用于查找从点到最近障碍物的距离的设备。该装置使用超声波技术测量距离。您可以将它视为一种无障碍的电子卷尺,测量范围为2cm至400cm,精度为1cm。 Arduino超声波测距仪的典型应用包括停车传感器、障碍物警告系统、液位控制器和地形监测设备。您可以使用便宜且易于使用的组件在不到一个小时的时间内制作自己的Arduino超声波测距仪。

在这里插入图片描述

Arduino超声波测距仪如何工作?

在这里插入图片描述

对于此测距仪,我们使用UltraSonic传感器测量两点之间的距离。该传感器的操作原理是测量声音在给定时间内行进的距离。传感器产生高频声波,遇到最近的障碍物并产生回声。确定回波到达传感器所花费的时间。这用于计算距离,因为空气中声音的速度是已知常数(343m / s)。我们可以在LCD上显示此信息。所有这些操作都是使用Arduino控制的。现在让我们来看看HC-SR04测距传感器吧!

在这里插入图片描述

● VCC:向该引脚施加5V电源电压。

● Trigger:给该引脚提供10uS长脉冲以触发传输。在接收到有效的触发脉冲时,HR-SR04发出8个40KHz脉冲。测量这些脉冲反射回来所花费的时间并根据它计算距离。

● Echo:在此引脚上,HC-SR04输出一个信号,其高电平时间与范围成正比。

● Ground:该引脚接地。

更多内容请参考以下链接:https://www.yiboard.com/thread-1081-1-1.html

2019-06-20 09:03:52 kqwin 阅读数 1695

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

超声波传感器

超声波传感器是利用超声波的特性研制而成的传感器。超声波是一种振动频 率高于声波的机械波,由换能晶片在电压的激励下发生振动产生的,它具有频率高、波长短、绕射现象小,特别是方向性好、能够成为射线而定向传播等特点。超声波对液体、固体的穿透本领很大,尤其是在阳光不透明的固体中,它可穿透几十米的深度。超声波碰到杂质或分界面会产生显著反射形成回波,碰到活动物体能产生多普勒效应。因此超声波检测广泛应用在工业、国防、生物医学等方面以超声波作为检测手段,必须产生超声波和接收超声波。完成这种功能的装置就是超声波传感器,习惯上称为超声换能器,或者超声探头。
超声波探头主要由压电晶片组成,既可以发射超声波,也可以接收超声波。小功率超声探头多作探测作用。它有许多不同的结构,可分直探头(纵波)、斜探头(横波)、表面波探头(表面波)、兰姆波探头(兰姆波)、双探头(一个探头反射、一个探头接收)等。
本次实验测试对象是SRF-04超声波传感器,有四个脚:5v电源脚(Vcc),触发控制端(Trig),接收端(Echo),地端(GND)

蜂鸣器

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。蜂鸣器在电路中用字母“H”或“HA”(旧标准用“FM”、“ZZG”、“LB”、“JD”等)表示。蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型。此处不再过多阐述他们的区别。

电路连接、接线

在这里插入图片描述

源码

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);
} 
2020-03-20 13:01:16 bimbamboun 阅读数 180

任务要求

能够利用arduino和超声波传感器测量与物体之间的距离,精度可以实现小数点后两位。

系统总体设计

在这里插入图片描述
超声波传感器: 超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停 止计时,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离。
Arduino: 为控制核心,在其中对传感器进行相应的处理和算法处理,获得距离。
Lcd1602: 将获得的距离值显示在lcd显示屏上。

硬件设计

超声波传感器:采用HC-SR04模块,HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。
超声波传感器模块电路:
在这里插入图片描述
LCD1602显示模块电路:
在这里插入图片描述

软件设计

超声波传感器的基本工作原理:
(1)采用IO口TRIG触发测距,给最少10us的高电平信号。
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回, 通过IO口ECHO输出一个高电平, 高电平持续的时间就是超声波从发射到返回的时间。 测试距离=(高电平时间*声速(344M/S))/2。

#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,10,5,4,3,2);//定义LCD的引脚连接情况
 
// 设定SR04连接的Arduino引脚
const int TrigPin = 7; 
const int EchoPin = 6; 
float distance; 
void setup() 
{   // 初始化串口通信及连接SR04的引脚
        Serial.begin(9600); 
        pinMode(TrigPin, OUTPUT); 
    // 要检测引脚上输入的脉冲宽度,需要先设置为输入状态
        pinMode(EchoPin, INPUT); 
        lcd.begin(16,2);  //定义lcd列数及行数
        lcd.clear();//清屏
        lcd.setCursor(0,0);//光标位置置于0,0 
} 
void loop() 
{ 
    // 产生一个10us的高脉冲去触发TrigPin 
        digitalWrite(TrigPin, LOW); 
        delayMicroseconds(2); 
        digitalWrite(TrigPin, HIGH); 
        delayMicroseconds(10);
        digitalWrite(TrigPin, LOW); 
    // 检测脉冲宽度,并计算出距离
        distance = pulseIn(EchoPin, HIGH) / 58.00;
        delay(1000); 
        lcd.clear();//清屏
        lcd.setCursor(0,0);//光标从这里开始
        lcd.print("Distance is");
        lcd.setCursor(0,1);//换行后显示距离
        lcd.print(distance);
}

pulseIn函数用于读取引脚脉冲的时间长度,单位为微秒,声速344m/s
测试距离cm=pulseIn()(微秒)x344x100(cm)/1000000(微秒)/2约等于pulseIn()/58.0

结果

在这里插入图片描述

测量值(cm) 4.30 5.30 6.30 7.30 8.30
实际值(cm) 4.48 5.38 6.29 7.34 8.31