Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

NeoMatrix Arduino Pong

Componenten en benodigdheden

NeoPixel-strip
× 1
Jumperdraden (algemeen)
× 1
Arduino Nano R3
× 1
Vrouwelijke kop 8 positie 1 rij (0,1")
× 1
Perma-Proto Breadboard Half Size
× 1
Analoge joystick (algemeen)
× 1
Draaipotentiometer (generiek)
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)

Apps en online services

Arduino IDE

Over dit project

De Matrix

Nee, niet de film, de NeoPixel-matrix! Om een ​​matrix te maken, hoeft u slechts één strip met individueel adresseerbare NeoPixel-LED's te kopen. Rol de strip uit en let op de pijlen erop. Je kunt ze maar in EEN RICHTING bevestigen, je zou ze kunnen verpesten als de oriëntatie verkeerd is.

Ik gebruikte een strip van 30 led/m 5m en sneed ze in stroken van elk tien leds. Ik begon toen de stroken op een stuk karton te leggen, afwisselende oriëntaties. Vervolgens heb ik de draden op de juiste lengte gesneden en aan de NeoPixel-aansluitingen gesoldeerd. Na dat 14 keer te hebben gedaan, was mijn matrix eindelijk klaar! Vervolgens heb ik met een multimeter gecontroleerd of er geen kortsluiting was, aangezien een kortsluiting de Nano, de matrix en misschien je USB-poort zal braden (weet ik uit ervaring). Upload de neomatrix-testschets met de parameters "NEO_BOTTOM + NEO_LEFT + NEO_COLUMNS + NEO_ZIGZAG". Als het "howdy" over het scherm schuift, ben je klaar met het schermgedeelte!

De logica

Een pongspel heeft verschillende objecten:de peddel, muren en de bal. De code heeft ball X en ball Y variabelen, die de positie van de bal bijhouden. De richting van de bal wordt afgehandeld door een 1 of -1 toe te kennen aan de richtingsvariabelen. De paddle is een rechthoek die wordt bestuurd via een potentiometer die wordt toegewezen aan 0 tot en met 15. De Y van de paddle verandert niet, dus een variabele om deze in kaart te brengen is niet nodig. Aan het begin van een spel begint de bal bij 1,1 en moet de speler de bal eenmaal laten stuiteren om te beginnen. De fysica houdt rekening met de richting van de bal en waar deze de peddel raakt.

Leuke tijd!

Sluit nu gewoon de NeoPixel-matrix aan op uw Arduino Nano, de +5V op de joystick op 5v, de GND op Arduino GND en tenslotte de X-as op A0. Veel plezier met je nieuwe pongspel! Probeer meer spelers en betere physics toe te voegen voor een uitdaging!

Code

  • De Arduino-code
  • Arduino-code
