超聲波傳感器,英文ultrasonic sensor,既可以發射超聲波,也可以接收超聲波,它有一個重要作用,可以提前探測到附近的物體,而且通過聲波速度,能夠推算出附近物體離傳感器的大概距離,
HC-SR04是一種非常流行的、很便宜的超聲波傳感器,非常適合進行嵌入式編程的技術試驗,它是智能避障小車的一個關鍵部件,可以提前發現小車前方的障礙物,相應做出轉彎或后退的動作,
HC-SR04長的模樣見下圖,它的作業電壓為5V,據說HC-SR04P或HC-SR04+新型號可以作業在3V電壓下,

現在我們的任務是把它接入樹莓派Pico里,來感知位于它前方物體的距離,
電路連接
先觀察它的針腳,只有4個,左邊是Vcc,接5V正極,右側 GND接地,我手里的HC-SR04是5V版本的,Vcc接Pico的VBUS即可,

現在還剩下2個針腳,Trig和Echo,
Trig負責控制是否發射超聲波,如果給它高電位,則發射;如果低電位,則停止發射,這里,我們要把它接到Pico的一個GPIO引腳,讓Pico控制它,我把它直接連接到GP18引腳,

Echo的連接稍微復雜一點,Echo的英文意思是“回聲”,意思是接收超聲波信號,如果接收到超聲波,則高電位;如果沒收到,則為低電位,
重要提醒:
我的HC-SR04的作業電壓為5V,那么echo針腳的電位也相應是5V,而Pico的作業電壓為3.3V,如果直接把echo的輸出信號連接到GPIO引腳上,會超過Pico的作業電壓,有損壞Pico的可能性,所以需要做降壓處理,
網上有些教程沒有說明這個問題,把echo輸出直接連到GPIO引腳上,比如這篇文章,
一種解決方案是加入3.3V-5.5V電平轉換器,一個非常便宜的小元件,比如這篇文章,
還有一種解決方案,只需要增加2個電阻,再加上清晰的頭腦和認真的連線即可,我參考了這篇文章的說明,

用到高中物理知識,得到電阻的計算公式,我們這里的Vin=5,Vout=3.3,所以R1/R2 = 0.515,如果R1選1000歐,那么R2約為2000歐,
所以,從Echo串上一個1000Ω的電阻,接到GP26引腳,再串一個2000Ω的電阻接地,就可以有效保護Pico的引腳,最后的邏輯連線圖:

實際連接圖(電阻絲非常細,又比較長,拍攝角度不容易看清楚連接關系):

學習原理,撰寫程式
看懂代碼,需要了解一下超聲波測距的基本原理,傳感器的T端(Transmitter)發出超聲波,遇到障礙物之后,超聲波回傳,被傳感器的R端(Receiver)接收到,根據時間差和聲音的速度,可以求出距離,

HC-SR04就是這樣作業的:
1)Trigger收到一個長達10us的方波后,開始發出超聲波
2)傳感器內部發出8組40KHz的方波,然后接識訓聲
3)方波發送完成后,ECHO變為高電位,收到回聲的時候,ECHO為低電位

下面這段代碼,一開始的2us是把電位置零,再產生10us的方波,
trigger.low()
utime.sleep_us(2)
trigger.high()
utime.sleep_us(10)
trigger.low()
然后把ECHO處于高電位的時間段計算出來,乘以聲音的速度,由于超聲波跑了雙程,所以還要除以2,最后求出距離,這里的單位是厘米,
while echo.value() == 0:
start = utime.ticks_us()
while echo.value() == 1:
end = utime.ticks_us()
d = (end - start) * 0.0343 / 2
最后的所有源代碼:
from machine import Pin
import utime
# 超聲波測距,單位:厘米
def getDistance(trigger, echo):
# 產生10us的方波
trigger.low()
utime.sleep_us(2)
trigger.high()
utime.sleep_us(10)
trigger.low()
while echo.value() == 0:
start = utime.ticks_us()
while echo.value() == 1:
end = utime.ticks_us()
d = (end - start) * 0.0343 / 2
return d
# 主程式
trigger = Pin(18, Pin.OUT)
echo = Pin(26, Pin.IN)
while True:
distance = getDistance(trigger, echo)
print("距離:{:.2f} cm".format(distance))
utime.sleep(1)
看HC-SR04的規格說明書,它能判斷出傳感器前方15度范圍內的2厘米~5米距離的障礙物,解析度達3毫米,

這里的計算距離的函式已經非常簡化,有時會不太準確,可以多取幾次求平均,另外,如果你對距離精度有更高的要求,那就要換其它的傳感器了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/310652.html
標籤:其他
上一篇:盲盒能夠持續火爆的原因
下一篇:I2S總線
