最近我拿到两块160mm×160mm的P2.5室内全彩灯板。单块分辨率为64×64,两块横向拼接后可以组成128×64画布。

这类灯板与WS2812B完全不同。它不是一根数据线串行传完就结束,而是通过HUB75接口,由控制器持续进行行扫描、颜色移位、锁存和亮度控制。本文记录我使用ESP32-S3完成单板测试和双板拼接的过程。

请添加图片描述

一、先确认灯板参数

P2.5只表示相邻像素中心间距约为2.5mm,并不代表通信协议。驱动前至少要确认:

  • 单板分辨率:本文为64×64;
  • 接口:HUB75;
  • 扫描方式:常见有1/16、1/32等;
  • 行地址是否使用A、B、C、D、E;
  • 驱动芯片是否需要特殊面板配置。

同样是P2.5灯板,驱动芯片或扫描方式不同,代码配置也可能不同。因此,先向卖家确认参数,或者查看PCB背面的型号标识。

二、HUB75传输了什么

HUB75主要信号可以分为四组:

信号作用
R1/G1/B1、R2/G2/B2同时传输屏幕上下两部分的RGB数据
A/B/C/D/E选择当前扫描行
CLK将每列像素数据移入驱动芯片
LAT/STB锁存刚刚传输的一行数据
OE输出使能、消隐和亮度控制

请添加图片描述

ESP32-S3需要不断重复“选行、移位、锁存、显示、换行”。刷新足够快时,人眼才会看到一幅稳定画面。

三、为什么使用DMA库

如果在loop()中手动翻转十几根GPIO,不仅占用大量CPU时间,也很难同时兼顾刷新率和应用逻辑。我使用ESP32-HUB75-MatrixPanel-DMA库,让ESP32-S3通过并行外设和DMA持续输出刷新数据。

这样做有三个直接好处:

  1. 屏幕刷新不再依赖主循环逐点操作;
  2. 可以使用接近Adafruit GFX的绘图接口;
  3. 后续增加文字、图形和动画更方便。

四、接线与供电

ESP32-S3的GPIO需要连接HUB75输入端的颜色线、行地址线以及CLKLATOE。具体GPIO可以自行分配,但程序配置必须与实物完全一致。

请添加图片描述

供电部分尤其需要注意:

  • 灯板使用独立5V电源;
  • 不要从ESP32-S3开发板的5V引脚给灯板提供大电流;
  • ESP32-S3的GND必须与灯板电源GND相连;
  • 两块灯板最好分别从电源端引出5V和GND;
  • 第一次测试先降低亮度,不要直接全屏白色。

ESP32-S3输出3.3V逻辑。短线测试时部分灯板可以直接识别,但正式作品、长线连接或出现花屏时,建议增加74AHCT245一类5V电平转换器。

五、单块64×64灯板配置

核心配置如下,GPIO映射需要根据自己的开发板和转接板补充:

#include <ESP32-HUB75-MatrixPanel-I2S-DMA.h>

#define PANEL_RES_X 64
#define PANEL_RES_Y 64
#define PANEL_CHAIN 1

MatrixPanel_I2S_DMA *display = nullptr;

void setup() {
  HUB75_I2S_CFG mxconfig(
      PANEL_RES_X,
      PANEL_RES_Y,
      PANEL_CHAIN
  );

  // 如果没有使用库的默认引脚,需要在这里配置mxconfig.gpio。
  display = new MatrixPanel_I2S_DMA(mxconfig);

  if (!display->begin()) {
    while (true) {
      delay(1000);
    }
  }

  display->setBrightness8(40);
  display->clearScreen();

  display->drawPixelRGB888(0, 0, 255, 0, 0);
  display->drawPixelRGB888(63, 0, 0, 255, 0);
  display->drawPixelRGB888(0, 63, 0, 0, 255);
  display->drawPixelRGB888(63, 63, 255, 255, 255);
}

void loop() {
}

我没有一开始就播放复杂动画,而是依次测试纯色、边框、四角和渐变。这样更容易判断RGB顺序、坐标方向和扫描边界是否正确。

请添加图片描述

六、两块灯板怎样级联

数据连接方式如下:

ESP32-S3 → 第一块灯板IN
第一块灯板OUT → 第二块灯板IN

两块板横向摆放时,单板尺寸仍然是64×64,只需要把链长改为2:

#define PANEL_RES_X 64
#define PANEL_RES_Y 64
#define PANEL_CHAIN 2

此时逻辑画布变成128×64:

  • x=0~63位于第一块板;
  • x=64~127位于第二块板;
  • y=0~63保持不变。

只要在128像素宽的坐标系中连续绘图,动画就可以跨过两块板之间的拼缝。

请添加图片描述
请添加图片描述

如果改成上下拼接,则不能只把高度改成128。物理级联顺序与逻辑坐标系不一致时,需要使用VirtualMatrixPanel或自行完成坐标映射。

七、双板后还要关注什么

双板级联不仅是把PANEL_CHAIN从1改成2,还会带来这些变化:

  • DMA帧缓存变大;
  • 刷新数据量增加;
  • 电源电流和压降问题更明显;
  • 两块板的亮度、扫描方式和驱动芯片最好一致;
  • 内存不足时可能需要降低颜色深度或关闭双缓冲。

八、常见问题

1. 整屏不亮

检查排线是否接在IN端、5V与GND是否正确、OE和时钟引脚配置是否匹配。

2. 上下半屏错位

优先检查扫描方式、行地址线和面板驱动配置。

3. 颜色不正确

检查R/G/B信号映射,不要先怀疑绘图算法。

4. 静态正常,动画闪烁

检查5V电源、共地、排线长度、刷新率、DMA内存和3.3V逻辑电平。

5. 接上第二块后重启

通常优先检查供电能力和压降,其次再检查DMA内存是否足够。

总结

WS2812B更像给灯珠依次发送一串颜色包;HUB75则要求控制器持续翻动一本“电子动画书”。真正需要掌握的不只是绘图API,还包括扫描、锁存、DMA、供电和坐标映射。

目前我已经完成单板纯色、边框、渐变测试,以及两块板组成128×64画布后的跨屏动画。下一步准备继续尝试粒子、流体和AI视觉交互效果。

我是阿白,感谢您的观看。

更多推荐