超聲波測距很成熟,原理簡單,如下:
HC-SR04 模塊可以測量 3cm - 4m 的距離,精確度可以達到 3mm。這個模塊包括 超聲波發射器、超聲波接收器和控制電路三部分。有 4 個引腳,如下圖;
接線方式:
4 個引腳由 2 個電源引腳(Vcc 、GND)和 2 個控制引腳(Trig、Echo)組成。
Vcc 和 Gnd 接 5v DC 電源,但不推薦用獨立電源給它供電,應使用樹莓派或單片機的 GPIO 口輸出 5v 和 Gnd 給它供電。不然會影響這個模塊的運行。
Trig 引腳用來接收來自樹莓派的控制信號。接任意 GPIO 口。
Echo 引腳用來發送測距結果給樹莓派。接任意 GPIO 口。
PS:Echo 返回的是 5v信號,而樹莓派的 GPIO 接收超過 3.3v 的信號可能會被燒毀,因此需要加一個分壓電路
TRIG接的38號引腳,ECHO接1K電阻後接40號引腳。
請忽略其它原件。
程序如下:
import RPi.GPIO as GPIO
import time
print('Program starting!')#提示開始
TRIG = 38#輸出使用38號引腳
ECHO = 40#輸入使用40號引腳
#初始化GIPO函數
def init():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(TRIG, GPIO.OUT)
GPIO.setup(ECHO, GPIO.IN)
GPIO.output(TRIG,GPIO.LOW)
#測距函數
def checkdist():
GPIO.output(TRIG,GPIO.HIGH)#輸出引腳高電平
time.sleep(0.00001)#保持100us
GPIO.output(TRIG,GPIO.LOW)#停止發送
while not GPIO.input(ECHO):
pass
#發現高電平開始計時
t1 = time.time()
while GPIO.input(ECHO):
pass
#高電平結束停止計時
t2 = time.time()
#計算結果(單位釐米)
return (t2-t1) * 34000/2
if __name__ == '__main__':
init()
try:
while True:
#輸出結果
print("距離是:{:.2f}cm".format(checkdist()))
time.sleep(1)
except KeyboardInterrupt:
print("停止測距!")
GPIO.cleanup()
排版如下:
保存後運行,結果如下:
程度輸出的結果還是比較準確的,如果使用樹莓派Zero加個盒子,再加一個顯示屏幕,就可以做為一個手持測距工具,個人感覺還是不錯了。
如果喜歡請關注並轉發,謝謝閱讀