亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

NeoMatrix Arduino Pong

组件和用品

NeoPixel strip
× 1
跳线(通用)
× 1
Arduino Nano R3
× 1
女性标题 8 位置 1 行 (0.1")
× 1
Perma-Proto 面包板半尺寸
× 1
模拟操纵杆(通用)
× 1
旋转电位器(通用)
× 1

必要的工具和机器

烙铁(通用)

应用和在线服务

Arduino IDE

关于这个项目

矩阵

不,不是电影,是 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; } 返回结果;}

示意图


制造工艺

  1. TinyML-Language Detector-基于 Edge Impulse &Arduino
  2. Arduino Gyroscope Game with MPU-6050
  3. Arduino 数字骰子
  4. 钢铁侠
  5. 找到我
  6. Arduino 加湿器控制
  7. Sonar 使用 arduino 并在处理 IDE 上显示
  8. MobBob:由 Android 智能手机控制的 DIY Arduino 机器人
  9. Arduino Audio Reactive Desk Light
  10. Arduino Joystick
  11. 计步器(Arduino 101)
  12. Arduino 混色器