开发板基本常识
UART 和 USB 是什么?
- USB:你插到电脑的那根线,既能供电(5V),又能做数据通信。但 ESP32 芯片本身其实不会直接讲“USB”,开发板上通常有一个 USB 转串口芯片(比如 CP2102/ CH340),它把 USB 数据转换成 UART。
- UART:通用异步收发口(串口),是一种最经典的通信方式(点对点,TX 发 → RX 收),速率固定(比如 115200bps)。在调试时你用 Serial Monitor 看到的打印其实就是 UART。
它们物理接口都用的是 USB Type‑A/Type‑C 形状的插口,但协议不同:USB 是复杂的分层通信协议(总线架构、设备枚举、驱动支持),而 UART 是最简单的一对点对点数字电平信号(TX/RX),所以需要芯片把“USB 协议”翻译成“UART 电平信号”供 ESP32 使用。
因为电脑的 USB 接口只能识别符合 USB 协议的设备,而 UART 只是两根电平线(TX/RX)没有协议握手,如果直接把 UART 信号线插到电脑的 USB 口,电脑完全不能识别也不能通信,所以要加一个 USB‑转‑UART 芯片让电脑觉得“这是一个标准的 USB 串口设备”,否则电脑端既没有驱动也没有办法收发数据。
👉 类比:
- USB = 高铁 → 能拉客也能拉货,很快。
- UART = 老式公交车 → 只能一对一、固定速度走,但足够简单,最常见。
一般 ESP32 芯片本身没有原生 USB 外设(不像 STM32 部分系列有),所以开发板上会加一个 USB 转 UART 芯片,把电脑的 USB 数据协议转换成 ESP32 能理解的 UART 协议,从而既能下载程序又能调试输出。
GND 是什么? 我看上面写着 GND 5v IO 是什么意思?
- GND = Ground,接地。它是电路的基准点,相当于“0V”。所有电流最终都要回到 GND,就像水流最终回到江河。
- 5V/3.3V = 正电压,开发板上通常有这两种。ESP32 芯片本身是 3.3V 工作的,有些模块支持 5V(比如继电器)。
- IO(Input/Output,GPIO):这是可编程的引脚,你可以让它输出高电平(3.3V)/低电平(0V),或者读取外部是否有电压输入。
👉 类比:
- GND = 大地(一定要有基准)。
- 5V = 电厂送来的电力。
- IO = 插座开关,编程随时能切换开/关,或者检测“有没有插电”。
在 ESP32 中,GPIO 的作用
GPIO 是 General Purpose Input/Output 的缩写,意思是“通用输入输出引脚”。在像 ESP32 这样的微控制器里,GPIO 是最基础、最常用的一部分资源。
ESP32 芯片上带有几十个引脚(不同封装型号数量可能不同),其中大多数都可以配置为 GPIO。每个 GPIO 引脚都可以通过软件设定为 输入 或 输出:
-
输入模式
可以用来读取外部信号(例如按钮、传感器的数据电平)。
ESP32 GPIO 还支持上拉、下拉电阻配置,方便读取稳定的逻辑电平。 -
输出模式
可以用来驱动外部器件(例如点亮 LED、控制继电器、与外设通信)。 -
多功能复用
ESP32 的 GPIO 大部分都可以复用为其他外 设功能(UART、I2C、SPI、PWM、ADC、DAC 等),不仅仅是单纯的“高低电平”。
ESP32 GPIO 的一些特点
数量:ESP32 通常提供约 34 个可用的 GPIO(不过并不是每一个封装都会引出全部引脚)。
电压:GPIO 工作在 3.3V 电平,输入电压必须在 0~3.3V 之间,高于这个范围可能烧坏芯片。
- 特殊功能引脚:
- GPIO6 ~ GPIO11:通常用于连接 Flash,不建议用户使用。
- GPIO34 ~ GPIO39:只支持输入,不支持输出。
- 可配置模式:通过软件 API(例如
pinMode()在 Arduino 框架下,或 ESP-IDF 的gpio_set_direction())来配置。
简单例子(Arduino 框架下)
int ledPin = 2; // ESP32 开发板上的一般 IO2 引脚接了板载 LED
void setup() {
pinMode(ledPin, OUTPUT); // 设置 GPIO2 为输出
}
void loop() {
digitalWrite(ledPin, HIGH); // 输出高电平,点亮 LED
delay(1000);
digitalWrite(ledPin, LOW); // 输出低电平,熄灭 LED
delay(1000);
}
开发板两边的针脚是什么?标有数字又是什么?
- 那些针脚叫 排针 (header pins),目的是让你连杜邦线,接其他模块。
- 上面的数字(比如 GPIO 15、IO2)就是 对应的 GPIO 引脚编号。
- 某些针脚有特别的功能(比如
TX0/RX0是 UART;EN是复位引脚;VIN是 5V 输入口)。
👉 类比:
它们就像是你 API 声明的函数参数,不同的编号对应不同的功能(某些是多功能复用的,要查 pinout 图)。
J5、P1、J2 那些名字是什么?
- 这些通常是 PCB 上的接口名字(Connector ID)。
- 比如
P1可能是电源接口,J2可能是专门的扩展接口。名字本身没统一标准,通常需要对应开发板的 原理图 才知道它们具体是什么。 - 就好比代码里不同模块的命名空间前缀。
继电器模块是什么?K1、IN4 等是什么意思?
-
继电器 = 用低电压控制高电压通路的“电子开关”。
- ESP32 输出 3.3V → 驱动继电器 → 继电器切换 220V 灯泡通断。
-
模块上通常有“通道编号”:
K1= 第一组继电器,K2= 第二组。IN4= 继电器第 4 通道的控制输入引脚(接 ESP32 的某个 GPIO)。
👉 类比:
继电器模块就像你远程调度的一组“机房电源开关”,用少量的低功率信号控制更大功率的电器。
高电平(3.3V)或 低电平(0V)是什么?
电平 = GPIO引脚的电压状态
- 高电平(3.3V) → 逻辑1 → true
- 低电平(0V) → 逻辑0 → false
ESP32通过检测引脚电压高低来判断数字信号。
1、输入检测
// 设置 GPIO 为输入模式
pinMode(2, INPUT);
// 读取电平状态
int level = digitalRead(2);
if (level == HIGH) { // 检测到3.3V
Serial.println("检测到高电平");
} else { // 检测到0V
Serial.println("检测到低电平");
}
2、输出控制
// 设置GPIO为输出模式
pinMode(2, OUTPUT);
// 输出高电平(3.3V) - LED亮
digitalWrite(2, HIGH);
// 输出低电平(0V) - LED灭
digitalWrite(2, LOW);
3、实际应用示例
// 按钮检测
if (digitalRead(BUTTON_PIN) == LOW) { // 按钮按下(接地)
digitalWrite(LED_PIN, HIGH); // 点亮LED
}
// 传感器检测
bool motion = digitalRead(PIR_PIN); // 读取人体感应
if (motion) { // 有运动时为高电平
Serial.println("检测到运动");
}
核心原理:程序中的 1/0 实际对应硬件上的 3.3V/0V电压状态。
UART 通信简介
UART = 一种串行通信协议,利用GPIO的高低电平按规则传输数据
核心概念:
- TX(发送) + RX(接收) 两根线实现双向通信
- 异步传输:无独立时钟线,双方约定波特率同步
- 将字节数据拆解为串行的0/1电平信号传输
1、基础串口通信
void setup() {
// 初始化串口,设置波特率
Serial.begin(115200);
Serial.println("UART通信开始");
}
void loop() {
// 发送数据
Serial.print("传感器值: ");
Serial.println(analogRead(A0));
// 接收数据
if (Serial.available()) {
String data = Serial.readString();
Serial.println("收到: " + data);
}
delay(1000);
}
2、多串口使用
// 使用硬件串口2与其他设备通信
void setup() {
Serial.begin(115200); // 调试用
Serial2.begin(9600, SERIAL_8N1, 16, 17); // RX=16, TX=17
}
void loop() {
// 向串口2发送AT命令(如4G模块)
Serial2.println("AT+CSQ");
// 读取串口2响应
if (Serial2.available()) {
String response = Serial2.readString();
Serial.println("模块响应: " + response);
}
}
3、UART数据格式检测
// 解析GPS模块NMEA数据
void parseGPS() {
if (Serial2.available()) {
String nmea = Serial2.readStringUntil('\n');
if (nmea.startsWith("$GPGGA")) { // 检测特定数据包
// 解析GPS坐标数据
parseCoordinates(nmea);
}
}
}
实际应用: Serial.println()就是通过UART将数据转换为电平信号,传输到电脑显示。