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
}