在Arduino上模拟和电子I/O工作
目录
一、Arduino 的 I/O 概述
二、数字 I/O 工作方式
1. 设置引脚模式
读写数字信号
三、模拟输入(Analog Input)
1. 原理
2. 使用方法
四、模拟输出(PWM)
1. 原理
2. 使用方法
五、注意事项
一、Arduino 的 I/O 概述
Arduino 的引脚可以分为两类:
-
数字 I/O (Digital Input/Output)
-
只能识别和输出 0 或 1(低电平 0V,高电平 5V/3.3V,具体看开发板)。
-
可用于控制 LED、读取按钮开关状态、与数字传感器通信等。
-
-
模拟 I/O (Analog Input/Output)
-
模拟输入 (Analog Input):通过板载的 ADC(模数转换器) 把连续的电压(0V~5V 或 0~3.3V)转换成离散的数值(通常 10 位,范围 0~1023)。
-
模拟输出 (Analog Output):Arduino 没有真正的 DAC(数模转换器),所以它的“模拟输出”其实是 PWM(脉冲宽度调制) 信号,用来“模拟”电压大小。
-
二、数字 I/O 工作方式
1. 设置引脚模式
在 setup()
里定义:
pinMode(pin, INPUT); // 设置为输入
pinMode(pin, INPUT_PULLUP); // 输入并启用内部上拉电阻
pinMode(pin, OUTPUT); // 设置为输出
读写数字信号
-
输入:
int buttonState = digitalRead(2); // 读取引脚 2 的电平(0 或 1)
输出:
digitalWrite(13, HIGH); // 将引脚 13 拉高(5V)
digitalWrite(13, LOW); // 将引脚 13 拉低(0V)
⚡ 例子:按钮控制 LED
const int buttonPin = 2;
const int ledPin = 13;
int buttonState = 0;void setup() {pinMode(buttonPin, INPUT);pinMode(ledPin, OUTPUT);
}void loop() {buttonState = digitalRead(buttonPin);if (buttonState == HIGH) {digitalWrite(ledPin, HIGH); // 点亮 LED} else {digitalWrite(ledPin, LOW); // 关闭 LED}
}
三、模拟输入(Analog Input)
1. 原理
-
Arduino UNO 有 6 个模拟输入引脚(A0~A5)。
-
电压范围:0V ~ 5V
-
ADC 分辨率:10 位 → 输出数值 0~1023
-
0 → 0V
-
1023 → 5V
-
例如:输入 2.5V → 大约读到 512
-
2. 使用方法
int sensorValue = analogRead(A0); // 读取 A0 上的电压
⚡ 例子:电位器读数
int sensorValue = 0;void setup() {Serial.begin(9600); // 打开串口监视器
}void loop() {sensorValue = analogRead(A0); Serial.println(sensorValue); // 打印 0~1023 的数值delay(500);
}
四、模拟输出(PWM)
1. 原理
-
Arduino UNO 的某些数字引脚支持 PWM 输出(标有
~
的引脚,如 3, 5, 6, 9, 10, 11)。 -
PWM 用高速开关信号的 占空比 来模拟电压:
-
0% 占空比 → 0V
-
50% 占空比 → 2.5V(假设 5V 电源)
-
100% 占空比 → 5V
-
2. 使用方法
analogWrite(pin, value);
// value 范围 0~255
// 0 = 0V, 255 ≈ 5V
⚡ 例子:呼吸灯
int led = 9; // 支持 PWM 的引脚
int brightness = 0;
int fadeAmount = 5;void setup() {pinMode(led, OUTPUT);
}void loop() {analogWrite(led, brightness); // 设置亮度brightness = brightness + fadeAmount;if (brightness <= 0 || brightness >= 255) {fadeAmount = -fadeAmount; // 反向变化}delay(30);
}
五、注意事项
-
电压范围:不要给 Arduino 模拟输入超过其供电电压(UNO 是 5V,Nano/ESP32 可能是 3.3V)。
-
电流限制:每个 I/O 引脚最大约 20mA,绝对不能超过 40mA。
-
PWM ≠ 真正模拟电压,它是数字信号模拟的“平均电压”,对 LED、马达有效,但不能直接输出真正的连续电压波形。
-
滤波电路:如果需要真正平滑的模拟电压,可以在 PWM 输出端加一个 RC 滤波器(电阻 + 电容)。
✅ 总结一下:
-
Digital I/O →
pinMode()
+digitalRead()
/digitalWrite()
-
Analog Input →
analogRead()
获取 0~1023 对应电压 -
Analog Output (PWM) →
analogWrite()
设置 0~255 对应占空比
下面我画了一个Arduino I/O 总结图(数字输入/输出,模拟输入/输出函数一览)