這個實驗是偶然搜尋到一個國外朋友使用 Raspberry pi Pico 控制 HC-SR04 的範例 Video (https://www.youtube.com/watch?v=5cWDgrbZers),我也想練習看看。順便優化他的程式 (https://github.com/KleistRobotics/Pico-Ultrasonic) 。
HC-SR04 是個 超聲波傳感器,可用來確認與物體的距離。偵測範圍可以到 2cm ~ 400cm 之間。以下是它的規格。
- 電源: +5V DC
- 靜態電流: <2mA
- 工作電流: 15mA
- 有效角度:<15°
- 測距距離:2cm – 400 cm/1″ – 13ft
- 測量角度:30度
- 觸發輸入脈衝寬度:10uS TTL脈衝
信號傳輸和接收之間的時間能讓我們計算到物體的距離,因為我們知道聲音在空氣中的速度。
環境溫度 20ºC (68ºF) 時空氣中的聲速 = 343m/s
計算與物體的距離 = (行程時間 / 2) x 聲速
聲速為 343m/S = 0.0343 cm/uS = 1/29.1 cm/uS
HC-SR04 Spec. (來源 : https://cdn.sparkfun.com/datasheets/Sensors/Proximity/HCSR04.pdf )
開始前必須在 Trigger 產生 10uS TTL 訊號, SR04 Module 便會自動產生 40KHz 聲波,接收回波後反映在 Echo pin 上,產生下緣信號。
在程式上
uint64_t sr04_sonic::getPulse(int trigPin,int echoPin)
{
gpio_put(trigPin,1);
sleep_us(10);
gpio_put(trigPin,0);
uint64_t width = 0;
while(gpio_get(echoPin) == 0) tight_loop_contents();
absolute_time_t startTime = get_absolute_time();
while(gpio_get(echoPin) == 1){
width++;
sleep_us(1);
if(width > timeout) return 0;
}
absolute_time_t endTime = get_absolute_time();
return absolute_time_diff_us(startTime,endTime);
}
uint64_t sr04_sonic::getCM()
{
uint64_t pulseLength = getPulse(this->trigPin,this->echoPin);
return pulseLength /29.1/2; //or multiply by 0.0343
}
電路
完整程式碼
Github : https://github.com/cold63/Pico_C_Project/tree/main/sonic_sr04