超音波感測器是一種常用於測量距離和檢測物體是否存在的設備。利用超音波的傳播速度來測量距離。以下是其感測原理:
超音波感測器的特點:
超音波感測器是過去 Arduino 專案中很常用到的一個實驗模組。不過要注意的是,在 Arduino 的實驗,我們常會使用「HY-SRF05」這個型號,這個型號使用的工作電壓是 5V。而在 ESP32 或是樹梅派開發板上,我們則會選擇使用「HC-SR04」,這個版本,其特點有:
# 本範例使用 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)
玩法:
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)
超音波感測器是不是很好玩呢?休息一下,明天我們繼續來學「用四位七段顯示器來做小時鐘」。