제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
|
|
매트릭스
아니요, 영화가 아니라 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="코드">
#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; } 반환 결과;}
#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 Nano R3 × 1 회전 전위차계(일반) × 7 SparkFun 푸시버튼 스위치 12mm × 7 MIDI 포트 × 1 저항 221옴 × 4 LED(일반) × 2 이 프로젝트 정보 2019년 3월 11일 업데이트 안녕하세요, 저는 아르페지에이터를 위한 새 펌웨어를 만들었습니다. 소스 코드가 완전히 다시 작성되었습니다. 이제 모듈식 구조를 통해 Arduino뿐만
구성품 및 소모품 Arduino UNO × 1 Adafruit RGB 백라이트 LCD - 16x2 × 1 브레드보드(일반) × 1 저항 220옴 × 1 SparkFun 푸시버튼 스위치 12mm × 1 점퍼 와이어(일반) × 1 USB-A-B 케이블 × 1 앱 및 온라인 서비스 Arduino IDE 이 프로젝트 정보 필요한 부품은 위의 그림과