Arduino - I/O Functions
Arduino板上的引脚可配置为输入或输出。 我们将在这些模式中解释引脚的功能。 重要的是要注意,大多数Arduino模拟引脚可以以与数字引脚完全相同的方式进行配置和使用。
引脚配置为INPUT
默认情况下,Arduino引脚被配置为输入,因此当您将它们用作输入时,不需要使用pinMode()显式声明它们作为输入。 以这种方式配置的引脚被称为处于高阻抗状态。 输入引脚对它们采样的电路提出极小的要求,相当于引脚前面100兆欧的串联电阻。
这意味着将输入引脚从一种状态切换到另一种状态所需的电流非常小。 这使得引脚可用于实现电容式触摸传感器或将LED读取为光电二极管等任务。
引脚配置为pinMode(引脚,INPUT),没有连接到它们,或连接到它们没有连接到其他电路的导线,报告看似引脚状态的随机变化,从环境中拾取电噪声,或电容耦合状态附近的一针。
Pull-up Resistors
如果不存在输入,则上拉电阻通常用于将输入引脚转向已知状态。 这可以通过在输入端添加一个上拉电阻(至+ 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()的输入,则保持高电平状态的输出引脚将设置上拉电阻。
Example
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() Function
pinMode()函数用于配置特定引脚以表现为输入或输出。 可以使用INPUT_PULLUP模式使能内部上拉电阻。 此外,INPUT模式明确禁用内部上拉。
pinMode() Function Syntax
Void setup () {
pinMode (pin , mode);
}
pin - 要设置其模式的引脚编号
mode - INPUT,OUTPUT或INPUT_PULLUP。
Example
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() Function
digitalWrite()函数用于将HIGH或LOW值写入数字引脚。 如果引脚已配置为带有pinMode()的OUTPUT,则其电压将设置为相应的值:5V(或3.3V板上3.3V)用于高电平,0V(接地)用于低电平。 如果引脚配置为INPUT,则digitalWrite()将使能(HIGH)或禁用(LOW)输入引脚上的内部上拉。 建议将pinMode()设置为INPUT_PULLUP以使能内部上拉电阻。
如果未将pinMode()设置为OUTPUT,并将LED连接到引脚,则在调用digitalWrite(HIGH)时,LED可能显得暗淡。 如果没有明确设置pinMode(),digitalWrite()将启用内部上拉电阻,该电阻就像一个大电流限制电阻。
digitalWrite() Function Syntax
Void loop() {
digitalWrite (pin ,value);
}
pin - 要设置其模式的引脚编号
value - HIGH或LOW。
Example
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( ) function
Arduino能够检测是否有一个电压施加到其中一个引脚并通过digitalRead()函数报告。 开/关传感器(检测到物体的存在)和模拟传感器之间存在差异,模拟传感器的值不断变化。 为了读取这种类型的传感器,我们需要一种不同类型的引脚。
在Arduino板的右下方,您将看到标有“Analog In”的六个引脚。 这些特殊引脚不仅可以判断是否有施加电压,还可以判断其值。 通过使用analogRead()函数,我们可以读取施加到其中一个引脚的电压。
此函数返回0到1023之间的数字,表示0到5伏之间的电压。 例如,如果引脚号0上施加2.5 V电压,则analogRead(0)返回512。
analogRead() function Syntax
analogRead(pin);
pin - 要读取的模拟输入引脚的编号(大多数板上为0到5,Mini和Nano上为0到7,Mega上为0到15)
Example
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
}