2022年8月29日星期一

[PI PICO RP2040] HC-SR04 應用 @ C/C++

這個實驗是偶然搜尋到一個國外朋友使用 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 上,產生下緣信號。

PI PICO,SR04

在程式上


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