ESP32/STM32 引脚紧缺?用 ULN2003A 实现多负载批量驱动|硬件极简扩展方案
想同时驱动 5V 继电器、步进电机、LED 阵列、蜂鸣器、小风扇…… 但 MCU 引脚不够用!GPIO 数量有限、驱动能力弱、直接带负载容易烧芯片,项目越做越受限。今天给大家分享一个成本不到 2 元、超实用的硬件扩展神器:ULN2003A。它能1 个引脚扩展驱动 7 路负载、提升驱动电流、隔离高低压、保护单片机,完美解决 GPIO 紧缺、驱动能力不足问题,附带接线图 + 双平台代码(ESP32/S
前言
玩 ESP32、STM32 的开发者一定遇到过这个痛点:想同时驱动 5V 继电器、步进电机、LED 阵列、蜂鸣器、小风扇…… 但 MCU 引脚不够用!GPIO 数量有限、驱动能力弱、直接带负载容易烧芯片,项目越做越受限。
今天给大家分享一个成本不到 2 元、超实用的硬件扩展神器:ULN2003A。它能1 个引脚扩展驱动 7 路负载、提升驱动电流、隔离高低压、保护单片机,完美解决 GPIO 紧缺、驱动能力不足问题,附带 接线图 + 双平台代码(ESP32/STM32)+ 实战演示,新手也能直接抄作业。
一、ULN2003A 到底是什么?(超通俗解释)
ULN2003A 是 7 路 NPN 达林顿管阵列驱动芯片一句话功能:小信号进 → 大电流出,1 个芯片 = 7 路独立驱动,扩展 GPIO + 增强驱动
核心亮点:
- 7 路独立驱动通道
- 输入 3.3V / 5V 兼容(完美适配 ESP32 / STM32)
- 输出最大 500mA / 通道,可直接驱动继电器、电机、灯
- 内置续流二极管,驱动感性负载(继电器、电机)不烧芯片
- 宽电压:5V~18V
- 体积小、DIP-16 直插,面包板直接用
- 单价极低(1~2 元)
一句话总结:MCU 弱信号 → ULN2003A → 强驱动负载,同时扩展 7 路输出
二、典型应用场景(全覆盖)
- 驱动 5V 继电器模块
- 驱动 28BYJ-48 步进电机(最常用)
- LED 点阵 / 流水灯批量驱动
- 多路蜂鸣器
- 小风扇、小水泵
- 电磁阀、小型执行器
- 任何需要批量开关控制的负载
三、引脚定义 & 标准接线图(必看,直接照接)
ULN2003A 引脚
- 1~7:输入(接 MCU GPIO)
- 8:GND
- 9:公共端 / 续流二极管正极(驱动电机 / 继电器必须接负载电源 VCC)
- 10~16:输出(接负载)
标准接线(通用)
- ESP32/STM32 GPIO → ULN2003A 1~7
- MCU GND → ULN2003A 8
- 负载电源 VCC(5V) → ULN2003A 9
- ULN2003A 10~16 → 负载负极
- 负载正极 → 电源 VCC
四、ESP32 代码示例(Arduino):7 路流水灯 / 继电器驱动
cpp
运行
/*
ESP32 + ULN2003A 批量驱动演示
功能:7 路输出依次开关
*/
// 定义驱动引脚(ESP32 GPIO)
const int driverPins[] = {2, 4, 5, 12, 13, 14, 15};
const int channelNum = 7;
void setup() {
// 初始化所有引脚为输出
for(int i=0; i<channelNum; i++){
pinMode(driverPins[i], OUTPUT);
digitalWrite(driverPins[i], LOW);
}
}
void loop() {
// 依次打开
for(int i=0; i<channelNum; i++){
digitalWrite(driverPins[i], HIGH);
delay(200);
}
// 依次关闭
for(int i=0; i<channelNum; i++){
digitalWrite(driverPins[i], LOW);
delay(200);
}
}
五、STM32 代码示例(HAL 库):批量驱动输出
c
运行
/*
STM32 + ULN2003A 7路驱动
*/
// 假设使用 GPIOA 0~6
void ULN2003_Init(void) {
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef gpio = {0};
gpio.Mode = GPIO_MODE_OUTPUT_PP;
gpio.Pull = GPIO_NOPULL;
gpio.Speed = GPIO_SPEED_FREQ_LOW;
for(int i=0; i<7; i++){
gpio.Pin = GPIO_PIN_0 << i;
HAL_GPIO_Init(GPIOA, &gpio);
HAL_GPIO_WritePin(GPIOA, gpio.Pin, GPIO_PIN_RESET);
}
}
// 打开某一路
void ULN2003_On(int ch) {
if(ch >=0 && ch <7)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0 << ch, GPIO_PIN_SET);
}
// 关闭某一路
void ULN2003_Off(int ch) {
if(ch >=0 && ch <7)
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0 << ch, GPIO_PIN_RESET);
}
六、最经典实战:28BYJ-48 步进电机驱动(人人都用)
ULN2003A 最常见用途就是驱动28BYJ-48 步进电机
接线
- IN1~IN4 → ESP32 / STM32 任意 4 个 GPIO
-
- → 5V
- GND → GND
ESP32 步进电机代码
cpp
运行
#include <Stepper.h>
const int stepsPerRev = 2048;
Stepper myStepper(stepsPerRev, 2,4,5,12);
void setup() {
myStepper.setSpeed(10);
}
void loop() {
myStepper.step(stepsPerRev);
delay(500);
}
七、为什么必须用 ULN2003A?3 个硬核理由
1. 解决 GPIO 数量不足
1 块芯片 = 7 路扩展输出项目再也不用因为缺 GPIO 而删减功能。
2. 解决驱动能力不足
- ESP32 / STM32 最大只能输出 20~40mA
- ULN2003A 输出 500mA直接驱动继电器、电机、灯,不伤单片机。
3. 保护 MCU(最重要)
内置续流二极管驱动继电器、电机这类感性负载不会反向击穿 GPIO。
八、注意事项(新手必看)
- ULN2003A 是低侧驱动(控制负极)负载正极接电源,负极接芯片输出。
- 驱动继电器 / 电机时,引脚 9 必须接 5V
- 输入高电平 → 输出导通
- 不能驱动高压负载(最大 18V)
九、总结
ULN2003A 是 MCU 扩展 GPIO、增强驱动的神器:
- 成本极低
- 7 路独立驱动
- 3.3V/5V 兼容
- 内置保护
- 接线简单、代码通用
不管是 ESP32 还是 STM32,只要遇到引脚不够、驱动不足,直接上 ULN2003A,2 块钱解决大问题!
更多推荐



所有评论(0)