Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
零部件与材料
- NeoPixel 灯条(单点可控) × 1
- 杜邦线 × 1
- Arduino Nano R3 × 1
- 8P 单排母排针 × 1
- 半孔洞实验板 × 1
- 模拟摇杆(通用) × 1
- 旋转电位器 × 1
所需工具
- 电烙铁
软件平台
- Arduino IDE
制作矩阵屏
购买一条可单点寻址的 NeoPixel 灯条。展开,注意灯条上的箭头方向——只能单向连接,接反会损坏。

我用 30 灯/米、5 米长的灯条,剪成每段 10 灯的短条。在硬纸板上交替方向铺设(之字形),剪线焊接连接。焊完 14 次后矩阵成型。用万用表检查无短路(短路会烧毁 Nano、矩阵甚至 USB 口,我有过教训)。上传 Adafruit NeoMatrix 测试例程,参数设为 NEO_BOTTOM + NEO_LEFT + NEO_COLUMNS + NEO_ZIGZAG,屏幕滚动显示“howdy”即成功。

游戏逻辑
乒乓游戏包含挡板、墙壁、球。代码维护球的 X/Y 坐标,方向用 1 或 -1 表示。挡板为矩形,通过电位器映射到 0-15 位置,Y 轴固定。游戏开始球在 (1,1),玩家需让球弹一次才算正式开始。物理碰撞考虑球的方向和击中挡板的位置。
接线与畅玩
NeoPixel 矩阵接 Arduino Nano,摇杆 +5V 接 5V,GND 接地,X 轴接 A0。享受你的霓虹乒乓!可尝试增加双人模式、优化物理引擎。
代码
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define PIN 6
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(15, 10, PIN,
NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
int paddleX = 0, paddleY = 0;
int oldPaddleX, oldPaddleY;
int ballDirectionX = 1, ballDirectionY = 1;
int score = 0;
int ballSpeed = 10; // 越小越快
int ballX, ballY, oldBallX, oldBallY;
void setup() {
Serial.begin(9600);
matrix.begin();
matrix.fillScreen(0);
matrix.setTextColor(matrix.Color(0,255,0));
matrix.print("GO");
matrix.show();
delay(2000);
matrix.fillScreen(0);
matrix.show();
}
void loop() {
int myWidth = matrix.width();
int myHeight = matrix.height();
paddleX = map(analogRead(A0), 0, 1023, 0, 12);
paddleY = 8;
if (oldPaddleX != paddleX || oldPaddleY != paddleY) {
matrix.fillRect(oldPaddleX, oldPaddleY, 4, 1, matrix.Color(0,0,0));
}
matrix.fillRect(paddleX, paddleY, 4, 1, matrix.Color(0,0,255));
oldPaddleX = paddleX;
oldPaddleY = paddleY;
matrix.show();
if (millis() % ballSpeed < 2) {
moveBall();
}
matrix.show();
if (ballY > 8 && (millis() > 10000)) {
score += 1;
matrix.fillScreen(0);
matrix.setTextColor(matrix.Color(255,0,0));
matrix.setCursor(0,2);
matrix.print(String(score));
matrix.show();
delay(4000);
ballX = random(3,11);
ballY = random(1,1);
matrix.fillScreen(0);
matrix.show();
delay(1000);
}
delay(5);
}
void moveBall() {
if (ballX > matrix.width() - 1 || ballX < 0) ballDirectionX = -ballDirectionX;
if (ballY > matrix.height() || ballY < 0) ballDirectionY = -ballDirectionY;
if (inPaddle(ballX, ballY, paddleX, paddleY, 4, 1)) {
if (ballX == paddleX && ballY == paddleY) {
ballDirectionX = -ballDirectionX; ballDirectionY = -ballDirectionY;
} else if (ballX == paddleX + 3 && ballY == paddleY) {
ballDirectionX = ballDirectionX; ballDirectionY = -ballDirectionY;
} else if (ballX == paddleX + 1 && ballY == paddleY) {
ballDirectionX = -ballDirectionX; ballDirectionY = -ballDirectionY;
} else if (ballX == paddleX + 2 && ballY == paddleY) {
ballDirectionX = ballDirectionX; ballDirectionY = -ballDirectionY;
}
}
ballX += ballDirectionX;
ballY += ballDirectionY;
if (oldBallX != ballX || oldBallY != ballY) {
matrix.drawPixel(oldBallX, oldBallY, matrix.Color(0,0,0));
}
matrix.drawPixel(ballX, ballY, matrix.Color(150,150,0));
oldBallX = ballX;
oldBallY = ballY;
}
boolean inPaddle(int x, int y, int rectX, int rectY, int rectWidth, int rectHeight) {
boolean result = false;
if ((x >= rectX && x <= (rectX + rectWidth)) && (y >= rectY && y <= (rectY + rectHeight))) {
result = true;
}
return result;
}
原理图

制造工艺
- 基于 Edge Impulse 的 TinyML 语言检测器:Arduino Nano 33 BLE Sense 实战
- Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- DIY Arduino 加湿器控制器:继电器安全控制高压电路
- Arduino 声纳实时测距与 Processing 可视化
- MobBob:3D 打印智能机器人,Android 手机无缝控制,语音视觉一体
- 声控氛围灯:Arduino Nano + 麦克风模块 + WS2812B 灯珠
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- Arduino 101 计步器:集成 DHT11 温湿度 + LCD 显示步数/距离/卡路里
- Arduino RGB 颜色混合器 – 分步制作教程