Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Jeu Arduino Nano Tetris sur matrice 16x8 maison

Composants et fournitures

Arduino Nano R3
× 1
Interrupteur à bouton-poussoir SparkFun 12mm
× 4
Texas Instruments Shift Register - Série à Parallèle
× 2
Interrupteur à glissière
× 1
LED 5 mm :Jaune
× 128

Outils et machines nécessaires

Fer à souder (générique)

Applications et services en ligne

Arduino IDE

À propos de ce projet

J'ai construit ce jeu de tetris avec une matrice LED 16x8 maison, Arduino Nano et deux registres à décalage 74hc595. J'ai également ajouté un bip lorsque vous appuyez sur n'importe quel bouton.

Code

  • code
codeArduino
/*Auteur :Jae Yeong Bae UBC ECE jocker.tistory.com Date :18 janvier 2013 Fichier :Tetris v2Changelog :v2 :affiche le score à la fin du jeu Objectif :tuer le temps. Registres à décalage 74HC575 dans l'ordre : broches vertes, bleues et rouges : Latch =3 horloge =2 données =4 anodes de rangée =5 à 13 (8 broches) partagées entre les deux boutons de la matrice (comme numérique) :A4 =gauche A5 =bas A6 =droite A7 =haut (rotation) Commentaire :Ceci est mon deuxième projet Arduino. Le code peut être désordonné et inefficace. Références de la bibliothèque Arduino et des fiches techniques.*/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;short btdowndelay =30;short btsidedelay =80;unsigned char blocktype;unsigned char blockrotation;int lines =0;boolean block[8][18]; //2 extra pour 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][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; lib[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); randomSeed(seed); aléatoire (10,9610806) ; graine =graine *random(3336,15679912)+analogRead(random(4)) ; randomSeed(seed); aléatoire (10 98046); cli();//arrêter les interruptions//définir l'interruption timer0 à 2kHz TCCR1A =0 ;// définir tout le registre TCCR0A à 0 TCCR1B =0 ;// idem pour TCCR0B TCNT1 =0 ;//initialiser la valeur du compteur à 0 // définir comparer le registre de correspondance pour les incréments de 2 kHz OCR1A =259 ; // =(16*10^6) / (2000*64) - 1 (doit être <256) // activer le mode CTC TCCR1A |=(1 <0;i--) { pour (j=0;j<16;j++) { bloc[i][j]=bloc[i-1][j]; } } pour (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) { //bdelay gauche =millis() + btsidedelay; retour 3; } if (analogRead(A5)> 500) { //down bdelay =millis() + btdowndelay; retour 4; } if (analogRead(A6)> 500) { //bdelay droit =​​millis() + btsidedelay; retour 2; } if (analogRead(A7)> 500) { //up bdelay =millis() + buttondelay; retour 1 ; } return 0;}void updateLED(){ int i; entier j; pour (i=0;i<8;i++) { pour (j=0;j<16;j++) { disp[i][j] =block[i][j] | pile[i][j]; } }}void rotate(){ //saut pour square block(3) if (blocktype ==3) return; entier xi; int yi; int je; entier j; //détecter la gauche pour (i=7;i>=0;i--) { pour (j=0;j<16;j++) { if (block[i][j]) { xi =i; } } } //détecter pour (i=15;i>=0;i--) { pour (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++ ; } autre retour ; } else if (!space_right()) { if (space_left3()) { if (!moveleft()) return ; if (!moveleft()) return ; xi--; xi--; } autre retour ; } else if (!space_right2()) { if (space_left2()) { if (!moveleft()) return ; xi--; } autre retour ; } bloc[xi][yi]=0; bloc[xi][yi+2]=0; bloc[xi][yi+3]=0; bloc[xi-1][yi+1]=1 ; bloc[xi+1][yi+1]=1 ; bloc[xi+2][yi+1]=1 ; rotation de bloc =1 ; } else { bloc[xi][yi]=0; bloc[xi+2][yi]=0; bloc[xi+3][yi]=0; bloc[xi+1][yi-1]=1 ; bloc[xi+1][yi+1]=1 ; bloc[xi+1][yi+2]=1 ; rotation de bloc =0 ; } } //décalage au milieu de xi ++; oui ++; if (blocktype ==1) { if (blockrotation ==0) { block[xi-1][yi-1] =0; bloc[xi-1][yi] =0; bloc[xi+1][yi] =0; bloc[xi][yi-1] =1; bloc[xi+1][yi-1] =1 ; bloc[xi][yi+1] =1 ; rotation de bloc =1 ; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; xi++ ; } xi--; bloc[xi][yi-1] =0; bloc[xi+1][yi-1] =0 ; bloc[xi][yi+1] =0; bloc[xi-1][yi] =1 ; bloc[xi+1][yi] =1 ; bloc[xi+1][yi+1] =1 ; rotation de bloc =2 ; } else if (blockrotation ==2) { yi --; bloc[xi-1][yi] =0; bloc[xi+1][yi] =0; bloc[xi+1][yi+1] =0 ; bloc[xi][yi-1] =1; bloc[xi][yi+1] =1 ; bloc[xi-1][yi+1] =1 ; rotation de bloc =3 ; } else { if (!space_right()) { if (!moveleft()) return ; xi--; } bloc[xi][yi-1] =0; bloc[xi][yi+1] =0; bloc[xi-1][yi+1] =0 ; bloc[xi-1][yi-1] =1 ; bloc[xi-1][yi] =1 ; bloc[xi+1][yi] =1 ; rotation de bloc =0 ; } } if (blocktype ==2) { if (blockrotation ==0) { block[xi+1][yi-1] =0; bloc[xi-1][yi] =0; bloc[xi+1][yi] =0; bloc[xi][yi-1] =1; bloc[xi+1][yi+1] =1 ; bloc[xi][yi+1] =1 ; rotation de bloc =1 ; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; xi++ ; } xi--; bloc[xi][yi-1] =0; bloc[xi+1][yi+1] =0 ; bloc[xi][yi+1] =0; bloc[xi-1][yi] =1 ; bloc[xi+1][yi] =1 ; bloc[xi-1][yi+1] =1 ; rotation de bloc =2 ; } else if (blockrotation ==2) { yi --; bloc[xi-1][yi] =0; bloc[xi+1][yi] =0; bloc[xi-1][yi+1] =0 ; bloc[xi][yi-1] =1; bloc[xi][yi+1] =1 ; bloc[xi-1][yi-1] =1 ; rotation de bloc =3 ; } else { if (!space_right()) { if (!moveleft()) return ; xi--; } bloc[xi][yi-1] =0; bloc[xi][yi+1] =0; bloc[xi-1][yi-1] =0 ; bloc[xi+1][yi-1] =1 ; bloc[xi-1][yi] =1 ; bloc[xi+1][yi] =1 ; rotation de bloc =0 ; } } if (blocktype ==4) { if (blockrotation ==0) { block[xi+1][yi-1] =0; bloc[xi-1][yi] =0; bloc[xi+1][yi] =1 ; bloc[xi+1][yi+1] =1 ; rotation de bloc =1 ; } else { if (!space_left()) { if (!moveright()) return; xi++ ; } xi--; bloc[xi+1][yi] =0; bloc[xi+1][yi+1] =0 ; bloc[xi-1][yi] =1 ; bloc[xi+1][yi-1] =1 ; rotation de bloc =0 ; } } if (blocktype ==5) { if (blockrotation ==0) { block[xi][yi-1] =0; bloc[xi-1][yi] =0; bloc[xi+1][yi] =0; bloc[xi][yi-1] =1; bloc[xi+1][yi] =1 ; bloc[xi][yi+1] =1 ; rotation de bloc =1 ; } else if (blockrotation ==1) { if (!space_left()) { if (!moveright()) return; xi++ ; } xi--; bloc[xi][yi-1] =0; bloc[xi+1][yi] =0; bloc[xi][yi+1] =0; bloc[xi-1][yi] =1 ; bloc[xi+1][yi] =1 ; bloc[xi][yi+1] =1 ; rotation de bloc =2 ; } else if (blockrotation ==2) { yi --; bloc[xi-1][yi] =0; bloc[xi+1][yi] =0; bloc[xi][yi+1] =0; bloc[xi][yi-1] =1; bloc[xi-1][yi] =1 ; bloc[xi][yi+1] =1 ; rotation de bloc =3 ; } else { if (!space_right()) { if (!moveleft()) return ; xi--; } bloc[xi][yi-1] =0; bloc[xi-1][yi] =0; bloc[xi][yi+1] =0; bloc[xi][yi-1] =1; bloc[xi-1][yi] =1 ; bloc[xi+1][yi] =1 ; rotation de bloc =0 ; } } if (blocktype ==6) { if (blockrotation ==0) { block[xi-1][yi-1] =0; bloc[xi][yi-1] =0; bloc[xi+1][yi-1] =1 ; bloc[xi][yi+1] =1 ; rotation de bloc =1 ; } else { if (!space_left()) { if (!moveright()) return; xi++ ; } xi--; bloc[xi+1][yi-1] =0 ; bloc[xi][yi+1] =0; bloc[xi-1][yi-1] =1 ; bloc[xi][yi-1] =1; rotation de bloc =0 ; } } //si la rotation du bloc fait et de la pile se chevauchent, poussez les lignes vers le haut tandis que (!check_overlap()) { for (i=0;i<18;i++) { for (j=0;j<8;j++) { block [j][i] =bloc[j][i+1] ; } } délais =millis() + délai_; } updateLED(); }void movedown(){ if (space_below()) { //deplacer vers le bas int i; pour (i=15;i>=0;i--) { int j; pour (j=0;j<8;j++) { bloc[j][i] =bloc[j][i-1]; } } pour (i=0;i<7;i++) { block[i][0] =0; } } else { //fusion et nouveau bloc int i; entier j; for (i=0;i<8;i++) { for(j=0;j<16;j++) { if (bloc[i][j]) { pile[i][j]=1; bloc[i][j]=0; } } } nouveauBloc(); } updateLED(); }booléen check_overlap(){ int i; entier j; for (i=0;i<16;i++) { for (j=0;j<7;j++) { if (block[j][i]) { if (pile[j][i]) return false; } } } pour (i=16;i<18;i++) { pour (j=0;j<7;j++) { if (block[j][i]) { return false; } } } return true;}void check_gameover(){ int i; entier j; int cnt=0;; pour(i=15;i>=0;i--) { cnt=0; for (j=0;j<8;j++) { if (pile[j][i]) { cnt ++; } } if (cnt ==8) { lignes++; pour (j=0;j<8;j++) { pile[j][i]=0; } updateLED(); retard (50); entier k; for(k=i;k>0;k--) { for (j=0;j<8;j++) { pile[j][k] =pile[j][k-1]; } } pour (j=0;j<8;j++) { pile[j][0] =0; } updateLED(); retard (50); je++ ; } } for(i=0;i<8;i++) { if (pile[i][0]) gameover(); } return;} void gameover(){ int i; entier j; //fermer le store pour (i=0;i<8;i++) { pour (j=0;j<16;j++) { if (j%2) { disp[i][j]=1; } else { disp[7-i][j]=1; } } délai(60); } //calculer le tableau des scores int num_lines; nombre_lignes =2 ; score booléen[8][17] ; pour (i=0;i<8;i++) { pour (j=0;j<16;j++) { score[i][j] =0; } } int digit1 =(lignes/10) % 10; int digit2 =(lignes) % 10 ; pour (i=0;i<5;i++) pour (j=0;j<8;j++) { score[7-j][i+3] =lib[digit1][i][j]; } pour (i=0;i<5;i++) pour (j=0;j<8;j++) { score[7-j][i+9] =lib[digit2][i][j]; } pour (i=0;i<16;i++) { score[0][i]=0; } // aveugle ouvert avec score pour (i=0;i<8;i++) { pour (j=0;j<16;j++) { if (j%2) { disp[i][j]=score[ i][j] ; } else { disp[7-i][j]=score[7-i][j] ; } } délai(60); } retard (100); while(true) { pour (i=0;i<8;i++) { pour (j=0;j<16;j++) { disp[i][j] =score[i][j]; } } booléen tmpline[8]; pour (i=0;i<8;i++) { score[i][16]=score[i][0] ; } pour (i=0;i<8;i++) { pour (j=0;j<16;j++) { score[i][j] =score[i][j+1]; } } délai (100); } }void newBlock(){ check_gameover(); type de bloc =aléatoire(7) ; if (blocktype ==0) // 0 // 0 // 0 // 0 { block[3][0]=1; bloc[3][1]=1 ; bloc[3][2]=1 ; bloc[3][3]=1 ; } if (blocktype ==1) // 0 // 0 0 0 { block[2][0]=1; bloc[2][1]=1 ; bloc[3][1]=1 ; bloc[4][1]=1 ; } if (blocktype ==2) // 0 // 0 0 0 { block[4][0]=1; bloc[2][1]=1 ; bloc[3][1]=1 ; bloc[4][1]=1 ; } if (blocktype ==3) // 0 0 // 0 0 { block[3][0]=1; bloc[3][1]=1 ; bloc[4][0]=1 ; bloc[4][1]=1 ; } if (blocktype ==4) // 0 0 // 0 0 { block[4][0]=1; bloc[5][0]=1 ; bloc[3][1]=1 ; bloc[4][1]=1 ; } if (type de bloc ==5) // 0 // 0 0 0 { bloc[4][0]=1; bloc[3][1]=1 ; bloc[4][1]=1 ; bloc[5][1]=1 ; } if (blocktype ==6) // 0 0 // 0 0 { block[3][0]=1; bloc[4][0]=1 ; bloc[4][1]=1 ; bloc[5][1]=1 ; } blockrotation =0;}boolean space_below(){ int i; entier 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; } } } } return true;}boolean space_left2(){ int i; entier j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==0 || j ==1) renvoie faux ; if (pile[j-1][i] | pile[j-2][i]) { return false; } } } } return true;}boolean space_left3(){ int i; entier j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==0 || j ==1 ||j ==2 ) renvoie faux ; if (pile[j-1][i] | pile[j-2][i]|pile[j-3][i]) { return false; } } } } return true;}boolean space_left(){ int i; entier 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; } } } } return true;}boolean space_right(){ int i; entier j; 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; entier j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==7||j ==6||j ==5) renvoie faux ; if (pile[j+1][i] |pile[j+2][i] | pile[j+3][i]) { return false; } } } } return true;}boolean space_right2(){ int i; entier j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (block[j][i]) { if (j ==7 || j ==6) renvoie faux ; if (pile[j+1][i] |pile[j+2][i]) { return false; } } } } return true;}ISR(TIMER1_COMPA_vect){ //changer le 0 en 1 pour timer1 et 2 pour timer2 LEDRefresh();}void LEDRefresh(){ int i; entier k; //////////////////////////////////////////////////////////// // J'ai mal soudé les broches. (12345670 au lieu de 01234567). // donc cette partie du code est destinée à corriger ce problème par logiciel. booléen 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] ; } //////////////////////////////////////////// pour(i =0;i<8;i++) { int j; si (i ==0) j =rowPin+7 ; sinon j =rowPin+i-1 ; octet supérieur =0 ; int b; for(b =0;b<8;b++) { supérieur <<=1; si (!tmpdisp[b][i]) supérieur |=1; } octet inférieur =0 ; for(b =0;b<8;b++) { inférieur <<=1; si (!tmpdisp[b][i+8]) inférieur |=1; } digitalWrite(j,LOW); digitalWrite(latchPin, LOW); shiftOut(dataPin, clockPin, LSBFIRST, inférieur); shiftOut(dataPin, clockPin, LSBFIRST, supérieur); digitalWrite(latchPin, HAUT); digitalWrite(rowPin+i,HIGH); retard(1) ; } digitalWrite(rowPin+7,LOW); }

Schémas


Processus de fabrication

  1. Jeu de gyroscope Arduino avec MPU-6050
  2. Dés numériques Arduino
  3. Téléviseur maison B-Gone
  4. Contrôleur de jeu Arduino
  5. Jeu Arduino Pong sur matrice 24x16 avec MAX7219
  6. Jeu Pixel Chaser
  7. Horloge à bascule Arduino à matrice LED unique
  8. NeoMatrix Arduino Pong
  9. Ne roulez jamais seul