“Let It Glow”:一块会唱歌、会发光的披头士 PCB 艺术板
在传统电子项目中,PCB 往往只是承载元件的“电路底板”;但在创客圈,越来越多人开始把 PCB 当作画布,把电子电路和视觉设计结合起来,做成真正意义上的“电子艺术”。
本文介绍的就是这样一个项目——The Beetles PCB ART,作者给它起了一个更有趣的名字:Let It Glow。
它既是一块披头士主题的 PCB 艺术板,又是一台能播放披头士歌曲的音乐播放器,同时还是一盏 RGB 氛围灯。
很难给它一个单一的定义,但它很好地诠释了一个理念:
把电路板变成媒介,用焊盘和阻焊层画画,用芯片和 LED 讲故事。
1. 项目概述:电路 + 音乐 + 艺术的混合体
1.1 功能概览
Let It Glow 的核心特性:
披头士主题 PCB 艺术板:
顶层 PCB 上是 60 年代风格的卡通 Beatles 插画,来源于 Pinterest,经处理后变为 PCB 图形。音乐播放器:
通过 Raspberry Pi Pico 2 + DFPlayer Mini 播放预存于 SD 卡中的 Beatles 曲目。RGB 氛围灯:
底板上的 WS2812B RGB LED 从背后照亮上层艺术板,形成四色区域渐变光效。一体化结构:
PCB 艺术板作为前面板,电子主板与扬声器、电池、充电电源管理全部集成在后侧结构中,可放置在桌面或挂墙。
作者自己也说不太好定义这件作品——既不是单纯的台灯,也不是传统意义的播放器,而是一个“电子艺术 + 互动音乐盒”式的混合创作。
2. 材料与硬件清单
项目核心器件如下:
主控与存储
Raspberry Pi Pico 2(RP2040 系列微控制器板)
Micro SD 卡(音乐文件存储)
音频部分
DFPlayer Mini 音频模块
扬声器(与 DFPlayer 直接连接)
显示与光效
多个 WS2812B RGB LED(数字可编程灯珠,串联构成灯带/灯圈)
SMD 指示 LED(0805 封装)
电源与充电管理
IP5306 电源管理芯片(锂电升压 + 充电管理)
锂电池(原计划 18650,最终使用 14500 3.7V,容量约 600mAh)
USB Type-C 接口(充电与供电)
去耦电容:10 μF(1206)、100 nF(0603)
控制与交互
下一曲
音量加
音量减
电源/模式(硬件侧)
4×4 轻触按键(4 个),用于:
结构与连接件
定制 PCB(主板 + 前艺术层 PCB)
3D 打印外壳(Fusion 设计)
M2.5 螺丝、M2.5 铜柱、CON5 连接头(自制公/母头组合)
3. PCB 艺术:从画到板的“视觉电路”
3.1 PCB Art 的个人演化
作者本身是喜欢绘画的,于是开始尝试把艺术和电子结合在 PCB 上:
早期项目:Flux Capacitor(回到未来中的通量电容)发光板
后续项目:Pandacorn(独角兽熊猫)、Halo、进击的巨人主题板、心形 Badge、R2-D2 等
技术手法:
利用顶/底层阻焊层开窗控制透光区域
把 LED 放在板底,通过双层开窗让光直接透过插画区域
利用铜箔 + 阻焊颜色对比,做“线稿 + 阴影效果”
这些经验最终沉淀为当前 Beatles 主题板的设计方法。

3.2 Beatles 主题前板设计思路
在 Pinterest 上寻找符合风格的 Beatles 卡通图
将图片导出,并根据 PCB 尺寸缩放
转换格式:JPG → 黑白单色 BMP,方便导入 PCB CAD
在 PCB 软件中作为 Logo 导入,映射到顶层铜/阻焊:
黑色区域:转为铜层/金属图形,用于“挡光”与线条表现
白色区域:作为阻焊开窗,形成透光孔洞
同样的开窗在底层也做一份,使 RGB LED 的光可以穿透整块板
结果就是:RGB LED 在主板上,下方发光;上层艺术板通过控制“哪里遮光、哪里透光”,把导线和阻焊变成“画面的一部分”。
4. 3D 结构与工业设计:把艺术板装进一个完整的设备里
在开始绘制 PCB 之前,作者先在 Fusion 360 中构建了整个装置的 3D 模型。这一步尤其重要,原因有两点:
结构定尺寸,反推 PCB 尺寸与布局:
扬声器位置决定 PCB 面积与开孔位置
锂电池、Type-C 口、按钮位置共同影响主板形状
声学与机械结合考虑:
扬声器需要稳定支撑
出音孔、腔体体积直接影响音质
3D 模型完成后,再生成外壳 STL 文件,通过 3D 打印出整套外壳,使 PCB 与外壳高度贴合,形成一个完整的“桌面设备”。
5. PCB 设计:主板 + 艺术板双板结构
整个电路系统分为两块 PCB:
Main Board(主板): 承载所有电子功能(Pico、DFPlayer、IP5306、RGB、按键、电源接口等)
Front Art Layer(前艺术板): 主要是插画和按键,做可视化 + 透光面板
5.1 主板电路结构
主控与音频通信
Raspberry Pi Pico 2 作为核心控制器
DFPlayer Mini 的 RX/TX 与 Pico 的 GPIO(如例程中 7、8)通过软串口通信
Pico 控制音量、曲目切换,根据 DFPlayer 状态做后续控制
按键接口
GPIO12:下一曲按键
GPIO13:音量加
GPIO14 / 15:音量减 / 备用(不同实现可能略有差异)
使用一个 CON5 连接器将前板按键引出至 Pico 的 GPIO:
按键采用
INPUT_PULLUP,默认高电平,按下接地,逻辑简单可靠RGB 灯效
使用 24 颗 WS2812B 串联,构成 LED 环或灯条
第一个 LED 的 DIN 接 Pico 的 GPIO0
所有 LED 的 VCC 接 5V,GND 接地
每颗 LED 就近放置一个去耦电容(10 μF + 100 nF 组合),保证电源稳定
电源管理
从 3.7V 锂电升压至 5V
充电管理与充电指示
欠压/过压保护
IP5306 负责:
14500 锂电池直接焊接到 PCB 的电池焊盘

