How can we help you today?
【感測】超音波 | dual2s-mini | MPY-LLM
簡介:
HC-SR04 超音波感測器是一款廣泛用於測距的感測器,常見於機器人和嵌入式應用中。它透過發射超音波並計算聲波返回所需的時間來測量與物體的距離。
技術面向上,因應越來越多低功耗微處理器,市面上的hcsr04多有支援寬電壓(3.3v – 5v)的規格。量測距離落在2cm-400cm之間,量測精準度會受到:物體反射材質、面積、環境溫度等影響。檢測角度為15度,分辨率為0.3cm。感測器主要有兩個引腳:觸發(trigger) 和 回波(echo)。當觸發引腳接收到至少 10 微秒的高電平信號時,感測器會以 40kHz 的頻率發射超音波脈衝。
範例電路:
實作 | practice
本影片以dual2s-mini為示範,跟著影片實作完成後,應當可建立下列認知:
- 如何使用LLM獲取更多 【超音波hcsr04】 有用資訊
- 如何建立自己的函數,用以控制hcsr04超音波。
- 基本範例: Ex 2-1【基本距離測量】
- 基本範例: 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() # 關閉蜂鳴器