自制 16×8 LED 矩阵俄罗斯方块游戏机:Arduino Nano + 74HC595 驱动
项目概述
本项目使用 Arduino Nano、两片 74HC595 串并转换芯片驱动自制 16 列 × 8 行 (128 个) 黄色 LED 矩阵,实现完整俄罗斯方块游戏。4 个按键控制左移、右移、下落、旋转,内置蜂鸣器按键音效,定时器中断刷新屏幕,行消除计分,Game Over 显示分数滚动动画。硬件采用纯手工焊接矩阵,展示移位寄存器行列扫描驱动原理,适合电子爱好者进阶练习。
所需组件与物料
- Arduino Nano R3 × 1
- 74HC595 移位寄存器 × 2 (串联扩展 16 列)
- 5mm 黄色 LED × 128 (建议同批次亮度一致)
- 12mm 轻触按键 × 4 (左、右、下、旋转)
- 滑动开关 × 1 (电源开关)
- 万用板/PCB、电阻、排针、杜邦线、焊接工具
硬件架构与驱动原理
列驱动:双 74HC595 级联
- Data (DS) → Arduino D4
- Clock (SH_CP) → Arduino D2
- Latch (ST_CP) → Arduino D3
- 第一片 Q0~Q7 驱动第 0~7 列,第二片 Q0~Q7 驱动第 8~15 列。
- 每列阳极接 LED 阳极,通过 74HC595 输出高电平点亮 (源电流)。
行驱动:Arduino 直接扫描
- 8 行阴极分别接 Arduino D5~D12 (共 8 个 GPIO)。
- 逐行扫描:拉低当前行 (低电平导通),其余行高阻/高电平;向 74HC595 移入该列数据;锁存输出;延时 1ms;拉高当前行关闭。循环 8 行完成一帧。
- 刷新率 ~125Hz (8 行 × 1ms),无闪烁。
按键接口
4 个按键分别接 A4~A7 模拟口作数字输入,内部上拉,按下接地读取低电平。代码中通过模拟读取 >500 判定按下 (兼容干扰)。
核心游戏逻辑
方块定义
10 种方块 (含 7 标准 + 3 变体) 以 5×7 布尔数组 `lib[10][5][7]` 存储,每种方块 4 个旋转态预计算。
关键函数
newBlock():随机生成新方块 (类型 0~6),初始位置列 3/4,旋转态 0。moveLeft/Right/Down():边界检测 + 碰撞检测 (`space_left/right/below`),通过数组平移实现。rotate():复杂旋转逻辑,针对每种方块硬编码旋转态变换,含墙壁踢墙 (Wall Kick) 处理。check_gameover():逐行检测满行消除,下落上方行,计分;顶行有方块触发 Game Over。gameover():百叶窗关闭动画 → 显示分数 (两位数字复用 `lib` 字模) → 百叶窗打开动画 → 分数滚动循环。
定时器中断刷屏
Timer1 配置 2kHz 中断 (OCR1A=259, 1024 分频),ISR 中调用 `LEDRefresh()` 执行逐行扫描。主循环仅处理按键、下落计时、游戏逻辑,显示与逻辑解耦。
代码亮点与技巧
- 软件修正引脚排序错误:作者焊接行引脚顺序为 12345670 (对应 D5~D12),`LEDRefresh()` 中通过数组映射修正,避免重新焊接。
- 随机种子熵源:组合 4 路模拟口浮空读值乘积 + `random()` 多次迭代,增强随机性。
- 按键防抖与延时分级:旋转/左右 150ms/80ms,下落 30ms,手感优化。
- 无阻塞延时:主循环用 `millis()` 控制自动下落间隔 (`delay_` 随分数递减加速)。
制作难点与避坑指南
- 128 颗 LED 焊接:建议先做 8×8 小矩阵测试,再拼接。排针间距 2.54mm,LED 引脚需修整成型,耗时 4~6 小时。
- 74HC595 级联时序:先移入低 8 列数据 (后级),再移入高 8 列数据 (前级),最后锁存。
- 行扫描电流:单行 16 颗 LED 同时亮,每颗 5mA 共 80mA,超出 GPIO 40mA 上限,**必须**加 NPN 三极管 (如 2N2222) 或 ULN2803 达灵顿阵列驱动行阴极,原作者直接驱动有烧毁风险。
- 供电容量:全亮约 640mA,USB 500mA 不足,需外接 5V 2A 电源。
扩展建议
- 改用 WS2812B 单线驱动,省去移位寄存器与行扫描,支持彩色特效。
- 增加 MAX7219 驱动 8×8 模块级联,简化硬件。
- 加入下一块预览、暂存、幽灵块、T-Spin 判定等现代规则。
- 移植至 ESP32 增加 WiFi 对战、网络排行榜。
项目文件
- Arduino 代码:`Tetris_16x8.ino` (文末完整代码)
- 原理图:`schematic.png` (含 74HC595 级联、行驱动、按键接线)
制造工艺
- Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- DIY Arduino TV-B-Gone:万能关机遥控器
- DIY Arduino USB 游戏手柄 — 自制高性能游戏手柄
- 用 Arduino Nano 与 MAX7219 制作 24×16 LED Pong 游戏机
- Pixel Chaser:Arduino Nano 单键 NeoPixel 追逐小游戏
- Arduino 8×8 LED 矩阵翻页时钟 - DIY 实时时钟项目
- Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
- Arduino Nano 手持盖革计数器:DIY 核辐射检测仪
- Arduino Nano 与 WS2812 灯带打造 1D 乒乓球游戏——分步 DIY 教程
- DIY LED 轮盘赌游戏机 —— Arduino Nano 打造单人桌面街机
- Never Ride Alone:骑行安全守护神——基于 Sigfox 的智能自行车报警器