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

Arduino Nano Tetris-spel op zelfgemaakte 16x8 Matrix

Componenten en benodigdheden

Arduino Nano R3
× 1
SparkFun Drukknopschakelaar 12 mm
× 4
Texas Instruments Shift Register- Serieel naar Parallel
× 2
Schuifschakelaar
× 1
5 mm LED:geel
× 128

Benodigde gereedschappen en machines

Soldeerbout (algemeen)

Apps en online services

Arduino IDE

Over dit project

Ik heb dit tetris-spel gebouwd met zelfgemaakte 16x8 LED-matrix, Arduino Nano en twee 74hc595-schuifregisters. Ik heb ook een pieptoon toegevoegd wanneer je op een knop drukt.

Code

  • code
codeArduino
/*Auteur:Jae Yeong Bae UBC ECE jocker.tistory.com Datum:18.jan.2013 Bestand:Tetris v2Changelog:v2:geeft score weer bij gameover Doel:tijd doden.. + voor de lol Circuits+Pins:Led Matrix:2 74HC575 Shift Registers in volgorde:Groen, Blauw, Rood pinnen:Vergrendeld =3 Klok =2 Data =4 Rij Anodes =5 tot 13 (8 pinnen) gedeeld tussen beide matrixknoppen (als digitaal):A4 =links A5 =omlaag A6 =rechts A7 =omhoog (roteren)Opmerking:Dit is mijn tweede Arduino-project. Code kan rommelig en inefficiënt zijn. Referenties uit Arduino Library en datasheets.*/unsigned char latchPin =3;unsigned char clockPin =2;unsigned char dataPin =4;unsigned char rowPin =5;long delays =0;short delay_ =500;long bdelay =0;short buttondelay =150;korte btdowndelay =30;korte btsidedelay =80;unsigned char blocktype;unsigned char blockrotation;int lines =0;boolean block[8][18]; //2 extra voor rotatieboolean stapel [8][16];boolean disp[8][16];boolean lib[10][5][7];void setup() {lib[0][1][0] =1;lib[0][2][0] =1;lib[0][3][0] =1;lib[0][0][1] =1;lib[0][4][ 1] =1;lib[0][3][2] =1;lib[0][0][2] =1;lib[0][4][2] =1;lib[0][2 ][3] =1;lib[0][0][3] =1;lib[0][4][3] =1;lib[0][1][4] =1;lib[0] [0][4] =1;lib[0][4][4] =1;lib[0][0][5] =1;lib[0][4][5] =1;lib[ 0][1][6] =1;lib[0][2][6] =1;lib[0][3][6] =1;lib[1][2][0] =1; lib[1][1][1] =1;lib[1][2][1] =1;lib[1][2][2] =1;lib[1][2][3] =1;lib[1][2][4] =1;lib[1][2][5] =1;lib[1][1][6] =1;lib[1][2][6 ] =1;lib[1][3][6] =1;lib[2][1][0] =1;lib[2][2][0] =1;lib[2][3] [0] =1;lib[2][0][1] =1;lib[2][4][1] =1;lib[2][4][2] =1;lib[2][ 3][3] =1;lib[2][2][4] =1;lib[2][1][5] =1;lib[2][0][6] =1;lib[2 ][1][6] =1;lib[2][2][6] =1;lib[2][3][6] =1;lib[2][4][6] =1;lib [3][0][0] =1;lib[3][1][0] =1;lib[3][2][0] =1;lib[3][3][0] =1;lib[3][4][0] =1;lib[3][3][1] =1;lib[3][2][2] =1;lib[3][3][3] =1;lib[3][4][4] =1;lib[3][0][5] =1;l ib[3][4][5] =1;lib[3][1][6] =1;lib[3][2][6] =1;lib[3][3][6] =1;lib[4][3][0] =1;lib[4][2][1] =1;lib[4][3][1] =1;lib[4][1][2 ] =1;lib[4][3][2] =1;lib[4][0][3] =1;lib[4][3][3] =1;lib[4][0] [4] =1;lib[4][1][4] =1;lib[4][2][4] =1;lib[4][3][4] =1;lib[4][ 4][4] =1;lib[4][3][5] =1;lib[4][3][6] =1;lib[5][0][0] =1;lib[5 ][1][0] =1;lib[5][2][0] =1;lib[5][3][0] =1;lib[5][4][0] =1;lib [5][0][1] =1;lib[5][0][2] =1;lib[5][1][2] =1;lib[5][2][2] =1;lib[5][3][2] =1;lib[5][4][3] =1;lib[5][4][4] =1;lib[5][0][5] =1;lib[5][4][5] =1;lib[5][1][6] =1;lib[5][2][6] =1;lib[5][3][ 6] =1;lib[6][2][0] =1;lib[6][3][0] =1;lib[6][1][1] =1;lib[6][0 ][2] =1;lib[6][0][3] =1;lib[6][1][3] =1;lib[6][2][3] =1;lib[6] [3][3] =1;lib[6][0][4] =1;lib[6][4][4] =1;lib[6][0][5] =1;lib[ 6][4][5] =1;lib[6][1][6] =1;lib[6][2][6] =1;lib[6][3][6] =1; lib[7][0][0] =1;lib[7][1][0] =1;lib[7][2][0] =1;lib[7][3][0] =1;lib[7][4][0] =1;lib[7][4][1] =1;lib[7][3][2] =1;lib[7][2][3 ] =1;lib[7][1][4] =1;lib[7][1][5] =1;lib[7][1][6] =1;lib[8][1][0] =1;lib[8][2][0 ] =1;lib[8][3][0] =1;lib[8][0][1] =1;lib[8][4][1] =1;lib[8][0] [2] =1;lib[8][4][2] =1;lib[8][1][3] =1;lib[8][2][3] =1;lib[8][ 3][3] =1;lib[8][0][4] =1;lib[8][4][4] =1;lib[8][0][5] =1;lib[8 ][4][5] =1;lib[8][1][6] =1;lib[8][2][6] =1;lib[8][3][6] =1;lib [9][1][0] =1;lib[9][2][0] =1;lib[9][3][0] =1;lib[9][0][1] =1;lib[9][4][1] =1;lib[9][0][2] =1;lib[9][4][2] =1;lib[9][1][3] =1;lib[9][2][3] =1;lib[9][3][3] =1;lib[9][4][3] =1;lib[9][4][ 4] =1;lib[9][3][5] =1;lib[9][1][6] =1;lib[9][2][6] =1; int seed =(analogRead(0)+1)* (analogRead(1)+1)* (analogRead(2)+1)* (analogRead(3)+1); willekeurig Zaad (zaad); willekeurig (10.9610806); seed =seed *random(3336,15679912)+analogRead(random(4)); willekeurig Zaad (zaad); willekeurig (10,98046); cli();//stop interrupts//set timer0 interrupt op 2kHz TCCR1A =0;// zet het gehele TCCR0A register op 0 TCCR1B =0;// hetzelfde voor TCCR0B TCNT1 =0;//initialiseer de tellerwaarde op 0 // stel vergelijk match register voor 2khz stappen OCR1A =259;// =(16*10^6) / (2000*64) - 1 (moet <256) // zet CTC-modus aan TCCR1A |=(1 <0;i--) { for (j=0;j<16;j++) { block[i][j]=block[i-1][j]; } } voor (j=0;j<16;j++) { block[0][j]=0; } updateLED(); retour 1; } return 0;}int readBut(){ if (bdelay> millis()) { return 0; } if (analogRead (A4)> 500) { // left bdelay =millis () + btsidedelay; retour 3; } if (analogRead (A5)> 500) {//down bdelay =millis() + btdowndelay; retour 4; } if (analogRead (A6)> 500) {//right bdelay =millis() + btsidedelay; retour 2; } if (analogRead (A7)> 500) { // up bdelay =millis () + buttondelay; retour 1; } retourneer 0;} ongeldige updateLED(){ int i; intj; for (i=0;i<8;i++) { for (j=0;j<16;j++) { disp[i][j] =block[i][j] | stapel[i][j]; } }}void rotary(){ //skip for square block(3) if (blocktype ==3) return; int xi; int yi; int ik; intj; // detecteer links voor (i=7;i>=0;i--) { for (j=0;j<16;j++) {if (block[i][j]) {xi =i; } } } // detecteren voor (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { yi =i; } } } if (blocktype ==0) { if (blockrotation ==0) { if (!space_left()) { if (space_right3()) { if (!moveright()) return; xi++; } anders terugkeren; } else if (!space_right()) { if (space_left3()) { if (!moveleft()) return; if (!moveleft()) terugkeer; xi--; xi--; } anders terugkeren; } else if (!space_right2()) { if (space_left2()) { if (!moveleft()) return; xi--; } anders terugkeren; } blok[xi][yi]=0; blok[xi][yi+2]=0; blok[xi][yi+3]=0; blok[xi-1][yi+1]=1; blok[xi+1][yi+1]=1; blok[xi+2][yi+1]=1; blokrotatie =1; } else { block[xi][yi]=0; blok[xi+2][yi]=0; blok[xi+3][yi]=0; blok[xi+1][yi-1]=1; blok[xi+1][yi+1]=1; blok[xi+1][yi+2]=1; blokrotatie =0; } } //offset naar midden xi ++; ja ++; if (bloktype ==1) { if (blokrotatie ==0) { block[xi-1][yi-1] =0; blok[xi-1][yi] =0; blok[xi+1][yi] =0; blok[xi][yi-1] =1; blok[xi+1][yi-1] =1; blok[xi][yi+1] =1; blokrotatie =1; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; xi++; } xi--; blok[xi][yi-1] =0; blok[xi+1][yi-1] =0; blok[xi][yi+1] =0; blok[xi-1][yi] =1; blok[xi+1][yi] =1; blok[xi+1][yi+1] =1; blokrotatie =2; } else if (blokrotatie ==2) { yi --; blok[xi-1][yi] =0; blok[xi+1][yi] =0; blok[xi+1][yi+1] =0; blok[xi][yi-1] =1; blok[xi][yi+1] =1; blok[xi-1][yi+1] =1; blokrotatie =3; } else { if (!space_right()) { if (!moveleft()) return; xi--; } blok[xi][yi-1] =0; blok[xi][yi+1] =0; blok[xi-1][yi+1] =0; blok[xi-1][yi-1] =1; blok[xi-1][yi] =1; blok[xi+1][yi] =1; blokrotatie =0; } } if (bloktype ==2) { if (blokrotatie ==0) { block[xi+1][yi-1] =0; blok[xi-1][yi] =0; blok[xi+1][yi] =0; blok[xi][yi-1] =1; blok[xi+1][yi+1] =1; blok[xi][yi+1] =1; blokrotatie =1; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; xi++; } xi--; blok[xi][yi-1] =0; blok[xi+1][yi+1] =0; blok[xi][yi+1] =0; blok[xi-1][yi] =1; blok[xi+1][yi] =1; blok[xi-1][yi+1] =1; blokrotatie =2; } else if (blokrotatie ==2) { yi --; blok[xi-1][yi] =0; blok[xi+1][yi] =0; blok[xi-1][yi+1] =0; blok[xi][yi-1] =1; blok[xi][yi+1] =1; blok[xi-1][yi-1] =1; blokrotatie =3; } else { if (!space_right()) { if (!moveleft()) return; xi--; } blok[xi][yi-1] =0; blok[xi][yi+1] =0; blok[xi-1][yi-1] =0; blok[xi+1][yi-1] =1; blok[xi-1][yi] =1; blok[xi+1][yi] =1; blokrotatie =0; } } if (bloktype ==4) { if (blokrotatie ==0) { block[xi+1][yi-1] =0; blok[xi-1][yi] =0; blok[xi+1][yi] =1; blok[xi+1][yi+1] =1; blokrotatie =1; } else { if (!space_left()) { if (!moveright()) return; xi++; } xi--; blok[xi+1][yi] =0; blok[xi+1][yi+1] =0; blok[xi-1][yi] =1; blok[xi+1][yi-1] =1; blokrotatie =0; } } if (bloktype ==5) { if (blokrotatie ==0) { block[xi][yi-1] =0; blok[xi-1][yi] =0; blok[xi+1][yi] =0; blok[xi][yi-1] =1; blok[xi+1][yi] =1; blok[xi][yi+1] =1; blokrotatie =1; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; xi++; } xi--; blok[xi][yi-1] =0; blok[xi+1][yi] =0; blok[xi][yi+1] =0; blok[xi-1][yi] =1; blok[xi+1][yi] =1; blok[xi][yi+1] =1; blokrotatie =2; } else if (blokrotatie ==2) { yi --; blok[xi-1][yi] =0; blok[xi+1][yi] =0; blok[xi][yi+1] =0; blok[xi][yi-1] =1; blok[xi-1][yi] =1; blok[xi][yi+1] =1; blokrotatie =3; } else { if (!space_right()) { if (!moveleft()) return; xi--; } blok[xi][yi-1] =0; blok[xi-1][yi] =0; blok[xi][yi+1] =0; blok[xi][yi-1] =1; blok[xi-1][yi] =1; blok[xi+1][yi] =1; blokrotatie =0; } } if (bloktype ==6) { if (blokrotatie ==0) { block[xi-1][yi-1] =0; blok[xi][yi-1] =0; blok[xi+1][yi-1] =1; blok[xi][yi+1] =1; blokrotatie =1; } else { if (!space_left()) { if (!moveright()) return; xi++; } xi--; blok[xi+1][yi-1] =0; blok[xi][yi+1] =0; blok[xi-1][yi-1] =1; blok[xi][yi-1] =1; blokrotatie =0; } } // als het gemaakte blok en de stapel elkaar overlappen, duwt u de rijen omhoog terwijl (!check_overlap()) { for (i=0;i<18;i++) { for (j=0;j<8;j++) { block [j][i] =blok[j][i+1]; } } vertragingen =millis() + vertraging_; } updateLED(); }void movedown(){ if (space_below()) { // move down int i; voor (i=15;i>=0;i--) { int j; for (j=0;j<8;j++) { block[j][i] =block[j][i-1]; } } voor (i=0;i<7;i++) { block[i][0] =0; } } else { //merge en nieuw blok int i; intj; for (i=0;i<8;i++) { for(j=0;j<16;j++) { if (block[i][j]) { pile[i][j]=1; blok[i][j]=0; } } } newBlock(); } updateLED(); }boolean check_overlap(){ int i; intj; for (i=0;i<16;i++) { for (j=0;j<7;j++) { if (block[j][i]) { if (pile[j][i]) return false; } } } for (i=16;i<18;i++) { for (j=0;j<7;j++) { if (block[j][i]) { return false; } } } return true;}void check_gameover(){ int i; intj; int cnt=0;; for(i=15;i>=0;i--) { cnt=0; for (j=0;j<8;j++) { if (pile[j][i]) { cnt ++; } } if (cnt ==8) { regels++; for (j=0;j<8;j++) {stapel[j][i]=0; } updateLED(); vertraging (50); int k; for(k=i;k>0;k--) { for (j=0;j<8;j++) { stapel[j][k] =stapel[j][k-1]; } } voor (j=0;j<8;j++) {stapel[j][0] =0; } updateLED(); vertraging (50); i++; } } for(i=0;i<8;i++) { if (pile[i][0]) gameover(); } return;}void gameover(){ int i; intj; //close blind for (i=0;i<8;i++) { for (j=0;j<16;j++) { if (j%2) { disp[i][j]=1; } else { disp[7-i][j]=1; } } vertraging (60); } // bereken scorebord int num_lines; aantal_lijnen =2; booleaanse score[8][17]; for (i=0;i<8;i++) { for (j=0;j<16;j++) {score[i][j] =0; } } int digit1 =(regels/10) % 10; int digit2 =(regels) % 10; for (i=0;i<5;i++) for (j=0;j<8;j++) {score[7-j][i+3] =lib[digit1][i][j]; } for (i=0;i<5;i++) for (j=0;j<8;j++) {score[7-j][i+9] =lib[digit2][i][j]; } voor (i=0;i<16;i++) {score[0][i]=0; } //open blind met score voor (i=0;i<8;i++) { for (j=0;j<16;j++) { if (j%2) { disp[i][j]=score[ ik][j]; } else { disp[7-i][j]=score[7-i][j]; } } vertraging (60); } vertraging(100); while(true) { for (i=0;i<8;i++) { for (j=0;j<16;j++) { disp[i][j] =score[i][j]; } } booleaanse tmpline[8]; for (i=0;i<8;i++) {score[i][16]=score[i][0]; } for (i=0;i<8;i++) { for (j=0;j<16;j++) { score[i][j] =score[i][j+1]; } } vertraging (100); } }nietig newBlock(){ check_gameover(); bloktype =willekeurig (7); if (bloktype ==0) // 0 // 0 // 0 // 0 { block[3][0]=1; blok[3][1]=1; blok[3][2]=1; blok[3][3]=1; } if (bloktype ==1) // 0 // 0 0 0 { block[2][0]=1; blok[2][1]=1; blok[3][1]=1; blok[4][1]=1; } if (bloktype ==2) // 0 // 0 0 0 { block[4][0]=1; blok[2][1]=1; blok[3][1]=1; blok[4][1]=1; } if (bloktype ==3) // 0 0 // 0 0 { block[3][0]=1; blok[3][1]=1; blok[4][0]=1; blok[4][1]=1; } if (bloktype ==4) // 0 0 // 0 0 { block[4][0]=1; blok[5][0]=1; blok[3][1]=1; blok[4][1]=1; } if (bloktype ==5) // 0 // 0 0 0 { block[4][0]=1; blok[3][1]=1; blok[4][1]=1; blok[5][1]=1; } if (bloktype ==6) // 0 0 // 0 0 { block[3][0]=1; blok[4][0]=1; blok[4][1]=1; blok[5][1]=1; } blockrotation =0;}boolean space_below(){ int i; intj; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (i ==15) return false; if (pile[j][i+1]) { return false; } } } } return true;}boolean space_left2(){ int i; intj; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==0 || j ==1) retourneer onwaar; if (stapel[j-1][i] | stapel[j-2][i]) { return false; } } } } return true;}boolean space_left3(){ int i; intj; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==0 || j ==1 ||j ==2 ) retourneer onwaar; if (stapel[j-1][i] | stapel[j-2][i]|stapel[j-3][i]) { return false; } } } } return true;}boolean space_left(){ int i; intj; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==0) return false; if (pile[j-1][i]) { return false; } } } } return true;}boolean space_right(){ int i; intj; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==7) return false; if (pile[j+1][i]) { return false; } } } } return true;}boolean space_right3(){ int i; intj; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==7||j ==6||j ==5) retourneer onwaar; if (stapel[j+1][i] |stapel[j+2][i] | stapel[j+3][i]) { return false; } } } } return true;}boolean space_right2(){ int i; intj; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==7 || j ==6) retourneer onwaar; if (pile[j+1][i] |pile[j+2][i]) { return false; } } } } return true;}ISR(TIMER1_COMPA_vect){ // verander de 0 in 1 voor timer1 en 2 voor timer2 LEDRefresh();}void LEDRefresh(){ int i; int k; ////////////////////////////////////////////////// Ik heb de pinnen verkeerd gesoldeerd. (12345670 in plaats van 01234567). // dus dit gedeelte van de code is bedoeld om dit probleem met de software te corrigeren. booleaanse tmpdisp[8][16]; for (k=0;k<16;k++) { for(i=1;i<8;i++) { tmpdisp[i][k]=disp[i-1][k]; } tmpdisp[0][k]=disp[7][k]; } ////////////////////////////////////////////// voor(ik =0;i<8;i++) { int j; if (i ==0) j =rijPin+7; anders j =rijPin+i-1; byte bovenste =0; int b; for(b =0;b<8;b++) { bovenste <<=1; if (!tmpdisp[b][i]) bovenste |=1; } byte lager =0; for(b =0;b<8;b++) { lager <<=1; if (!tmpdisp[b][i+8]) lager |=1; } digitalWrite(j,LOW); digitalWrite (LatchPin, LAAG); shiftOut(dataPin, clockPin, LSBFIRST, lager); shiftOut(dataPin, clockPin, LSBFIRST, bovenste); digitalWrite (LatchPin, HOOG); digitalWrite(rijPin+i,HOOG); vertraging(1); } digitalWrite(rowPin+7,LOW); }

Schema's


Productieproces

  1. Arduino-gyroscoopspel met MPU-6050
  2. Arduino digitale dobbelstenen
  3. Zelfgemaakte tv B-Gone
  4. Arduino-gamecontroller
  5. Arduino Pong Game op 24x16 Matrix met MAX7219
  6. Pixel Chaser-game
  7. Enkele LED Matrix Arduino Flip Clock
  8. NeoMatrix Arduino Pong
  9. Handheld geigerteller met Arduino Nano
  10. DIY Arduino 1D Pong-spel met WS2812 LED-strip
  11. Rijd nooit alleen