目前全網(wǎng)最詳細的樹莓派 Pico入門指南_第1頁
目前全網(wǎng)最詳細的樹莓派 Pico入門指南_第2頁
目前全網(wǎng)最詳細的樹莓派 Pico入門指南_第3頁
目前全網(wǎng)最詳細的樹莓派 Pico入門指南_第4頁
目前全網(wǎng)最詳細的樹莓派 Pico入門指南_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

目前全網(wǎng)最詳細的樹莓派Pico入門指南

[導讀]2021年1月底的時候,樹莓派基金會發(fā)布了一個重磅消息,推出了進軍微控制器領域的樹莓派Pico。

2021年1月底的時候,樹莓派基金會發(fā)布了一個重磅消息,推出了進軍微控制器領域的樹莓派Pico。功能強勁,價格便宜的特性讓Pico受到了全世界創(chuàng)客們的關注,這篇文章就來給大家介紹一下Pico這個小玩意兒。文章原文來自DroneBotWorkshop,負責人是一個非常和藹的老爺爺。有條件的小伙伴可以去油管關注一下他。這篇文章使用MicroPython在樹莓派Pico上編程,一起來看看三十塊的微控制器究竟能做些什么。介紹樹莓派基金會發(fā)布微控制器本身就是一個大消息,畢竟在這之前,這個世界上最流行的單板電腦的制造商從來沒有表示過對微控制器的興趣。不僅僅是樹莓派Pico的公布讓人感到意外,這次樹莓派還自己打造了一款新的芯片。他們沒有在現(xiàn)有代碼的基礎上,支持基于ESP32或SAMD21的設計,而是選擇創(chuàng)建自己的微控制器。所以談到Pico時,我們都是新手。樹莓派也在官網(wǎng)發(fā)布了一大堆技術文檔,還有一本名為《GetStartedwithMicroPythononRaspberryPiPico》的說明書。它有紙質(zhì)版,也有PDF版下載。除此之外,目前還沒有關于Pico更深入的資料。不過隨著時間的推移,這種情況很快就會改變,樹莓派已經(jīng)授權包括Adafruit在內(nèi)的其他廠商在自己的設計中使用RP2040芯片。假以時日,就會給我們帶來更多的代碼和開發(fā)工具。我們先來嘗試一下,給Pico連接上一堆東西,會發(fā)生什么有趣的事情吧!樹莓派PicoPico是一塊小小的板子,大小和ArduinoNano差不多。和所有樹莓派一樣,包裝非常簡陋,只是一個塑料包裝內(nèi)的Pico,而塑料包裝本身就是從一條條的包裝上剪下來的,非常像小時候吃的咪咪蝦條或者是糖果的包裝??纯碢ico的板子四刀買到的就僅僅是這么一款裸板,沒有多的,就是這么環(huán)保。裸板不帶針腳,需要自己焊。這是一塊做工精良的電路板,也可以作為SMD元件,直接焊接到印刷電路板上。俯視圖從頂部看,Pico是這樣的。板上最主要的功能是一端的microUSB連接器。它既用于通信,也用于給Pico供電。在microUSB連接器旁邊安裝了一個板載LED,它內(nèi)部連接到GPIO針腳25。值得注意的是,這是整個Pico板上唯一的LED。開機按鈕安裝在離LED稍低一點的地方,它可以讓你改變Pico的啟動模式,這樣你就可以在上面加載MicroPython,進行拖拽式編程。在板子的底部,你會看到三個連接點,這些連接點是用于串行Debug選項的,我們今天是入門,暫時不探討這個問題,高級開發(fā)者會比較感興趣。在板子的中央是整個板子的“大腦”——RP2040MCU,我們一會兒就會研究它的功能。接地引腳板子上有好幾個地線,8個地線加上3針Debug連接器上的一個附加地線。這些引腳很容易發(fā)現(xiàn),它們是均勻的,而且是方形的,而不是像其他連接的圓形。其中一個位于33號針腳的地線也被指定為模擬地線。電源引腳Pico是一個3.3V的邏輯器件,但由于內(nèi)置了電壓轉(zhuǎn)換器和穩(wěn)壓器,它可以用一系列電源供電。所有與電源相關的引腳都被安排在了一起,靠近microUSB連接器。VBUS-這是來自microUSB總線的電源,5V。如果Pico不是由microUSB連接器供電,那么這里將沒有輸出。VSYS-這是輸入電壓,范圍為2至5V。板載電壓轉(zhuǎn)換器將為Pico將其改為3.3V。3V3-這是Pico內(nèi)部調(diào)節(jié)器的3.3伏輸出。只要將負載保持在300ma以下,它就可用于為其他組件供電。還有幾個輸入可以讓你控制Pico的電源。3V3_EN-你可以使用此輸入禁用Pico的內(nèi)部電壓調(diào)節(jié)器,從而關閉Pico和由其供電的任何組件。RUN-可以啟用或禁用RP2040微控制器,也可以將其復位。GPIO引腳樹莓派Pico板上有26個裸露的GPIO連接。它們的排列順序很好,在GPIO22和GPIO26之間有一個"空隙"(這些"缺失"的引腳在內(nèi)部使用)。這些引腳都有多種功能,你可以為PWM配置多達16個引腳。有兩個I2C總線,兩個UART和兩個SPI總線,這些可以配置使用多種GPIO引腳。模擬引腳Pico有三個模數(shù)轉(zhuǎn)換器,還有一個內(nèi)部用于板載溫度傳感器的轉(zhuǎn)換器。ADC的分辨率為12位。你也可以在ADC_VREF引腳上提供一個外部精密電壓參考。其中一個接地點,即33腳上的ADC_GND被用作該參考點的接地點。RP2040微控制器樹莓派Pico是圍繞基金會的新芯片RP2040微控制器而設計的。下面是它的參數(shù):雙核32位ARMCortex-M0+處理器運行在48MHz,但可以超頻到133MHz。30個GPIO引腳(26個暴露)可支持USB主機或設備模式8可編程I/O(PIO)狀態(tài)機RP2040能夠支持高達16MB的片外閃存,不過在Pico中只有4MB。樹莓派基金會對這款芯片有很多計劃,也已經(jīng)授權給了很多其他廠商。對Pico進行編程你可以使用兩種編程語言之一開始使用Pico。MicroPython-一種專門為微控制器制作的解釋語言。C++-許多微控制器用戶都熟悉C++,因為它被用于Arduino和ESP32板上。雖然我急于將C++與Pico一起使用,以榨取它的每一克性能,但還是決定與大多數(shù)人一樣,使用MicroPython。在這個早期的開發(fā)階段,C++的工具還在進行最后的開發(fā),期待著Pico成為PlatformIO和ArduinoIDE板系列的一部分。開始使用Pico當我們拿到Pico板時,它被包裝在一個塑料載體中,沒有額外的零件。除非你有計劃將Pico表面貼裝,或者你的唯一目的是只是點個燈,否則我們都需要一些引腳。Pico有40個引腳,每側20個。另外三個針腳用于調(diào)試端口。標準的公頭針腳有40個針腳帶,因此可以將其中一個針腳帶減半,作為Pico的針腳使用。如果你想在Debug連接器上安裝針腳,你需要另一個3針的公頭,可以是直的或90度的。焊接一個Pico在開始對Pico進行編程之前,我們需要進行一些焊接工作!除了杜邦公頭引腳之外,我們還需要合適的烙鐵和一些焊料。電烙鐵的頭需要精細一點,我們還需要一塊清潔海綿和一個支架。此外,我們還需要想辦法在焊接Pico引腳時把它固定住,因為它們需要以精確的90度角安裝到電路板上,這樣才能裝入無焊料面包板。許多實驗都使用無焊面包板來固定引腳,雖然這種方法可行,但有可能因熱力或焊料飛濺而損壞面包板。所以最好的解決方法是,你有一塊老舊的面包板,用它作為針座。我個人喜歡用幾塊便宜的灌注板、打孔實驗板。我說的"便宜"是指單面的東西,沒有排孔,只有一面是裸銅的。兩片這種東西很適合固定引腳,每當要焊接一個小模塊或者單片機的時候,我就經(jīng)常用這個。把電烙鐵加熱到一定溫度,然后加熱引腳與焊盤的連接處,在另一面涂上焊料,千萬不要直接涂到電烙鐵上。加熱零件,而不是焊料。如果你想焊接Debug的3個引腳連接器(這是可選的),你可能應該先做。這些引腳的方向與GPIO引腳的方向相反。我用了一個小的便簽墊來固定電路板,因為Debug連接器與GPIO引腳在網(wǎng)格上并不一致。之后就是焊接40個引腳了,一次20個!真的不需要太長的時間,只需要用盡可能多的焊料,避免出現(xiàn)焊橋,完成后再檢查一下。焊接后清理Pico我喜歡在焊接完我的PCB后清洗它們,以去除焊料核心中的助焊劑和樹脂。它表現(xiàn)為焊接連接處周圍的褐色污漬。這一步完全是可有可無的,因為助焊劑和樹脂對元件的運行或壽命沒有任何不利影響。它只是看起來更好看!如果你想克隆你的板子,你需要一些PCB板清洗劑或FlusRemover。由于它也往往會留下一點殘留物,我用異丙醇來清理。PCB板清洗劑可以到網(wǎng)上購買。異丙醇可以在當?shù)厮幍暾业剑欢ㄒI純酒精和水的混合物(70%),不要買有香味的。我用一把舊牙刷和一些塑料容器,在一個盆子里進行工作。記得最好要準備好口罩、手套和護目鏡。我用牙刷蘸PCB清潔劑擦洗引腳,然后用牙刷蘸異丙醇沖洗。讓板子自然風干,也可以使用空氣軟管,這樣之后,我們將擁有一個閃閃發(fā)光的新Pico!Pico和ThonnyIDE現(xiàn)在Pico的引腳已經(jīng)連接好了,我們可以開始對它進行實驗了。建議你把它放在一個無焊的面包板上,以迎接我們即將到來的實驗。雖然有許多IDE可以讓我們選擇與我們的新Pico一起工作,但我的建議是使用樹莓派推薦的ThonnyIDE。ThonnyIDEThonny自稱是"PythonIDEforBeginners",它適用于Windows、MacOSX和Linux。它也是樹莓派操作系統(tǒng)(以前的Raspbian)的一部分。我將在樹莓派操作系統(tǒng)上使用ThonnyIDE,運行在8GB的樹莓派4上,作為我今天實驗的開發(fā)平臺。當然,你可以使用任何你能運行Thonny的平臺,但我想讓它在樹莓派家族中運行--另外,由于Thonny已經(jīng)安裝在新構建的樹莓派操作系統(tǒng)上,所以上手非常簡單。啟動和安裝MicroPython我們需要做的第一件事是將MicroPython安裝到Pico上。將microUSB連接到Pico上,并準備將另一端插入電腦。在插入之前,先按下Pico上的BootSelect(開關)按鈕。按住BOOTSEL鍵,將Pico插入電腦的USB端口。按住BOOTSEL鍵幾秒鐘,然后松開。你應該會看到一個新的驅(qū)動器在你的電腦上可用,信息看起來會有所不同,這取決于你所使用的操作系統(tǒng),但它類似于你將U盤插入電腦時得到的信息。打開新的"驅(qū)動器",你會看到一個名為RPI-RP2的文件夾。在這個驅(qū)動器里,你會看到幾個文件,其中一個是網(wǎng)頁文檔index.htm。點擊該網(wǎng)頁文件,瀏覽器就會打開,你會被重定向到樹莓派Pico入門頁面。點擊MicroPython入門的標簽。你會看到一個鏈接來下載一個UF2文件,這就是可下載的MicroPython文件。把這個文件下載到你的電腦上。現(xiàn)在將下載的文件拖到Pico的RPI-RP2文件夾中。一旦這樣做了,文件夾就會消失,Pico將以MicroPython模式啟動。配置ThonnyIDE在Pico仍然被連接的情況下,打開ThonnyIDE,如果你和我一樣使用樹莓派操作系統(tǒng),你會在編程工具菜單下找到Thonny。一旦Thonny打開,請看右下角的狀態(tài)欄,它可能會顯示一個Python的版本。這是當前在你的計算機上運行的Python版本,對于我們的實驗來說,這一點并不重要。點擊該消息,應該會出現(xiàn)一個下拉菜單,還有其他環(huán)境可以選擇。其中一個應該是MicroPython(樹莓派Pico)。選擇那一個。你會注意到底部打開了一個新的Shell,在這個Shell中,你應該會看到一些文字,表明你已經(jīng)連接到Pico。是時候開始編程了!Shell測試Shell是Pico的"命令行",你可以直接在這里執(zhí)行代碼。一個簡單的測試是輸入以下內(nèi)容(這也是查看你是否正確連接到Pico的好方法),然后按Enter鍵。print(“Hello

World”)你應該在shell中看到"HelloWorld"被打印出來了,當然這是你告訴Pico要做的。腳本測試當然,你不會直接在shell中輸入你的程序,一來,一旦你執(zhí)行了程序,它們就會消失,二來,對于任何相當大的程序來說,也是不方便的。你要用編輯器來輸入你的程序,也就是shell上面的大文本區(qū)域,在ThonnyIDE的屏幕上占主導地位。進入這個編輯器,輸入和剛才一樣的文字,用一個漂亮的"你好"來迎接編程世界。點擊"運行"按鈕(綠色帶箭頭的那個),系統(tǒng)會提示你先保存程序。你可以選擇將其保存在本地電腦或Pico上,嘗試保存在Pico上。給你的程序起個帶".py"后綴的名字,比如"hello.py"。程序?qū)⒈槐4娌⑦\行,你將在shell中看到"HelloWorld"的問候語。你可以按"運行"按鈕再次看到它,再按一次。所以,現(xiàn)在你知道了如何編寫和保存MicroPython程序,我們就可以開始我們的實驗了!使用LED和開關基本的數(shù)字I/O功能可以很容易地用LED和開關來說明,這正是我們開始Pico冒險的方式。但請注意我們?nèi)绾谓o開關布線,我們將以不同的方式進行操作。RGBLED最簡單的輸出設備可能是LED。當在正確的方向上施加足夠的電流時,這種輸出設備就會工作。雖然簡單,但它可以用來說明I/O技術,這些技術可以應用于其他設備,如繼電器或晶體管。我將使用一個Common-CathodeRGBLED,但你也可以使用三個分立的LED來代替。無論哪種方式,你都還需要三個降壓電阻,我在實驗中使用了330歐姆的電阻。如果你選擇像我這樣使用RGBLED,一定要買一個標準的RGBLED,而不是一個可編程的。按鈕開關這是最簡單的輸入設備。我用的是一對瞬時常開按鈕開關一個紅色和一個黑色,但在其他方面是相同的。我們再次使用一個簡單的輸入設備來測試我們的小Pico的I/O能力。我們將以不同的方式為兩個開關布線,使其更加有趣,而且我們也不會使用任何上拉或下拉電阻。LED和開關的連接這里是我們的LED和開關的連接圖,請記住,如果你沒有共陰極RGBLED,你可以使用三個獨立的LED。請注意,這兩個開關的接線方式不同。黑色按鈕開關的一側連接到Pico的GPIO引腳,另一側連接到地。紅色開關則相反,它的一側連接到GPIO引腳,另一側連接到3.3伏,這是Pico的工作電壓和邏輯電壓。經(jīng)典項目——點燈我們要做的第一個實驗是我們自己的Arduino"Blink"草圖的變體。是的,從技術上講,我們已經(jīng)看到了如何閃爍板載LED,但由于我們現(xiàn)在有一個RGBLED在我們的支配下,我們當然可以找到另一種方法來點燈!在Thonny中打開以下代碼。#

樹莓派

Pico

RGB

Blink#

rgb-blink.py#

RED

LED

-

Pico

GPIO

10

-

Pin

14#

GREEN

LED

-

Pico

GPIO

11

-

Pin

15#

BLUE

LED

-

Pico

GPIO

14

-

Pin

19#

DroneBot

Workshop

2021#

import

machine

import

utime

led_red

=

machine.Pin(10,

machine.Pin.OUT)

led_green

=

machine.Pin(11,

machine.Pin.OUT)

led_blue

=

machine.Pin(14,

machine.Pin.OUT)whileTrue:

led_red.value(1)

led_green.value(0)

led_blue.value(0)

utime.sleep(2)

led_red.value(0)

led_green.value(1)

led_blue.value(0)

utime.sleep(2)

led_red.value(0)

led_green.value(0)

led_blue.value(1)

utime.sleep(2)

led_red.value(1)

led_green.value(1)

led_blue.value(0)

utime.sleep(2)

led_red.value(1)

led_green.value(0)

led_blue.value(1)

utime.sleep(2)

led_red.value(0)

led_green.value(1)

led_blue.value(1)

utime.sleep(3)

led_red.value(1)

led_green.value(1)

led_blue.value(1)

utime.sleep(2)print("End

of

Loop")

led_red.value(0)

led_green.value(0)

led_blue.value(0)

utime.sleep(2)這是一個簡單的腳本,肯定可以改進,但它可以很好地說明我們的觀點。我們先導入machine和utime庫。你會發(fā)現(xiàn),任何涉及I/O端口的活動都需要用到machine,而只要我們想使用時間函數(shù),就需要用到utime。然后,我們定義三個LED元件的連接,請注意,它們是以GPIO編號而非Pico上的物理引腳編號來表示的。我們將所有這些引腳定義為machinePin.OUT,這意味著這些引腳現(xiàn)在被設置為輸出引腳。whileTrue條件類似于Arduino草圖中的Loop,這里的代碼是連續(xù)執(zhí)行的。在本節(jié)中,我們對LED進行尋址,并將它們設置為開(值為1)或關(值為0)。我們通過一個序列,在最后一個序列,我們打印到控制臺。然后我們再做一遍。將腳本加載到Pico上,然后觀察LED,你應該會看到一個彩色的閃爍。開關測試我們接下來的腳本是對兩個開關進行一個非?;镜臏y試,我們用這樣一個奇怪的方式來接線。你會觀察到的第一件奇怪的事情是它們的接線不同,黑色的開關將輸入端連接到地,而紅色的開關將輸入端連接到3.3伏,用于邏輯HIGH。另一個有趣的事情是,這兩個開關都沒有采用上拉或下拉電阻,它們顯然需要這些電阻,黑色開關需要上拉,紅色開關需要下拉才能正常工作。我們將在代碼中加入所需的電阻!#

樹莓派

Pico

Switch

Test#

switchtest.py#

RED

BUTTON

-

Pico

GPIO

15

-

Pin

20#

BLACK

BUTTON

-

Pico

GPIO

2

-

Pin

4#

DroneBot

Workshop

2021#

import

machine

import

utime

button_red

=

machine.Pin(15,

machine.Pin.IN,

machine.Pin.PULL_DOWN)

button_black

=

machine.Pin(2,

machine.Pin.IN,

machine.Pin.PULL_UP)whileTrue:ifbutton_red.value()

==

1:print("Red")ifbutton_black.value()

==

0:print("Black")

utime.sleep(0.25)請注意定義按鈕的行的語法,你會看到它們是如何被定義為Inputs的,以及如何添加了下拉和上拉電阻。在whileTrue:循環(huán)中,你還會注意到我們是在監(jiān)測不同的條件,紅色的開關觸發(fā)了一個HIGH輸入,而黑色的開關觸發(fā)了一個LOW。最后的微小時間延遲是一種簡單的debouncing形式,如果你喜歡,你可以實驗一下這個值。這個腳本會在控制臺中打印所有的結果,所以在你按下按鈕的時候要注意。中斷和切換接下來的實驗引入了幾個有用的概念。第一個,也可以說是這兩個概念中最重要的,就是"中斷"。中斷中斷就像它的聲音一樣,是一個"中斷"程序正常流程的事件。在我們的情況下,我們處理的是外部硬件中斷,這意味著在程序繼續(xù)運行之前,需要處理一個信號或狀態(tài)變化。在Pico上,我們按照以下方式創(chuàng)建一個中斷。我們將一個引腳定義為"中斷輸入",我們定義該點上的狀態(tài)變化被認為是一個中斷。在Pico上,我們可以使用任何GPIO引腳來實現(xiàn)這一點,而且我們可以定義多個引腳。我們創(chuàng)建了一個"中斷處理程序"函數(shù),我們希望在檢測到中斷時運行該函數(shù)。我們將"中斷處理程序"與"中斷輸入"配對?,F(xiàn)在,每當中斷輸入條件發(fā)生時,Pico將停止它正在做的任何事情,并執(zhí)行"中斷處理程序"。然后它將恢復到原來的位置。切換雖然不像中斷那樣基本,但仍然非常有用?!扒袚Q”只是將Pico上的輸出狀態(tài)反轉(zhuǎn)。因此,如果輸出為高電平,而我們應用"切換",它就會變?yōu)榈碗娖?。我們不需要知道輸出的當前狀態(tài),我們只需要知道當我們應用一個切換器時,它將變?yōu)橄喾吹臓顟B(tài)。自然,這是寫另一個Blink程序的理想函數(shù),所以我們會這么做。只有我們的Blink程序才會有被中斷的風險!#

