一、介紹
Raspberry Pi Pico進階套件為iCShop x CIRCUS Pi 專為Raspberry Pi Pico 使用者搭配推出的套件組,內含Grove Shield for Pi Pico擴展板,可與Raspberry Pi Pico搭配使用,並且搭配十幾款的MIT Grove接頭模組,省去連接跳線及麵包板的困擾,透過學習結合各種感測器讓您能夠更快速的了解Pico並做出許多有趣的應用。
二、Raspberry Pi Pico進階套件
Raspberry Pi Pico進階套件使用盒裝的方式方便使用者使用與收納,下圖為Raspberry Pi Pico進階套件盒裝的外觀。
Raspberry Pi Pico進階套件內容物如下圖表所示。
Raspberry Pi Pico 腳位圖如下:
Grove Shield for Pi Pico 圖表如下:
1 | 類比埠 | A0, A1, A2 |
2 | 數位埠 | D16, D18, D20 |
3 | UART | UART 0, UART 1 |
4 | I2C | I2C 0, I2C 1 |
5 | 電源切換開關 | 可選3.3v / 5v電源 |
6 | SPI | SPI 0 |
三、軟體安裝
(一)軟體下載
開發環境我們使用Thonny,Thonny是一個小巧好用的Python IDE,內建Python 3.7等多個直譯器,所以不需要額外安裝Python,對於初學者來說會非常方便。
Thonny支援三大作業系統(Windows、MAC、Linux)。到Thonny官網並依照自己的作業系統下載相對應版本的Thonny。
開啟Thonny程式編輯器,起始畫面如下圖所示。
(二)環境設定
Thonny預設會使用Python3作為直譯器,而我們需要將他更改為使用MicroPython(Raspberry Pi Pico)來執行我們的程式。選擇「工具>>選項>>直譯器」,修改直譯器為MicroPython(Raspberry Pi Pico),如下圖所示 。
首次使用MicroPython語言開發Pico需要先將MicroPython韌體燒錄至Pico內,選擇「工具>>選項>>直譯器」,選擇右下角「安裝或更新韌體」,在未連接電源的狀態下按住Pico上的BOOTSEL 按鍵,接著將Pico與電腦連接,系統成功安裝驅動後將會看到如下圖所示。
點選「安裝」後即可將MicroPython韌體燒錄至,如下圖所示。
四、套件模組實作範例程式
在開始撰寫程式之前,我們先來了解一下基本硬體,下圖是Pico插上擴展板的樣子,上面標註了每個Grove接孔的編號,在後面的程式範例都會依照這個編號接上指定的模組,各位可以參照下圖連接各項模組。
接下來將逐一講解各個感測器該如何使用,並帶大家將模組與程式整合在一起,完成一個小型實作。
本篇教學文章所使用的範例程式都可以到Github下載參考喔!
(一)LED 模組(紅、綠、黃、藍)實作
我們要使用紅、黃、綠LED燈實作一個簡易紅綠燈範例。首先將Pi Pico插上Grove擴展板,並將Grove D16、D18、D20接上紅黃綠LED模組,開啟範例「example/led.py」並執行。
程式碼解說:
- Line 1~2:引入相關模組,Pin模組用以操作IO腳位,sleep_ms模組用以延遲系統。
- Line 4~6:建立三個Pin物件用以控制三顆LED燈,分別對應腳位16、18、20(紅、黃、綠),並將IO狀態設為輸出。
- Line 8~17:在無窮迴圈內模擬紅綠燈過程,使用Pin物件的on方法將IO訊號拉高以點亮LED燈,off方法拉低訊號關閉LED燈,使用sleep_ms方法延遲系統運行,參數單位為毫秒。
(二)按鍵模組實作
我們要使用Circus 輕觸按鍵模組控制LED燈亮滅。將LED接在擴展板D18,開關接在擴展板D20,開啟範例「example/button.py」並執行。
程式碼解說:
- Line 1: 引入相關模組,Pin模組用以操作IO腳位。
- Line 3: 建立一個Pin物件,並設為輸出,用以控制LED燈。
- Line 4: 建立一個Pin物件,並設為輸入,用以讀取按鈕電位狀態。
- Line 6~10: 持續檢查按鈕狀態並控制LED燈,使用Pin物件的value方法取得IO訊號狀態(高或低電位),使用on、off方法控制IO訊號高低。
(三)可調電阻模組實作
讀取Circus 可調電阻模組數值,並控制LED燈亮度。將可調電阻模組接在擴展板A0,LED燈接在擴展板D20,開啟範例「example/adc.py」並執行。
程式碼解說:
- Line 1~2: 引入相關模組,ADC模組用以讀取ADC數值,PWM模組用以產生PWM訊號。
- Line 4: 建立一個ADC物件讀取可調電阻模組數值,使用IO26(A0)腳位,Pico能使用的ADC腳位為GPIO 26~28(A0~A2)。
- Line 6: 建立一個PWM物件控制LED燈亮度,使用IO20腳位。
- Line 7: 設定PWM物件頻率為1KHz,表示多久在LED的開和關之間切換一次電位。(T=1/F)
- Line 9~11: 每0.1秒讀取一次ADC數值並控制LED燈,使用ADC物件的read_u16讀取可調電阻數值,使用PWM物件duty_u16方法控制PWM工作週期(LED燈亮度),轉動可調電阻模組旋鈕,觀察LED燈亮度變化。
(四)無源蜂鳴器模組實作
使用蜂鳴器發出「逼逼」聲。將蜂鳴器模組接到擴展板D20,開啟範例「example/buzzer.py」並執行。
程式碼解說:
- Line 1~2: 引入相關模組
- Line 4: 建立一個PWM物件控制蜂鳴器,使用IO20腳位。
- Line 6: 設定PWM物件頻率為1KHz。(T=1/F)
- Line 9: 設定PWM物件工作週期(0~65025)為 50%。
- Line 11: 使用PWM物件的deinit取消初始化並停止PWM輸出。
(五)人體紅外線偵測模組實作
使用人體紅外線偵測模組偵測人體移動,並將結果顯示在互動環境視窗。將人體紅外線偵測模組接到擴展板D20,開啟範例「example/pir.py」並執行。
程式碼解說:
- Line 1~2: 引入相關模組
- Line 4: 建立一個Pin物件,並設為輸入,用以讀取人體紅外線感測模組電位狀態。
- Line 6~8: 每0.1秒讀取一次人體紅外線感測模組電位,並顯示在互動環境視窗內(0表示已偵測到人體移動,1表示無),在感測器前方移動身體並觀察狀態。
(六)震動感測模組實作
使用震動感測模組感測震動狀態,並將結果顯示在互動環境視窗。將震動感測模組接到擴展板D20,開啟範例「example/shake_sw.py」並執行。
程式碼解說:
- Line 1~2: 引入相關模組
- Line 4: 建立一個Pin物件,並設為輸入,用以讀取震動感測模組電位狀態。
- Line 6~8: 每0.1秒讀取一次震動感測模組電位,並顯示在互動環境視窗內(0表示無震動,1表示有震動),嘗試撥動感測器觀察數值狀態。
(七)光感測模組實作
使用光感測模組感測光源,並將結果顯示在互動環境視窗。將光感測模組接到擴展板A0,開啟範例「example/light.py」並執行。
程式碼解說:
- Line 1~2: 引入相關模組。
- Line 4: 建立一個ADC物件讀取光感測模組數值,使用IO26(A0)腳位。
- Line 6~8: 每0.1秒讀取一次光感測器ADC數值顯示在互動環境視窗上,使用ADC物件的read_u16讀取光感測器數值,嘗試遮擋光源並觀察數值變化。
(八)溫溼度感測器模組實作
使用SHT3x 溫溼度感測器模組感測溫溼度,並將結果顯示在互動環境視窗。將SHT3x 溫溼度感測器模組接到擴展板I2C1。開啟「libs/sht31.py」驅動程式,並另存到Pico內。
選擇「另存新檔」,如下圖所示:
選擇存入Raspberry Pi Pico,如下圖所示:
點選右上角「選單」>>新增目錄>>輸入「lib」>>點選「確認」,如下圖所示:
進入lib目錄,輸入檔案名稱為「sht31.py」,點選「確認」,如下圖所示:
開啟範例「example/SHT31.py」,並執行。
程式碼解說:
- Line 1~2: 引入相關模組,I2C模組提供I2C功能,SHT31模組提供sht31模組相關驅動程式。
- Line 4: 建立一個I2C物件驅動sht31模組,使用ch1的I2C,SCL pin為7,SDA pin為6,I2C Clock頻率為400KHz。
- Line 5: 建立一個SHT31物件用以讀取溫溼度資料,傳入I2C物件並設定SHT31 I2C位置為0x44。
- Line 7~9: 持續讀取溫溼度數值並顯示在互動環境視窗上,使用SHT31物件的get_temp_humi方法讀取溫溼度數值,tuple 0為溫度,tuple 1為濕度。
(九)全彩LED模組實作
使用Pixel全彩LEDx4模組循環顯示多種顏色。將Pixel全彩LEDx4模組接到擴展板D20,開啟「libs/ws2812b.py」驅動程式,並另存到Pico內(作法同「(八)溫溼度感測器模組實作」)。
開啟範例「example/ws2812b_rainbow.py」,並執行。
程式碼解說:
- Line 1~2: 引入相關模組,ws2812b模組提供ws2812b模組相關驅動程式。
- Line 4: 設定RGB LED燈數量。
- Line 5: 建立一個ws2812b物件用以控制RGB LED燈,參數傳入LED燈數,state machine編號,輸出腳位。
- Line 7~13: 建立7種顏色,參數順序為R>>G>>B。
- Line 14: 將7種顏色組成tuple(元組)。
- Line 16~21: 依顏色順序每0.1秒點亮一顆LED燈,點滿四顆後更換顏色,重複循環,使用ws2812b物件的set_pixel方法控制LED燈顏色,參數1為要控制的LED燈編號(由0開始),參數2~4分別為RGB三色;使用ws2812b物件的show方法點亮LED。
(十)OLED顯示螢幕實作
使用OLED顯示螢幕顯示溫溼度資料。將OLED顯示螢幕接到擴展板I2C0,SHT31溫溼度模組接到擴展板I2C1。開啟「libs/ssd1306.py」驅動程式,並另存到Pico內(作法同「(八)溫溼度感測器模組」)。
開啟範例「example/oled_sht31.py」,並執行。
程式碼解說:
- Line 1~3: 引入相關模組,ssd1306模組提供OLED模組相關驅動程式。
- Line 5~6: 定義OLED顯示器寬、高。
- Line 8: 建立OLED用的I2C,編號為0,I2C Clock為400KHz。
- Line 9: 建立OLED物件,傳入寬、高及I2C物件。
- Line 14~26: 將讀取到的溫濕度資料顯示在OLED上,使用SSD1306物件的fill方法清除整個OLED文字,使用text方法顯示文字,傳入參數為要顯示的文字,列,行。
(十一)伺服馬達實作
使用可調電阻模組控制9G伺服馬達旋轉角度。將可調電阻模組接到擴展板A0,9G伺服馬達接到擴展板D20,開啟範例「example/servo.py」,並執行。
程式碼解說:
- Line 1: 引入相關模組。
- Line 3: 建立ADC物件,使用IO26(A0)。
- Line 5~6: 建立PWM物件,設定工作頻率為50Hz。
- Line 8~9: 建立數值範圍轉換方法,它能將數值轉換到指定範圍。
- Line 11~13: 將讀取到的ADC數值從0~65535轉換成1638~8191,並使用PWM物件的duty_u16方法傳入工作週期以控制servo。
補充說明:
此servo型號為SG90,脈沖頻率(Pulse Frequency)為50 Hz,即一個工作週期為20ms。角度0度為500us,180度為2500us,轉換為工作週期為2.5%~12.5%,對應PWM物件的duty_u16方法傳入數值範圍為16bit(0~65535),其範圍為1638~8191。
(十二)風扇模組實作
L9110 風扇模組可以正轉與反轉,使用可調電阻模組能控制轉速,使用輕觸按鍵模組控制方向。將可調電阻模組接到擴展板A0,L9110 風扇模組接到擴展板D20,輕觸按鍵模組接到擴展板D18。
開啟範例「example/fan.py」,並執行。
程式碼解說:
- Line 1: 引入相關模組。
- Line 3: 建立ADC物件作為可調電阻輸入,使用IO26(A0)。
- Line 5: 建立Pin物件作為開關輸入,使用IO18。
- Line 7~10: 建立兩個PWM物件用以控制風扇轉速,A為正轉B為反轉,設定工作頻率為1KHz。
- Line 12: 建立按鈕狀態變數。
- Line 14~17: 檢查按鈕是否被按下一次,並修改state變數狀態,此狀態會決定風扇轉動方向。
- Line 18~23: 依照state變數控制風扇轉動方向,依照可變電阻數值控制風扇轉速。
五、結語
本篇為大家開箱Raspberry Pi Pico進階套件,並與大家分享套件中基礎的操作,透過文章中的說明能夠了解並熟悉每個模組如何運作及其原理,之後再與大家分享如何使用套件中的模組整合實作出更多有趣的應用,喜歡我們文章的夥伴們,請多多支持與分享喔!