超声波测距

来自Microduino Wikipedia
跳转至: 导航搜索

目的

在做项目的时候,很多时候需要避障或者距离的测量。今天以一个常用的超声波测距传感器HC-SR04为例做一个距离测量的实验,并把测量的距离显示在串口监视界面上。

设备

Microduino-CoreSTM32是采用 STM32F103CBT6芯片的ARM开发板,采用独特的Upin7接口,大小与一枚一元硬币差不多大,完全兼容Microduino其他扩展模块。

  • 其他硬件设备
    • 面包板跳线 一盒
    • 面包板 一块
    • 超声波测距传感器 一个
    • USB数据连接线 一根

原理

超声波是一种超出人类听觉极限的声波即其振动频率高于20 kHz的机械波。超声波传感器在工作的时候就是将电压和超声波之间的互相转换,当超声波传感器发射超声波时,发射超声波的探头将电压转化的超声波发射出去,当接收超声波时,超声波接收探头将超声波转化的电压回送到单片机控制芯片。超声波具有振动频率高、波长短、绕射现象小而且方向性好还能够为反射线定向传播等优点,而且超声波传感器的能量消耗缓慢有利于测距。在中、长距离测量时,超声波传感器的精度和方向性.都要大大优于红外线传感器,但价格也稍贵。

超声波测距传感器有四个脚:5v电源脚(Vcc),触发控制端(Trig),接收端(Echo),地端(GND)

HC-SR04技术参数:

  • 典型工作用电压:5V。
  • 超小静态工作电流:小于 2mA。
  • 感应角度:不大于 15 度 。
  • 探测距离:2cm-400cm
  • 高精度:可达 0.3cm。
  • 盲区(2cm)超近。

HC-SR04工作原理 超声波测距模块能提供2cm-450cm非接触式感测距离,测距的精度可 高达3mm,能很好的满足我们正常的要求。

触发测距超声波发射器后向某一方向发射超声波,在发射的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离s,即:s=340m/s× t / 2 。这就是所谓的时间差测距法。本实验利用超声波测得的距离从串口中显示。

超声波测距传感器的操作信号时序图如下所示:

操作顺序:

  • 先拉低TRIG,然后至少给10us的高电平信号去触发;
  • 触发后,模块会自动发射8个40KHZ的方波,并自动检测是否有信号返回。
  • 如果有信号返回,通过ECHO输出一个高电平,高电平持续的时间便是超声波从发射到接收的时间。那么测试距离=高电平持续时间*340m/s*0.5或者us/58=cm,us/148=英寸。

注意:1、不宜带电连接,如果要带电连接,则先让模块的 Gnd 端先连接。否则会影响模块工作。

2、测距时,被测物体的面积不少于 0.5 平方米且要尽量平整。否则会影响测试结果。

原理图 传感器的Vcc接Microduino CoreSTM32的Vcc引脚,Trig接Microduino CoreSTM32的D3引脚,Echo接Microduino CoreSTM32的D2引脚,GND接Microduino CoreSTM32的GND引脚。 如下所示:

程序

int inputPin=  2;   //echo pulse input pin
int CTLPin=3;       //trigger pin
int32 t0,t1,deltaT;
void setup() 
{
    pinMode(inputPin, INPUT);
    pinMode(CTLPin, OUTPUT);
    digitalWrite(CTLPin,LOW);
}
void loop()
{
   digitalWrite(CTLPin,HIGH);
   delayMicroseconds(15);
   digitalWrite(CTLPin,LOW);
  while(digitalRead(inputPin)==LOW);  //waiting for high pulse
  t0=micros();
  while(digitalRead(inputPin)==HIGH); //waiting for low 
  t1=micros();
   SerialUSB.print(t1);
   SerialUSB.print("-");
   SerialUSB.print(t0);
   SerialUSB.print("=");
   deltaT=t1-t0;  
   SerialUSB.println(deltaT);
   SerialUSB.print("Distance:");
   SerialUSB.print(deltaT/58);
   SerialUSB.println("cm");
   t0=0;
   t1=0;
   delay(1000);
}

语句while(digitalRead(inputPin)==LOW); 和语句while(digitalRead(inputPin)==HIGH);用来获取超声波从发射出去到收到响应信号之间的时间差。

调试

步骤一:按照原理图连接电路图。如下所示:

步骤二:复制程序到Maple IDE,编译、下载后打开串口监视界面。

步骤三:转动超声波测距传感器的位置,使之对着不同距离的障碍物,观察串口监视界面距离的变化。

结果

改变传感器位置后,测量的距离随之变化,如下图所示:

视频