[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閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容

  • 最近由于事情比較雜,加上自己懶得動手碼字,一直沒有更簡書。剛好最近幫學弟做了一個超聲波測距(含溫度補償)的小...
    Deng_Wei閱讀 4,381評論 1 14
  • 超聲波測距原理:通過超聲波發射裝置發出超聲波,根據接收器接到超聲波時的時間差就可以知道距離。 模塊特征 HC-SR...
    繁著閱讀 9,456評論 0 6
  • 超聲波測距的原理很簡單,高中物理題不是做過很多次了么 :D 可以看到,知道時間間隔就能得到距離 L。 那么 HC-...
    jiang閱讀 16,001評論 11 4
  • 1989年11月,父親離開邊防團到分區任參謀長,楊副團長接任了團長職務,當年和他一起在大雪天執行過轉運傷員任務的邊...
    精睿君閱讀 356評論 3 4
  • 挑了今天4月1號,周五,應該去墓園不會扎堆,出發吧。 女司機車技不堪,撩的是車,撩了一輛本田 CRV. 年輕小夫妻...
    xuanxueqing笑哈哈閱讀 129評論 0 0