2021年2月8日 星期一

【Raspberry Pi Pico 開箱實作教學 #01】 MicroPython開發環境安裝與GPIO數位/類比測試


在星爺電影食神中,唐牛說:「瀨尿牛丸彈性十足,還可用來打乓乒球,好玩又有噱頭!我都忍不住買了一碗!」,我想這正是我手上拿著Raspberry Pi Pico(以下簡稱Pi Pico)的心情,怎麼能不跟一波風潮呢。(ps.天竺鼠車車表示不服)

Pi Pico是一款有Arm Cortex-M0雙核心(133MHz)、264KB SRAM及2MB Flash的一款單晶片(MCU),關於規格介紹的文章已充斥網上了,這裡就不多說明了,可以參考一下官網說明[1]或者陸向陽大大的文章[2]。

為了能快點試試這小傢伙究竟有多好玩,趁著周末無聊,就順手焊了一塊板子方便測試,其中包括了兩個輸出的LED(可數位或類比輸出)、兩個按鍵輸入,一個半可變電阻可調的類比輸入,最後再搭上一塊I2C介面的OLED顯示器,電路接線圖如Fig. 1所示,實體照片如Fig. 2所示。(ps. 不要問我為什麼不用麵包板,因為我喜歡享受焊板子的手感)

 

Fig. 1 Pi Pico測試用電路板接線圖。(OmniXRI Feb. 2021設計/繪圖)(點擊圖放大)


Fig. 2 Pi Pico測試用電路板實體照片。(OmniXRI Feb. 2021設計/製作)(點擊圖放大)


初步看完Raspberry官網的介紹[1.a]後,覺得這塊板子和之前在玩的Arm Cortex-M0/M3或者Arduino有些不同,應該有許多更進階的內容可以玩,一篇應該寫不完,所以這一次先簡單介紹系統安裝及基本GPIO數位及類比輸出入應用,後續會視情況繼續寫系列實作文章。

依據官方說明得知這塊板子有兩種開發模式,MicroPytho[1.b]及C/C++ SDK[1.c],此次先從Windows系列加上MicroPython開發方式進行介紹。至於Liunx及C/C++ SDK方式就留待下次再介紹。或者有興趣的朋友可自行從官網上學習。

*開發工具Thonny安裝及MicroPython環境設置


一般MicroPython的開發工具有很多種,而此次Pi Pico推薦使用Thonny,主要是為了解決一些硬體相容性問題,所以一定要使用3.3.3版以上才能支援[3]。如果自己的電腦上已有舊的版本,務必要先移除後重新下載並安裝新的版本,不然將無法正確和Pi Pico連線。Thonny官網下載畫面如Fig. 3所示。安裝程序很簡單,執行thonny-3.3.3.exe,一直按OK直到結束即可。安裝好先不急著啟動執行Thonny。


Fig. 3 Thonny官網及3.3.3版下載選項。[3] (點擊圖放大)


接著到Raspberry Pi官網[1],點選"Getting started with MicroPython"頁面,下載UF2檔案。接著按住Pi Pico上BOOTSEL按鍵不放再插入USB供電,插入USB後馬上放開BOOTSEL,此時電腦上就會多出一個巨量儲存裝置(隨身碟)。然後再將剛才下載的*.uf2拖(複製)到新產生的儲存裝置中,Pi Pico就會自動重啟,等待編輯器進行連線編輯。若正確工作則開啟Windows裝置管理員時會看到一個新的虛擬連接埠(COM),埠號會自動配置。最後就可開啟Thonny,但此時Thonny還不能正確工作。流程如Fig. 4所示。

Fig. 4 Pi Pico安裝MicroPython執行環境步驟。(OmniXRI Feb. 2021整理製作)(點擊圖放大)


接著先檢查Thonny是否是3.3.3版本,再來進入選單"Run"-"Select interpreter...",選擇"MicroPython(Raspberry Pi Pico)"直譯器,按OK即可啟動,如Fig. 5所示。若仍無法正確連線,則按一下快速工具列[Stop]圖標重啟MicroPython。若還不行則關閉Thonny再重新啟動即可。

Fig. 5 Thonny連接Pi Pico基本設定流程。(OmniXRI Feb. 2021整理製作)(點擊圖放大)


*數位GPIO應用程式


一般拿到新的MCU開發板,第一個程式大多都是讓LED閃爍(Blink),就像學習一種新的程式語言要先print "Hello World!"一樣。所以Pi Pico也不例外。

Pi Pico板子上自帶一顆LED方便測試用,被安排在GPIO25上。這裡的編號方式是承襲樹莓派編號方式,而不是像一般ARM Cortex-M0用PA, PB, PC埠號方式。下面【範例一】就是令板上LED點亮0.5秒、熄滅0.5秒,一直循環,產生LED閃爍效果。其中import machine是用來設定Pi Pico所有相關硬體參數,若板子沒有正確連線或者直譯器沒有選對,則執行程式後會出現"import machine module named not found"的錯誤。

【範例一】

import machine # 導入Pi Pico硬體參數設定類別
import utime   # 導入時間相關類別

led_onboard = machine.Pin(25, machine.Pin.OUT) #設定GP25為輸出腳

