Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino Nano Tetris-Spiel auf hausgemachter 16x8-Matrix

Komponenten und Verbrauchsmaterialien

Arduino Nano R3
× 1
SparkFun Drucktastenschalter 12 mm
× 4
Schieberegister von Texas Instruments - seriell zu parallel
× 2
Schiebeschalter
× 1
5 mm LED:Gelb
× 128

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)

Apps und Onlinedienste

Arduino-IDE

Über dieses Projekt

Ich habe dieses Tetris-Spiel mit hausgemachter 16x8-LED-Matrix, Arduino Nano und zwei 74hc595-Schieberegistern gebaut. Ich habe auch einen Piepton hinzugefügt, wenn du eine beliebige Taste drückst.

Code

  • Code
codeArduino
/*Autor:Jae Yeong Bae UBC ECE jocker.tistory.com Datum:18. Januar 2013Datei:Tetris v2Changelog:v2:zeigt den Spielstand beim Gameover an Zweck:Zeit totschlagen.. + zum Spaß Schaltungen+Pins:Led Matrix:2 74HC575 Schieberegister in der Reihenfolge:Grüne, Blaue, Rote Pins:Latch =3 Clock =2 Data =4 Row Anodes =5 bis 13 (8pins) geteilt von beiden Matrixtasten (als digital):A4 =links A5 =unten A6 =rechts A7 =up (rotate)Comment:Dies ist mein zweites Arduino-Projekt. Code kann unordentlich und ineffizient sein. Referenzen aus der Arduino-Bibliothek und Datenblättern.*/unsigned char LatchPin =3;unsigned char clockPin =2;unsigned char dataPin =4;unsigned char rowPin =5;lange Verzögerungen =0;kurze Verzögerung_ =500;lange bdelay =0;kurze Tastenverzögerung =150;kurze btdowndelay =30;kurze btsidedelay =80;unsigned char blocktype;unsigned char blockrotation;int lines =0;boolean block[8][18]; // Extra für Rotationboolean Pile[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][][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][][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][][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][ ] =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); zufälligSamen (Samen); zufällig (10,9610806); Seed =Seed *zufällig (3336,15679912) +analogRead (zufällig (4)); zufälligSamen (Samen); zufällig (10,98046); cli(); // Stoppe Interrupts // setze Timer0 Interrupt auf 2kHz TCCR1A =0; // setze das gesamte TCCR0A Register auf 0 TCCR1B =0; // dasselbe für TCCR0B TCNT1 =0; // initialisiere den Zählerwert auf 0 // set Vergleichsregister für 2khz-Inkremente OCR1A =259; // =(16*10^6) / (2000*64) - 1 (muss <256 sein) // CTC-Modus einschalten TCCR1A |=(1 <0;i--) { für (j=0;j<16;j++) { Block[i][j]=Block[i-1][j]; } } für (j=0;j<16;j++) {block[0][j]=0; } updateLED(); 1 zurückgeben; } Rückgabe 0;}int readBut () { if (bdelay> millis ()) { Rückgabe 0; aufrechtzuerhalten. Wenn (analogRead (A4)> 500) {//links bdelay =millis () + btsidedelay; Rückkehr 3; aufrechtzuerhalten. Wenn (analogRead (A5)> 500) {//down bdelay =millis () + btdowndelay; Rückkehr 4; aufrechtzuerhalten. Wenn (analogRead (A6)> 500) {//rechts bdelay =millis () + btsidedelay; zurück 2; aufrechtzuerhalten. Wenn (analogRead (A7)> 500) {//up bdelay =millis () + buttondelay; 1 zurückgeben; } Rückgabe 0;}void updateLED () { int i; int j; for (i=0;i<8;i++) { for (j=0;j<16;j++) { disp[i][j] =block[i][j] | Haufen[i][j]; aufrechtzuerhalten. aufrechtzuerhalten. aufrechtzuerhalten. int xi; int yi; int ich; int j; //Erkenne links für (i=7;i>=0;i--) { for (j=0;j<16;j++) { if (block[i][j]) { xi =i; } } } //detektieren für (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++; } sonst zurück; } else if (!space_right()) { if (space_left3()) { if (!moveleft()) return; if (!moveleft()) return; xi--; xi--; } sonst zurück; } else if (!space_right2()) { if (space_left2()) { if (!moveleft()) zurück; xi--; } sonst zurück; } block[xi][yi]=0; block[xi][yi+2]=0; block[xi][yi+3]=0; block[xi-1][yi+1]=1; block[xi+1][yi+1]=1; block[xi+2][yi+1]=1; Blockrotation =1; aufrechtzuerhalten. Sonst { Block[xi][yi]=0; block[xi+2][yi]=0; block[xi+3] [yi]=0; block[xi+1][yi-1]=1; block[xi+1][yi+1]=1; block[xi+1][yi+2]=1; Blockrotation =0; } } //Offset zur Mitte von xi ++; yi++; if (Blocktyp ==1) { if (Blockrotation ==0) { Block[xi-1][yi-1] =0; block[xi-1][yi] =0; block[xi+1][yi] =0; block[xi][yi-1] =1; block[xi+1][yi-1] =1; block[xi][yi+1] =1; Blockrotation =1; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; xi++; } xi--; block[xi][yi-1] =0; block[xi+1][yi-1] =0; block[xi][yi+1] =0; block[xi-1][yi] =1; block[xi+1][yi] =1; block[xi+1][yi+1] =1; Blockrotation =2; aufrechtzuerhalten. Sonst if (Blockrotation ==2) { yi --; block[xi-1][yi] =0; block[xi+1][yi] =0; block[xi+1][yi+1] =0; block[xi][yi-1] =1; block[xi][yi+1] =1; block[xi-1][yi+1] =1; Blockrotation =3; } else { if (!space_right()) { if (!moveleft()) return; xi--; } block[xi][yi-1] =0; block[xi][yi+1] =0; block[xi-1][yi+1] =0; block[xi-1][yi-1] =1; block[xi-1][yi] =1; block[xi+1][yi] =1; Blockrotation =0; }} if (Blocktyp ==2) { if (Blockrotation ==0) { Block[xi+1][yi-1] =0; block[xi-1][yi] =0; block[xi+1][yi] =0; block[xi][yi-1] =1; block[xi+1][yi+1] =1; block[xi][yi+1] =1; Blockrotation =1; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; xi++; } xi--; block[xi][yi-1] =0; block[xi+1][yi+1] =0; block[xi][yi+1] =0; block[xi-1][yi] =1; block[xi+1][yi] =1; block[xi-1][yi+1] =1; Blockrotation =2; aufrechtzuerhalten. Sonst if (Blockrotation ==2) { yi --; block[xi-1][yi] =0; block[xi+1][yi] =0; block[xi-1][yi+1] =0; block[xi][yi-1] =1; block[xi][yi+1] =1; block[xi-1][yi-1] =1; Blockrotation =3; } else { if (!space_right()) { if (!moveleft()) return; xi--; } block[xi][yi-1] =0; block[xi][yi+1] =0; block[xi-1][yi-1] =0; block[xi+1][yi-1] =1; block[xi-1][yi] =1; block[xi+1][yi] =1; Blockrotation =0; }} if (Blocktyp ==4) { if (Blockrotation ==0) { Block[xi+1][yi-1] =0; block[xi-1][yi] =0; block[xi+1][yi] =1; block[xi+1][yi+1] =1; Blockrotation =1; } else { if (!space_left()) { if (!moveright()) return; xi++; } xi--; block[xi+1][yi] =0; block[xi+1][yi+1] =0; block[xi-1][yi] =1; block[xi+1][yi-1] =1; Blockrotation =0; }} if (Blocktyp ==5) { if (Blockrotation ==0) { Block[xi][yi-1] =0; block[xi-1][yi] =0; block[xi+1][yi] =0; block[xi][yi-1] =1; block[xi+1][yi] =1; block[xi][yi+1] =1; Blockrotation =1; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; xi++; } xi--; block[xi][yi-1] =0; block[xi+1][yi] =0; block[xi][yi+1] =0; block[xi-1][yi] =1; block[xi+1][yi] =1; block[xi][yi+1] =1; Blockrotation =2; aufrechtzuerhalten. Sonst if (Blockrotation ==2) { yi --; block[xi-1][yi] =0; block[xi+1][yi] =0; block[xi][yi+1] =0; block[xi][yi-1] =1; block[xi-1][yi] =1; block[xi][yi+1] =1; Blockrotation =3; } else { if (!space_right()) { if (!moveleft()) return; xi--; } block[xi][yi-1] =0; block[xi-1][yi] =0; block[xi][yi+1] =0; block[xi][yi-1] =1; block[xi-1][yi] =1; block[xi+1][yi] =1; Blockrotation =0; }} if (Blocktyp ==6) { if (Blockrotation ==0) { Block[xi-1][yi-1] =0; block[xi][yi-1] =0; block[xi+1][yi-1] =1; block[xi][yi+1] =1; Blockrotation =1; } else { if (!space_left()) { if (!moveright()) return; xi++; } xi--; block[xi+1][yi-1] =0; block[xi][yi+1] =0; block[xi-1][yi-1] =1; block[xi][yi-1] =1; Blockrotation =0; aufrechtzuerhalten [j][i] =Block[j][i+1]; } } Verzögerungen =millis() + delay_; } updateLED(); }void movedown () { if (space_below ()) { // nach unten bewegen int i; für (i=15;i>=0;i--) {int j; für (j=0;j<8;j++) { Block[j][i] =Block[j][i-1]; }} für (i=0;i<7;i++) {block[i][0] =0; } } else { //merge und neuer Block int i; int j; for (i=0;i<8;i++) { for(j=0;j<16;j++) { if (block[i][j]) { Haufen[i][j]=1; block[i][j]=0; } } } neuerBlock(); } updateLED(); }boolescher check_overlap(){ int i; int j; 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; } } } true zurückgeben;}void check_gameover(){ int i; int j; 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) {lines++; für (j=0;j<8;j++) { Haufen[j][i]=0; } updateLED(); Verzögerung (50); int-k; for(k=i;k>0;k--) { for (j=0;j<8;j++) { Stapel[j][k] =Stapel[j][k-1]; } } für (j=0;j<8;j++) { Stapel[j][0] =0; } updateLED(); Verzögerung (50); i++; } } for(i=0;i<8;i++) { if (pile[i][0]) gameover(); } Rückkehr;} Spielüberschreitung () { int i; int j; // Blind schließen für (i=0;i<8;i++) { for (j=0;j<16;j++) { if (j%2) { disp[i][j]=1; } else { disp[7-i][j]=1; } } Verzögerung (60); } //Scoreboard berechnen int num_lines; Anzahl_Zeilen =2; boolesche Punktzahl[8][17]; for (i=0;i<8;i++) { for (j=0;j<16;j++) { score[i][j] =0; } } int digit1 =(Zeilen/10) % 10; int digit2 =(Zeilen) % 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]; } für (i=0;i<16;i++) { score[0][i]=0; } //open blind mit Score für (i=0;i<8;i++) { for (j=0;j<16;j++) { if (j%2) { disp[i][j]=score[ i][j]; } else { disp[7-i][j]=Score[7-i][j]; } } Verzögerung (60); } Verzögerung (100); while(true) { for (i=0;i<8;i++) { for (j=0;j<16;j++) { disp[i][j] =score[i][j]; } } boolesche tmpline[8]; für (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]; } } Verzögerung (100); } }NeuerBlock () ungültig machen { check_gameover (); Blocktyp =zufällig(7); if (Blocktyp ==0) // 0 // 0 // 0 // 0 { Block[3][0]=1; block[3] [1]=1; block[3] [2]=1; block[3][3]=1; aufrechtzuerhalten. Wenn (Blocktyp ==1) // 0 // 0 0 0 { Block[2][0]=1; block[2][1]=1; block[3] [1]=1; block[4][1]=1; } if (Blocktyp ==2) // 0 // 0 0 0 { Block[4][0]=1; block[2][1]=1; block[3] [1]=1; block[4][1]=1; } if (Blocktyp ==3) // 0 0 // 0 0 { Block [3] [0] =1; block[3] [1]=1; block[4][0]=1; block[4][1]=1; } if (Blocktyp ==4) // 0 0 // 0 0 { Block[4][0]=1; block[5][0]=1; block[3] [1]=1; block[4][1]=1; } if (Blocktyp ==5) // 0 // 0 0 0 { Block[4][0]=1; block[3] [1]=1; block[4][1]=1; block[5][1]=1; } if (Blocktyp ==6) // 0 0 // 0 0 { Block [3] [0] =1; block[4][0]=1; block[4][1]=1; block[5][1]=1; } Blockrotation =0;}Boolean space_below(){ int i; int j; 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; } } } } true zurückgeben;}Boolean space_left2(){ int i; int j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==0 || j ==1) false zurückgeben; if (stapel[j-1][i] | Stapel[j-2][i]) { return false; } } } } true zurückgeben;}Boolean space_left3(){ int i; int j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==0 || j ==1 ||j ==2 ) false zurückgeben; if (stapel[j-1][i] | Stapel[j-2][i]|stapel[j-3][i]) { return false; } } } } true zurückgeben;}Boolean space_left(){ int i; int j; 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; } } } } true zurückgeben;}Boolean space_right(){ int i; int j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==7) return false; if (stapel[j+1][i]) { return false; } } } } true zurückgeben;}Boolean space_right3(){ int i; int j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==7||j ==6||j ==5) false zurückgeben; if (stapel[j+1][i] |stapel[j+2][i] | Stapel[j+3][i]) { return false; } } } } true zurückgeben;}Boolean space_right2(){ int i; int j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==7 || j ==6) false zurückgeben; if (stapel[j+1][i] |stapel[j+2][i]) { return false; aufrechtzuerhalten. int-k; /////////////////////////////////////////////// // Ich habe Pins falsch gelötet. (12345670 statt 01234567). // Dieser Teil des Codes dient also dazu, dieses Problem durch die Software zu beheben. boolesches 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]; } //////////////////////////////////////////// für(i =0;i<8;i++) {int j; if (i ==0) j =rowPin+7; sonst j =rowPin+i-1; oberes Byte =0; intb; for(b =0;b<8;b++) {oben <<=1; if (!tmpdisp[b][i]) obere |=1; } Byte niedriger =0; for(b =0;b<8;b++) { niedriger <<=1; if (!tmpdisp[b][i+8]) niedriger |=1; } digitalWrite(j,LOW); digitalWrite (LatchPin, LOW); shiftOut (dataPin, clockPin, LSBFIRST, niedriger); shiftOut (dataPin, clockPin, LSBFIRST, oben); digitalWrite (LatchPin, HIGH); digitalWrite(rowPin+i,HIGH); Verzögerung (1); } digitalWrite (rowPin+7,LOW); }

Schaltpläne


Herstellungsprozess

  1. Arduino-Gyroskop-Spiel mit MPU-6050
  2. Arduino Digital Dice
  3. Selbstgemachter Fernseher B-Gone
  4. Arduino-Gamecontroller
  5. Arduino-Pong-Spiel auf einer 24x16-Matrix mit MAX7219
  6. Pixel-Chaser-Spiel
  7. Einzelne LED-Matrix-Arduino Flip Clock
  8. NeoMatrix Arduino Pong
  9. Handheld-Geigerzähler mit Arduino Nano
  10. Fahre niemals allein