Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Game Arduino Nano Tetris di Matriks 16x8 Buatan Sendiri

Komponen dan persediaan

Arduino Nano R3
× 1
Sakelar Tombol Tekan SparkFun 12mm
× 4
Texas Instruments Shift Register- Serial to Parallel
× 2
Sakelar Geser
× 1
LED 5 mm:Kuning
× 128

Alat dan mesin yang diperlukan

Besi solder (generik)

Aplikasi dan layanan online

Arduino IDE

Tentang proyek ini

Saya membuat game tetris ini dengan matriks LED 16x8 buatan sendiri, Arduino Nano, dan dua register geser 74hc595. Saya juga menambahkan suara bip saat Anda menekan tombol apa saja.

Kode

  • kode
kodeArduino
/*Penulis:Jae Yeong Bae UBC ECE jocker.tistory.com Tanggal:Jan.18.2013File:Tetris v2Changelog:v2:menampilkan skor di gameover Tujuan:menghabiskan waktu.. + untuk bersenang-senang Sirkuit+Pin:Matriks Led:2 74HC575 Shift Register dalam urutan:Hijau, Biru, Merah pin:Latch =3 Jam =2 Data =4 Baris Anoda =5 sampai 13 (8pin) dibagi antara kedua tombol matriks (sebagai digital):A4 =kiri A5 =bawah A6 =kanan A7 =naik (putar)Komentar:Ini adalah Proyek Arduino kedua saya. Kode mungkin berantakan dan tidak efisien. Referensi dari Perpustakaan Arduino dan lembar data.*/unsigned char latchPin =3;unsigned char clockPin =2;unsigned char dataPin =4;unsigned char rowPin =5;penundaan panjang =0;penundaan singkat_ =500;penundaan panjang =0;penundaan tombol pendek =150;short btdowndelay =30;short btsidedelay =80;unsigned char blocktype;unsigned char blockrotation;int lines =0;boolean block[8][18]; //2 ekstra untuk tumpukan boolean rotasi[8][16];disp boolean[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); randomSeed(benih); acak (10,9610806); benih =benih *random(3336,15679912)+analogRead(random(4)); randomSeed(benih); acak(10.98046); cli();//stop interrupts//set timer0 interrupt pada 2kHz TCCR1A =0;// setel seluruh register TCCR0A ke 0 TCCR1B =0;// sama untuk TCCR0B TCNT1 =0;//inisialisasi nilai counter ke 0 // set bandingkan register pertandingan untuk peningkatan 2khz OCR1A =259;// =(16*10^6) / (2000*64) - 1 (harus <256) // nyalakan mode CTC TCCR1A |=(1 <0;i--) { untuk (j=0;j<16;j++) { blok[i][j]=blok[i-1][j]; } } untuk (j=0;j<16;j++) { blok[0][j]=0; } pembaruanLED(); kembali 1; } return 0;}int readBut(){ if (bdelay> milis()) { return 0; } if (analogRead(A4)> 500) { //bdelay kiri =milis() + btsidedelay; kembali 3; } if (analogRead(A5)> 500) { //bdelay bawah =milis() + btdowndelay; kembali 4; } if (analogRead(A6)> 500) { //bdelay kanan =milis() + btsidedelay; kembali 2; } if (analogRead(A7)> 500) { //up bdelay =milis() + buttondelay; kembali 1; } return 0;}void updateLED(){ int i; int j; for (i=0;i<8;i++) { untuk (j=0;j<16;j++) { disp[i][j] =blok[i][j] | tumpukan[i][j]; } }}void rotate(){ //skip for square block(3) if (blocktype ==3) return; int xi; int yi; di aku; int j; //deteksi kiri untuk (i=7;i>=0;i--) { untuk (j=0;j<16;j++) { if (blok[i][j]) { xi =i; } } } //mendeteksi up for (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++; } kembali lagi; } else if (!space_right()) { if (spasi_left3()) { if (!moveleft()) return; if (!moveleft()) kembali; xi--; xi--; } kembali lagi; } else if (!space_right2()) { if (spasi_left2()) { if (!moveleft()) kembali; xi--; } kembali lagi; } 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; blokrotasi =1; } else { blok[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; blokrotasi =0; } } //offset ke pertengahan xi ++; y++; if (blocktype ==1) { if (blockrotation ==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; blokrotasi =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; blokrotasi =2; } else if (blockrotation ==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; blokrotasi =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; blokrotasi =0; } } if (blocktype ==2) { if (blockrotation ==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; blokrotasi =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; blokrotasi =2; } else if (blockrotation ==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; blokrotasi =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; blokrotasi =0; } } if (blocktype ==4) { if (blockrotation ==0) { block[xi+1][yi-1] =0; blok[xi-1][yi] =0; blok[xi+1][yi] =1; blok[xi+1][yi+1] =1; blokrotasi =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; blokrotasi =0; } } if (blocktype ==5) { if (blockrotation ==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; blokrotasi =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; blokrotasi =2; } else if (blockrotation ==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; blokrotasi =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; blokrotasi =0; } } if (blocktype ==6) { if (blockrotation ==0) { block[xi-1][yi-1] =0; blok[xi][yi-1] =0; blok[xi+1][yi-1] =1; blok[xi][yi+1] =1; blokrotasi =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; blokrotasi =0; } } //jika berputar membuat balok dan tiang tumpang tindih, dorong baris ke atas while (!check_overlap()) { for (i=0;i<18;i++) { for (j=0;j<8;j++) { blok [j][i] =blok[j][i+1]; } } penundaan =milis() + delay_; } pembaruanLED(); }void movedown(){ if (spasi_below()) { //pindah ke bawah int i; for (i=15;i>=0;i--) { int j; for (j=0;j<8;j++) { blok[j][i] =blok[j][i-1]; } } untuk (i=0;i<7;i++) { blok[i][0] =0; } } else { //gabung dan blok baru int i; int j; for (i=0;i<8;i++) { for(j=0;j<16;j++) { if (blok[i][j]) { tumpukan[i][j]=1; blok[i][j]=0; } } } blok baru(); } pembaruanLED(); }boolean 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; } } } mengembalikan true;}void check_gameover(){ int i; int j; int cnt=0;; untuk(i=15;i>=0;i--) { cnt=0; for (j=0;j<8;j++) { if (tumpukan[j][i]) { cnt ++; } } if (cnt ==8) { lines++; for (j=0;j<8;j++) { tumpukan[j][i]=0; } pembaruanLED(); penundaan (50); int k; for(k=i;k>0;k--) { untuk (j=0;j<8;j++) { tumpukan[j][k] =tumpukan[j][k-1]; } } untuk (j=0;j<8;j++) { tumpukan[j][0] =0; } pembaruanLED(); penundaan (50); saya++; } } for(i=0;i<8;i++) { if (tumpukan[i][0]) gameover(); } return;}void gameover(){ int i; int j; //tutup 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; } } penundaan(60); } //menghitung papan skor int num_lines; jumlah_baris =2; skor boolean[8][17]; untuk (i=0;i<8;i++) { untuk (j=0;j<16;j++) { skor[i][j] =0; } } int digit1 =(baris/10) % 10; int digit2 =(baris) % 10; for (i=0;i<5;i++) for (j=0;j<8;j++) { skor[7-j][i+3] =lib[digit1][i][j]; } untuk (i=0;i<5;i++) untuk (j=0;j<8;j++) { skor[7-j][i+9] =lib[digit2][i][j]; } untuk (i=0;i<16;i++) { skor[0][i]=0; } //buka blind dengan skor for (i=0;i<8;i++) { for (j=0;j<16;j++) { if (j%2) { disp[i][j]=score[ aku j]; } else { disp[7-i][j]=skor[7-i][j]; } } penundaan(60); } penundaan(100); while(benar) { untuk (i=0;i<8;i++) { untuk (j=0;j<16;j++) { disp[i][j] =skor[i][j]; } } tmpline boolean[8]; untuk (i=0;i<8;i++) { skor[i][16]=skor[i][0]; } untuk (i=0;i<8;i++) { untuk (j=0;j<16;j++) { skor[i][j] =skor[i][j+1]; } } penundaan(100); } }kosongkan newBlock(){ check_gameover(); tipe blok =acak(7); if (tipe blok ==0) // 0 // 0 // 0 // 0 { blok[3][0]=1; blok[3][1]=1; blok[3][2=1; blok[3][3]=1; } if (tipe blok ==1) // 0 // 0 0 0 { blok[2][0]=1; blok [2][1]=1; blok[3][1]=1; blok[4][1]=1; } if (tipe blok ==2) // 0 // 0 0 0 { blok[4][0]=1; blok [2][1]=1; blok[3][1]=1; blok[4][1]=1; } if (tipe blok ==3) // 0 0 // 0 0 { blok[3][0]=1; blok[3][1]=1; blok[4][0]=1; blok[4][1]=1; } if (tipe blok ==4) // 0 0 // 0 0 { blok[4][0]=1; blok[5][0]=1; blok[3][1]=1; blok[4][1]=1; } if (tipe blok ==5) // 0 // 0 0 0 { blok[4][0]=1; blok[3][1]=1; blok[4][1]=1; blok[5][1]=1; } if (tipe blok ==6) // 0 0 // 0 0 { blok[3][0]=1; blok[4][0]=1; blok[4][1]=1; blok[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 (tumpukan[j][i+1]) { kembali salah; } } } } mengembalikan true;}boolean space_left2(){ int i; int j; for (i=15;i>=0;i--) { untuk (j=0;j<8;j++) { if (blok[j][i]) { if (j ==0 || j ==1) mengembalikan salah; if (tumpukan[j-1][i] | tumpukan[j-2][i]) { kembali salah; } } } } mengembalikan true;}boolean space_left3(){ int i; int j; for (i=15;i>=0;i--) { untuk (j=0;j<8;j++) { if (blok[j][i]) { if (j ==0 || j ==1 ||j ==2 ) mengembalikan false; if (tumpukan[j-1][i] | tumpukan[j-2][i]|tumpukan[j-3][i]) { kembali salah; } } } } mengembalikan true;}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 (tumpukan[j-1][i]) { kembali salah; } } } } mengembalikan true;}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 (tumpukan[j+1][i]) { kembali salah; } } } } mengembalikan true;}boolean space_right3(){ int i; int j; for (i=15;i>=0;i--) { untuk (j=0;j<8;j++) { if (blok[j][i]) { if (j ==7||j ==6||j ==5) mengembalikan false; if (tumpukan[j+1][i] |tumpukan[j+2][i] | tumpukan[j+3][i]) { kembali salah; } } } } mengembalikan true;}boolean space_right2(){ int i; int j; for (i=15;i>=0;i--) { for (j=0;j<8;j++) { if (blok[j][i]) { if (j ==7 || j ==6) mengembalikan salah; if (tumpukan[j+1][i] |tumpukan[j+2][i]) { kembali salah; } } } } return true;}ISR(TIMER1_COMPA_vect){ //mengubah 0 menjadi 1 untuk timer1 dan 2 untuk timer2 LEDRefresh();}void LEDRefresh(){ int i; int k; /////////////////////////////////////////////////////////// // Saya salah menyolder pin. (12345670 bukannya 01234567). // jadi bagian kode ini untuk perangkat lunak memperbaiki masalah ini. tmpdisp boolean[8][16]; untuk (k=0;k<16;k++) { untuk(i=1;i<8;i++) { tmpdisp[i][k]=disp[i-1][k]; } tmpdisp[0][k]=disp[7][k]; } //////////////////////////////////////////// untuk(i =0;i<8;i++) { int j; if (i ==0) j =rowPin+7; lain j =rowPin+i-1; byte atas =0; int b; untuk(b =0;b<8;b++) { atas <<=1; if (!tmpdisp[b][i]) atas |=1; } byte lebih rendah =0; untuk(b =0;b<8;b++) { lebih rendah <<=1; jika (!tmpdisp[b][i+8]) lebih rendah |=1; } digitalWrite(j,RENDAH); digitalWrite(latchPin, RENDAH); shiftOut(dataPin, clockPin, LSFIRST, lebih rendah); shiftOut(dataPin, clockPin, LSFIRST, atas); digitalWrite(latchPin, TINGGI); digitalWrite(barisPin+i,TINGGI); penundaan (1); } digitalWrite(rowPin+7,RENDAH); }

Skema


Proses manufaktur

  1. Game Arduino Gyroscope dengan MPU-6050
  2. Arduino Digital Dice
  3. TV Buatan Sendiri B-Gone
  4. Pengontrol Game Arduino
  5. Game Arduino Pong pada Matrix 24x16 dengan MAX7219
  6. Game Pixel Chaser
  7. Matriks LED Tunggal Arduino Flip Clock
  8. NeoMatrix Arduino Pong
  9. Penghitung Geiger Genggam dengan Arduino Nano
  10. Jangan Pernah Berkendara Sendiri