超聲波測距的原理很簡單,高中物理題不是做過很多次了么 :D
可以看到,知道時間間隔就能得到距離 L。
那么 HC-SR04 是怎么測距的呢?又怎么使用樹莓派控制它??
HC-SR04 介紹
HC-SR04 模塊可以測量 3cm - 4m 的距離,精確度可以達到 3mm。這個模塊包括 超聲波發射器、超聲波接收器和控制電路三部分。有 4 個引腳。
接線方式
4 個引腳由 2 個電源引腳(Vcc 、GND)和 2 個控制引腳(Trig、Echo)組成。
Vcc 和 Gnd 接 5v DC 電源,但不推薦用獨立電源給它供電,應使用樹莓派或單片機的 GPIO 口輸出 5v 和 Gnd 給它供電。不然會影響這個模塊的運行。
Trig 引腳用來接收來自樹莓派的控制信號。接任意 GPIO 口。
Echo 引腳用來發送測距結果給樹莓派。接任意 GPIO 口。
(注意 Echo 返回的是 5v信號,而樹莓派的 GPIO 接收超過 3.3v 的信號可能會被燒毀,因此需要加一個分壓電路)
HC-SR04 的測距過程
1. 樹莓派向 Trig 腳發送一個持續 10us 的脈沖信號。
2. HC-SR04 接收到樹莓派發送的脈沖信號,開始發送超聲波 (start sending ultrasoun),并把 Echo置為高電平。 ? ?然后準備接收返回的超聲波。
3. 當 HC-SR04 接收到返回的超聲波 (receive returned ultrasound) 時,把 Echo 置為低電平。
從上述過程可以看出, Echo 高電平持續的時間就是超聲波從發射到返回所經過的時間間隔 ~
請對照下圖,
電路圖與 python 程序
接線跟前文所說的一樣。 GPIO 2 腳接 Trig , GPIO 3 腳接 Echo 。樹莓派的 +5v 和 Gnd 與 HC-SR04 的 Vcc 和 Gnd 相連。還有一個分壓電路,一端接 Echo ,另一端接 Gnd。
?1k 和 2k 電阻組成了一個分壓電路,使 GPIO 3 腳的電壓降到了 3.3v 左右。
python 程序
初始化相關引腳:
2 腳連 Trig ,設為輸出模式; 3 腳連 Echo,設為輸入模式。
然后向 Trig 引腳輸入 10us 的脈沖:
time.sleep() ?接收的參數單位為 s ,于是把10 us 轉換為 0.00001 s 。
接收到這個脈沖后,HC-SR04 發射出超聲波,同時把 Echo 置為高電平。在發射之前,Echo 一直為低電平。
據此編寫程序,記錄超聲波發射時的時間。
然后記錄超聲波返回時的時間。
這樣就獲得了我們需要的數據 pulse_start 和 pulse_end ,可以算出距離了~
測得距離(單位:m) ?= ?(pulse_end - pulse_start) * 聲波速度 / 2?
聲波速度取 343m/s 。
然后再把測得的距離轉換為 cm。
測得距離(單位:cm) = (pulse_end - pulse_start) * 聲波速度 / 2 * 100?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= ?(pulse_end - pulse_start) * 17150?
上面的代碼片段都是截圖,完整的文本程序地址 :?github.com/mozjiang/my_raspi/blob/master/ultrasonic_test.py