NeoMatrix Arduino Pong
组件和用品
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 |
必要的工具和机器
![]() |
|
应用和在线服务
![]() |
|
关于这个项目
矩阵
不,不是电影,是 NeoPixel 矩阵!要制作矩阵,只需购买一条可单独寻址的 NeoPixel LED。解开带子,注意上面的箭头。您只能将它们固定在一个方向上,如果方向错误,您可能会毁了它们。

我使用了一个 30 led/m 5m 的灯条,并将它们切成每条 10 个 LED 的灯条。然后我开始将条带放在一张卡片纸上,交替方向。然后我将电线切割成正确的长度并将它们焊接到 NeoPixel 端子上。做了 14 次之后,我的矩阵终于完成了!接下来,我用万用表检查以确保没有短路,因为短路会炸毁 Nano、矩阵,也许还有你的 USB 端口(我从经验中知道)。使用“NEO_BOTTOM + NEO_LEFT + NEO_COLUMNS + NEO_ZIGZAG”参数上传neomatrix 测试草图。如果它在显示屏上滚动“你好”,您就完成了显示部分!

逻辑
乒乓球游戏有几个对象:球拍、墙壁和球。该代码具有球 X 和球 Y 变量,用于跟踪球的位置。球的方向由分配给方向变量的 1 或 -1 处理。桨是一个矩形,通过映射到 0 到 15 的电位器控制。桨的 Y 不会改变,因此不需要用于映射的变量。比赛开始时,球从 1,1 开始,玩家必须让球弹跳一次才能开始。物理学考虑了球的方向和它击中球拍的位置。
欢乐时光!
现在,只需将 NeoPixel 矩阵连接到您的 Arduino Nano,将操纵杆上的 +5V 连接到 5v,将 GND 连接到 Arduino GND,最后将 X 轴连接到 A0。玩你的新乒乓球游戏!尝试添加更多玩家和更好的物理来迎接挑战!
代码
- Arduino 代码
- Arduino 代码
Arduino 代码C/C++
#include#include #include #define PIN 6Adafruit_NeoMatrix 矩阵 =Adafruit_NeoMatrix(15, 10, PIN, NEO_MATRIX_BOTTOM + NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_LEFT+NEO_MATRIX_LEFZ_NEOIGZ_NEOIGZ_NEOIGZ_NEOIGZ_NEOIGZ_NEOIGZ_NEOIGZ0;// 球和桨位置的变量int paddleX =0;int paddleY =0;int oldPaddleX, oldPaddleY;int ballDirectionX =1;int ballDirectionY =1;int score =0;int ballSpeed =10; // 较低的数字是 fastint ballX, ballY, oldBallX, oldBallY;void setup() { Serial.begin(9600); // 初始化显示矩阵.begin(); // 黑色背景 matrix.fillScreen(0); matrix.setTextColor(matrix.Color(0,255,0)); matrix.print("GO");矩阵.show();延迟(2000);矩阵.fillScreen(0); matrix.show();}void loop() { // 保存屏幕的宽度和高度 int myWidth =matrix.width(); int myHeight =matrix.height(); // 将桨的位置映射到电位器的位置 paddleX =map(analogRead(A0), 0, 1023, 0, 12);桨Y =8; // 将填充颜色设置为黑色并擦除之前的 // 桨的位置 if (oldPaddleX !=paddleX || oldPaddleY !=paddleY) { matrix.fillRect(oldPaddleX, oldPaddleY, 4, 1,matrix.颜色(0,0,0)); } // 在屏幕上绘制桨,保存当前位置 // 为前一个。//if(paddleX>=0 &&paddleX <=11){ matrix.fillRect(paddleX, paddleY, 4, 1,matrix.Color( 0,0,255));//}//else if(paddleX <0){ //paddleX =0; //matrix.fillRect(paddleX, paddleY, 3, 1,matrix.Color(0,0,255));//}//else if(paddleX>=13){ //} oldPaddleX =paddleX; oldPaddleY =paddleY;矩阵.show(); // 更新球的位置并将其绘制在屏幕上 if (millis() % ballSpeed <2) { moveBall();矩阵.show(); if(ballY> 8 &&(millis()> 10000)){ score +=1;矩阵.fillScreen(0); matrix.setTextColor(matrix.Color(255,0,0));矩阵.setCursor(0,2); matrix.print(String(score));矩阵.show();延迟(4000); ballX =随机(3,11); ballY =随机(1,1);矩阵.fillScreen(0);矩阵.show();延迟(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 =-球方向X; 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;}// 这个函数检查球的位置//看它是否与paddleboolean相交 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; } 返回结果;}
Arduino 代码C/C++
#include#include #include #define PIN 6Adafruit_NeoMatrix 矩阵 =Adafruit_NeoMatrix(15, 10, PIN, NEO_MATRIX_BOTTOM + NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_LEFT+NEO_MATRIX_LEFZ_NEOIGZ_NEOIGZ_NEOIGZ_NEOIGZ_NEOIGZ_NEOIGZ_NEOIGZ0;// 球和桨位置的变量int paddleX =0;int paddleY =0;int oldPaddleX, oldPaddleY;int ballDirectionX =1;int ballDirectionY =1;int score =0;int ballSpeed =10; // 较低的数字是 fastint ballX, ballY, oldBallX, oldBallY;void setup() { Serial.begin(9600); // 初始化显示矩阵.begin(); // 黑色背景 matrix.fillScreen(0); matrix.setTextColor(matrix.Color(0,255,0)); matrix.print("GO");矩阵.show();延迟(2000);矩阵.fillScreen(0); matrix.show();}void loop() { // 保存屏幕的宽度和高度 int myWidth =matrix.width(); int myHeight =matrix.height(); // 将桨的位置映射到电位器的位置 paddleX =map(analogRead(A0), 0, 1023, 0, 12);桨Y =8; // 将填充颜色设置为黑色并擦除之前的 // 桨的位置 if (oldPaddleX !=paddleX || oldPaddleY !=paddleY) { matrix.fillRect(oldPaddleX, oldPaddleY, 4, 1,matrix.颜色(0,0,0)); } // 在屏幕上绘制桨,保存当前位置 // 为前一个。//if(paddleX>=0 &&paddleX <=11){ matrix.fillRect(paddleX, paddleY, 4, 1,matrix.Color( 0,0,255));//}//else if(paddleX <0){ //paddleX =0; //matrix.fillRect(paddleX, paddleY, 3, 1,matrix.Color(0,0,255));//}//else if(paddleX>=13){ //} oldPaddleX =paddleX; oldPaddleY =paddleY;矩阵.show(); // 更新球的位置并将其绘制在屏幕上 if (millis() % ballSpeed <2) { moveBall();矩阵.show(); if(ballY> 8 &&(millis()> 10000)){ score +=1;矩阵.fillScreen(0); matrix.setTextColor(matrix.Color(255,0,0));矩阵.setCursor(0,2); matrix.print(String(score));矩阵.show();延迟(4000); ballX =随机(3,11); ballY =随机(1,1);矩阵.fillScreen(0);矩阵.show();延迟(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 =-球方向X; 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;}// 这个函数检查球的位置//看它是否与paddleboolean相交 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; } 返回结果;}
示意图

制造工艺