De Arduino-codeC/C++
#include #include #include #define PIN 6Adafruit_NeoMatrix matrix =Adafruit_NeoMatrix(15, 10, PIN, NEO_MATRIX_BOTTOM + NEO_MATRIOX_LE +K800_MATRIX_LE +K800_MATRIX_LE +K800;// variabelen voor de positie van de bal en paddleint paddleX =0;int paddleY =0;int oldPaddleX, oldPaddleY;int ballDirectionX =1;int ballDirectionY =1;int score =0;int ballSpeed ​​=10; // lagere getallen zijn sneller in ballX, ballY, oldBallX, oldBallY; void setup () {Serial.begin (9600); // initialiseer de weergavematrix.begin(); // zwarte achtergrond matrix.fillScreen (0); matrix.setTextColor(matrix.Color(0,255,0)); matrix.print("GO"); matrix.show(); vertraging (2000); matrix.fillScreen(0); matrix.show();}void loop() { // sla de breedte en hoogte van het scherm op int myWidth =matrix.width(); int mijnHoogte =matrix.hoogte(); // breng de locatie van de paddle in kaart met de positie van de potentiometers paddleX =map (analogRead (A0), 0, 1023, 0, 12); peddelY =8; // stel de vulkleur in op zwart en wis de vorige // positie van de paddle indien anders dan aanwezig if (oldPaddleX !=paddleX || oldPaddleY !=paddleY) { matrix.fillRect(oldPaddleX, oldPaddleY, 4, 1,matrix. Kleur (0,0,0)); } // teken de paddle op het scherm, sla de huidige positie op // zoals de vorige.//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; matrix.show(); // werk de positie van de bal bij en teken deze op het scherm als (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(); vertraging (4000); ballX =willekeurig (3,11); balY =willekeurig (1,1); matrix.fillScreen(0); matrix.show(); vertraging (1000); } delay(5);}// deze functie bepaalt de positie van de bal op screenvoid moveBall() { // als de bal van het scherm gaat, keer de richting om:if (ballX> matrix.width() - 1 || ballX <0) { ballDirectionX =-ballDirectionX; } if (ballY> matrix.height() || ballY <0) { ballDirectionY =-ballDirectionY; } // controleer of de bal en de paddle dezelfde ruimte op het scherm innemen if (inPaddle(ballX, ballY, paddleX, paddleY, 4, 1)) { if(ballX ==paddleX &&ballY ==paddleY){ ballDirectionX =- balDirectionX; 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; } } // update de positie van de bal ballX +=ballDirectionX; ballY +=ballDirectionY; // wis de vorige positie van de bal if (oldBallX !=ballX || oldBallY !=ballY) { matrix.drawPixel (oldBallX, oldBallY,matrix.Color (0,0,0)); } // teken de huidige positie van de bal matrix.drawPixel(ballX, ballY,matrix.Color(150,150,0)); oldBallX =ballX; oldBallY =ballY;}// deze functie controleert de positie van de bal// om te zien of deze de paddleboolean kruist 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))) { resultaat =waar; } resultaat retourneren;}
Arduino-codeC/C++
#include #include #include #define PIN 6Adafruit_NeoMatrix matrix =Adafruit_NeoMatrix(15, 10, PIN, NEO_MATRIX_BOTTOM + NEO_MATRIOX_LE +K800_MATRIX_LE +K800_MATRIX_LE +K800;// variabelen voor de positie van de bal en paddleint paddleX =0;int paddleY =0;int oldPaddleX, oldPaddleY;int ballDirectionX =1;int ballDirectionY =1;int score =0;int ballSpeed ​​=10; // lagere getallen zijn sneller in ballX, ballY, oldBallX, oldBallY; void setup () {Serial.begin (9600); // initialiseer de weergavematrix.begin(); // zwarte achtergrond matrix.fillScreen (0); matrix.setTextColor(matrix.Color(0,255,0)); matrix.print("GO"); matrix.show(); vertraging (2000); matrix.fillScreen(0); matrix.show();}void loop() { // sla de breedte en hoogte van het scherm op int myWidth =matrix.width(); int mijnHoogte =matrix.hoogte(); // breng de locatie van de paddle in kaart met de positie van de potentiometers paddleX =map (analogRead (A0), 0, 1023, 0, 12); peddelY =8; // stel de vulkleur in op zwart en wis de vorige // positie van de paddle indien anders dan aanwezig if (oldPaddleX !=paddleX || oldPaddleY !=paddleY) { matrix.fillRect(oldPaddleX, oldPaddleY, 4, 1,matrix. Kleur (0,0,0)); } // teken de paddle op het scherm, sla de huidige positie op // zoals de vorige.//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; matrix.show(); // werk de positie van de bal bij en teken deze op het scherm als (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(); vertraging (4000); ballX =willekeurig (3,11); balY =willekeurig (1,1); matrix.fillScreen(0); matrix.show(); vertraging (1000); } delay(5);}// deze functie bepaalt de positie van de bal op screenvoid moveBall() { // als de bal van het scherm gaat, keer de richting om:if (ballX> matrix.width() - 1 || ballX <0) { ballDirectionX =-ballDirectionX; } if (ballY> matrix.height() || ballY <0) { ballDirectionY =-ballDirectionY; } // controleer of de bal en de paddle dezelfde ruimte op het scherm innemen if (inPaddle(ballX, ballY, paddleX, paddleY, 4, 1)) { if(ballX ==paddleX &&ballY ==paddleY){ ballDirectionX =- balDirectionX; 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; } } // update de positie van de bal ballX +=ballDirectionX; ballY +=ballDirectionY; // wis de vorige positie van de bal if (oldBallX !=ballX || oldBallY !=ballY) { matrix.drawPixel (oldBallX, oldBallY,matrix.Color (0,0,0)); } // teken de huidige positie van de bal matrix.drawPixel(ballX, ballY,matrix.Color(150,150,0)); oldBallX =ballX; oldBallY =ballY;}// deze functie controleert de positie van de bal// om te zien of deze de paddleboolean kruist 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))) { resultaat =waar; } resultaat retourneren;}

Schema's


Productieproces

  1. TinyML-taaldetector-gebaseerd op Edge Impulse &Arduino
  2. Arduino-gyroscoopspel met MPU-6050
  3. Arduino digitale dobbelstenen
  4. Iron Man
  5. Vind mij
  6. Arduino-luchtbevochtigerbediening
  7. Sonar met arduino en weergave op verwerkings-IDE
  8. MobBob:doe-het-zelf Arduino-robot bestuurd door Android-smartphone
  9. Arduino Audio Reactive Desk Light
  10. Arduino-joystick
  11. Stappenteller (Arduino 101)