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