📜  Arduino-I / O功能

📅  最后修改于: 2020-11-05 03:32:01             🧑  作者: Mango


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

引脚配置为输入

默认情况下,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的引脚时,另一端应接地。对于简单的开关,这会导致该引脚在开关断开时读为高电平,而在按下开关时读为低电平。上拉电阻器提供足够的电流来点亮昏暗连接至配置为输入的引脚的LED。如果项目中的LED似乎工作正常,但效果非常暗淡,则很可能正在发生这种情况。

控制引脚为高电平或低电平的相同寄存器(内部芯片存储位置)控制上拉电阻。因此,如果某个引脚配置为在INPUT模式下开启时上拉电阻开启,那么如果该引脚随后通过pinMode()切换到OUTPUT模式,则该引脚将配置为HIGH。这也可以在另一个方向上起作用,并且如果使用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

引脚配置为OUTPUT

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

尝试从输出引脚运行大电流设备,可能会损坏或破坏该引脚中的输出晶体管,或者损坏整个Atmega芯片。通常,这会导致微控制器中的“死”引脚,但其余芯片仍能函数。因此,除非通过特殊应用需要从引脚吸收最大电流,否则最好通过470Ω或1k电阻将OUTPUT引脚连接至其他设备。

pinMode()函数

pinMode()函数用于将特定的引脚配置为充当输入或输出。可以通过INPUT_PULLUP模式启用内部上拉电阻。此外,INPUT模式明确禁用了内部上拉电阻。

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()函数用于将HIGH或LOW值写入数字引脚。如果使用pinMode()将引脚配置为OUTPUT,则其电压将设置为相应的值:5V(在3.3V板上为3.3V)为HIGH,低电平为0V(接地)。如果该引脚配置为INPUT,则digitalWrite()将启用(HIGH)或禁用(LOW)输入引脚上的内部上拉。建议将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);
  • 引脚-要读取的模拟输入引脚的编号(在大多数板上为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
}