工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

自家製16x8マトリックス上のArduinoNanoTetr​​isゲーム

コンポーネントと消耗品

>
>
Arduino Nano R3
× 1
SparkFunプッシュボタンスイッチ12mm
× 4
TexasInstrumentsシフトレジスタ-シリアルからパラレル
× 2
スライドスイッチ
× 1
5 mm LED:黄色
× 128

必要なツールとマシン

>
はんだごて(汎用)

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて

このテトリスゲームは、自家製の16x8 LEDマトリックス、Arduino Nano、および2つの74hc595シフトレジスタを使用して作成しました。また、いずれかのボタンを押すとビープ音が鳴ります。

コード

  • コード
コード Arduino
 / *作成者:Jae Yeong Bae UBC ECE jocker.tistory.com日付:2013年1月18日ファイル:Tetris v2Changelog:v2:ゲームオーバー時のスコアを表示目的:暇つぶし.. +楽しみのためにCircuits + Pins:Led Matrix:2 74HC575シフトレジスタの順序:緑、青、赤のピン:ラッチ=2クロック=2データ=4行のノード=両方のマトリックスボタン間で共有される5〜13(8ピン)(デジタルとして):A4 =左A5 =下A6 =右A7 =up(rotate)コメント:これは私の2番目のArduinoプロジェクトです。コードは乱雑で非効率的かもしれません。 Arduinoライブラリとデータシートからの参照。* / unsignedcharラッチPin =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追加のrotationbooleanpile [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(シード);ランダム(10,9610806);シード=シード* random(3336,15679912)+ analogRead(random(4)); randomSeed(シード);ランダム(10,98046); cli(); //割り込みの停止// 2kHzでのtimer0割り込みの設定TCCR1A =0; // TCCR0Aレジスタ全体を0に設定TCCR1B =0; // TCCR0Bの場合も同じTCNT1 =0; //カウンタ値を0に初期化//設定一致レジスタを2khz刻みで比較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]; }} for(j =0; j <16; j ++){block [0] [j] =0; } updateLED(); 1を返します。 } return 0;} int readBut(){if(bdelay> millis()){return 0; } if(analogRead(A4)> 500){//左bdelay =millis()+ btsidedelay; 3を返します。 } if(analogRead(A5)> 500){// down bdelay =millis()+ btdowndelay; 4を返します。 } if(analogRead(A6)> 500){//右bdelay =millis()+ btsidedelay; 2を返します。 } if(analogRead(A7)> 500){// up 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(){//正方形のblock(3)をスキップif(blocktype ==3)return; int xi; int yi; int i; int j; //左を検出for(i =7; i> =0; i-){for(j =0; j <16; j ++){if(block [i] [j]){xi =i; }}} //検出する(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; if(!moveleft())return; xi--; xi--; } else return; } else if(!space_right2()){if(space_left2()){if(!moveleft())return; xi--; } else return; } 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; } else {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;ブロック[xi + 1] [yi + 2] =1; blockrotation =0; }} //中程度のxi ++へのオフセット; yi ++; if(blocktype ==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; } else 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(blocktype ==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; } else 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(blocktype ==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(blocktype ==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; } else 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(blocktype ==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; }} //回転してブロックと杭が重なる場合は、行を上に押し上げますwhile(!check_overlap()){for(i =0; i <18; i ++){for(j =0; j <8; j ++){block [j] [i] =ブロック[j] [i + 1]; }} delays =millis()+ delay_; } updateLED(); } void movedown(){if(space_below()){//下に移動int i; for(i =15; i> =0; i-){int j; for(j =0; j <8; j ++){block [j] [i] =block [j] [i-1]; }} for(i =0; i <7; i ++){block [i] [0] =0; }} else {//マージして新しいブロックinti; int j; for(i =0; i <8; i ++){for(j =0; j <16; j ++){if(block [i] [j]){pile [i] [j] =1; block [i] [j] =0; }}} newBlock(); } updateLED(); } 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; }}} return true;} 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 ++; for(j =0; j <8; j ++){pile [j] [i] =0; } updateLED(); delay(50); int k; for(k =i; k> 0; k-){for(j =0; j <8; j ++){pile [j] [k] =tile [j] [k-1]; }} for(j =0; j <8; j ++){pile [j] [0] =0; } updateLED(); delay(50); i ++; }} for(i =0; i <8; i ++){if(pile [i] [0])gameover(); } return;} void gameover(){int i; int j; //ブラインドを閉じる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; }} delay(60); } //スコアボードを計算するintnum_lines; num_lines =2;ブールスコア[8] [17]; for(i =0; i <8; i ++){for(j =0; j <16; j ++){スコア[i] [j] =0; }} int digit1 =(lines / 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]; } for(i =0; i <16; i ++){スコア[0] [i] =0; } //(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]; }} delay(60); } delay(100); while(true){for(i =0; i <8; i ++){for(j =0; j <16; j ++){disp [i] [j] =score [i] [j]; }} boolean tmpline [8]; for(i =0; i <8; i ++){スコア[i] [16] =スコア[i] [0]; } for(i =0; i <8; i ++){for(j =0; j <16; j ++){スコア[i] [j] =スコア[i] [j + 1]; }} delay(100); }} void newBlock(){check_gameover(); blocktype =random(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;} 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]){falseを返す; }}}} return true;} 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を返します。 if(pile [j-1] [i] | tile [j-2] [i]){falseを返す; }}}} return true;} 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を返します。 if(pile [j-1] [i] | tile [j-2] [i] | tile [j-3] [i]){falseを返す; }}}} return 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(pile [j-1] [i]){falseを返す; }}}} return 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(pile [j + 1] [i]){falseを返す; }}}} return true;} 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を返します。 if(pile [j + 1] [i] | tile [j + 2] [i] | tile [j + 3] [i]){falseを返す; }}}} return true;} 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を返します。 if(pile [j + 1] [i] | pile [j + 2] [i]){falseを返す; }}}} return true;} ISR(TIMER1_COMPA_vect){// timer1の場合は0を1に、timer2の場合は2に変更しますLEDRefresh();} void LEDRefresh(){int i; int k; //////////////////////////////////////////////////ピンを間違ってはんだ付けしました。 (01234567の代わりに12345670)。 //したがって、コードのこの部分は、この問題をソフトウェアで修正するためのものです。 boolean 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]; } ////////////////////////////////////////////// for(i =0; i <8; i ++){int j; if(i ==0)j =rowPin + 7;それ以外の場合、j =rowPin + i-1;バイト上位=0; int b; for(b =0; b <8; b ++){upper <<=1; if(!tmpdisp [b] [i])upper | =1; }バイト下位=0; for(b =0; b <8; b ++){下位<<=1; if(!tmpdisp [b] [i + 8])lower | =1; } digitalWrite(j、LOW); digitalWrite(latchPin、LOW); shiftOut(dataPin、clockPin、LSBFIRST、lower); shiftOut(dataPin、clockPin、LSBFIRST、upper); digitalWrite(latchPin、HIGH); digitalWrite(rowPin + i、HIGH); delay(1); } digitalWrite(rowPin + 7、LOW); } 

回路図


製造プロセス

  1. MPU-6050を搭載したArduinoジャイロスコープゲーム
  2. Arduino Digital Dice
  3. 自家製テレビB-Gone
  4. Arduinoゲームコントローラー
  5. MAX7219を搭載した24x16マトリックスのArduinoPongゲーム
  6. ピクセルチェイサーゲーム
  7. シングルLEDマトリックスArduinoフリップクロック
  8. NeoMatrix Arduino Pong
  9. ArduinoNanoを搭載したハンドヘルドガイガーカウンター
  10. WS2812LEDストリップを備えたDIYArduino1Dポンゲーム
  11. 一人で乗るな