跳到主要内容

开发板基本常识

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 之间,高于这个范围可能烧坏芯片。

  1. 特殊功能引脚:
    • GPIO6 ~ GPIO11:通常用于连接 Flash,不建议用户使用。
    • GPIO34 ~ GPIO39:只支持输入,不支持输出。
  2. 可配置模式:通过软件 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将数据转换为电平信号,传输到电脑显示。