前言

玩 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。


八、注意事项(新手必看)

  1. ULN2003A 是低侧驱动(控制负极)负载正极接电源,负极接芯片输出。
  2. 驱动继电器 / 电机时,引脚 9 必须接 5V
  3. 输入高电平 → 输出导通
  4. 不能驱动高压负载(最大 18V)

九、总结

ULN2003A 是 MCU 扩展 GPIO、增强驱动的神器

  • 成本极低
  • 7 路独立驱动
  • 3.3V/5V 兼容
  • 内置保护
  • 接线简单、代码通用

不管是 ESP32 还是 STM32,只要遇到引脚不够、驱动不足,直接上 ULN2003A,2 块钱解决大问题!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