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

MAX7219가 있는 24x16 매트릭스의 Arduino Pong 게임

구성품 및 소모품

Arduino Nano R3
× 1
MAX7219가 포함된 8x8 Led 매트릭스 모듈
× 6
회전 전위차계(일반)
× 2
부저
× 1

필요한 도구 및 기계

납땜 인두(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

나는 6개의 배열에 이 작은 탁구 콘솔을 만들었습니다. 지침 및 코드에 따른 8x8 LED 매트릭스:https://www.instructables.com/id/Pong/

맞춤형 매트릭스 보드 대신 알리익스프레스에서 MAX7219가 있는 저렴한 기성품 8x8 모듈을 구입했습니다.

각 보드의 "클럭" 및 "로드" 핀은 모두 함께 연결됩니다. 첫 번째 매트릭스의 "Din"핀은 Arduino로 이동하고 "Dout"은 다음 매트릭스의 "Din"으로 이동합니다. 제어 패들은 Arduino의 A0 및 A1 아날로그 핀에 연결된 두 개의 10k 전위차계이며 부저는 D9 핀에 연결됩니다.

결국 나는 플라스틱 상자에 장치를 넣고 전기 설치를 위해 상자에 컨트롤러를 넣습니다.

다음에서 LedControl 라이브러리를 다운로드할 수 있습니다.

https://github.com/wayoda/LedControl

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

코드

<울>
  • 코드
  • 코드Arduino
    //항상 라이브러리를 포함해야 합니다. #include "LedControl.h" byte rightcore; 바이트 왼쪽 점수; 정수 톤 루프 =1000; ={// 디스플레이를 시작할 때에 사용 바이트 pongdisplay [] "퐁"B11111111, B00000000, B00001001, B00000000, B00001001, B00000000, B00000110, B00000000, B00000000, B00000000, B00000000, B00000000, B01110000, B00000000, B10001000, B00000000, B10001000 , B00000000, B01110000, B00000000, B00000000, B00000000, B00000000, B00000000, B11110000, B00000000, B00001000, B00000000, B00001000, B00000000, B11110000, B00000000, B00000000, B00000000, B00000000, B00000000, B11001111, B00000000, B10001001, B00000000, B10001001, B00000000 , B11111111, B00000000, B00000000, B00000000, B00000000, B00000000, }; byte zero[]={ // 점수 표시 시 '0' 표시 B00000000, B00000000, B00111100, B01000010, B01000010, B01000010, B00111100, B00000;0 byte one[]={ // 점수 표시 시 '1'로 표시 B00000000, B00000000, B10001000, B10000100, B11111110, B10000000, B10000000, B0000}0 byte two[]={ // 점수 표시 시 '2'로 표시 B00000000, B01100010, B01010001, B01010001, B01001001, B01000110, B00000000, B00000 사용 to' 3' 표시용 B00000000, B00100110, B01000001, B01001001, B00110110, B00000000, B000000000, B00000000, B00000000, B0 B0 B0 0 B0 a0 when10 a0 a0 바이트 4'[]={ B00001000, B00001000, B11111111, B00000000, B00000000} 바이트 displayevens; 바이트 다섯 [] ={//는 '5'스코어 B00000000를 표시 할 때 들면, B00000000, B10011110, B10010010, B10010010, B11110010, B00000000, B00000000} 표시하는 데 사용 =0;byte displayrow=0;byte displayindex=0;byte displayodds=1;unsigned long time;unsigned long currenttime;/* 이제 작업할 LedControl이 필요합니다. 핀 12는 DataIn에 연결되고 핀 11은 CLK에 연결되고 핀 10은 LOAD에 연결됩니다. 6개의 MAX72XX가 있습니다. */바이트 모드;바이트 편향;바이트 캐리;int line;LedControl lc=LedControl(12,11,10,6);long randnumber;byte dir;int startpos;byte row;byte column;long randNumber;byte start;byte diry;int pass;byte limit;#define leftpaddle 0 //왼쪽 퐁 노브가 아날로그 입력에 연결됨 0#define rightpaddle 1 // 오른쪽 퐁 노브가 아날로그 입력에 연결됨 1int directionpong;int rightpongval;int leftpongval;byte 깜박임;byte 퐁 [] ={// 저장 공과 패들 B00000000의 위치 B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000 , B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000 , B00000000, B00000000, B00000000, B00000000, B000000 00}; 무효 설정(){ pinMode(왼쪽 패들, INPUT); // 패들은 입력입니다. 핀모드(오른쪽 패들, 입력); // 패들은 입력입니다. Serial.begin(9600); // 디버깅을 위한 직렬 통신. 9600 baud로 설정 // 아래의 이러한 상태는 주어진 설정으로 행렬을 설정하고 설정합니다. lc.shutdown(0,false); lc.setIntensity(0,1); lc.clearDisplay(0); lc.shutdown(1,거짓); lc.setIntensity(1,1); lc.clearDisplay(1); lc.shutdown(2,거짓); lc.setIntensity(2,1); lc.clearDisplay(2); lc.shutdown(3,거짓); lc.setIntensity(3,1); lc.clearDisplay(3); lc.shutdown(4,거짓); lc.setIntensity(4,1); lc.clearDisplay(4); lc.shutdown(5,거짓); lc.setIntensity(5,1); lc.clearDisplay(5); while(displayevens<5){ while(displayrow<=7){ lc.setRow(displayevens,displayrow,pongdisplay[디스플레이인덱스]); 디스플레이 행 ++; 디스플레이 인덱스+=2; } 디스플레이 행=0; displayevens+=2; } 디스플레이 행=0; 디스플레이 인덱스=1; randomSeed(analogRead(4)); 시작=1; 시간=밀리(); 현재 시간=밀리(); while(현재시간-시간<3000){ leftpongval=analogRead(왼쪽 패들); leftpongval=map(leftpongval,1023,20,2,0); if(leftpongval==0){ lc.setLed(3,2,7,true); lc.setLed(3,3,7,거짓); lc.setLed(3,4,7,거짓); 모드=1; 한계=2; } if(leftpongval==1){ lc.setLed(3,2,7,true); lc.setLed(3,3,7,true); lc.setLed(3,4,7,거짓); 모드=2; 제한=1; } if(leftpongval==2){ lc.setLed(3,2,7,true); lc.setLed(3,3,7,true); lc.setLed(3,4,7,true); 모드=3; 한계=2; } 지연(50); lc.clearDisplay(3); 현재 시간=밀리(); } } 무효 루프(){ 패들(); 퐁심(); 표시 화면(); } void paddles(){ // 패들에서 데이터를 읽고 배열에 표시합니다. int searchbit; 정수 캐리 =0; // Serial.print("왼쪽 패들:"); // Serial.println(analogRead(leftpaddle)); leftpongval=analogRead(왼쪽 패들); leftpongval=map(leftpongval,0,1010,0,13); rightpongval=analogRead(오른쪽 패들); rightpongval=map(rightpongval,1023,20,0,13); // Serial.print("오른쪽 패들:"); // Serial.println(rightpongval); //다음 패들을 표시하기 위해 이전 패들을 삭제합니다. pong[0]=B00000000; 퐁[1]=B00000000; 퐁[46]=B00000000; 퐁[47]=B00000000; //-------------------------------오른쪽 패들 if(mode!=3){ if(rightpongval<=7) { rightpongval=map(rightpongval,0,7,7,0); bitSet(pong[46], rightpongval); if(rightpongval-1>=0){ bitSet(pong[46],rightpongval-1); } else{ bitSet(퐁[47], 7); if(모드!=2){ bitSet(pong[47],6); 캐리=1; } } if(모드!=2){ if(carry==0){ if(rightpongval-2>=0){ bitSet(pong[46], rightpongval-2); } else{ bitSet(퐁[47], 7); 캐리=1; } } } } if(rightpongval>7){ rightpongval=map(rightpongval,8,13,7,limit); bitSet(pong[47], rightpongval); bitSet(pong[47], rightpongval-1); if(모드!=2){ bitSet(pong[47],rightpongval-2); } } } else{ 퐁[46]=B11111111; 퐁[47]=B11111111; lc.setRow(4,7,퐁[46]); lc.setRow(5,7,퐁[47]); } //----------------------------------왼쪽 패들 carry=0; if(leftpongval<=7){ leftpongval=map(leftpongval,0,7,7,0); bitSet(pong[0], leftpongval); if(leftpongval-1>=0){ bitSet(pong[0],leftpongval-1); } else{ bitSet(퐁[1], 7); if(모드!=2){ bitSet(pong[1],6); 캐리=1; } } if(모드!=2){ if(carry==0){ if(leftpongval-2>=0){ bitSet(pong[0], leftpongval-2); } else{ bitSet(퐁[1], 7); } } } } if(leftpongval>7){ leftpongval=map(leftpongval,8,13,7,limit); bitSet(pong[1],leftpongval); bitSet(pong[1],leftpongval-1); if(모드!=2){ bitSet(pong[1],leftpongval-2); } } }pongsim(){ if( ((줄==2 || 줄==3) &&diry ==0) || ((줄==44 || 줄==45) &&diry==1) ){ ball_meets_paddle(); } if(start==1){ // 새 게임 시작 randnumber=random(1,7); // 임의의 시작 비트를 가져옵니다. dir=random(2); // 왼쪽에서 오른쪽으로 또는 오른쪽에서 왼쪽으로 무작위로 시작하는 움직임 diry=random(2); // 임의의 시작 y 이동 방향을 생각해냅니다. if(diry==0){ // y 방향이 0인 경우. 아래에서 위로 이동 line=random(30,34); // 30-34 사이의 임의의 시작 라인을 찾아냅니다. bitSet(pong[line],randnumber); // 임의의 라인에 비트를 설정하고 pong 배열에서 임의의 비트를 1로 설정 } if(diry==1){ // y 방향이 1인 경우. 위에서 아래로 이동=random(12,16); // 12-16 사이의 임의의 시작 라인을 생각해냅니다. bitSet(pong[line],randnumber); // 임의의 라인에 비트를 설정하고 pong 배열에서 임의의 비트를 1로 설정 } start=0; // 시작 변수를 다시 0으로 설정 } if(diry==0){ // 공이 아래에서 위로 움직이는 경우 if(dir==0){ // 공이 오른쪽에서 왼쪽으로 움직이는 경우 if (deflect==0 &&carry==0){ // 공이 방향을 바꾸거나 다른 행렬로 넘어가지 않는 경우 line-=2; // 줄에서 2를 빼서 공을 반대쪽으로 진행합니다. pong[line]=pong[line+2] <<1;// 공을 왼쪽으로 이동하고 새 줄과 동일하게 설정합니다. pong[line+2] =B00000000; // 공의 이전 줄 지우기 } if(carry==1){ // 공이 새 행렬로 넘어가야 하는 경우 line-=3; // 라인에서 3을 빼서 공을 반대쪽으로 진행합니다. pong[line]=B00000001; // 새 줄 설정 pong[line+3]=B00000000; // 공의 이전 줄 지우기 carry=0; // 캐리 변수를 다시 0으로 설정 return; // 여기서 끝입니다. } if(deflect==1){ // 공이 벽에서 벗어나야 하는 경우 line-=2; // 라인에서 2를 빼서 공을 반대편으로 진행합니다. pong[line]=B01000000; // 새 줄 설정 pong[line+2]=B00000000; // 볼의 이전 라인을 지웁니다. Deflection=0; // 편향 변수를 다시 0으로 설정 dir=1; // 방향을 왼쪽에서 오른쪽으로 전환 return; // 여기서 끝 } if(bitRead(pong[line],7)==1){ // 공이 라인의 7번째 비트에 있으면 if(line==3|| line==5 || line==7 || line==9 || line==11 || line==13 || line==15 || // 줄이 홀수인 경우 line==17 || line==19 | | 줄==21 || 줄==23 || 줄==25 || 줄==27 || 줄==29 || 줄==31 || 줄==33 || 줄==35 || 줄 ==37 || 줄==39 || 줄==41 ||줄==43 || 줄==45){ 캐리=1; // 공은 다른 행렬로 넘어갈 필요가 있습니다. return; // 여기서 끝났습니다 } else{ // 그렇지 않으면 공이 짝수 선에 있습니다 if(line!=2){ // 공이 2번 방향에서 패들과 만나기 때문에 선은 2가 될 수 없습니다. // 공은 벽 리턴에서 방향을 바꿔야 합니다. // 여기까지 완료 } } } } // 위의 주석은 아래의 모든 내용을 설명해야 합니다. 일부 항목, 다른 매개변수. if(dir==1){ if(deflect==0 &&carry==0){ line-=2; 퐁[라인]=퐁[라인+2]>> 1; 퐁[line+2]=B00000000; } if(carry==1){ 줄 --; 퐁[line]=B10000000; 퐁[line+1]=B00000000; 캐리=0; 반품; } if(편향==1){ 줄-=2; 퐁[줄]=B00000010; 퐁[line+2]=B0000000; 편향=0; 디렉토리=0; 반품; } if(bitRead(pong[line],0)==1){ if( line==2 || line==4 || line==6 || line==8 || line==10 || line ==12 || 줄==14 || 줄==16 || 줄==18 || 줄==20 || 줄==22 || 줄==24 || 줄==26 || 줄==28 || 줄==30 || 줄==32 || 줄==34 || 줄==36|| 줄==38 || 줄==40 ||줄==42 || 줄==44 ) { 캐리=1; 반품; } else{ if(line!=3){ 편향=1; 반품; } } } } }//---------------------------------------------------------- -diry =1 아래 if(diry==1){ if(dir==0){ if(deflect==0 &&carry==0){ line+=2; 퐁[라인]=퐁[라인-2] <<1; 퐁[line-2]=B00000000; } if(carry==1){ line+=1; 퐁[줄]=B00000001; 퐁[line-1]=B00000000; 캐리=0; 반품; } if(편향==1){ 줄+=2; 퐁[줄]=B01000000; 퐁[line-2]=B00000000; 편향=0; 디렉토리=1; 반품; } if(bitRead(pong[line],7)==1){ if( line==5 || line==7 || line==9 || line==11 || line==13 || line ==15 || 줄==17 || 줄==19 || 줄==21 || 줄==23 || 줄==25 || 줄==27 || 줄==29 || 줄==31 || 줄==33 || 줄==35 || 줄==37 || 줄==39|| 줄==41 ||줄==43 || 줄==45){ 나르다=1; 반품; } else{ if(line!=44){ 편향=1; 반품; } } } } if(dir==1){ if(deflect==0 &&carry==0){ line+=2; 퐁[라인]=퐁[라인-2]>> 1; 퐁[line-2]=B00000000; } if(carry==1){ line+=3; 퐁[line]=B10000000; 퐁[line-3]=B00000000; 캐리=0; 반품; } if(편향==1){ 줄+=2; 퐁[줄]=B00000010; 퐁[line-2]=B0000000; 편향=0; 디렉토리=0; 반품; } if(bitRead(pong[line],0)==1){ if(line==2|| line==4 || line==6 || line==8 || line==10 || line ==12 || 줄==14 || 줄==16 || 줄==18 || 줄==20 || 줄==22 || 줄==24 || 줄==26 || 줄==28 || 줄==30 || 줄==32 || 줄==34 || 줄==36|| 줄==38 || 줄==40 ||줄==42 || 줄==44 ) { 캐리=1; 반품; } else{ if(line!=45){ 편향=1; 반품; } } } }} 무효 displayscreen(){ displayevens=0; 디스플레이 행=0; 디스플레이 인덱스=0; displayodds=1; while(displayevens<5){ while(displayrow<=7){ lc.setRow(displayevens,displayrow,pong[디스플레이인덱스]); 디스플레이 행 ++; 디스플레이 인덱스+=2; } 디스플레이 행=0; displayevens+=2; } 디스플레이 행=0; 디스플레이 인덱스=1; while(displayodds<6){ while(displayrow<8){ lc.setRow(displayodds,displayrow,pong[디스플레이인덱스]); 디스플레이 행 ++; 디스플레이 인덱스+=2; } 디스플레이 행=0; displayodds+=2; }} 무효 clearscreen(){ int clearing=0; while(clearing<49){ 퐁[clearing]=B00000000; 지우기++; }}무효 ball_meets_paddle(){ 바이트 검색1=0; if(diry==0){ // 공이 위로 이동 if(dir==0){ // 공이 오른쪽에서 왼쪽으로 이동 while(search1<8){ //공이 있는 비트 찾기 if(bitRead(pong [line],search1)==1){ //공이 있는 비트를 찾았습니다. if(line==2){ if( search1!=6 &&search1!=7){ //공이 2번째 줄에 있으면 확인 특수 비트에 없는지 확인합니다. if( bitRead(pong[0], search1)==1){ // 패들이 있는지 확인 diry=1; // y 방향을 전환하여 다른 패들 톤(9,500,100)으로 향하도록 합니다. } else if( bitRead(pong[0], search1+1)==1){ diry=1; 디렉토리=1; 톤(9,500,100); if(검색1==0){ 캐리=1; } } else { // 패들 없음, 볼 톤(9,500,300)을 놓쳤습니다. 클리어스크린(); 시작=1; 지연(1000); 점수 왼쪽(); } } if(search1==6){ //특수 비트, 동일한 경로를 편향해야 함 if(bitRead(pong[0],7)==1){ // 거기에 패들이 있음 pong[2] =B01000000; 디렉토리=1; 건조한 =1; 톤(9,500,100); } else{//그것을 놓쳤습니다. 노가 없습니다. 톤(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 점수 왼쪽(); } } if(search1==7){//특수 비트, 먼저 벽에서 튀어 나와야 함 if(bitRead(pong[0],6)==1){// 패들 pong[2]=B00100000을 찾았습니다. 건조한 =1; 디렉토리=1; 라인=2; 톤(9,500,100); 표시 화면(); } else{//그것을 놓쳤습니다. 노가 없습니다. 톤(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 점수 왼쪽(); } } } if(line==3){ if( search1!=7){ //라인 3에 있는 경우 특수 비트에 없는지 확인하십시오. if( bitRead(pong[1], search1)==1) { // 패들이 있는지 확인 diry=1; // y 방향을 전환하여 다른 패들 톤(9,500,100)으로 향하도록 합니다. } else if( bitRead(pong[1], search1+1)==1){ diry=1; 디렉토리=1; 톤(9,500,100); } else { // 노가 없음, 볼 톤을 놓쳤습니다(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 점수 왼쪽(); } } if(search1==7){//특수 비트, 다음 행렬로 이월해야 함 if(bitRead(pong[1],7)==1){ //패들을 찾았습니다 //pong[2] =B10000000; // dir=0에 있던 행을 지웁니다. //방향이 동일함 diry=1; // y 방향은 tone(9,500,100)을 바꿉니다. } else if(bitRead(pong[0],0)==1){ 디렉토리=1; 건조한 =1; 톤(9,500,100); 캐리=0; } else{// 패들 없음, 볼 톤(9,500,300)을 놓쳤습니다. 클리어스크린(); 시작=1; 지연(1000); 점수 왼쪽(); } } } } 검색1++; } } if(dir==1){//공이 왼쪽에서 오른쪽으로 이동하고 있음 while(search1<8){ //공이 있는 비트 찾기 if(bitRead(pong[line],search1)==1) { //공이 있는 비트를 찾았습니다. if(line==3){ if( search1!=1 &&search1!=0){ //3번째 줄에 있으면 특수 비트에 있지 않은지 확인하십시오. if( bitRead(pong[1], search1)==1){ //패들이 있는지 확인 diry=1; // 공이 다른 패들 쪽으로 향하도록 y 방향을 전환합니다. tone(9,500,100); } else if(bitRead(pong[1], search1-1)==1){ diry=1; 디렉토리=0; 톤(9,500,100); if(검색1==7){ 캐리=1; } } else{ // 노가 없음, 볼 톤을 놓쳤습니다(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 점수 왼쪽(); } } if(search1==1){ if(bitRead(pong[1],0)==1){ pong[3]=B00000010; 디렉토리=0; 건조한 =1; 톤(9,500,100); } else{ 톤(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 점수 왼쪽(); } } if(검색1==0){ if(bitRead(퐁[1],0)==1){ 퐁[3]=B00000100; 건조한 =1; 디렉토리=0; 라인=3; 톤(9,500,100); 표시 화면(); } else{ 톤(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 점수 왼쪽(); } } } if(line==2){ if( search1!=0){ if(bitRead(pong[0], search1)==1){ //패들이 있는지 확인 diry=1; // 공이 다른 패들 쪽으로 향하도록 y 방향을 전환합니다. tone(9,500,100); } else if(bitRead(pong[0], search1-1)==1){ diry=1; 디렉토리=0; 톤(9,500,100); } else{ // 노가 없음, 볼 톤을 놓쳤습니다(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 점수 왼쪽(); } } if(search1==0){ if(bitRead(pong[0],0)==1){ // pong[2]=B00000001; 라인=2; 디렉토리=1; 건조한 =1; 톤(9,500,100); 반품; } else if(bitRead(pong[1],7)==1){ diry=1; 디렉토리=0; 톤(9,500,100); 캐리=0; } else{ 톤(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 점수 왼쪽(); } } } } 검색1++; } } }//--------------------------------------------- ---------------------- if(diry==1){ // 공이 위로 이동 if(dir==0){ // 공이 움직입니다. 오른쪽에서 왼쪽으로 while(search1<8){ //공이 있는 비트 찾기 if(bitRead(pong[line],search1)==1){ //공이 있는 비트 찾기 if(line==44){ if( search1!=6 &&search1!=7){ //라인 2에 있으면 특수 비트에 있지 않은지 확인하십시오. if( bitRead(pong[46], search1)==1){ // 거기에 패들이 있는지 확인하십시오. diry=0; // y 방향을 전환하여 다른 패들 톤(9,500,100)으로 향하도록 합니다. } else if( bitRead(pong[46], search1+1)==1){ diry=0; 디렉토리=1; 톤(9,500,100); if(검색1==0){ 캐리=1; } } else { // 패들 없음, 볼 톤(9,500,300)을 놓쳤습니다. 클리어스크린(); 시작=1; 지연(1000); 득점권(); } } if(search1==6){ //특수 비트, 동일한 경로를 우회해야 함 if(bitRead(pong[46],7)==1){ // 거기에 패들이 있습니다 dir=1; 건조한 =0; 톤(9,500,100); } else{//그것을 놓쳤습니다. 노가 없습니다. 톤(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 득점권(); } } if(search1==7){//특수 비트, 먼저 벽에서 튀어나와야 함 if(bitRead(pong[46],6)==1){// 패들 pong[44]=B00100000을 찾았습니다. 건조한 =0; 디렉토리=1; 톤(9,500,100); 표시 화면(); 라인=44; 반품; } } } if(line==45){ if( search1!=7){ //라인 3에 있는 경우 특수 비트에 있지 않은지 확인하십시오. if( bitRead(pong[47], search1)==1) { // 패들이 있는지 확인 diry=0; // y 방향을 전환하여 다른 패들 톤(9,500,100)으로 향하도록 합니다. } else if( bitRead(pong[47], search1+1)==1){ diry=0; 디렉토리=1; 톤(9,500,100); } else { // 노가 없음, 볼 톤을 놓쳤습니다(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 득점권(); } } if(search1==7){//특수 비트, 다음 행렬로 이월해야 함 if(bitRead(pong[47],7)==1){ // 패들을 찾았습니다 // pong[45] =B10000000; //줄에 있던 행 지우기=45; 디렉토리=0; //방향이 동일함 diry=0; // y 방향은 tone(9,500,100)을 바꿉니다. } else if(bitRead(pong[46],0)==1){ 디렉토리=1; 건조한 =0; 톤(9,500,100); 캐리=0; } else{// 패들 없음, 볼 톤(9,500,300)을 놓쳤습니다. 클리어스크린(); 시작=1; 지연(1000); 득점권(); } } } } 검색1++; } } if(dir==1){//공이 왼쪽에서 오른쪽으로 이동하고 있음 while(search1<8){ //공이 있는 비트 찾기 if(bitRead(pong[line],search1)==1) { //공이 있는 비트를 찾았습니다. if(line==45){ if( search1!=1 &&search1!=0){ //3번째 줄에 있으면 특수 비트에 있지 않은지 확인하십시오. if( bitRead(pong[47], search1)==1){ //패들이 있는지 확인 diry=0; // 공이 다른 패들 쪽으로 향하도록 y 방향을 전환합니다. tone(9,500,100); } else if(bitRead(pong[47], search1-1)==1){ diry=0; 디렉토리=0; 톤(9,500,100); if(검색1==7){ 캐리=1; } } else{ // 노가 없음, 볼 톤을 놓쳤습니다(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 득점권(); } } if(search1==1){ if(bitRead(pong[47],0)==1){ pong[43]=B00000010; 디렉토리=0; 건조한 =0; 톤(9,500,100); } else{ 톤(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 득점권(); } } if(search1==0){ if(bitRead(pong[47],1)==1){ pong[45]=B00000100; 건조한 =0; 디렉토리=0; 라인=45; 톤(9,500,100); 표시 화면(); } else{ 톤(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 득점권(); } } } if(line==44){ if( search1!=0){ if(bitRead(pong[46], search1)==1){ //패들이 있는지 확인 diry=0; // 공이 다른 패들 쪽으로 향하도록 y 방향을 전환합니다. tone(9,500,100); } else if(bitRead(pong[46], search1-1)==1){ diry=0; 디렉토리=0; 톤(9,500,100); } else{ // 노가 없음, 볼 톤을 놓쳤습니다(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 득점권(); } } if(검색1==0){ if(bitRead(퐁[46],0)==1){ 퐁[44]=B00000001; 라인=44; 디렉토리=1; 건조한 =0; 톤(9,500,100); } else if(bitRead(pong[47],7)==1){ 디렉토리=0; 건조한 =0; 톤(9,500,100); 캐리=0; } else{ 톤(9,500,300); 클리어스크린(); 시작=1; 지연(1000); 득점권(); } } } } 검색1++; } } } 패스=1; search1=0;}void scoreleft(){ clearscreen(); 권리점수++; 세트스코어(); 표시 화면(); if(rightscore==5){ while(blinkx++<4){ clearscreen(); 표시 화면(); 지연(500); 세트스코어(); 표시 화면(); 지연(500); } 깜박임x=0; 권리 점수=0; 왼쪽 점수 =0; } else{ 지연(2000); } clearscreen();} 무효 scoreright(){ clearscreen(); 좌점수++; 세트스코어(); 표시 화면(); if(leftscore==5){ while(blinkx++<4){ clearscreen(); 표시 화면(); 지연(500); 세트스코어(); 표시 화면(); 지연(500); } 깜박임x=0; 권리 점수=0; 왼쪽 점수 =0; } else{ 지연(2000); } clearscreen();}무효 setscore(){ 바이트 setScoreLoop=0; while(setScoreLoop<=7){ if(leftscore==0){ pong[setScoreLoop*2]=zero[setScoreLoop]; } if(leftscore==1){ pong[setScoreLoop*2]=one[setScoreLoop]; } if(leftscore==2){ pong[setScoreLoop*2]=two[setScoreLoop]; } if(leftscore==3){ pong[setScoreLoop*2]=three[setScoreLoop]; } if(leftscore==4){ 퐁[setScoreLoop*2]=four[setScoreLoop]; } if(leftscore==5){ pong[setScoreLoop*2]=five[setScoreLoop]; } if(rightscore==0){ 퐁[32+(setScoreLoop*2)]=zero[setScoreLoop]; } if(rightscore==1){ 퐁[32+(setScoreLoop*2)]=one[setScoreLoop]; } if(rightscore==2){ 퐁[32+(setScoreLoop*2)]=two[setScoreLoop]; } if(rightscore==3){ 퐁[32+(setScoreLoop*2)]=three[setScoreLoop]; } if(rightscore==4){ 퐁[32+(setScoreLoop*2)]=four[setScoreLoop]; } if(rightscore==5){ 퐁[32+(setScoreLoop*2)]=five[setScoreLoop]; } 세트스코어루프++; } 퐁[20]=B00011000; 퐁[22]=B00011000; 퐁[24]=B00011000; } 

    회로도


    제조공정

    1. MPU-6050을 사용한 Arduino 자이로스코프 게임
    2. Arduino Pong 게임 - OLED 디스플레이
    3. Arduino 게임 컨트롤러
    4. Arduino로 코인 억셉터 제어
    5. MAX7219가 있는 24x16 매트릭스의 Arduino Pong 게임
    6. 수제 16x8 매트릭스의 Arduino Nano 테트리스 게임
    7. Bluetooth가 탑재된 Arduino로 LED 제어!
    8. 픽셀 체이서 게임
    9. Arduino Uno로 LED 매트릭스 제어
    10. NeoMatrix Arduino Pong