6. PCB 制造与 DFM 检查(简要)
电路设计完成后,导出 Gerber 文件,提交 PCB 厂生产。
在实际工程中,作者使用了 HQDFM 这类 Gerber 查看与 DFM 分析工具,提前检查:
阻焊开窗是否正确
过孔与焊盘尺寸是否符合工艺
器件间间距是否足够
这种“自检 + 厂家 DFM”的组合,可以在打样前发现一部分潜在问题,减少返工。
7. 主板装配:从焊膏到可工作的电路系统
7.1 SMD 器件贴装与回流
使用针筒将焊膏(63/37 Sn/Pb)点涂到每个 SMD 焊盘
使用镊子放置:
WS2812B RGB LED
IP5306 电源管理芯片
配套的电阻、电容等
将 PCB 放至加热板或小型回流台上,加热至约 200°C 左右,使焊膏熔化并重新固化,完成所有贴片器件焊接
7.2 通孔器件焊接
从 PCB 顶面插入:
Raspberry Pi Pico 的母排针
DFPlayer Mini 的母排针
Type-C 接口
自制 CON5 连接头
电感与部分大封装器件
翻转 PCB,使用电烙铁逐个焊接通孔焊点,保证机械与电气连接可靠
最后,将 Pico 与 DFPlayer 插入对应母座,主板装配完成
8. RGB 灯效测试代码解析
主板装好后,第一件事不是直接播放音乐,而是先验证 RGB 灯带是否工作正常。测试代码基于 Adafruit NeoPixel 库:
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#define PIN 0
#define NUMPIXELS 25 // 实际可根据板上 LED 数调整
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#define DELAYVAL 100
void setup() {
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif
pixels.begin();
}
void loop() {
pixels.clear();
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(i, pixels.Color(0, 150, 0)); // 绿色
pixels.show();
delay(DELAYVAL);
}
}测试点:
数据线是否正确连接到第一个 WS2812 的 DIN
5V 电源是否能稳定驱动全部 LED
是否存在“半条灯不亮”之类的焊接或布线问题
看到 LED 按预期逐个点亮,就说明整个 RGB 子系统工作正常。
9. 前艺术层装配与扬声器、电池集成
9.1 艺术板按键焊接
前艺术板上包含 4 个 4×4 轻触开关:
将按键插入 PCB 指定孔位
翻面后逐个焊接,保证按键平整、牢固
按键引脚通过 CON5 接头与主板的对应 GPIO 相连
9.2 扬声器接线
扬声器正极 → DFPlayer 的 Speaker 1 引脚
扬声器负极(GND)→ DFPlayer 的 Speaker 2 引脚
DFPlayer 内置功放,这种接法形成一个简易单声道音频通路,不需要额外功放。
9.3 电池接入
原本计划使用 18650,但出于体积考虑改用 14500 电池
两者标称电压同为 3.7V,14500 体积更小但容量约减半
电池正负极直接焊接到板载电池焊盘,经 IP5306 升压与充电管理
10. 主控代码解析:音乐控制 + LED 氛围
这是项目中最核心的一段代码(简化整理后):
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>
#include <Adafruit_NeoPixel.h>
SoftwareSerial mySerial(7, 8); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
const int totalSongs = 4;
int currentSong = 1;
int currentVolume = 20;
// 按键引脚
const int nextPin = 12;
const int volUpPin = 13;
const int volDownPin = 14;
// LED 配置
#define LED_PIN 0
#define LED_COUNT 24
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
pinMode(nextPin, INPUT_PULLUP);
pinMode(volUpPin, INPUT_PULLUP);
pinMode(volDownPin, INPUT_PULLUP);
strip.begin();
strip.show();
if (!myDFPlayer.begin(mySerial)) {
Serial.println("DFPlayer Mini not found");
while (true);
}
myDFPlayer.volume(currentVolume);
delay(1000);
myDFPlayer.play(currentSong);
updateLEDs();
}
void loop() {
// 歌曲播放结束自动切下一曲
if (myDFPlayer.available()) {
uint8_t type = myDFPlayer.readType();
if (type == DFPlayerPlayFinished) {
currentSong++;
if (currentSong > totalSongs) currentSong = 1;
myDFPlayer.play(currentSong);
}
}
// 长按切歌
static unsigned long nextPressStart = 0;
if (digitalRead(nextPin) == LOW) {
if (nextPressStart == 0) nextPressStart = millis();
if (millis() - nextPressStart >= 1000) {
currentSong++;
if (currentSong > totalSongs) currentSong = 1;
myDFPlayer.play(currentSong);
nextPressStart = 0;
while (digitalRead(nextPin) == LOW); // 等待松开
}
} else {
nextPressStart = 0;
}
// 音量加
if (digitalRead(volUpPin) == LOW) {
delay(200);
if (currentVolume < 30) currentVolume++;
myDFPlayer.volume(currentVolume);
while (digitalRead(volUpPin) == LOW);
}
// 音量减
if (digitalRead(volDownPin) == LOW) {
delay(200);
if (currentVolume > 0) currentVolume--;
myDFPlayer.volume(currentVolume);
while (digitalRead(volDownPin) == LOW);
}
}
void updateLEDs() {
for (int i = 0; i < LED_COUNT; i++) {
if (i < 6) {
strip.setPixelColor(i, strip.Color(255, 255, 0)); // 黄色
} else if (i < 12) {
strip.setPixelColor(i, strip.Color(255, 0, 128)); // 品红
} else if (i < 18) {
strip.setPixelColor(i, strip.Color(0, 255, 255)); // 青蓝
} else {
strip.setPixelColor(i, strip.Color(0, 255, 0)); // 绿色
}
}
strip.show();
}10.1 库说明
SoftwareSerial:在指定 GPIO 上模拟串口,用于与 DFPlayer 通信DFRobotDFPlayerMini:提供简单 API 来控制 DFPlayer:play、volume、读状态等Adafruit_NeoPixel:驱动 WS2812B,控制每一颗 RGB LED 的颜色
10.2 交互逻辑
按键功能
nextPin:长按约 1s → 切换下一首volUpPin:短按 → 音量 +1,最大 30volDownPin:短按 → 音量 -1,最小 0电源按钮则多为硬件电路实现(如 IP5306 按键或电源开关),未在此代码中作为 GPIO 读取
曲目管理
totalSongs = 4,轮询播放 1~4 号曲目当 DFPlayer 报告
PlayFinished时自动切下一首灯效映射
区域 1:黄色
区域 2:偏粉紫
区域 3:青蓝
区域 4:绿色
24 颗 LED 被划分为 4 个区域,每 6 颗一种颜色:
这四个区域在实体板上对应 Beatles 插画的不同区域,从而形成具有分区感的背光效果
灯效逻辑非常简单,但在艺术板的透光设计配合下,视觉效果却非常“合成感”。
11. 最终装配与整机形态
11.1 双板连接
使用自制的 CON5 公/母头“直插桥接件” 把前艺术板与主板连接
在前板四个安装孔上拧入 M2.5 PCB 铜柱
将前板对准主板上的对应孔与连接器位置压合并锁紧,完成电气与机械双重连接
11.2 外壳与整体固定
3D 打印外壳容纳了扬声器与锂电池
主板 + 前板组合安装在外壳上,通过 M2.5 螺丝锁紧
外形效果类似一块“有插画的发光音乐盒”,可以平放在桌面,也可通过背面的挂孔挂墙
12. 效果与意义:电路板不止是电路板
完成后的 Let It Glow:
播放的是 Beatles 歌曲
呈现的是 Beatles 主题的卡通插画
背后是完整的电源管理、灯效控制、音频播放、电路设计与机械结构整合
它不是单纯的音箱,也不是简单的灯牌,而是一件融合了:
视觉设计
音乐内容
电子工程
结构设计
的综合作品。
从工程视角看,这个项目很好地体现了几个要点:
PCB 不再只是“功能承载”,而是设计的一部分:
铜、阻焊、丝印都被纳入“视觉系统”。多学科融合:
工业设计(3D 外壳)、电子硬件(电源、音频、电路)、嵌入式软件(Pico 控制)、视觉艺术(插画与透光)在一个小项目中全部出现。可扩展性强:
未来可以很容易加入:音乐与灯效同步(节奏闪烁)
触摸按键或手势控制
USB 或 BLE 升级为“可编程氛围音箱”














评论