iT邦幫忙

2023 iThome 鐵人賽

DAY 13
1
自我挑戰組

WiFiBoy Python 玩學機介紹系列 第 13

13. 使用超音波感測器作測距儀

  • 分享至 

  • xImage
  •  

超音波感測器原理

https://ithelp.ithome.com.tw/upload/images/20230914/201057071XJpZ6iKVP.png

https://ithelp.ithome.com.tw/upload/images/20230914/20105707BhH8Aq3ySn.png

超音波感測器是一種常用於測量距離和檢測物體是否存在的設備。利用超音波的傳播速度來測量距離。以下是其感測原理:

  1. 超音波發射: 其頻率通常在 20 KHz 到 200 KHz 之間。
  2. 信號反射: 一旦聲波發射,會傳遞並擊中靠近的物體表面。信號碰撞時,會反射傳回感測器。
  3. 測量時間: 感測器會記錄從發射到收到信號返回的時間。利用聲波在空氣中的傳播速度,計算訊號往返時間,但聲速會受不同溫溼度影響,感測器通常會校正來提高準確性。
  4. 計算距離: 與物體距離為「時間乘以速度的一半」。

超音波感測器的特點:

  1. 非接觸式: 不用接觸待測物,可安全測量,增加安全性。
  2. 高精密度與可調整感測範圍: 設備依不同精密度,具有可微調的感測範圍,適用不同的應用場景。
  3. 可與微控制器整合應用: 目前已有許多現成的模組,可與微控制器整合成獨立控制板。
  4. 應用領域廣: 距離測量、障礙物檢測、液位測量、自動駕駛與機器人導航等。

硬體檢查與接線說明

超音波感測器是過去 Arduino 專案中很常用到的一個實驗模組。不過要注意的是,在 Arduino 的實驗,我們常會使用「HY-SRF05」這個型號,這個型號使用的工作電壓是 5V。而在 ESP32 或是樹梅派開發板上,我們則會選擇使用「HC-SR04」,這個版本,其特點有:

  1. 工作電壓為: 3.3V ~ 5V,可在 Arduino、ESP32、Micro:Bit等開發板上使用。
  2. 設備精度為: 3mm
  3. 距離範圍為: 2~ 450 cm
  4. 有效角度為: 小於 15 度
  5. 接線方式: VCC、TRIG(控制端)、ECHO(接收端)、GND

https://ithelp.ithome.com.tw/upload/images/20230914/20105707JHdGG06i8S.png

範例程式

超音波感測器範例

# 本範例使用 HC-SR04 模組
# 請將 GND 接地接到玩學機的 GND 腳位
# 請將 VCC 電源接到玩學機的 VCC 腳位
from machine import Pin, Timer
import utime

TRIGGER_PIN = 18 
ECHO_PIN = 19  

# 初始化腳位
trigger = Pin(TRIGGER_PIN, Pin.OUT) 
echo = Pin(ECHO_PIN, Pin.IN) 

def ping():
    trigger.value(0)
    utime.sleep_us(2) # 低電位等 2 微秒
    trigger.value(1)
    utime.sleep_us(5) # 高電位等 5 微秒
    trigger.value(0)
    while echo.value() == 0:
        signaloff = utime.ticks_us()
    while echo.value() == 1:
        signalon = utime.ticks_us()
    timepassed = signalon - signaloff
    distance = (timepassed * 0.0343) / 2
    return distance

while True:
    print("The distance is : ", round(ping(), 0), " cm.")
    utime.sleep(.25)

https://ithelp.ithome.com.tw/upload/images/20230914/20105707rBf5sMR6s7.png

超音波手風琴

玩法:

  1. 執行本程式
  2. 將手遮住超音波感測器,按下任何鍵,會發出不同頻率聲音。
    • 0 – 10 公分: 發出 Do 音(頻率 261Hz)
    • 10 – 18 公分: 發出 Re 音(頻率 293Hz)
    • 18 – 26 公分: 發出 Mi 音(頻率 330Hz)
    • 26 – 34 公分: 發出 Fa 音(頻率 349Hz)
    • 34 – 40 公分: 發出 So 音(頻率 392Hz)

https://ithelp.ithome.com.tw/upload/images/20230914/20105707vPG0vJNyAP.png

from machine import Pin, Timer
import utime

machine.Pin(5, machine.Pin.OUT).value(1)		# VCC
trig = Pin(21, machine.Pin.OUT) 
echo = Pin(19, machine.Pin.IN) 
machine.Pin(18, machine.Pin.OUT).value(0) 		# GND
 
machine.Pin(17,2).value(1) 						# 設定蜂鳴器
snd = machine.PWM(machine.Pin(25 ,2)) 
snd.duty(0) 
 
wb.cls() 
wb.colors(0xffff,0) 
wb.str("Ultrasonic Piano", 0, 0, 2, 2) 
wb.str("Press any key to play music!", 10, 20, 2, 1) 
wb.str("CM", 100, 80, 2, 5) 
wb.colors(0xc0ff,0) 
while True: 
        trig.value(1) 
        trig.value(0) 
        timeout = 0 
        while not echo.value():   
                timeout += 1 
                if timeout > 1000: break       
        start=time.ticks_us() 
        timeout=0 
        while echo.value():   
                timeout += 1       
                if timeout > 1000000: break   
        duration=time.ticks_diff(time.ticks_us(), start) 
        distance = int(duration/58) 
        if duration < 20000: 
            wb.str("%03d"%(distance), 40,80,2,5) 
                 
        time.sleep(0.1) 
        # print(wb.getkey())
        if wb.getkey() != 0: 
            snd.duty(50) 
            if distance < 10 : snd.freq(261)   # do 
            elif distance < 18 : snd.freq(293) # re 
            elif distance < 26 : snd.freq(330) # mi 
            elif distance < 34 : snd.freq(349) # fa                           
            elif distance < 40 : snd.freq(392) # so   
        else: snd.duty(0)

超音波感測器是不是很好玩呢?休息一下,明天我們繼續來學「用四位七段顯示器來做小時鐘」。


上一篇
12. 遊戲音樂引擎展示
下一篇
14. 用四位七段顯示器來做小時鐘
系列文
WiFiBoy Python 玩學機介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言