顯示包含「PI PICO」標籤的文章。顯示所有文章
顯示包含「PI PICO」標籤的文章。顯示所有文章

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

 

2022年8月22日星期一

[PI PICO] Probe Debug 製作及使用

使用 C/C++ SDK 開發 Raspberry pi Pico 程式,編譯完成後產生 UF2 檔案。然後將這個檔案複製到 Pico 開發板上完成燒錄動作,就如同 Pi Pico 官方網站的示範展示 (https://www.raspberrypi.com/documentation/microcontrollers/c_sdk.html#your-first-binaries )。但若是頻繁修改的狀態下,這樣的操作方式就有點不方便使用了。

Pi Pico 還有如同其他 ARM 平台一樣有 SWD Debug port, 所以可以走這個路徑做板子燒錄及進行程式除錯。

在官方文件 (https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf ) 的 58 頁 (Appendix A: Using Picoprobe ) 及 62 頁msys, 說明了透過另一個 Pico 板 做為 Probe Debug 功能,及接線方法。

PI Pico RP2040

Debug Probe 電路

Pi Pico RP2040

J1 是 標準的 10 pin JTAG 連接器,預留。
J2 連接至 Pi Pico 的 SWD CLK 及 SWIO,如果需要有 printf 功能, 則分別接入 TX , RX。VSYS 可不用接,Target 的 Pi Pico 獨立接入 USB 做為電源輸入。

實物連接

PI Pico RP2040

Demo 影片

原始電路圖 及 Gerber

https://github.com/cold63/Pico_C_Project/tree/main/Debug_Probe

 

2022年8月14日星期日

[PI PICO RP2040] GPIO Function 功能測試 @ C/C++

Raspberry Pi Pico 具有 26 個 GPIO 引腳,GPIO 也是在 MCU 中最基本運作的基礎. 這裡開始打算用一個 C/C++ SDK 程序 對 GPIO 的操作測試。程式文件在 Raspberry 官方網站上都有提供,可以在這個頁面下載. ( https://www.raspberrypi.com/documentation/microcontrollers/c_sdk.html )

官方的範例有個名為 hello_7segment 的程式範例,我這裡將改成用 hello_7segment 內使用的方法,來做跑馬燈的功能。並有 Button 中斷控制做啟動及停止。

電路

RP2040,raspberry pi pico

電路中的 LED 是從 GP2 接到 GP9 ,共 8 個 LED。GP10 接一個彈跳開關。



主程式碼


int main(){


    stdio_init_all();
    
    for(int x = Shift_GPIO; x < Shift_GPIO + 8; x++){
        gpio_init(x);
        gpio_set_dir(x,GPIO_OUT);
        gpio_set_outover(x,GPIO_OVERRIDE_INVERT);
    }
    gpio_set_irq_enabled_with_callback(10,   GPIO_IRQ_EDGE_FALL, true, &gpio_callback);


    gpio_init(PICO_DEFAULT_LED_PIN);
    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);


    uint8_t y;


    while(true){
        
        if(OnButton) {
            uint32_t mask = bits[y] << Shift_GPIO;


            gpio_set_mask(mask);
            sleep_ms(1000);
            gpio_clr_mask(mask);


            y++;
            if(y >= 8){
                y=0;
            }
        }

    }


    return 0;
}

Button 按鍵副程式


void gpio_callback(uint gpio,uint32_t events){


    if(events == 0x4)
    {
        if(OnButton){
            OnButton = 0;
            gpio_put(PICO_DEFAULT_LED_PIN, 1);
        }
        else{
            OnButton = 1;
            gpio_put(PICO_DEFAULT_LED_PIN, 0);
        }
    }
}

呈現的結果是
按 Button 開始跑馬燈 , GP25 LED 不亮
再按 Button 停止跑馬燈, GP25 LED 亮起

gpio_set_outover : 設定 GPIO 輸出模式 ,一般 / 反向 / HIGH / LOW 。 程式是 設定反向
gpio_set_mask : 致能 GPIO 不被改變, 直到執行 gpio_clr_mask, 這與 gpio_put 用法不同。

範例程式

https://github.com/cold63/Pico_C_Project/blob/main/gpio_1/main.c


 

2022年7月12日星期二

[PI PICO RP2040] 開始第一個程式 @ C/C++

當我們拿到一個新的板子時,通常會點 LED 及 print 顯示。 然後再做各種的範例測試,這做為 Raspberry Pi Pico RP2040 & C/C++ 開篇以來,也從這裡做為開始吧。

Raspberry Pi Pico RP2040 板的 print 列印顯示 UART (Default) 輸出為 UART 0 ,也就是深紫色的 UART0_TX (1) 及 UART0_RX。Default Baudrate 為 115200bps。

PI PICO RP2040


 // Enable UART
 stdio_init_all();
 

對 UART及 USB 做 初始化,後續可用 stdio 函式。例如: printf(),scanf()...等

Blink 與 printf 實作


int main() {
    // Enable UART
    stdio_init_all();


    gpio_init(25);
    gpio_set_dir(25, GPIO_OUT);    
    
    while (true) {
        gpio_put(25, 1);
        sleep_ms(1500);
        gpio_put(25, 0);
        printf("blink test\n");
        sleep_ms(1500);
    }


    return 0;
}

UART0_TX (1) 及 UART0_RX 連接到 USB TO UART 轉換器 開始接收字串

如果要使用 USB CDC 功能,只要修改 cmake (CMakeLists.txt) 檔案即可


pico_enable_stdio_usb(newblink1 1)
pico_enable_stdio_uart(newblink1 0)

即 usb enable , uart disable

裝置管理員

PI PICO RP2040

putty 的 serial 設定

PI PICO RP2040

輸出

PI PICO RP2040

原始碼連結

https://github.com/cold63/Pico_C_Project/tree/main/newblink1