[Arduino]超声波测距

一切开始之前,我们需要先来温习一个中学就学习过的物理原理:

常温常压下空气中的声速: 340m/s

德罕姆冲你微笑

声波雷达原理

超声波也是声波,它在1个标准大气压下,15℃的空气中的传播速度为340m/s。而声波在传播的过程中遇到障碍物时,会反射也会衍射,所以当我们测量出发出声波和听到回声的时间差,就能估算出声音传播的距离。同时因为超声波频率高波长短,所以衍射低,拘束性好,因此能量衰减也更少,传播的距离也更长,更比耳朵能听到的低频率声音更适合做长距离测量。

超声波测距原理

如上图所示,测量步骤为:

  • 发出n个mHz的超声波脉冲,超声波脉冲发射结束时开始计时,记作t0
  • 开始监听mHz的超声波脉冲的回声,监听到n个后结束计时,记作t1
  • 计算时间差t = t1 - t0,为超声波来回两程所花费的时间
  • 计算超声波走过的距离s = v * (t1 - t0) / 2(v为声速)

声波速度与空气温度的关系

声波传播速度与传播介质的温度成正比,与传输介质的密度成正比。声波在1个标准大气压下的传播速度与空气温度的关系为:

v = 331.5 + 0.607t

v为声波的速度,单位m/s
t为空气的温度,单位℃

超声波测距模块

现在市面上的超声波测距模块很多,比较常见的就算HC-SRxxx系列和US-100系列了,它们甚至可以用于汽车的倒车雷达。基本上都长这个样子,一定会有一个或者两个圆筒筒的超声波收发器。

超声波模块

目前这个超声波模块都是使用40kHz的声波,人耳可辨识的声音频率范围在20 ~ 20kHz,模块使用的声音频率超过人耳可识频率上限的2倍,完全对人类的正常生活产生影响。

它们的测距方式都是大同小异的,通常有TTL方式和GPIO方式两种,GPIO是最通用的一种控制方式,我们就用这个方式为例说明超声波测距模块的用法。
接线方式如下:

  • Trigger,触发输入端,默认低电平,输入一个时常超过10μs的高电平脉冲即可触发模块发射一组超声波脉冲
  • Echo,回声输出端,默认低电平,模块发射超声波脉冲结束后,回声端就会输出高电平,直到监听到所有超声波脉冲的回声(或监听超时)后才会重新输出低电平
超声波测距时序

使用步骤如下:

  • 在拉高Trigger端10μs以上后拉低,以触发模块发射8个40kHz的超声波脉冲
  • 开始监听Echo端,Echo输出高电平时开始计时,Echo输出低电平时结束计时
  • 计算出计时的时长,即为声波一来一回花费的时间
  • 计算声波走过的路程

如果想要测量得更精确,可以测量环境温度,然后如声波速度与空气温度的关系所述,利用环境温度来修正声波的速度后,再计算声波的距离。温度测量的实现方法详见[Ardunio] DS18B20温度传感器

编码实现

#define ULTRASONIC_ECHO_PIN              2
#define ULTRASONIC_TRIGGER_PIN           4
#define ULTRASONIC_DISCOVERING_STATE_PIN 13
#define ULTRASONIC_DISCOVERING_INTERVAL  500000

volatile bool mReadyToDiscovering = true;
unsigned long mEchoStartTime      = 0;
unsigned long mEchoEndTime        = 0;
float         mDistance           = 0.0f;

void trigger();
void calcDistance();
void onEcho();
bool isReadyToDiscovering();
  
void setup() {
    Serial.begin(115200);
    Serial.println();
    Serial.println("Ultrasonic ranging ready");

    // UltraSonic pins setup
    pinMode(ULTRASONIC_ECHO_PIN, INPUT);
    pinMode(ULTRASONIC_TRIGGER_PIN, OUTPUT);
    pinMode(ULTRASONIC_DISCOVERING_STATE_PIN, OUTPUT);
    attachInterrupt(digitalPinToInterrupt(ULTRASONIC_ECHO_PIN), onEcho, CHANGE);

    // UltraSonic pins initialization
    digitalWrite(ULTRASONIC_TRIGGER_PIN, LOW);
    digitalWrite(ULTRASONIC_DISCOVERING_STATE_PIN, LOW);
}

void loop() {
    if (isReadyToDiscovering()) {
        calcDistance();
        trigger();
    }
}

bool isReadyToDiscovering() {
    if (mReadyToDiscovering) {
        unsigned long now = micros();
        if (now - mEchoEndTime > ULTRASONIC_DISCOVERING_INTERVAL) {
            mReadyToDiscovering = false;
            return true;
        }
    }
    return false;
}

void trigger() {
    digitalWrite(ULTRASONIC_TRIGGER_PIN, HIGH);
    delayMicroseconds(50);
    digitalWrite(ULTRASONIC_TRIGGER_PIN, LOW);
}

void onEcho() {
    uint8_t echo = digitalRead(ULTRASONIC_ECHO_PIN);
    unsigned long now = micros();
    if (echo == HIGH) {
        mEchoStartTime = now;
        digitalWrite(ULTRASONIC_DISCOVERING_STATE_PIN, HIGH);
    } else {
        mEchoEndTime = now;
        digitalWrite(ULTRASONIC_DISCOVERING_STATE_PIN, LOW);
        mReadyToDiscovering = true;
    }
}

void calcDistance() {
    long deltaTime = mEchoEndTime - mEchoStartTime;
    mDistance = 340L * deltaTime / 2000000.0; // s = vt = 340 m/s * time / 2
    Serial.print("Distance = ");Serial.print(mDistance * 100.0);Serial.print("cm, Time = ");Serial.print(deltaTime);Serial.println("us");
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容

  • 最近由于事情比较杂,加上自己懒得动手码字,一直没有更简书。刚好最近帮学弟做了一个超声波测距(含温度补偿)的小...
    Deng_Wei阅读 4,103评论 1 14
  • 超声波测距原理:通过超声波发射装置发出超声波,根据接收器接到超声波时的时间差就可以知道距离。 模块特征 HC-SR...
    繁著阅读 9,225评论 0 6
  • 超声波测距的原理很简单,高中物理题不是做过很多次了么 :D 可以看到,知道时间间隔就能得到距离 L。 那么 HC-...
    jiang阅读 15,896评论 11 4
  • 1989年11月,父亲离开边防团到分区任参谋长,杨副团长接任了团长职务,当年和他一起在大雪天执行过转运伤员任务的边...
    精睿君阅读 328评论 3 4
  • 挑了今天4月1号,周五,应该去墓园不会扎堆,出发吧。 女司机车技不堪,撩的是车,撩了一辆本田 CRV. 年轻小夫妻...
    xuanxueqing笑哈哈阅读 107评论 0 0