Arduino - I/O 函式



Arduino 開發板上的引腳可以配置為輸入或輸出。我們將解釋這些模式下引腳的功能。需要注意的是,大多數 Arduino 模擬引腳可以以與數字引腳完全相同的方式配置和使用。

配置為 INPUT 的引腳

Arduino 引腳預設配置為輸入,因此當您將它們用作輸入時,不需要使用 **pinMode()** 顯式宣告為輸入。這樣配置的引腳處於高阻抗狀態。輸入引腳對它們取樣的電路的要求極小,相當於在引腳前面有一個 100兆歐的串聯電阻。

這意味著切換輸入引腳從一個狀態到另一個狀態需要非常小的電流。這使得引腳可用於實現電容式觸控感測器或將 LED 作為光電二極體讀取等任務。

配置為 pinMode(pin, INPUT) 且沒有任何連線到它們的引腳,或連線到它們的電線未連線到其他電路的引腳,會報告看似隨機的引腳狀態變化,拾取環境中的電噪聲,或電容性耦合附近引腳的狀態。

上拉電阻

如果不存在輸入,上拉電阻通常用於將輸入引腳引導到已知狀態。這可以透過新增一個上拉電阻(到 +5V)或下拉電阻(電阻到地)到輸入來實現。10K 電阻是上拉或下拉電阻的良好值。

使用配置為輸入的引腳的內建上拉電阻

Atmega 晶片內建了 20,000 個上拉電阻,可以透過軟體訪問。這些內建的上拉電阻可以透過將 **pinMode()** 設定為 INPUT_PULLUP 來訪問。這實際上反轉了 INPUT 模式下的行為,其中 HIGH 表示感測器關閉,LOW 表示感測器開啟。此上拉電阻的值取決於所使用的微控制器。在大多數基於 AVR 的開發板上,該值保證在 20kΩ 和 50kΩ 之間。在 Arduino Due 上,它在 50kΩ 和 150kΩ 之間。有關確切的值,請查閱您開發板上的微控制器的規格書。

將感測器連線到配置為 INPUT_PULLUP 的引腳時,另一端應連線到地。在簡單開關的情況下,這會導致引腳在開關開啟時讀取 HIGH,在開關按下時讀取 LOW。上拉電阻提供足夠的電流來微弱地點亮連線到配置為輸入的引腳的 LED。如果專案中的 LED 似乎正在工作,但非常微弱,則這很可能是正在發生的情況。

控制引腳是 HIGH 還是 LOW 的相同暫存器(內部晶片記憶體位置)控制上拉電阻。因此,當引腳處於 INPUT 模式時配置為開啟上拉電阻的引腳,如果然後使用 pinMode() 將引腳切換到 OUTPUT 模式,則該引腳將配置為 HIGH。這在另一個方向上也能起作用,並且如果使用 pinMode() 將輸出引腳切換到輸入,則保持 HIGH 狀態的輸出引腳將設定上拉電阻。

示例

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

配置為 OUTPUT 的引腳

使用 pinMode() 配置為 OUTPUT 的引腳處於低阻抗狀態。這意味著它們可以為其他電路提供大量電流。Atmega 引腳可以向其他裝置/電路提供高達 40 mA(毫安)的電流(提供正電流)或吸收(提供負電流)。這足以點亮 LED(不要忘記串聯電阻),或執行許多感測器,但不足以執行繼電器、電磁閥或電機。

嘗試從輸出引腳執行大電流裝置可能會損壞或破壞引腳中的輸出電晶體,或損壞整個 Atmega 晶片。通常,這會導致微控制器中的引腳“失效”,但其餘晶片仍然可以正常工作。因此,除非特定應用程式需要從引腳中汲取最大電流,否則最好透過 470Ω 或 1k 電阻將 OUTPUT 引腳連線到其他裝置。

pinMode() 函式

pinMode() 函式用於配置特定引腳的行為,使其充當輸入或輸出。可以使用模式 INPUT_PULLUP 啟用內部上拉電阻。此外,INPUT 模式顯式停用內部上拉電阻。

pinMode() 函式語法

Void setup () {
   pinMode (pin , mode);
}
  • **pin** - 您希望設定其模式的引腳編號

  • **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() 函式

**digitalWrite()** 函式用於向數字引腳寫入 HIGH 或 LOW 值。如果引腳已使用 pinMode() 配置為 OUTPUT,則其電壓將設定為相應的值:HIGH 為 5V(或 3.3V 電壓板上的 3.3V),LOW 為 0V(接地)。如果引腳配置為 INPUT,則 digitalWrite() 將啟用(HIGH)或停用(LOW)輸入引腳上的內部上拉電阻。建議將 pinMode() 設定為 INPUT_PULLUP 以啟用內部上拉電阻。

如果您未將 pinMode() 設定為 OUTPUT,並將 LED 連線到引腳,則在呼叫 digitalWrite(HIGH) 時,LED 可能會顯得暗淡。在沒有顯式設定 pinMode() 的情況下,digitalWrite() 將啟用內部上拉電阻,該電阻充當一個大的限流電阻。

digitalWrite() 函式語法

Void loop() {
   digitalWrite (pin ,value);
}
  • **pin** - 您希望設定其模式的引腳編號

  • **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
}

analogRead( ) 函式

Arduino 能夠檢測其引腳之一是否施加了電壓,並透過 digitalRead() 函式報告它。開/關感測器(檢測物體的存在)和模擬感測器(其值連續變化)之間存在差異。為了讀取此類感測器,我們需要不同型別的引腳。

在 Arduino 開發板的右下部分,您會看到六個標記為“Analog In”的引腳。這些特殊引腳不僅指示是否向其施加了電壓,還指示其值。透過使用 **analogRead()** 函式,我們可以讀取施加到其中一個引腳上的電壓。

此函式返回介於 0 和 1023 之間的數字,表示介於 0 和 5 伏之間的電壓。例如,如果 2.5 V 的電壓施加到引腳 0,則 analogRead(0) 返回 512。

analogRead() 函式語法

analogRead(pin);
  • **pin** - 要從中讀取的模擬輸入引腳編號(大多數開發板上的 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
}
廣告