樹莓派

Pico

Interrupt

&

Toggle

Demo#

interrrupt-toggle-demo.py#

RED

LED

-

Pico

GPIO

10

-

Pin

14#

GREEN

LED

-

Pico

GPIO

11

-

Pin

15#

RED

BUTTON

-

Pico

GPIO

15

-

Pin

20#

DroneBot

Workshop

2021#

import

machine

import

utime

led_red

=

machine.Pin(10,

machine.Pin.OUT)

led_green

=

machine.Pin(11,

machine.Pin.OUT)

led_red.value(0)

led_green.value(0)

button_red

=

machine.Pin(15,

machine.Pin.IN,

machine.Pin.PULL_DOWN)

def

int_handler(pin):

button_red.irq(handler=None)print("Interrupt

Detected!")

led_red.value(1)

led_green.value(0)

utime.sleep(4)

led_red.value(0)

button_red.irq(handler=int_handler)

button_red.irq(trigger=machine.Pin.IRQ_RISING,

handler=int_handler)whileTrue:

led_green.toggle()

utime.sleep(2)在這個MicroPython腳本中,我們將閃爍我們的RGBLED的綠色部分,使用一個切換器來改變它的狀態(tài)。在正常的操作下,LED狀態(tài)將每兩秒鐘切換一次。然而,我們可以通過按下紅色按鈕來中斷閃爍。這將導致一個中斷,這將關閉綠色的LED,然后打開紅色的。它將保持四秒,之后程序控制權將被恢復,因此我們可以繼續(xù)進行綠色閃爍。我們通過導入machine和utime庫來開始我們的腳本,就像我們之前一樣。LED段和紅色按鈕的定義和之前的腳本一樣。LED在程序啟動時被關閉。然后我們定義一個函數(shù),這是我們的中斷處理程序,叫做"int_handler"。在這個函數(shù)中,我們做了以下工作。關閉中斷,這樣我們就不會有多個中斷了。將"中斷檢測"打印到Shell上打開紅色LED段。關閉綠色LED段。睡眠四秒。關閉紅色段。重新建立中斷退出處理函數(shù)后的那一行將中斷"粘"到我們定義為紅色按鈕輸入的引腳上。需要注意的是,它指定了"IRQ_RISING",這意味著如果輸入從0(地)上升到1(3.3伏),它將觸發(fā)一個中斷。這與我們紅色按鈕的接線方式一致。在True循環(huán)中,我們只需使用定義為輸出的任何GPIO引腳可用的"toggle"功能來閃爍LED。將它發(fā)送到Pico上,觀察RGBLED,它應該開始閃爍綠色。觀察一段時間,然后按下紅色按鈕。LED應該變成紅色,Shell應該顯示"InterruptDetected"。四秒鐘后,綠色閃爍將重新開始。開關和LED演示既然我們一直在研究開關和LED,我們不妨把它們結合起來,再編寫一個簡單的腳本。#

樹莓派

Pico

Switch

&

RGB

LED

Demo#

switch-led-demo.py#

RED

LED

-

Pico

GPIO

10

-

Pin

14#

GREEN

LED

-

Pico

GPIO

11

-

Pin

15#

BLUE

LED

-

Pico

GPIO

14

-

Pin

19#

BLACK

BUTTON

-

Pico

GPIO

2

-

Pin

4#

DroneBot

Workshop

2021#

import

machine

import

utime

led_red

=

machine.Pin(10,

machine.Pin.OUT)

led_green

=

machine.Pin(11,

machine.Pin.OUT)

led_blue

=

machine.Pin(14,

machine.Pin.OUT)

led_red.value(0)

led_green.value(0)

led_blue.value(0)

button_black

=

machine.Pin(2,

machine.Pin.IN,

machine.Pin.PULL_UP)whileTrue:ifbutton_black.value()

==

0:

led_red.value(1)

led_green.value(0)

led_blue.value(0)

utime.sleep(1)

led_red.value(0)

led_green.value(1)

led_blue.value(0)

utime.sleep(1)

led_red.value(0)

led_green.value(0)

led_blue.value(1)

utime.sleep(1)

led_red.value(0)

led_green.value(0)

led_blue.value(0)這個很簡單,現(xiàn)在大家應該對它的操作很熟悉了。我們用machine庫函數(shù)定義RGBLED和黑色按鈕。記住,黑色按鈕是由我們定義的上拉保持HIGH的,當按鈕被按下時,它就會變LOW,因為另一邊是接地線的。所以在True循環(huán)中,我們尋找一個"0"的值,以表示按鈕被按下。一旦我們檢測到這個條件,我們就會通過它們的顏色循環(huán)LED段。正如我所說,很簡單的東西。模擬輸入測試現(xiàn)在我們來談談模擬輸入。樹莓派Pico有三個模擬輸入,它們都有12位的分辨率。這三個輸入端如下。GPIO26-ADC0(31針)GPIO27-ADC1(針腳32)GPIO28-ADC2(針腳34)還有第四個ADC用于內(nèi)部溫度傳感器。電位計的連接在我們的測試中,我們將使用一個電位器在模擬輸入端呈現(xiàn)一個可變電壓,然后我們將讀取該電壓。我們將使用ADC0作為我們的電位計輸入,但你也可以使用其他兩個中的一個。請注意,雖然我將23號針腳顯示為地線,這只是為了方便,但你可以使用任何Pico地線針腳。在33號針腳處還有一個特殊的模擬地,你可以使用。在我的面包板上,我將33號針腳與其他一些地線相連。電位計讀數(shù)我們要做的第一個實驗是簡單地讀取我們在模擬輸入端得到的值,這個值應該根據(jù)我們電位器的位置而波動。#

樹莓派

Pico

Analog

Input

Test#

analog-input.py#

POT

-

Pico

GPIO

26

ADC0

-

Pin

32#

DroneBot

Workshop

2021#

import

machine

import

utime

potentiometer

=

machine.ADC(26)whileTrue:print(potentiometer.read_u16())

utime.sleep(2)這是一個簡單的腳本,像往常一樣,首先導入用于GPIO操作的machine庫和用于時間函數(shù)的utime庫。然后我們定義我們的電位器連接。請注意我們?nèi)绾问褂?ADC"來表示我們要將GPIO26針作為模擬輸入。當然這只適用于具有模擬輸入能力的三個GPIO引腳。在True循環(huán)中,我們只需打印從電位器上得到的值,然后延遲幾秒鐘再做一次。需要注意的是,我們用"read_u16"函數(shù)得到的值的類型是一個無符號的16位整數(shù)。這意味著它將在0和65,535之間變化,而不是你可能期望從12位ADC中得到的4095。這可能看起來很奇怪,但正如我們將在下一個腳本中看到的那樣,能夠傳遞具有相同數(shù)值數(shù)據(jù)類型的值實際上是有用的。運行腳本并觀察Shell,你應該會看到那里的數(shù)值隨著你移動電位器軸而改變。LEDPWM控制讓我們在之前的腳本基礎上進行擴展,使用電位器的輸出來控制LED的亮度。當然,我們將使用PWM進行控制,這個任務在MicroPython中非常簡單。#

