樹莓派 Pico 的 RP2040 微控制器在設計時考慮到了物理計算。它的眾多通用輸入/輸出(GPIO)引腳讓它與一系列組件交互,允許你建立項目,從照明 LED 到記錄你周圍世界的數據。
物理計算并不比傳統計算更難學習,如果你能遵循本篇的內容,你會明白如何建立你自己的電 路,并對它們進行編程來執行你的命令。
第一個物理計算程序:Hello, LED!
就像在屏幕上打印「Hello, World」是學習編程語言的第一步,點亮 LED 是學習物理計算的經典入門。
你也可以在沒有任何額外組件的情況下開始,Pico 電路板上就有一個小的 LED。
這個 LED 被通電時,它會發光;當它關閉電源,它就會熄滅。
板載 LED 連接到 RP2040 的 GP25 引腳上。你可能還記得,這是RP2040上「缺失」的 GPIO 引腳之一。
打開 Thonny,連上你的 Pico。點擊進入腳本編輯區域,用以下一行開始你的編程:
import machine
這一小行代碼是在 Pico 上使用 MicroPython 的關鍵。它導入 MicroPython 代碼集合,也稱為庫。在本例中是「machine」庫。包含了 MicroPython 與 Pico 和其他 兼容 MicroPython 的設備通信所需的所有指令。如果沒有這一行,你將無法控制任何 Pico 的 GPIO 引腳。
選擇性導入
在 MicroPython 和 Python 中,都可以導入庫的一部分,而不是整個庫。這樣做可以使你的程序使用更少的內存,并允許你混合和匹配來自不同庫的函數。本教程中的程序導入了整個庫,在其他地方,你可能會看到程序有類似于 from machine import Pin,這是告訴 MicroPython 只從「machine」庫中導入「Pin」函數,而不是整個庫。
machine 庫公開了應用程序接口(API)。這個名稱聽起來很復雜,但是準確地描述了它的功能,它為你的程序提供了一種通過接口與 Pico 通信的方法。
程序的下一行提供了 machine 庫的 API 示例:
led_onboard = machine.Pin(25, machine.Pin.OUT)
這一行定義了一個名為 led_onboard 的對象,代碼的第二部分調用 machine 庫中的 Pin 函數。顧名思義,這個函數是為處理你的 Pico 的 GPIO 引腳而設計的。第一個參數是 25,是你設置的引腳編號。machine.Pin.OUT 則是告訴 Pico 該引腳應該被用作輸出而不是輸入。
這行代碼只起到了設置引腳的作用,它并不會點亮 LED。要做到這一點,你需要告訴 Pico 打 開這個引腳。在下一行輸入以下代碼:
led_onboard.value(1)
這一行將 led_onboard 的值設置為 1(表示「開」),也可以將值設置為 0 (表示「關」)。
單擊 Run 并將程序保存在 Pico 上,命名為 Blink.py。你會看到 LED 燈亮起來。祝賀你——你已經編寫了你的第一個物理計算程序!
然而,你會注意到 LED 仍然是亮著的。這是因為你的程序告訴 Pico 打開它,但從來沒有告訴它關閉 LED。你可以在程序的底部添加另一行:
led_onboard.value(0)
然而,這次運行程序 LED 似乎永遠不會點亮。這是因為 Pico 的工作速度非常非常快,比你用 肉眼看到的速度快得多。LED 有被點亮,但在如此短的時間內,它似乎保持熄滅。要解決這個問題,你需要通過引入延遲來降低程序的速度。
轉到程序的最上面,并單擊第一行末尾,然后按回車鍵插入新行:
import utime
與 import machine 類似,這一行將一個新的 utime 庫導入 MicroPython。這個庫處理與時間有關的所有事情,從度量時間到向程序中插入延遲。
轉到程序的底部,并單擊 led_onboard.value(1) 行末尾,然后按回車鍵插入新行:
utime.sleep(5)
這將調用來自 utime 庫的 sleep 函數,該函數將使你的程序暫停數為你輸入的秒數,在本例中為 5 秒。
再次單擊 Run。這次你會看到你的 Pico 上的 LED 燈亮了,保持亮 5 秒鐘然后再熄滅。
最后,是時候讓 LED 循環閃爍了。為此,你需要創建一個循環。重寫你的程序:
import machine import utime led_onboard = machine.Pin(25, machine.Pin.OUT) while True: led_onboard.value(1) utime.sleep(5) led_onboard.value(0) utime.sleep(5)
記住,循環中的行需要縮進四個空格,這樣 MicroPython 就知道它們構成了循環。再次點擊 Run,你會看到 LED 點亮 5 秒,熄滅 5 秒,然后再次點亮的不斷重復。LED 將繼續閃 爍,直到你點擊停止圖標取消你的程序和重置你的 Pico。
還有另一種方法來處理同樣的工作,即使用 toggle,而不是顯式地將 LED 的輸出設置為 0 或 1。刪除程序的最后四行,并替換它們,如下面這這樣:
import machine import utime led_onboard = machine.Pin(25, machine.Pin.OUT) while True: led_onboard.toggle() utime.sleep(5)
再次運行程序。你將看到與之前相同的效果。板載的 LED 將點亮 5 秒,然后熄滅 5 秒,然后在無限循環中再次點亮。不過,這一次,你的程序縮短了兩行,你已經優化了它。toggle() 可用于所有數字輸出引腳,它只是在開和關之間切換:如果引腳當前是開的,toggle() 將其關閉;如果它是關閉的,toggle() 將它打開。
使用面包板
如果你使用面包板來保存組件并進行電氣連接,那么本章中接下來的項目將會更容易完成。
面包片上面有很多間距 2.54 毫米的孔洞。在這些孔下是金屬條,它們就像用跳線串連起來。
其中帶有正負標志的兩行通常用于接 Pico 的 5V/3.3V 和 GND 引腳。當然也可以用來接外部電源的正負極。用來給需要的元器件供電。
把電子元件加到面包板上很簡單,只要把它們的引腳與孔對齊,然后輕輕插進去。你可以使用跳線再將引腳引入到 Pico 上。
把你的 Pico 插到面包板上,使它跨過面包板中間的空隙,microUSB 接口在最上面。在插入之前,請確保所有的排針都對準了孔位,否則可能很難插入或者折斷 Pico 的引腳。
外接 LED
對于這個項目,你需要一個面包板,公對公跳線,一個 LED,和一個 330Ω 電阻(或接近 330Ω)。如果你沒有面包板,你可以使用母對母杜邦線。
電阻在這里被當作限流電阻使用。它通過限制 LED 可以引出的電流量來保護你的 Pico 和 LED。如果沒有它,LED 可能會拉出太多的電流而燒毀。330Ω 對大多數常見的 LED 都適用。數值越高,LED 越暗;數值越低,LED 就越亮。
如果沒有電流限制電阻,千萬不要把 LED 連接到 Pico 上,除非你知道 LED 有一個合適的內置電阻。
用手指握住 LED,你會看到其中一根導線比另一根長。較長的引線稱為正極,較短的引線是 負極。正極需要通過電阻連接到你的 Pico 的 GPIO 管腳;負極需要連接到一個 GND 引腳。
從連接電阻器取一端(哪一端無關緊要),并將它插入到面包板的同一行,與 Pico 的 GP15 引腳在左下角。將另一端插入面包板下面的一個空置行中。
拿起 LED,把較長的支腳(正極)推到電阻器的末端所在的同一排。把較短的(負 極)放到同一行,但要穿過面包板中間的空隙,這樣它就能對齊。最后,在 LED 短腳的同一行插入一根 M2M 跳線,然后將它直接連接到你的 Pico 的 GND 引腳上。如下圖所示。
在 MicroPython 中控制一個外部 LED 和控制 Pico 板載的 LED 沒有什么不同,只需要改變程序代碼中引腳的編號。如果你關閉了 Thonny,重新打開它并加載前面的 Blink.py 程序。找到:
led_onboard = machine.Pin(25, machine.Pin.OUT)
編輯引腳號,將其從 25 改為 15。再把 led_onboard 修改為 led_external。最終代碼如下:
import machine import utime led_external = machine.Pin(15, machine.Pin.OUT) while True: led_external.toggle() utime.sleep(5)
輸入:讀取按鍵
對于這個項目,你將需要一個面包板,公對公跳線,和一個按鈕開關。將他們按照圖中示意的位置安裝好。其中按鈕有引腳的兩側分別插入面包板,并且橫跨在面包板正中間(物理上隔斷兩側引腳的連通)。
按鈕的一側接 Pico 的 3V3 引腳,另一側接 Pico 的 GND 引腳。
隱藏的內置電阻
與 LED 不同,按鈕開關不需要限流電阻。它仍然需要一個所謂的上拉或下拉電阻,這取決于你的電路如何工作。如果沒有上拉或下拉電阻,輸入信號會有「噪聲」,即使你沒有按下按鈕也會觸發。
那么電路中的電阻器在哪里?它藏在 Pico 芯片里。就像它有一個板載 LED,Pico 內置一個板載可編程電阻連接到每個 GPIO 引腳。可以根據需要在 MicroPython 中將其設置成下拉電阻或上拉電阻。
有什么區別呢?
下拉電阻將引腳連接到 GND,這意味著當按鈕被按下時,讀取到的輸入值是 0。
上拉電阻連接引腳到 3V3,這意味著當按鈕沒有按下,讀取到的輸入值是 1。
本書中所有的電路都使用下拉模式下的可編程電阻。
打開 Thonny,然后在新的一行啟動一個新程序:
import machine
接下來,你需要使用 machine API 設置一個引腳作為輸入,而不是輸出:
button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
這與你的 LED 項目的工作方式相同:創建一個名為「button」的對象,它包括引腳號 GP14,并將其配置為一個電阻設置為下拉的輸入。不過,創建對象并不意味著它會自己做任 何事情,就像之前創建LED對象并不能使 LED 發光一樣。
要真正讀取按鈕,你需要再次使用 machine API,這一次使用 value 函數讀取,而不是設置引腳的值。輸入以下一行:
print(button.value())
單擊 Run 并將程序保存為 Button.py,記住以確保它保存在你的 Pico MicroPython device 里。你的程序將打印出從 GP14 讀取到的值。因為輸入端使用的是一個下拉電阻,這個值將是 0,讓你知道按鈕沒有被按下。
用手指按住按鈕,并再次按下 Run 圖標。這一次,你將看到值 1 打印到 Shell。按下按鈕就電
路導通并改變了從引腳讀取的值。要連續讀取按鈕,你需要在程序中添加一個循環。編輯程序如下:
import machine import utime button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN) while True: if button.value() == 1: print("You pressed the button!") utime.sleep(2)
再次單擊 Run 按鈕。你的 Pico 運行速度要比你的觀察速度快得多,并且沒有延遲,即使是簡單地按一下按鈕,也可以向 Shell 打印數百條消息!如果你按住按鈕超過兩秒的延遲,它會每兩秒打印一條消息,直到你松開按鈕。
輸入和輸出:同時使用
大多數電路都有不止一個元件,這就是為什么 Pico 有這么多 GPIO 管腳。現在是時候把你學 到的所有東西結合在一起,制作一個更復雜的電路了:一個用按鈕開關 LED 的裝置。
實際上,這個電路將前面的兩個電路組合成一個。你可能記得你使用 GP15 來驅動外部 LED,GP14 來讀取按鈕。現在重建你的電路,使 LED 和按鈕同時在面包板上,仍然連接到 GP15 和 GP14。別忘了 LED 的限流電阻。
在 Thonny 啟動一個新程序,并開始導入你的程序需要的兩個庫:
import machine import utime
接下來,設置輸入和輸出引腳:
led_external = machine.Pin(15, machine.Pin.OUT) button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN)
然后創建一個讀取按鈕值的循環:
while True: if button.value() == 1:
不過,這一次你將根據輸入引腳的值切換輸出引腳上 LED 的狀態,而不是將消息打印到 Shell。使用下面的代碼:
led_external.value(1) utime.sleep(2)
這足以讓 LED 亮起來,但當按鈕沒有被按下時,你還需要再次關閉它。添加以下新行,刪除 8 個空格中的 4 個,這意味著這行將不是 if 語句的一部分,而是無限循環的一部分:
led_external.value(0)
最終代碼如下:
import machine import utime led_external = machine.Pin(15, machine.Pin.OUT) button = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_DOWN) while True: if button.value() == 1: led_external.value(1) utime.sleep(2) led_external.value(0)
單擊 Run 并將程序保存為 Pico 上的 Switch.py。
起初,什么都不會發生。按下按鈕,你就會看到 LED 燈亮起來。松開按鈕兩秒鐘后,指示燈再次熄滅,直到你再次按下按鈕。
祝賀你!你已經建立了你的第一個電路,它根據一個輸入引腳控制另一個輸出引腳,我們已經在 構建模塊程序的路上跨越了一大步!
審核編輯:劉清
-
微控制器
+關注
關注
48文章
7336瀏覽量
150114 -
led照明
+關注
關注
34文章
2632瀏覽量
142284 -
GPIO
+關注
關注
16文章
1175瀏覽量
51515 -
python
+關注
關注
53文章
4753瀏覽量
84081 -
樹莓派
+關注
關注
116文章
1679瀏覽量
105256
原文標題:樹莓派 Pico 物理編程入門
文章出處:【微信號:趣無盡,微信公眾號:趣無盡】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論