Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Игра Arduino Nano Tetris на самодельной матрице 16x8

Компоненты и расходные материалы

Arduino Nano R3
× 1
Кнопочный переключатель SparkFun, 12 мм
× 4
Регистр сдвига Texas Instruments - последовательный на параллельный
× 2
Ползунковый переключатель
× 1
5 мм светодиод:желтый
× 128

Необходимые инструменты и машины

Паяльник (общий)

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Я построил эту игру в тетрис с самодельной светодиодной матрицей 16x8, Arduino Nano и двумя регистрами сдвига 74hc595. Еще я добавил звуковой сигнал при нажатии любой кнопки.

Код

  • код
код Arduino
 / * Автор:Jae Yeong Bae UBC ECE jocker.tistory.com Дата:18 января 2013 г. Файл:Tetris v2 Изменения:v2:отображает счет при завершении игры Цель:убить время .. + для развлечения Цепи + Пины:Светодиодная матрица:2 74HC575 Регистры сдвига по порядку:зеленый, синий, красный контакты:защелка =3 такта =2 данных =4 ряда анодов =от 5 до 13 (8 контактов), совместно используемых обеими матричными кнопками (как цифровые):A4 =левый A5 =нижний A6 =правый A7 =вверх (повернуть) Комментарий:это мой второй проект Arduino. Код может быть беспорядочным и неэффективным. Ссылки из библиотеки Arduino и даташитов. * / Unsigned char latchPin =3; unsigned char clockPin =2; unsigned char dataPin =4; unsigned char rowPin =5; long delay =0; short delay_ =500; long bdelay =0; short buttondelay =150; short btdowndelay =30; short btsidedelay =80; беззнаковый тип блока char; беззнаковое вращение блока char; int lines =0; логический блок [8] [18]; // 2 дополнительных для вращения булевская куча [8] [16]; логическая disp [8] [16]; логическая 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; библиотека [0] [2] [6] =1; библиотека [0] [3] [6] =1; библиотека [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; библиотека [6] [1] [6] =1; библиотека [6] [2] [6] =1; библиотека [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; библиотека [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 (семя); случайный (10,9610806); семя =семя * случайное (3336,15679912) + аналоговое чтение (случайное (4)); randomSeed (семя); случайный (10,98046); cli (); // останавливаем прерывания // устанавливаем прерывание таймера 0 на 2 кГц TCCR1A =0; // устанавливаем весь регистр TCCR0A на 0 TCCR1B =0; // то же самое для TCCR0B TCNT1 =0; // инициализируем значение счетчика на 0 // устанавливаем сравнить регистр совпадения для увеличения 2 кГц OCR1A =259; // =(16 * 10 ^ 6) / (2000 * 64) - 1 (должно быть <256) // включить режим CTC TCCR1A | =(1 < 0; i--) {for (j =0; j <16; j ++) {block [i] [j] =block [i-1] [j]; }} для (j =0; j <16; j ++) {block [0] [j] =0; } updateLED (); возврат 1; } return 0;} int readBut () {если (bdelay> millis ()) {return 0; } if (analogRead (A4)> 500) {// слева bdelay =millis () + btsidedelay; возврат 3; } if (analogRead (A5)> 500) {// вниз bdelay =millis () + btdowndelay; возврат 4; } if (analogRead (A6)> 500) {// вправо bdelay =millis () + btsidedelay; возврат 2; } if (analogRead (A7)> 500) {// вверх bdelay =millis () + buttondelay; возврат 1; } return 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] | куча [i] [j]; }}} void rotate () {// пропустить квадратный блок (3) if (blocktype ==3) return; int xi; int yi; int i; int j; // обнаруживаем left for (i =7; i> =0; i--) {for (j =0; j <16; j ++) {if (block [i] [j]) {xi =i; }}} // обнаруживаем 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 ++; } else return; } else if (! space_right ()) {if (space_left3 ()) {if (! moveleft ()) return; если (! moveleft ()) вернуться; xi--; xi--; } else return; } else if (! space_right2 ()) {if (space_left2 ()) {if (! moveleft ()) return; xi--; } else return; } блок [xi] [yi] =0; блок [xi] [yi + 2] =0; блок [xi] [yi + 3] =0; блок [xi-1] [yi + 1] =1; блок [xi + 1] [yi + 1] =1; блок [xi + 2] [yi + 1] =1; blockrotation =1; } еще {блок [xi] [yi] =0; блок [xi + 2] [yi] =0; блок [xi + 3] [yi] =0; блок [xi + 1] [yi-1] =1; блок [xi + 1] [yi + 1] =1; блок [xi + 1] [yi + 2] =1; blockrotation =0; }} // смещение до середины xi ++; yi ++; if (blocktype ==1) {if (blockrotation ==0) {block [xi-1] [yi-1] =0; блок [xi-1] [yi] =0; блок [xi + 1] [yi] =0; блок [xi] [yi-1] =1; блок [xi + 1] [yi-1] =1; блок [xi] [yi + 1] =1; blockrotation =1; } else if (blockrotation ==1) {if (! space_left ()) {if (! moveright ()) return; xi ++; } xi--; блок [xi] [yi-1] =0; блок [xi + 1] [yi-1] =0; блок [xi] [yi + 1] =0; блок [xi-1] [yi] =1; блок [xi + 1] [yi] =1; блок [xi + 1] [yi + 1] =1; blockrotation =2; } иначе, если (blockrotation ==2) {yi -; блок [xi-1] [yi] =0; блок [xi + 1] [yi] =0; блок [xi + 1] [yi + 1] =0; блок [xi] [yi-1] =1; блок [xi] [yi + 1] =1; блок [xi-1] [yi + 1] =1; blockrotation =3; } else {если (! space_right ()) {если (! moveleft ()) return; xi--; } блок [xi] [yi-1] =0; блок [xi] [yi + 1] =0; блок [xi-1] [yi + 1] =0; блок [xi-1] [yi-1] =1; блок [xi-1] [yi] =1; блок [xi + 1] [yi] =1; blockrotation =0; }} if (blocktype ==2) {if (blockrotation ==0) {block [xi + 1] [yi-1] =0; блок [xi-1] [yi] =0; блок [xi + 1] [yi] =0; блок [xi] [yi-1] =1; блок [xi + 1] [yi + 1] =1; блок [xi] [yi + 1] =1; blockrotation =1; } else if (blockrotation ==1) {if (! space_left ()) {if (! moveright ()) return; xi ++; } xi--; блок [xi] [yi-1] =0; блок [xi + 1] [yi + 1] =0; блок [xi] [yi + 1] =0; блок [xi-1] [yi] =1; блок [xi + 1] [yi] =1; блок [xi-1] [yi + 1] =1; blockrotation =2; } иначе, если (blockrotation ==2) {yi -; блок [xi-1] [yi] =0; блок [xi + 1] [yi] =0; блок [xi-1] [yi + 1] =0; блок [xi] [yi-1] =1; блок [xi] [yi + 1] =1; блок [xi-1] [yi-1] =1; blockrotation =3; } else {если (! space_right ()) {если (! moveleft ()) return; xi--; } блок [xi] [yi-1] =0; блок [xi] [yi + 1] =0; блок [xi-1] [yi-1] =0; блок [xi + 1] [yi-1] =1; блок [xi-1] [yi] =1; блок [xi + 1] [yi] =1; blockrotation =0; }} if (blocktype ==4) {if (blockrotation ==0) {block [xi + 1] [yi-1] =0; блок [xi-1] [yi] =0; блок [xi + 1] [yi] =1; блок [xi + 1] [yi + 1] =1; blockrotation =1; } else {если (! space_left ()) {если (! moveright ()) возврат; xi ++; } xi--; блок [xi + 1] [yi] =0; блок [xi + 1] [yi + 1] =0; блок [xi-1] [yi] =1; блок [xi + 1] [yi-1] =1; blockrotation =0; }} if (blocktype ==5) {if (blockrotation ==0) {block [xi] [yi-1] =0; блок [xi-1] [yi] =0; блок [xi + 1] [yi] =0; блок [xi] [yi-1] =1; блок [xi + 1] [yi] =1; блок [xi] [yi + 1] =1; blockrotation =1; } else if (blockrotation ==1) {if (! space_left ()) {if (! moveright ()) return; xi ++; } xi--; блок [xi] [yi-1] =0; блок [xi + 1] [yi] =0; блок [xi] [yi + 1] =0; блок [xi-1] [yi] =1; блок [xi + 1] [yi] =1; блок [xi] [yi + 1] =1; blockrotation =2; } иначе, если (blockrotation ==2) {yi -; блок [xi-1] [yi] =0; блок [xi + 1] [yi] =0; блок [xi] [yi + 1] =0; блок [xi] [yi-1] =1; блок [xi-1] [yi] =1; блок [xi] [yi + 1] =1; blockrotation =3; } else {если (! space_right ()) {если (! moveleft ()) return; xi--; } блок [xi] [yi-1] =0; блок [xi-1] [yi] =0; блок [xi] [yi + 1] =0; блок [xi] [yi-1] =1; блок [xi-1] [yi] =1; блок [xi + 1] [yi] =1; blockrotation =0; }} if (blocktype ==6) {if (blockrotation ==0) {block [xi-1] [yi-1] =0; блок [xi] [yi-1] =0; блок [xi + 1] [yi-1] =1; блок [xi] [yi + 1] =1; blockrotation =1; } else {если (! space_left ()) {если (! moveright ()) возврат; xi ++; } xi--; блок [xi + 1] [yi-1] =0; блок [xi] [yi + 1] =0; блок [xi-1] [yi-1] =1; блок [xi] [yi-1] =1; blockrotation =0; }} // если вращение перекрывающихся блоков и стопок, подталкиваем строки вверх while (! check_overlap ()) {for (i =0; i <18; i ++) {for (j =0; j <8; j ++) {block [j] [i] =блок [j] [i + 1]; }} задержки =millis () + delay_; } updateLED (); } void moveown () {if (space_below ()) {// двигаться вниз int i; для (i =15; i> =0; i--) {int j; для (j =0; j <8; j ++) {блок [j] [i] =блок [j] [i-1]; }} для (я =0; я <7; я ++) {блок [я] [0] =0; }} else {// объединить и создать новый блок int i; int j; for (i =0; i <8; i ++) {for (j =0; j <16; j ++) {if (block [i] [j]) {pile [i] [j] =1; блок [i] [j] =0; }}} newBlock (); } updateLED (); } логическое 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; }}} return true;} void check_gameover () {int я; int j; int cnt =0;; для (i =15; i> =0; i--) {cnt =0; для (j =0; j <8; j ++) {если (pile [j] [i]) {cnt ++; }} если (cnt ==8) {строки ++; для (j =0; j <8; j ++) {pile [j] [i] =0; } updateLED (); задержка (50); int k; for (k =i; k> 0; k--) {for (j =0; j <8; j ++) {pile [j] [k] =pile [j] [k-1]; }} для (j =0; j <8; j ++) {pile [j] [0] =0; } updateLED (); задержка (50); я ++; }} для (я =0; я <8; я ++) {если (куча [я] [0]) gameover (); } return;} void gameover () {int я; int j; // закрытие вслепую for (i =0; i <8; i ++) {for (j =0; j <16; j ++) {if (j% 2) {disp [i] [j] =1; } иначе {disp [7-я] [j] =1; }} задержка (60); } // вычисляем табло int num_lines; num_lines =2; логическая оценка [8] [17]; for (i =0; i <8; i ++) {for (j =0; j <16; j ++) {score [i] [j] =0; }} int digit1 =(строк / 10)% 10; int digit2 =(строки)% 10; for (i =0; i <5; i ++) for (j =0; j <8; j ++) {оценка [7-j] [i + 3] =lib [digit1] [i] [j]; } for (i =0; i <5; i ++) for (j =0; j <8; j ++) {оценка [7-j] [i + 9] =lib [digit2] [i] [j]; } для (я =0; я <16; я ++) {оценка [0] [я] =0; } // открытый блайнд со счетом for (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] =оценка [7-i] [j]; }} задержка (60); } задержка (100); while (true) {for (i =0; i <8; i ++) {for (j =0; j <16; j ++) {disp [i] [j] =оценка [i] [j]; }} логический tmpline [8]; для (я =0; я <8; я ++) {оценка [я] [16] =оценка [я] [0]; } for (i =0; i <8; i ++) {for (j =0; j <16; j ++) {оценка [i] [j] =оценка [i] [j + 1]; }} задержка (100); }} void newBlock () {check_gameover (); тип блока =случайный (7); if (blocktype ==0) // 0 // 0 // 0 // 0 {block [3] [0] =1; блок [3] [1] =1; блок [3] [2] =1; блок [3] [3] =1; } if (blocktype ==1) // 0 // 0 0 0 {block [2] [0] =1; блок [2] [1] =1; блок [3] [1] =1; блок [4] [1] =1; } if (blocktype ==2) // 0 // 0 0 0 {block [4] [0] =1; блок [2] [1] =1; блок [3] [1] =1; блок [4] [1] =1; } if (blocktype ==3) // 0 0 // 0 0 {block [3] [0] =1; блок [3] [1] =1; блок [4] [0] =1; блок [4] [1] =1; } if (blocktype ==4) // 0 0 // 0 0 {block [4] [0] =1; блок [5] [0] =1; блок [3] [1] =1; блок [4] [1] =1; } if (blocktype ==5) // 0 // 0 0 0 {block [4] [0] =1; блок [3] [1] =1; блок [4] [1] =1; блок [5] [1] =1; } if (blocktype ==6) // 0 0 // 0 0 {block [3] [0] =1; блок [4] [0] =1; блок [4] [1] =1; блок [5] [1] =1; } blockrotation =0;} логическое 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; если (куча [j] [я + 1]) {вернуть ложь; }}}} return true;} логическое 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; if (pile [j-1] [i] | pile [j-2] [i]) {return false; }}}} return true;} логическое 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; if (pile [j-1] [i] | pile [j-2] [i] | pile [j-3] [i]) {return false; }}}} return true;} логическое значение 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; }}}} return true;} логическое 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 (pile [j + 1] [i]) {return false; }}}} return true;} логическое 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; if (pile [j + 1] [i] | pile [j + 2] [i] | pile [j + 3] [i]) {return false; }}}} return true;} логическое 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; if (pile [j + 1] [i] | pile [j + 2] [i]) {return false; }}}} return true;} ISR (TIMER1_COMPA_vect) {// измените 0 на 1 для таймера 1 и 2 для таймера 2 LEDRefresh ();} void LEDRefresh () {int i; int k; ////////////////////////////////////////////////// // Неправильно припаял контакты. (12345670 вместо 01234567). // так что эта часть кода предназначена для программного исправления этой проблемы. логический tmpdisp [8] [16]; для (k =0; k <16; k ++) {для (i =1; i <8; i ++) {tmpdisp [i] [k] =disp [i-1] [k]; } tmpdisp [0] [k] =disp [7] [k]; } ////////////////////////////////////////////// for (i =0; я <8; я ++) {int j; если (i ==0) j =rowPin + 7; иначе j =rowPin + i-1; верхний байт =0; int b; для (b =0; b <8; b ++) {верхний <<=1; если (! tmpdisp [b] [i]) верхний | =1; } младший байт =0; для (b =0; b <8; b ++) {нижний <<=1; если (! tmpdisp [b] [i + 8]) lower | =1; } digitalWrite (j, LOW); digitalWrite (latchPin, LOW); shiftOut (dataPin, clockPin, LSBFIRST, нижний); shiftOut (dataPin, clockPin, LSBFIRST, верхний); digitalWrite (latchPin, HIGH); digitalWrite (rowPin + i, HIGH); задержка (1); } digitalWrite (rowPin + 7, LOW); } 

Схема


Производственный процесс

  1. Игра с гироскопом Arduino с MPU-6050
  2. Цифровые игральные кости Arduino
  3. Самодельный телевизор B-Gone
  4. Игровой контроллер Arduino
  5. Игра Arduino Pong на матрице 24x16 с MAX7219
  6. Игра Pixel Chaser
  7. Перекидные часы Arduino с одной светодиодной матрицей
  8. NeoMatrix Arduino Pong
  9. Портативный счетчик Гейгера с Arduino Nano
  10. Никогда не ездить в одиночестве