樹莓派

Pico

LED

PWM

Test#

led-pwm.py#

POT

-

Pico

GPIO

26

ADC0

-

Pin

32#

RED

LED

-

Pico

GPIO

10

-

Pin

14#

DroneBot

Workshop

2021#

import

machine

import

utime

led_red

=

machine.PWM(machine.Pin(10))

potentiometer

=

machine.ADC(26)

led_red.freq(1000)whileTrue:

led_red.duty_u16(potentiometer.read_u16())在這個腳本中需要注意的一個關鍵項目是我們定義"led_red"的方式。我們將其定義為"PWM",而不是輸出。電位器的定義與上一個腳本中的方式完全相同?,F(xiàn)在我們已經(jīng)給輸出賦予了"PWM"的屬性,它繼承了許多其他參數(shù)。其中之一是PWM頻率,我們將其設置為1000Hz。在true循環(huán)中,我們不斷地從電位器中獲取無符號的16位值,并將其傳遞給LEDs占空比,也方便地指定為無符號的16位整數(shù)。這就說明了兩者保持相同的編號方案的價值,不需要將模擬值,真的是0到4095,映射到占空比,真的是0到100。運行程序,你應該可以順利地控制紅色LED段的亮度。添加顯示屏我們將進行的下一個實驗是將一個OLED顯示器連接到我們的Pico上,當然,也可以在上面打印一些東西。我們將使用I2C顯示屏,因此我們也將看到Pico如何使用I2C連接工作。記住,Pico有兩條I2C總線。我們的OLED是標準的1602型OLED顯示器,到處都有。如果你愿意,也可以使用與我的顯示屏尺寸不同的顯示屏,只需在代碼中更改尺寸即可。這是我們?nèi)绾伟堰@些東西都掛起來的,只有四根線。我們的顯示器需要一個庫,我們可以使用ThonnyID安裝。你可能會發(fā)現(xiàn)在全菜單模式下比在基本模式下更容易,但這兩種方式都可以。點擊"工具"菜單點擊"管理包"搜索"ssd1306"找到"ssd1306.py"并安裝它?,F(xiàn)在我們已經(jīng)安裝了庫,我們可以看一下演示OLED顯示屏的腳本。#