while True: # 若真則循環
    led_onboard.value(1) # 點亮LED
    utime.sleep(0.5)     # 延時0.5秒
    led_onboard.value(0) # 熄滅LED
    utime.sleep(0.5)     # 延時0.5秒

編寫完程式後,可按[F5]鍵執行程式,或者按功能列上綠色箭頭的快捷鍵亦可。若想重新編輯或停止程式執行,則需要按[Ctrl+F2]或按功能列上紅色Stop鍵停止。程式運行中是不能編輯的。編輯完成後可選擇[File]/[Save Copy]儲存程式,此時會問是要存在這台電腦(This Computer)或裝置(Raspberry Pi Pico)上,可依需求自行決定。另外提醒一下,當USB插除(斷電)再重新插入(供電)後,會發現剛才儲存在裝置中的程式並沒有運行,這是因為預設只會執行main.py這個程式。

接著【範例二】為簡單測試按鍵輸入並對應到LED輸出,PB1按下時LED1亮,反之熄滅。而PB2相反,沒按時LED2亮,反之則熄滅。為簡化程式可以將 import machine 改成 from machine import Pin,則後續程式則可將machine.Pin簡化成Pin。這裡按鍵PB1和PB2在實體電路上並沒有加裝提升(Pull Up 或稱 Pull High)電阻來確保按鍵未按下時輸入信號一定在高電位,而是直接使用晶片內建的參數設定即可。直接使用Pin.value()即可讀取輸入信號目前狀態。

【範例二】


from machine import Pin # 從machine導入Pin參數設定類別

led1 = Pin(16, Pin.OUT) # 設定GP16為LED1輸出腳
led2 = Pin(17, Pin.OUT) # 設定GP17為LED2輸出腳
pb1  = Pin(18, Pin.IN, Pin.PULL_UP) # 設定GP18為PB1輸入腳,且自帶pull high電阻
pb2  = Pin(19, Pin.IN, Pin.PULL_UP) # 設定GP19為PB2輸入腳,且自帶pull high電阻


while True: # 若真則循環
    if(pb1.value() == 0): # 若PB1輸入為Low(按下)
        led1.value(1)     # 點亮LED1
    else:                 # 反之
        led1.value(0)     # 熄滅LED1

    if(pb2.value() == 1): # 若PB2輸入為High(未按)
        led2.value(1)     # 點亮LED2
    else:                 # 反之
        led2.value(0)     # 熄滅LED2

*類比GPIO應用程式


在Pi Pico上GP1到GP28除了當作一般數位輸出/輸入外,亦可作為PWM(模擬類比)輸出點,但只有GP26,27,28可以作為類比輸入點(ADC0,ADC1,ADC2)。另外晶片內部有一溫度感測元件作為ADC3類比輸入。Pi Pico上有提供3.3V類比轉換參考電壓ADC_VREF及類比接地信號AGND。在這個測試電路中,使用一個10K歐姆的半可變電阻(SVR)作為類比信號的模擬輸入,而隨意指定一個LED作為PWM(模擬類比)輸出。【範例三】則是讀取ADC0(GP26)的數值,再將其轉成PWM信號輸出至LED2,如此當調整SVR時ADC0讀到電壓大就令LED變得較亮,反之則令LED變暗,相當於是類比調整LED亮度。

【範例三】

from machine import Pin, ADC, PWM #  從machine導入Pin, ADC, PWM硬體參數設定類別
import utime       # 導入時間相關類別

pwm = PWM(Pin(17)) # 設定LED2為PWM輸出腳
pwm.freq(1000)     # 設定PWM頻率為1000 Hz
adc = ADC(0)       # 設定連接到ADC0(GP26),亦可寫成ADC(26)
factor = 3.3 / (65535) # 電壓轉換因子

while True: # 若真則循環
    reading = adc.read_u16() # 讀取類比輸入值16bit無號整數
    pwm.duty_u16(reading)    # 將輸入值轉至PWM工作周期值
    vlot = reading * factor  # 將輸入值轉成電壓值
    print(vlot)              # 將輸入電壓值列印至Shell區
    utime.sleep(0.1)         # 延時0.1秒

*小結


本文簡單介紹了如何建置一個MicorPython的開發環境,並使用Thonny進行範例程式開發,三個範例充份示範了數位及類比的輸出/輸入點如何使用。至於電路中的OLED驅動方式,就留待下回分解,敬請期待。

參考文獻


[1] Getting Started with Raspberry Pi Pico – Raspberry Pi
    a. Board Specifications
    b. Getting started with MicroPython
    c. Getting started with C/C++
https://www.raspberrypi.org/documentation/pico/getting-started/

[2] 陸向陽, "破盤4美元!Raspberry Pi Pico技術與策略解析"
https://makerpro.cc/2021/02/cost-4-dollars-raspberry-pi-pico/

[3] Thonny - Python IDE for beginners
https://thonny.org/







沒有留言:

張貼留言

【頂置】簡報、源碼、系列文快速連結區

常有人反應用手機瀏覽本部落格時常要捲很多頁才能找到系列發文、開源專案、課程及活動簡報,為了方便大家快速查詢,特整理連結如下,敬請參考! Edge AI Taiwan 邊緣智能交流區 全像顯示與互動交流區 台科大(NTUST) 人工智慧與邊緣運算實務 開南大學...