산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

NeoMatrix Arduino Pong

구성품 및 소모품

NeoPixel 스트립
× 1
점퍼 와이어(일반)
× 1
Arduino Nano R3
× 1
암컷 헤더 8 위치 1 행(0.1")
× 1
Perma-Proto 브레드보드 절반 크기
× 1
아날로그 조이스틱(일반)
× 1
회전 전위차계(일반)
× 1

필요한 도구 및 기계

납땜 인두(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

매트릭스

아니요, 영화가 아니라 NeoPixel 매트릭스입니다! 매트릭스를 만들려면 개별적으로 주소 지정이 가능한 NeoPixel LED 스트립 하나를 구입하면 됩니다. 스트립을 풀고 화살표에 주목하십시오. ONE DIRECTION에만 부착할 수 있으며 방향이 잘못되면 망칠 수 있습니다.

30 led/m 5m 스트립을 사용하고 각각 10개의 LED 스트립으로 자릅니다. 그런 다음 나는 방향을 바꾸면서 판지 조각에 스트립을 놓기 시작했습니다. 그런 다음 와이어를 올바른 길이로 자르고 NeoPixel 터미널에 납땜했습니다. 그렇게 14번을 해서 드디어 제 행렬이 완성되었습니다! 다음으로 멀티미터로 단락이 없는지 확인했습니다. 단락으로 인해 Nano, 매트릭스 및 USB 포트가 손상될 수 있기 때문입니다(경험상 압니다). "NEO_BOTTOM + NEO_LEFT + NEO_COLUMNS + NEO_ZIGZAG" 매개변수를 사용하여 네오매트릭스 테스트 스케치를 업로드합니다. 디스플레이에서 "안녕" 스크롤하면 디스플레이 부분이 완료된 것입니다!

논리

탁구 게임에는 패들, 벽 및 공과 같은 여러 개체가 있습니다. 코드에는 공의 위치를 ​​추적하는 공 X 및 공 Y 변수가 있습니다. 공의 방향은 방향 변수에 할당되는 1 또는 -1에 의해 처리됩니다. 패들은 0에서 15까지 매핑되는 전위차계를 통해 제어되는 직사각형입니다. 패들의 Y는 변경되지 않으므로 매핑을 위한 변수가 필요하지 않습니다. 게임이 시작될 때 공은 1,1에서 시작하며 플레이어는 공이 한 번 튀는 것을 허용해야 시작됩니다. 물리학은 공의 방향과 공이 패들에 닿는 위치를 고려합니다.

즐거운 시간!

이제 NeoPixel 매트릭스를 Arduino Nano, 조이스틱의 +5V를 5v에, GND를 Arduino GND에, 마지막으로 X축을 A0에 연결하기만 하면 됩니다. 새로운 탁구 게임을 즐기세요! 도전을 위해 더 많은 플레이어와 더 나은 물리학을 추가해 보세요!

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • Arduino 코드
  • Arduino 코드
  • Arduino 코드C/C++
    #include #include #include #define PIN 6Adafruit_NeoMatrix 매트릭스 =Adafruit_NeoMatrix(15, 10, +_CEOIGX0), PIN, NEO_MATRIX_BOTTOM + NEO_MATRIX_UMTRIX_LEFT;// 공과 paddle의 위치에 대한 변수int paddleX =0;int paddleY =0;int oldPaddleX, oldPaddleY;int ballDirectionX =1;int 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(); 지연(2000); matrix.fillScreen(0); matrix.show();}void loop() { // 화면의 너비와 높이를 저장합니다. int myWidth =matrix.width(); int myHeight =행렬.높이(); // 패들의 위치를 ​​전위차계의 위치에 매핑합니다. 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(패들X <0){ //패들X =0; //matrix.fillRect(paddleX, paddleY, 3, 1,matrix.Color(0,0,255));//}//else if(paddleX>=13){ //} oldPaddleX =paddleX; oldPaddleY =paddleY; matrix.show(); // 공의 위치를 ​​업데이트하고 화면에 그립니다. if (millis() % ballSpeed ​​<2) { moveBall(); } matrix.show(); if(ballY> 8 &&(millis()> 10000)){ 점수 +=1; matrix.fillScreen(0); matrix.setTextColor(matrix.Color(255,0,0)); matrix.setCursor(0,2); matrix.print(문자열(점수)); matrix.show(); 지연(4000); ballX =랜덤(3,11); ballY =랜덤(1,1); matrix.fillScreen(0); matrix.show(); 지연(1000); } delay(5);}// 이 함수는 화면에서 공의 위치를 ​​결정합니다. 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)); 올드볼X =볼X; 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))) { 결과 =true; } 반환 결과;}
    Arduino 코드C/C++
    #include #include #include #define PIN 6Adafruit_NeoMatrix 매트릭스 =Adafruit_NeoMatrix(15, 10, +_CEOIGX0), PIN, NEO_MATRIX_BOTTOM + NEO_MATRIX_UMTRIX_LEFT;// 공과 paddle의 위치에 대한 변수int paddleX =0;int paddleY =0;int oldPaddleX, oldPaddleY;int ballDirectionX =1;int 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(); 지연(2000); matrix.fillScreen(0); matrix.show();}void loop() { // 화면의 너비와 높이를 저장합니다. int myWidth =matrix.width(); int myHeight =행렬.높이(); // 패들의 위치를 ​​전위차계의 위치에 매핑합니다. 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(패들X <0){ //패들X =0; //matrix.fillRect(paddleX, paddleY, 3, 1,matrix.Color(0,0,255));//}//else if(paddleX>=13){ //} oldPaddleX =paddleX; oldPaddleY =paddleY; matrix.show(); // 공의 위치를 ​​업데이트하고 화면에 그립니다. if (millis() % ballSpeed ​​<2) { moveBall(); } matrix.show(); if(ballY> 8 &&(millis()> 10000)){ 점수 +=1; matrix.fillScreen(0); matrix.setTextColor(matrix.Color(255,0,0)); matrix.setCursor(0,2); matrix.print(문자열(점수)); matrix.show(); 지연(4000); ballX =랜덤(3,11); ballY =랜덤(1,1); matrix.fillScreen(0); matrix.show(); 지연(1000); } delay(5);}// 이 함수는 화면에서 공의 위치를 ​​결정합니다. 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)); 올드볼X =볼X; 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))) { 결과 =true; } 반환 결과;}

    회로도


    제조공정

    1. TinyML-Language Detector 기반 Edge Impulse 및 Arduino
    2. MPU-6050을 사용한 Arduino 자이로스코프 게임
    3. Arduino 디지털 주사위
    4. 아이언맨
    5. 나를 찾기
    6. Arduino 가습기 제어
    7. arduino를 사용한 소나 및 IDE 처리 시 표시
    8. MobBob:Android 스마트폰으로 제어되는 DIY Arduino 로봇
    9. Arduino Audio Reactive Desk Light
    10. Arduino 조이스틱