樹莓派

Pico

OLED

Display

Test#

Uses

ssd1306

module#

display-ssd1306-test.py#

DroneBot

Workshop

2021#

import

machine

import

utime

sda=machine.Pin(20)

scl=machine.Pin(21)

i2c=machine.I2C(0,

sda=sda,

scl=scl,

freq=400000)

from

ssd1306

import

SSD1306_I2C

oled

=

SSD1306_I2C(128,

32,

i2c)print(i2c.scan())

oled.text('Welcome

to

the',

0,

0)

oled.text('Pi

Pico',

0,

10)

oled.text('Display

Demo',

0,

20)

oled.show()

utime.sleep(4)

oled.fill(1)

oled.show()

utime.sleep(2)

oled.fill(0)

oled.show()whileTrue:

oled.text("Hello

World",0,0)foriinrange

(0,

164):

oled.scroll(1,0)

oled.show()

utime.sleep(0.01)我們的OLED顯示屏是一個I2C設備,所以你會注意到,在腳本的開頭,我們將兩個GPIO引腳定義為SDA(GPIO20)和SCL(GPIO21)。Pico有兩條I2C總線,你可以使用幾種不同的GPIO引腳來連接它們。但它們并不是隨便的引腳,例如某些引腳被指定為總線0的SDA,只有它們才能用于SDA總線0。然后我們使用機器庫的I2C函數(shù)定義一個I2C連接。我們需要給它提供以下參數(shù)。I2C總線號,在我們的例子中是0。SDA引腳SCL引腳I2C總線頻率--在我們的例子中是400KHz。然后我們添加OLED庫,并創(chuàng)建一個I2COLED對象。我們將大小參數(shù)和I2C連接信息傳遞給它。注意,我們沒有傳遞I2C地址。SD1306OLED顯示器有一個固定的I2C地址,所以我們不需要指定它。不過,我在這里添加了一行與顯示器無關的內(nèi)容,但可以讓你掃描I2C總線,并打印出它發(fā)現(xiàn)占用的地址。請注意,在Shell中打印出來的是十進制,而不是你更可能習慣看到的十六進制?;氐絆LED腳本!我們開始在顯示屏上打印,幾行文字。注意我們?nèi)绾沃付啃虚_始的像素位置。實際上,我們并沒有直接打印到顯示屏上,而是將數(shù)據(jù)發(fā)送到一個緩沖區(qū)。oled.show()這一行將把該緩沖區(qū)的數(shù)據(jù)傳輸?shù)斤@示器上。在打印完歡迎信息并按住它四秒鐘后,我們再執(zhí)行oled.fill(1)。這將打開顯示器中的每一個像素,或者更準確地說,是緩沖區(qū)中的每一個像素。然后我們做一個oled.show()來顯示填充。我們將填充物保持在顯示屏上兩秒鐘,然后執(zhí)行oled.fill(0),當我們顯示它時,它將關閉顯示屏中的每個像素。現(xiàn)在進入True循環(huán)。我們再次輸入一些文本,經(jīng)典的"HelloWorld"。但我們沒有進行"顯示"來顯示它,而是開始一個for-loop。在這個循環(huán)中,我們使用led.scroll(1,0)將顯示水平移動1像素(垂直移動0像素,這就是另一個參數(shù))。然后我們在屏幕上顯示,然后休眠一段很短的時間。然后我們再做一次。結果將是顯示屏在屏幕上滾動。你可以在for-loop中使用參數(shù)來改變它。將腳本加載到你的Pico上,然后觀看顯示。你應該看到歡迎文字,然后是顯示填充,然后是空。之后,只要你讓實驗運行,滾動的"HelloWorld"就會繼續(xù)。驅(qū)動電機微控制器比較流行的應用之一是驅(qū)動一個或幾個直流電動機。這是通過使用H-Bridge來實現(xiàn)的,H-Bridge是一種功率晶體管或MOSFET的排列方式,可以處理電機電流,同時允許你控制電機的方向和速度。我們將只用一個電機來實現(xiàn)這一點。我們將使用TB6612FNGH-Bridge和樹莓派Pico來控制一個小型直流電機。TB6612FNGH-BridgeTB6612FNGH-Bridge是我們之前使用過的,一款基于MOSFET的H-Bridge,相比老款備用的L-298N有很多性能上的優(yōu)勢。該設備其實有兩個通道,我們只用通道A來演示。通道A有三個輸入。AI1-方向和模式AI2-方向和模式PWMA-一個PWM輸入,用于控制電機速度。在它們之間,AI1和AI2引腳控制電機方向和模式。模式包括短制動和停止模式。在我們的簡單演示中,我們將只處理方向模式。TB6612FNGH-Bridge在板子的另一側還有電源和電機的連接。下面是我們將使用TB6612FNGH-Bridge和樹莓Pico的連接方式。請注意,由于我使用的是6V電機,我已經(jīng)為它提供了一個6V電源。不要試圖使用Pico的輸出電壓來為你的電機供電,單獨的電源是必要的。我使用了四節(jié)AA型電池,這是一種簡單而安全的安排。電機的極性其實并不重要,它只是決定了哪條路是向前的,哪條路是向后的。一旦它被全部連接起來,我們就需要一些代碼來運行它。我建議這樣做。#

