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
}
广告