Pin¶
概要¶
熟練的掌握和使用芯片的IO資源是玩轉硬件的前提。前面我們曾多次提到了如何使用MicroPython來點亮一個LED燈,本節教程我們就以該例子,進行詳細的剖析,為大家講解machine
模塊中的Pin
類以及數字信號的相關概念。
開始之前¶
信號是運載消息的工具,是消息的載體。從廣義上講,它包含光信號、聲信號和電信號等,我們今天主角是電信號。電信號是指隨著時間而變化的電壓或電流,因此在數學描述上可將它表示為時間的函數,并可畫出其波形。由于非電的物理量可以通過各種傳感器較容易地轉換成電信號,而電信號又容易傳送和控制,所以使其成為應用最廣的信號。
如果你剛開始接觸嵌入式或者硬件控制,我想可能你需要先明確電信號的基本概念。
在電子線路中,我們將電信號進行如下的劃分:
-
模擬信號
-
數字信號
模擬信號¶
簡而言之,模擬信號是指信息參數在給定范圍內表現為連續的信號。
還記得發電機的工作原理嗎?發電機的轉子轉動一圈產生的感應電壓正好是一個周期的三角函數波,就像上圖中左邊的那個波形一樣。廣播的聲音信號,或圖像信號等生活中許多常見的信號,都是模擬信號。
數字信號¶
數字信號是指幅度的取值是離散的,幅值表示被限制在有限個數值之內。二進制碼就是一種數字信號。在這種二進制體系中,我們用 0 表示 低電平
, 1表示 高電平
。很可能你會問,高低電平指什么?
高低電平¶
你可以簡單的理解為較高的電壓為高電平,較低的電壓自然就是低電平。當然,肯定有一套判定高低電平的準則:
一般規定低電平為0~ 0.25V,高電平為3.5~5V。
當然對于有些不同的芯片或者電路模組,對高電平或低電平的定義可能會有所差異。
上升沿 下降沿¶
當低電平突然躍升為高電平時,電信號的變化時間極快,幾乎呈直角,從低電平直線攀升至高電平,這個電平跳變的過程我們稱之為上升沿
當高電平突然下降為低電平時,電信號的變化時間極快,幾乎呈直角,從高電平直線跌入低電平,這個電平跳變的過程我們稱之為下降沿
同時從上面這張圖你也可以看出,在數字信號中,我們的電壓變化理論上只有 低電平0 或 高電平1,因此我們的數字信號能夠更好的被計算機所理解,并進行快速的運算。
數模轉換¶
我們上文說,數字信號更好被計算機理解,計算,但是現實世界中大部分信號,圖像,聲音等等都是連續信號,所以如果需要計算機來處理這些信號,就需要將這些模擬信號轉換為數字信號。所以人們發明了各種各樣的傳感器來采集各種模擬量的數據,轉化為我們需要的數字信號。
那么,計算機計算好了的信號,比如處理之后的聲音信號,如何變為連續的信號輸出,被揚聲器播放呢?這就需要我們借助將模擬信號轉換為數字信號的模塊將數字信號轉化為模擬信號輸出了。
回顧¶
先回顧以下我們之前所教大家的點亮LED燈的代碼。
>>> from machine import Pin >>> led = Pin(2, Pin.OUT) #NodeMCU-32S默認的2號GPIO與板載的LED相連 >>> led.value(1)
在第一行代碼中,我們從machine
模塊中導入了Pin
這個類。
你一定很好奇,Pin
這個類里到底有什么,第二三行代碼有什么含義。還記得TAB
這個技能嗎?
我們使用TAB
按鍵來查看Pin
中所包含的內容:
>>> Pin. __class__ __name__ IN IRQ_FALLING IRQ_RISING OPEN_DRAIN OUT PULL_DOWN PULL_UP WAKE_HIGH WAKE_LOW init irq value
為了滿足你的好奇心,接下來我們在API文檔中分別介紹以上的內容。如果以下的內容剛開始對你來說很難以理解,沒有關系,你只需建立起初步的概念,結合我們上文開始之前講述的基本概念,通過以下的API文檔理解點亮LED的代碼即可,之后的內容會頻繁的使用到Pin模塊,到時再回過頭來仔細翻看API吧。
API詳解¶
宏定義¶
下面的宏定義用于配置pin,也就是將對應編號的真實的管腳配置成輸入或者輸出或者其他模式。
宏定義 | 含義 |
---|---|
Pin.IN | 信號輸入 |
Pin.OUT | 信號輸出 |
Pin.PULL_DOWN | 是否接入下拉電阻 |
Pin.PULL_UP | 是否接入上拉電阻 |
Pin.IRQ_RISING | 信號上升沿觸發中斷 |
Pin.IRQ_FALLING | 信號下降沿觸發中斷 |
Pin.WAKE_HIGH | 從高電平喚醒 |
Pin.WAKE_LOW | 從低電平喚醒 |
Pin.OPEN_DRAIN | 開漏 |
注意:不是每個端口都有下面的全部屬性。例如某些引腳只能輸入不能輸出
我們注意到其中的Pin.OUT
為信號輸出,而Pin(2, Pin.OUT)
,就是將GPIO2 設置為輸出模式,
通過改變該GPIO的value
為邏輯1,于是便在該引腳上輸出了高電平(3v以上的電壓),該led燈便被點亮。
對于上表中的數字信號,可能很多沒有學過數字電路和模擬電路的同學,需要進行以下的科普。
類¶
class machine.Pin(id[, mode[, pull[, value]]])¶
id
:任意引腳號
mode
:引腳模式
-
Pin.IN
— 輸入 -
Pin.OUT
— 輸出 -
Pin.OPEN_DRAIN
— 開漏
pull
:是否接入拉電阻
-
None
— 無上拉、下拉電阻 -
Pin.PULL_UP
— 上拉 -
Pin.PULL_DOWN
— 下拉
value
:引腳電平狀態
-
0
—低電平 -
1
—高電平
定義Pin¶
示例:
>>> from machine import Pin >>> >>> led = Pin(2, mode=Pin.OUT, pull=None, value=0) #可以簡單使用Pin(2, Pin.OUT) >>> print(led) Pin(2)
函數¶
Pin.init([mode[, pull]])¶
函數說明:初始化引腳。
mode
:
-
Pin.IN
— 輸入 -
Pin.OUT
— 輸出 -
Pin.OPEN_DRAIN
— 開漏
pull
:
-
None
— 無上拉、下拉電阻 -
Pin.PULL_UP
— 上拉 -
Pin.PULL_DOWN
— 下拉
示例:
>>> from machine import Pin >>> pin = Pin(2) >>> pin.init(mode=Pin.OUT) #也可以寫作pin.init(Pin.OUT)
Pin.value([value])¶
函數說明:獲取或設置引腳電平狀態,根據引腳的邏輯電平返回0或1。
注意:不帶參數時是讀取輸入電平,帶參數時是設置輸出電平。
value
:可以是True
/False
,也可以是1
/0
。
示例:
>>> pin = Pin(2,Pin.OUT) >>> pin.value() 0 >>> pin.Value(True) >>> pin.value() 1 >>> pin.Value(0) >>> pin.value() 0
Pin.irq(trigger, handler)¶
函數說明:配置一個引腳的中斷處理程序,在引腳的電平滿足條件時調用。
trigger
:
-
Pin.IRQ_FALLING
— 下降沿觸發 -
Pin.IRQ_RISING
— 上升沿觸發
handler
:中斷被觸發之后的回調函數
示例:
>>> touch = Pin(32, Pin.IN) >>> touch.irq(trigger=Pin.IRQ_FALLING, handler=lambda t:print("IRQ triggered by your finger"))
觸摸傳感器¶
ESP32上的部分引腳自帶觸摸式的傳感器,我們可以直接通過觸摸來改變這些引腳的電平輸入,在之前的引腳的講解中,之后我們會詳細為大家介紹
然后你便可以在REPL中看到: