< All Topics
Print

【感測】超音波 | dual2s-mini | MPY-LLM

簡介:

HC-SR04 超音波感測器是一款廣泛用於測距的感測器,常見於機器人和嵌入式應用中。它透過發射超音波並計算聲波返回所需的時間來測量與物體的距離。

技術面向上,因應越來越多低功耗微處理器,市面上的hcsr04多有支援寬電壓(3.3v – 5v)的規格。量測距離落在2cm-400cm之間,量測精準度會受到:物體反射材質、面積、環境溫度等影響。檢測角度為15度,分辨率為0.3cm。感測器主要有兩個引腳:觸發(trigger)回波(echo)。當觸發引腳接收到至少 10 微秒的高電平信號時,感測器會以 40kHz 的頻率發射超音波脈衝。


範例電路:


實作 | practice

本影片以dual2s-mini為示範,跟著影片實作完成後,應當可建立下列認知:

  1. 如何使用LLM獲取更多 【超音波hcsr04】 有用資訊
  2. 如何建立自己的函數,用以控制hcsr04超音波。
  3. 基本範例: Ex 2-1【基本距離測量】
  4. 基本範例: Ex 2-2【控制 LED / ws2812b 根據距離變化

韌體範例

MPY範例:基本控制函數

簡單的超音波感測程式,每秒測量一次距離並將距離值傳送到串列埠介面

from machine import Pin, time_pulse_us
import time

# 超音波模組引腳設定
TRIG = Pin(27, Pin.OUT)
ECHO = Pin(13, Pin.IN)

def measure_distance():
    """
    使用超音波模組測量距離。
    返回距離值(單位:cm),若測量失敗則返回 -1。
    """
    # 發送觸發信號
    TRIG.off()
    time.sleep_us(2)
    TRIG.on()
    time.sleep_us(10)
    TRIG.off()
    
    # 計算回波時間
    duration = time_pulse_us(ECHO, 1, 30000)  # 最多等待30ms
    if duration < 0:
        return -1  # 無有效回波
    
    # 計算距離 (cm)
    distance = (duration / 2) * 0.0343  # 回波時間轉換為距離
    return round(distance, 2)

# 主迴圈
print("Starting Ultrasonic Distance Measurement...")

try:
    while True:
        distance = measure_distance()
        if distance == -1:
            print("Distance: Out of Range")
        else:
            print("Distance: {} cm".format(distance))
        time.sleep(1)  # 每秒測量一次
except KeyboardInterrupt:
    print("Measurement stopped.")

MPY範例:元件整合

MPY超音波範例程式:100公分以內警示啟動,發出蜂鳴器(G15)的B, B間隔聲響,偵測距離越近,聲響間隔越短、頻率越高(200~1000Hz之間)。

from machine import Pin, PWM, time_pulse_us
import time

# 超音波模組引腳設定
TRIG = Pin(27, Pin.OUT)
ECHO = Pin(13, Pin.IN)

# 蜂鳴器引腳設定
BUZZER = PWM(Pin(15))  # 使用 PWM 控制蜂鳴器

def measure_distance():
    """
    使用超音波模組測量距離。
    返回距離值(單位:cm)。
    """
    TRIG.off()
    time.sleep_us(2)
    TRIG.on()
    time.sleep_us(10)
    TRIG.off()
    
    duration = time_pulse_us(ECHO, 1, 30000)  # 計算回波時間(最多等待30ms)
    if duration < 0:
        return -1  # 無有效回波
    
    distance = (duration / 2) * 0.0343  # 計算距離 (cm)
    return round(distance, 2)

def sound_buzzer(distance):
    """
    根據距離調整蜂鳴器的頻率和間隔。
    """
    if distance <= 0 or distance > 100:
        BUZZER.duty_u16(0)  # 關閉蜂鳴器
        return
    
    # 計算頻率與間隔
    frequency = int(200 + (100 - distance) * 8)  # 距離越近,頻率越高
    interval = max(0.05, distance / 200)         # 距離越近,間隔越短
    
    # 啟動蜂鳴器
    BUZZER.freq(frequency)
    BUZZER.duty_u16(32768)  # 設置占空比為50%(啟動蜂鳴器)
    time.sleep(interval)    # 持續時間
    BUZZER.duty_u16(0)      # 關閉蜂鳴器
    time.sleep(interval)    # 間隔時間

# 主迴圈
print("UltraSonic Buzzer Alert System Starting...")

try:
    while True:
        distance = measure_distance()
        print("Distance: {} cm".format(distance))
        sound_buzzer(distance)
        time.sleep(0.1)  # 減少測量頻率(避免過多計算)
except KeyboardInterrupt:
    print("Exiting Program")
    BUZZER.deinit()  # 關閉蜂鳴器

Table of Contents