Arduino - I/O 函数


Arduino 板上的引脚可以配置为输入或输出。我们将解释这些模式下引脚的功能。值得注意的是,大多数 Arduino 模拟引脚的配置和使用方式与数字引脚完全相同。

引脚配置为输入

Arduino 引脚默认配置为输入,因此当您将它们用作输入时,不需要使用pinMode()显式声明它们为输入。以这种方式配置的引脚被认为处于高阻抗状态。输入引脚对其采样的电路的要求极小,相当于在引脚前面串联一个 100 兆欧的电阻。

这意味着只需很少的电流即可将输入引脚从一种状态切换到另一种状态。这使得这些引脚对于实施电容式触摸传感器或将 LED 读取为光电二极管等任务非常有用。

配置为 pinMode(pin, INPUT) 且没有任何连接的引脚,或者连接到其但未连接到其他电路的电线的引脚,报告引脚状态看似随机的变化,从环境中拾取电噪声,或电容耦合状态附近的引脚。

上拉电阻

如果没有输入,上拉电阻通常可用于将输入引脚引导至已知状态。这可以通过在输入端添加一个上拉电阻(至+5V)或一个下拉电阻(接地电阻)来完成。10K 电阻对于上拉或下拉电阻来说是一个不错的值。

使用内置上拉电阻并将引脚配置为输入

Atmega 芯片内置有 20,000 个上拉电阻,可以通过软件访问。这些内置上拉电阻可通过将pinMode()设置为 INPUT_PULLUP 来访问。这有效地反转了输入模式的Behave,其中高电平表示传感器关闭,低电平表示传感器打开。该上拉电阻的值取决于所使用的微控制器。在大多数基于 AVR 的板上,该值保证在 20kΩ 到 50kΩ 之间。在 Arduino Due 上,它在 50kΩ 到 150kΩ 之间。有关确切值,请参阅板上微控制器的数据表。

将传感器连接到配置有 INPUT_PULLUP 的引脚时,另一端应接地。对于简单开关,这会导致引脚在开关打开时读为高电平,而在按下开关时读为低电平。上拉电阻提供足够的电流来点亮连接到配置为输入的引脚的昏暗 LED。如果项目中的 LED 看起来正常工作,但非常暗淡,则可能就是这种情况。

控制引脚是高电平还是低电平的相同寄存器(内部芯片存储位置)也控制上拉电阻。因此,配置为在引脚处于 INPUT 模式时打开上拉电阻的引脚,如果随后使用 pinMode() 将引脚切换到 OUTPUT 模式,则该引脚将配置为高电平。这也适用于另一个方向,如果使用 pinMode() 切换到输入,则处于高状态的输出引脚将设置上拉电阻。

例子

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

引脚配置为输出

使用 pinMode() 配置为 OUTPUT 的引脚被认为处于低阻抗状态。这意味着它们可以为其他电路提供大量电流。Atmega 引脚可以向其他设备/电路提供(提供正电流)或吸收(提供负电流)高达 40 mA(毫安)的电流。该电流足以点亮 LED(不要忘记串联电阻),或运行许多传感器,但不足以运行继电器、螺线管或电机。

尝试从输出引脚运行高电流设备可能会损坏或毁坏引脚中的输出晶体管,或者损坏整个 Atmega 芯片。通常,这会导致微控制器中的引脚“失效”,但其余芯片仍然可以充分运行。因此,最好通过 470Ω 或 1k 电阻将 OUTPUT 引脚连接到其他设备,除非特定应用需要从引脚汲取最大电流。

pinMode() 函数

pinMode() 函数用于将特定引脚配置为输入或输出。可以使用 INPUT_PULLUP 模式启用内部上拉电阻。此外,输入模式显式禁用内部上拉电阻。

pinMode() 函数语法

Void setup () {
   pinMode (pin , mode);
}
  • pin - 您要设置其模式的引脚编号

  • 模式- 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()配置为输出,则其电压将设置为相应的值:5V(或 3.3V 板上的 3.3V)为高电平,0V(接地)为低电平。如果引脚配置为输入,digitalWrite() 将启用(​​高电平)或禁用(低电平)输入引脚上的内部上拉电阻。建议将pinMode()设置为 INPUT_PULLUP 以启用内部上拉电阻。

如果未将 pinMode() 设置为 OUTPUT,并将 LED 连接到引脚,则在调用 digitalWrite(HIGH) 时,LED 可能会变暗。如果没有显式设置 pinMode(),digitalWrite() 将启用内部上拉电阻,其作用类似于大限流电阻。

digitalWrite() 函数语法

Void loop() {
   digitalWrite (pin ,value);
}
  • pin - 您要设置其模式的引脚编号

  • - 高或低。

例子

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
}