樹莓派

Pico

Motor

Test#

motor-test.py#

POT

-

Pico

GPIO

26

ADC0

-

Pin

32#

RED

BUTTON

-

Pico

GPIO

15

-

Pin

20#

BLACK

BUTTON

-

Pico

GPIO

2

-

Pin

4#

RED

LED

-

Pico

GPIO

10

-

Pin

14#

GREEN

LED

-

Pico

GPIO

11

-

Pin

15#

BLUE

LED

-

Pico

GPIO

14

-

Pin

19#

DroneBot

Workshop

2021#

import

machine

import

utime

potentiometer

=

machine.ADC(26)

mtr_AI1

=

machine.Pin(8,

machine.Pin.OUT)

mtr_AI2

=

machine.Pin(7,

machine.Pin.OUT)

mtr_PWMa

=

machine.PWM(machine.Pin(6))

button_red

=

machine.Pin(15,

machine.Pin.IN,

machine.Pin.PULL_DOWN)

button_black

=

machine.Pin(2,

machine.Pin.IN,

machine.Pin.PULL_UP)

led_red

=

machine.Pin(10,

machine.Pin.OUT)

led_green

=

machine.Pin(11,

machine.Pin.OUT)

led_blue

=

machine.Pin(14,

machine.Pin.OUT)

led_red.value(0)

led_green.value(0)

led_blue.value(1)

mtr_PWMa.freq(50)

mtr_AI1.value(1)

mtr_AI2.value(0)whileTrue:

mtr_PWMa.duty_u16(potentiometer.read_u16())ifbutton_red.value()

==

1:

mtr_AI1.value(0)

mtr_AI2.value(1)

led_red.value(1)

led_green.value(0)

led_blue.value(0)ifbutton_black.value()

==

0:

mtr_AI1.value(1)

mtr_AI2.value(0)

led_red.value(0)

led_green.value(1)

led_blue.value(0)

utime.sleep(0.25)我們要利用電位器、兩個開關和RGBLED,以及電機控制器。電位器將控制電機的速度,開關將控制電機的方向,而LED將用彩色指示燈顯示當前的方向。我們使用我們的之前的兩個庫,并像以前一樣設置電位器。接下來,我們將Pico與TB6612FNGH-Bridge的連接定義為輸出。GPIO6上的PWMA輸出被定義為PWM,它將控制電機速度。LED和按鈕的設置與之前相同。PWM頻率設置為50Hz,這是一個任意的選擇。隨意實驗一下,看看是否能提高電機性能。電機AI1和AI2輸入被設置為正向旋轉(zhuǎn),所以電機將以正向啟動。請注意,當我們啟動時,RGBLED的藍段也會被打開。在True循環(huán)中,我們讀取電位器的值,并將其傳遞給電機PWM信號,以控制電機的速度。我們還要看按鈕的狀態(tài)。如果紅色按鈕被按下,我們設置AI1和AI2信號,使電機反轉(zhuǎn)。我們也會點亮紅色LED段。如果黑色按鈕被按下,我們設置電機方向正向,并打開綠色LED段。加載、檢查代碼。它應該用一個藍色的LED啟動,你應該能夠控制電機的速度。按下按鈕可以控制方向,還可以改變LED的顏色。PicoEverything演示剩下的就是把所有的東西放在一起做一個大的最終演示。這一點我們已經(jīng)做得不遠了,因為在上一個腳本中,我們使用了所有的東西,除了OLED顯示屏。所以讓我們把OLED顯示屏添加到這個組合中。下面是我們需要做的代碼。#

樹莓派

Everything

Test#

everything.py#

POT

-

Pico

GPIO

26

ADC0

-

Pin

32#

RED

BUTTON

-

Pico

GPIO

15

-

Pin

20#

BLACK

BUTTON

-

Pico

GPIO

2

-

Pin

4#

RED

LED

-

Pico

GPIO

10

-

Pin

14#

GREEN

LED

-

Pico

GPIO

11

-

Pin

15#

BLUE

LED

-

Pico

GPIO

14

-

Pin

19#

DroneBot

Workshop

2021#

import

machine

import

utime

potentiometer

=

machine.ADC(26)

mtr_AI1

=

machine.Pin(8,

machine.Pin.OUT)

mtr_AI2

=

machine.Pin(7,

machine.Pin.OUT)

mtr_PWMa

=

machine.PWM(machine.Pin(6))

button_red

=

machine.Pin(15,

machine.Pin.IN,

machine.Pin.PULL_DOWN)

button_black

=

machine.Pin(2,

machine.Pin.IN,

machine.Pin.PULL_UP)

led_red

=

machine.Pin(10,

machine.Pin.OUT)

led_green

=

machine.Pin(11,

machine.Pin.OUT)

led_blue

=

machine.Pin(14,

machine.Pin.OUT)

sda=machine.Pin(20)

scl=machine.Pin(21)

i2c=machine.I2C(0,

sda=sda,

scl=scl,

freq=400000)

from

ssd1306

import

SSD1306_I2C

oled

=

SSD1306_I2C(128,

32,

i2c)

oled.text('Pico

Motor

Test',

0,

0)

oled.show()

utime.sleep(2)

led_red.value(1)

led_green.value(0)

led_blue.value(0)

utime.sleep(2)

led_red.value(0)

led_green.value(1)

led_blue.value(0)

utime.sleep(2)

led_red.value(0)

led_green.value(0)

led_blue.value(1)

mtr_PWMa.freq(50)

mtr_AI1.value(1)

mtr_AI2.value(0)whileTrue:

speedvalue

=

int((potentiometer.read_u16())/500)

mtr_PWMa.duty_u16(potentiometer.read_u16())ifbutton_red.value()

==

1:

mtr_AI1.value(0)

mtr_AI2.value(1)

led_red.value(1)

led_green.value(0)

led_blue.value(0)ifbutton_black.value()

==

0:

mtr_AI1.value(1)

mtr_AI2.value(0)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論