Arduino板上的引腳可以配置為輸入或輸出。我們將在這些模式下解釋引腳的功能。重要的是要注意,大多數(shù)Arduino模擬引腳可以按照與數(shù)字引腳完全相同的方式進(jìn)行配置和使用。
Arduino引腳默認(rèn)配置為輸入,因此在使用它們作為輸入時(shí),不需要使用 pinMode()顯式聲明為輸入。以這種方式配置的引腳被稱為處于高阻抗?fàn)顟B(tài)。輸入引腳對(duì)采樣電路的要求非常小,相當(dāng)于引腳前面的100兆歐的串聯(lián)電阻。
這意味著將輸入引腳從一個(gè)狀態(tài)切換到另一個(gè)狀態(tài)所需的電流非常小。這使得引腳可用于諸如實(shí)現(xiàn)電容式觸摸傳感器或讀取LED作為光電二極管的任務(wù)。
被配置為pinMode(pin,INPUT)的引腳(沒(méi)有任何東西連接到它們,或者有連接到它們而未連接到其他電路的導(dǎo)線),報(bào)告引腳狀態(tài)看似隨機(jī)的變化,從環(huán)境中拾取電子噪音或電容耦合附近引腳的狀態(tài)。
如果沒(méi)有輸入,上拉電阻通常用于將輸入引腳引導(dǎo)到已知狀態(tài)。這可以通過(guò)在輸入端添加上拉電阻(到5V)或下拉電阻(接地電阻)來(lái)實(shí)現(xiàn)。10K電阻對(duì)于上拉或下拉電阻來(lái)說(shuō)是一個(gè)很好的值。
Atmega芯片內(nèi)置了2萬(wàn)個(gè)上拉電阻,可通過(guò)軟件訪問(wèn)。通過(guò)將pinMode()設(shè)置為INPUT_PULLUP可訪問(wèn)這些內(nèi)置上拉電阻。這有效地反轉(zhuǎn)了INPUT模式的行為,其中HIGH表示傳感器關(guān)閉,LOW表示傳感器開(kāi)啟。此上拉的值取決于所使用的微控制器。在大多數(shù)基于AVR的板上,該值保證在20kΩ和50kΩ之間。在Arduino Due上,它介于50kΩ和150kΩ之間。有關(guān)確切的值,請(qǐng)參考板上微控制器的數(shù)據(jù)表。
當(dāng)將傳感器連接到配置為INPUT_PULLUP的引腳時(shí),另一端應(yīng)接地。在簡(jiǎn)單開(kāi)關(guān)的情況下,這會(huì)導(dǎo)致當(dāng)開(kāi)關(guān)打開(kāi)時(shí)引腳變?yōu)楦唠娖?,?dāng)按下開(kāi)關(guān)時(shí)引腳為低電平。上拉電阻提供足夠的電流來(lái)點(diǎn)亮連接到被配置為輸入的引腳的LED。如果項(xiàng)目中的LED似乎在工作,但很昏暗,這可能是發(fā)生了什么。
控制引腳是高電平還是低電平的相同寄存器(內(nèi)部芯片存儲(chǔ)器單元)控制上拉電阻。因此,當(dāng)引腳處于INPUT模式時(shí),配置為有上拉電阻導(dǎo)通的引腳將被開(kāi)啟;如果引腳通過(guò)pinMode()切換到OUTPUT模式,引腳將配置為高電平。這也適用于另一個(gè)方向,如果通過(guò)pinMode()切換到輸入,則處于高電平狀態(tài)的輸出引腳將設(shè)置上拉電阻。
示例
pinMode(3,INPUT) ; // set pin to input without using built in pull up resistor pinMode(5,INPUT_PULLUP) ; // set pin to input using built in pull up resistor
通過(guò)pinMode()配置為OUTPUT的引腳被認(rèn)為處于低阻抗?fàn)顟B(tài)。這意味著它們可以向其他電路提供大量的電流。Atmega引腳可以向其他器件/電路提供(提供正電流)或吸收(提供負(fù)電流)高達(dá)40mA(毫安)的電流。這是足以點(diǎn)亮LED或者運(yùn)行許多傳感器的電流(不要忘記串聯(lián)電阻),但不足以運(yùn)行繼電器,螺線管或電機(jī)。
試圖從輸出引腳運(yùn)行高電流器件,可能損壞或破壞引腳中的輸出晶體管,或損壞整個(gè)Atmega芯片。通常,這會(huì)導(dǎo)致微控制器中出現(xiàn)“死”引腳,但是剩余的芯片仍然可以正常工作。因此,最好通過(guò)470Ω或1k電阻將OUTPUT引腳連接到其他器件,除非特定應(yīng)用需要從引腳吸取最大電流。
pinMode()函數(shù)用于將特定引腳配置為輸入或輸出。可以使用INPUT_PULLUP模式啟用內(nèi)部上拉電阻。此外,INPUT模式顯式禁止內(nèi)部上拉。
Void setup () { pinMode (pin , mode); }
pin - 你希望設(shè)置模式的引腳的編號(hào)
mode - INPUT,OUTPUT或INPUT_PULLUP。
示例
int button = 5 ; // button connected to pin 5 int LED = 6; // LED connected to pin 6 void setup () { pinMode(button , INPUT_PULLUP); // set the digital pin as input with pull-up resistor pinMode(button , OUTPUT); // set the digital pin as output } void setup () { If (digitalRead(button ) == LOW) // if button pressed { digitalWrite(LED,HIGH); // turn on led delay(500); // delay for 500 ms digitalWrite(LED,LOW); // turn off led delay(500); // delay for 500 ms } }
digitalWrite()函數(shù)用于向數(shù)字引腳寫(xiě)入HIGH或LOW值。如果該引腳已通過(guò)pinMode()配置為OUTPUT,則其電壓將被設(shè)置為相應(yīng)的值:HIGH為5V(或3.3V在3.3V板上),LOW為0V(接地)。如果引腳配置為INPUT,則digitalWrite()將啟用(HIGH)或禁止(LOW)輸入引腳的內(nèi)部上拉。建議將pinMode()設(shè)置為INPUT_PULLUP,以啟用 內(nèi)部上拉電阻。
如果不將pinMode()設(shè)置為OUTPUT,而將LED連接到引腳,則在調(diào)用digitalWrite(HIGH)時(shí),LED可能會(huì)變暗。在沒(méi)有明確設(shè)置pinMode()時(shí),digitalWrite()將啟用內(nèi)部上拉電阻,這就像一個(gè)大的限流電阻。
Void loop() { digitalWrite (pin ,value); }
pin - 你希望設(shè)置模式的引腳的編號(hào)
value - HIGH或LOW。
示例
int LED = 6; // LED connected to pin 6 void setup () { pinMode(LED, OUTPUT); // set the digital pin as output } void setup() { digitalWrite(LED,HIGH); // turn on led delay(500); // delay for 500 ms digitalWrite(LED,LOW); // turn off led delay(500); // delay for 500 ms }
Arduino能夠檢測(cè)是否有一個(gè)電壓施加到其引腳,并通過(guò)digitalRead()函數(shù)報(bào)告。開(kāi)/關(guān)傳感器(檢測(cè)物體的存在)和模擬傳感器之間存在一個(gè)差異,模擬傳感器的值連續(xù)變化。為了讀取這種類型的傳感器,我們需要一個(gè)不同類型的引腳。
在Arduino板的右下角,你會(huì)看到6個(gè)標(biāo)記為“Analog In”的引腳。這些特殊引腳不僅可以告知是否有電壓施加給它們,還可以告知它們的值。通過(guò)使用analogRead()函數(shù),我們可以讀取施加到其中一個(gè)引腳的電壓。
此函數(shù)返回0到1023之間的數(shù)字,表示0到5伏特之間的電壓。例如,如果施加到編號(hào)0的引腳的電壓為2.5V,則analogRead(0)返回512。
analogRead(pin);
pin - 要讀取的模擬輸入引腳的編號(hào)(大多數(shù)電路板上為0至5,Mini和Nano上為0至7,Mega上為0至15)
示例
int analogPin = 3;//potentiometer wiper (middle terminal) // connected to analog pin 3 int val = 0; // variable to store the value read void setup() { Serial.begin(9600); // setup serial } void loop() { val = analogRead(analogPin); // read the input pin Serial.println(val); // debug value }
更多建議: