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

樹莓派Pico:僅4美元的MCU

距離檢測報(bào)警使用樹莓派Pico

評論