Arduino - I/O 函式
Arduino 板上的引腳可配置為輸入或輸出。我們將在這些模式中解釋引腳的功能。重要的是要注意,大多數 Arduino 模擬引腳可以以與數字引腳完全相同的方式進行配置和使用。
引腳配置為 INPUT
預設情況下,Arduino 引腳被配置為輸入,因此當你將它們用作輸入時,不需要將它們顯式宣告為帶有 pinMode()
的輸入。以這種方式配置的引腳被稱為處於高阻抗狀態。輸入引腳對它們取樣的電路提出極小的要求,引腳的輸入電阻相當於 100 兆歐的串聯電阻。
這意味著將輸入引腳從一種狀態切換到另一種狀態所需的電流非常小。這使得引腳可用於實現電容式觸控感測器或將 LED 讀取為光電二極體等任務。
引腳配置為 pinMode(pin, INPUT)
時,假如沒有訊號連線到它們,或有沒有連線到其他電路的導線,那麼引腳的狀態變化時隨機的,它從環境中拾取電噪聲,結果為 1
或者 0
。
上拉電阻器
如果不存在輸入,則上拉電阻通常用於將輸入引腳轉為固定的已知狀態。這可以通過在輸入端新增一個上拉電阻(至+5V)或下拉電阻(接地電阻)來實現。對於上拉或下拉電阻,10K 電阻是一個很好的值。
使用配置為內建上拉電阻為引腳輸入
Atmega 晶片內建了 20,000 個上拉電阻,可通過軟體訪問。通過將 pinMode()
設定為 INPUT_PULLUP
來訪問這些內建上拉電阻。這有效地反轉了 INPUT 模式的行為,其中 HIGH 表示感測器處於 OFF 狀態,LOW 表示感測器處於 ON 狀態。該上拉電阻的值取決於所使用的微控制器。在大多數基於 AVR 的電路板上,該值保證在 20kΩ 和 50kΩ 之間。在 Arduino Due 上,它介於 50kΩ 和 150kΩ 之間。有關確切電阻值,請參閱電路板上微控制器的資料手冊。
將感測器連線到配置有 INPUT_PULLUP 的引腳時,另一端應連線到地。如果是簡單的開關,這會導致引腳在開關開啟時讀取高電平,在按下開關時讀取低電平。上拉電阻提供足夠的電流來輕微地點亮模擬連線到配置為輸入的引腳的 LED。如果專案中的 LED 似乎工作,但非常模糊,這可能就是所說的這種情況。
控制引腳是高電平還是低電平的相同暫存器(內部晶片儲存器位置)來控制上拉電阻。因此,當引腳處於 INPUT 模式時,配置為使上拉電阻導通的引腳將使引腳配置為高電平,如果引腳隨後通過 pinMode()
切換到 OUTPUT 模式。這也適用於另一個方向,如果 pinMode()
從 OUTPUT
切換到 INPUT
模式,則高電平狀態的輸出引腳將設定上拉電阻。
例
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()
函式是用來寫一個高電平或低電平值到數字引腳。如果引腳已配置為帶有 pinMode()
的 OUTPUT,則其電壓將設定為相應的值:5V(或 3.3V 電路板上 3.3V)- 高電平,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 伏之間的電壓。例如,如果引腳號 0 上施加 2.5 V 電壓,則 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
}