在本教程中,我們將使用 MicroPython在 Raspberry Pi Pico 上通過雙核編程的多線程控制兩個(gè) LED 。
到目前為止,我們已經(jīng)了解了如何連接OLED、LCD、伺服、超聲波傳感器,并且我們已經(jīng)實(shí)現(xiàn)了I2C、ADC、與 Raspberry Pi Pico 的藍(lán)牙通信。RP2040微控制器pico 板具有雙核。如果您不熟悉多線程執(zhí)行,那么請(qǐng)考慮一下您的計(jì)算機(jī)系統(tǒng)。它可以同時(shí)執(zhí)行多個(gè)程序,這些程序可以由一個(gè)操作系統(tǒng)使用多線程來運(yùn)行。但是我們?cè)?Raspberry Pi Pico 上沒有任何操作系統(tǒng)來控制 CPU 周期,它只能支持每個(gè)內(nèi)核一個(gè)線程,在這種情況下是兩個(gè)。
Raspberry Pi Pico 上雙核編程所需的組件
您需要確保擁有以下組件來演示 Pico 板上的雙核編程。
樹莓派 Pico
LED x2
電阻器 x2(330 歐姆)
面包板
連接電線
使用 Raspberry Pi Pico 板的伺服電機(jī)電路圖
伺服電機(jī)的電路圖就是這么簡(jiǎn)單。我已經(jīng)分別使用兩個(gè) 330 歐姆電阻與 GPIO15 和 GPIO16 連接了兩個(gè) LED。LED 的接地引腳已連接到 Pico 板的接地引腳。
使用雙核編程在 Raspberry Pi Pico 上進(jìn)行多線程
您需要克隆我們的Raspberry Pi Pico 教程GitHub 存儲(chǔ)庫(kù)。然后打開“T9_DualCore_Program_PIco”文件夾。在此文件夾中,您可以找到“代碼”文件夾。在Thonny編輯器中打開“main.py”python 文件。現(xiàn)在,讓我們討論一下main.py文件。
從機(jī)器進(jìn)口銷 導(dǎo)入 utime 導(dǎo)入_thread
首先,我們需要從上面提到的 machine.py 庫(kù)中導(dǎo)入Pin() 類。在我們之前的教程中,我們已經(jīng)多次使用機(jī)器庫(kù),希望您現(xiàn)在熟悉機(jī)器庫(kù)。然后我們需要導(dǎo)入“utime”庫(kù)來使用pico的內(nèi)部時(shí)鐘。我們正在使用“_thread”庫(kù)來使用 raspberry pi pico 社區(qū)制作的線程函數(shù)。
led1 = Pin(16, machine.Pin.OUT) led2 = Pin(15, machine.Pin.OUT) sLock = _thread.allocate_lock()
在上面的代碼中,我使用“Pin(16, machine.Pin.OUT)”和“Pin(15, machine.Pin.OUT)”函數(shù)將 GPIO15 和 GPIO16 的兩個(gè) LED 初始化為 OUPUT ?!癬thread.allocate_lock()”函數(shù)可用于為兩個(gè)線程提供信號(hào)量鎖。如果想詳細(xì)了解這個(gè)函數(shù),可以參考“_thread”庫(kù)的文檔。
定義核心任務(wù)(): 而真: sLock.acquire() print("進(jìn)入第二個(gè)線程") utime.sleep(1) led2.high() print("Led 2 開啟") utime.sleep(2) led2.low() print("Led 2 關(guān)閉") utime.sleep(1) print("從第二個(gè)線程退出") utime.sleep(1) sLock.release() _thread.start_new_thread(CoreTask, ())
我們將在單線程的另一個(gè)內(nèi)核中使用“CoreTask()”函數(shù)。在函數(shù)內(nèi)的 while 循環(huán)中,我們使用信號(hào)量鎖來保持線程,直到它完成。然后我將 led2 調(diào)高 1 秒鐘,然后在 Thonny 的輸出端打印指令。然后我在線程完成時(shí)釋放信號(hào)量鎖。“_thread.start_new_thread(CoreTask, ())”函數(shù)將啟動(dòng)線程。該函數(shù)將目標(biāo)函數(shù)名作為第一個(gè)參數(shù)。在我的例子中,它是“CoreTask”,它在第二個(gè)參數(shù)中接受參數(shù)。就我而言,我沒有任何要傳遞的論點(diǎn)。
而真: # 我們獲取信號(hào)量鎖 sLock.acquire() print("進(jìn)入主線程") led1.toggle() utime.sleep(0.15) print("Led 1 開始切換。") print("退出主線程") utime.sleep(1) # 我們釋放信號(hào)量鎖 sLock.release()
在上面的 while 循環(huán)中,我們類似地使用了另一個(gè)信號(hào)量鎖,以便主線程繼續(xù)運(yùn)行直到它完成。它將切換 led1,然后釋放信號(hào)量鎖。現(xiàn)在,在 Thonny IDE中,打開 “main.py” 文件。首先, 通過按鍵盤上的 “ctrl+shift+s”鍵將“main.py”文件保存在 Pico 板上 。在保存文件之前,請(qǐng)確保您的 Pico 板已連接到您的筆記本電腦。保存代碼后,會(huì)出現(xiàn)一個(gè)彈出窗口,如下圖所示。您必須首先 選擇 Raspberry Pi Pico,然后 將文件命名為“main.py”并保存。 此過程使您能夠在 Pico 打開時(shí)運(yùn)行程序。
當(dāng)您在 Pico 板上上傳并運(yùn)行代碼時(shí),您會(huì)看到連接到 GPIO16 的 led1 以 1.15 秒的延遲切換。但是連接到 GPIO15 的 led2 會(huì)延遲 2 秒閃爍。您可以參考下面的視頻了解更多詳情。
代碼
主文件
進(jìn)口機(jī) 導(dǎo)入 utime 導(dǎo)入_thread led1 = machine.Pin(16, machine.Pin.OUT) led2 = machine.Pin(15, machine.Pin.OUT) sLock = _thread.allocate_lock() 定義核心任務(wù)(): 而真: sLock.acquire() print("進(jìn)入第二個(gè)線程") utime.sleep(1) led2.high() print("Led 2 開啟") utime.sleep(2) led2.low() print("Led 2 關(guān)閉") utime.sleep(1) print("從第二個(gè)線程退出") utime.sleep(1) sLock.release() _thread.start_new_thread(CoreTask, ()) 而真: # 我們獲取信號(hào)量鎖 sLock.acquire() print("進(jìn)入主線程") led1.toggle() utime.sleep(0.15) print("Led 1 開始切換。") utime.sleep(1) print("退出主線程") utime.sleep(1) # 我們釋放信號(hào)量鎖 sLock.release()
-
led
+關(guān)注
關(guān)注
242文章
23252瀏覽量
660584 -
Micropython
+關(guān)注
關(guān)注
0文章
68瀏覽量
4731
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論