Arduino LED立方体3D公告板制作指南
项目概述
本方案实现4×4×4 LED立方体,通过逐层扫描技术实现3D显示效果。系统使用Arduino Nano控制,配合74HC595移位寄存器扩展IO口,实现64个LED的独立控制。
电路连接
【层控制电路】
Arduino D2-D5 → 4个2N2222晶体管基极(220Ω电阻)
晶体管发射极 → GND
晶体管集电极 → 各层LED阳极(共4层)【列控制电路】
16列LED阴极 → 74HC595输出引脚(通过220Ω限流电阻)
74HC595级联配置:Arduino D11 → 第一片74HC595 DS(数据)Arduino D12 → 两片74HC595 SHCP(时钟)Arduino D8 → 两片74HC595 STCP(锁存)
第一片Q7' → 第二片DS
核心代码
#include <avr/pgmspace.h>// 引脚定义
const int dataPin = 11;
const int clockPin = 12;
const int latchPin = 8;
const int layerPins[4] = {2, 3, 4, 5};// 动画帧存储(PROGMEM节省内存)
const uint64_t animation[] PROGMEM = {0x1111111111111111, // 全亮0xFFFF00000000FFFF, // X形0x0F0F0F0FF0F0F0F0, // 棋盘格0x8421842184218421 // 螺旋
};void setup() {for (int i = 0; i < 4; i++) {pinMode(layerPins[i], OUTPUT);digitalWrite(layerPins[i], LOW);}pinMode(dataPin, OUTPUT);pinMode(clockPin, OUTPUT);pinMode(latchPin, OUTPUT);
}void displayFrame(uint64_t frame) {for (int layer = 0; layer < 4; layer++) {digitalWrite(latchPin, LOW);// 输出当前层的16位列数据uint16_t layerData = (frame >> (16 * layer)) & 0xFFFF;shiftOut(dataPin, clockPin, MSBFIRST, layerData >> 8); // 高字节shiftOut(dataPin, clockPin, MSBFIRST, layerData & 0xFF); // 低字节digitalWrite(latchPin, HIGH);digitalWrite(layerPins[layer], HIGH);delay(5); // 层显示时间digitalWrite(layerPins[layer], LOW);}
}void loop() {for (int i = 0; i < sizeof(animation)/8; i++) {uint64_t frame = pgm_read_qword_near(animation + i);for (int f = 0; f < 50; f++) { // 每帧显示50次扫描displayFrame(frame);}}
}
制作步骤
-
立方体搭建
- 使用64个5mm LED(共阴结构)
- 将16列垂直LED阴极焊接在一起(每列4个LED)
- 将4层水平阳极焊接在一起(每层16个LED)
-
驱动电路
- 层控制:4个NPN晶体管驱动各层阳极
- 列控制:2片74HC595驱动16列阴极
- 电源:外接5V/2A电源(避免USB供电不足)
-
编程要点
- 使用
PROGMEM
存储动画序列节省内存 - 每帧显示时间5ms/层(总刷新率50Hz)
- 通过位运算快速提取层数据
- 使用
动画设计原理
- 3D坐标映射:将三维坐标 $(x,y,z)$ 转换为位地址 $$ \text{address} = 16z + 4y + x $$
- 扫描时序:以120fps速率循环显示预存模式 $$ t_{\text{frame}} = \frac{1}{4 \times 50} = 5\text{ms} $$
效果优化
- 增加平滑过渡:在帧间插入中间态
- 添加交互:通过红外传感器切换动画模式
- 亮度调节:PWM控制层通电时间
注意事项:
- 焊接前测试所有LED极性
- 每列串联220Ω限流电阻
- 层控制晶体管需加散热片
- 避免长时间静态显示防止LED烧毁
此方案可实现文字滚动、3D图形旋转等效果,通过修改动画数组可扩展更多显示模式。