超声波测距

罗大富 BigRich大约 3 分钟ESP32Arduino

本节课来学习使用 Arduino 控制超声波传感器。

实验原理

超声波是一种频率高于 20000Hz 的声波,功率密度为 p≥0.3W/cm,它的的方向性好,反射能力强,易于获得较集中的声能。超声波用于许多不同的领域,比如检测物体和测量距离,清洗设备,消毒杀菌等等。

超声波传感器使用声纳来确定与物体的距离。我们使用的超声波模块由 2 个超声波探头组成:

  1. T:表示 Transmitter(发射),负责发送超声波信号;
  2. R:表示 Receiver(接收),负责接收回响信号;

注意

如果在使用过程中,对其中任意一个探头进行遮挡,都会使超声波无法正常测量距离。

底部有四个引脚:

  1. VCC:5V 供电引脚;
  2. GND:接地;
  3. TRIG:控制信号输入;
  4. ECHO:回响信号输出;

以上时序图表示超声波模块的基本工作原理:

  • 采用 IO 口 TRIG 触发测距,给一个 10us 的高电平信号;
  • 模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回;
  • 有信号返回,通过 IO 口 ECHO 输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2

回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式如下:

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

硬件电路设计

物料清单(BOM 表):

材料名称数量
0.96 寸 OLED 屏幕1
杜邦线(跳线)若干
面包板1
超声波模块1

软件程序设计

该程序的功能是通过超声波模块测算距离并显示在 OLED 屏幕上,代码如下:

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// 定义超声波模块引脚
#define TRIG 13
#define ECHO 14

// OLED 显示屏尺寸
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

// 软件SPI总线
#define OLED_MOSI 19
#define OLED_CLK 18
#define OLED_DC 2
#define OLED_CS 4
#define OLED_RESET 15

Adafruit_SSD1306 oled(SCREEN_WIDTH, SCREEN_HEIGHT,
                      OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

void setup()
{
  // 初始化超声波模块引脚
  pinMode(TRIG, OUTPUT);
  pinMode(ECHO, INPUT);

  // 初始化 OLED
  oled.begin();
  // 设置字体大小
  oled.setTextSize(2);
  // 设置文本颜色
  oled.setTextColor(SSD1306_WHITE);
  // 显示内容
  oled.display();
}

void loop()
{
  // 清除trigPin
  digitalWrite(TRIG, LOW);
  delay(2);
  // 将trigPin设置为HIGH状态10微秒
  digitalWrite(TRIG, HIGH);
  delay(10);
  digitalWrite(TRIG, LOW);
  // 读取echoPin,返回声波传播时间(微秒)
  float time = pulseIn(ECHO, HIGH);
  // 计算距离
  float distance = time * 0.034 / 2;

  // 清空屏幕
  oled.clearDisplay();
  // 设置光标位置
  oled.setCursor(0, 15);
  // 显示文字
  oled.print("Distance: ");
  oled.print(distance);
  oled.print("cm");
  // 刷新屏幕
  oled.display();

  delay(100); // 延迟一段时间后更新显示
}
上次编辑于:
贡献者: Luo