ブレッドボードからPCBへパート1-サイモン曰くゲームを作る
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 1 | ||||
| × | 12 | ||||
| × | 4 | ||||
| × | 4 | ||||
| × | 1 |
アプリとオンラインサービス
> |
|
このプロジェクトについて
はじめに
正しいライトシーケンスに対応するボタンを押してライトのシーケンスをコピーしようとする、古いSimonSaysゲームを見てきました。 Hackster Liveでは、Upverterと呼ばれるPCB設計ツールを紹介しました。これは、PCBを作成して変換するための楽しくてシンプルなプロジェクトです。以下は、ハードウェアとコードを備えたゲーム作成を示す基本的なプロジェクトです。
このプロジェクトシリーズには3つのパートがあります。
- パート1: サイモン曰くゲームを作る
- パート2: Upverterを使用してSimonSaysゲームに基づいてPCBを設計する
- パート3: Upverterで作成したデザインから独自のPCBを粉砕します
このシリーズで学ぶこと
- 基本的なプロジェクトをブレッドボードにレイアウトする方法
- UpverterでPCBをレイアウトする方法
- CNCマシンを使用して独自のPCBを粉砕する方法
ソフトウェア
コードを記述してArduinoにアップロードするためのArduinoIDEがない場合は、ここからオペレーティングシステムの最新バージョンをダウンロードしてください。
ハードウェアのセットアップ
ハードウェアセットアップのインスピレーションとしてSparkfunのInventor’s Kitの例を使用し、少し調整しました。以下のフリッツの図を確認してください。
<図><図>
コード
このゲームの楽しいところは、たくさんのバリエーションを持つことができるということです。上で述べたように、ハードウェアセットアップの開始点としてSparkfunの例を使用し、コードを最初から作成しました。独自のコードを書くことに興味がない場合は、以下の私のコードを使用するか、上記の例でいくつかの調整を加えたSparkfunのコードを使用するか、ハードウェアのセットアップで動作するゲーム/コードを言う他のSimonを検索してください。
ゲームの実行中にシリアルモニターで何が起こっているかを確認できるように、詳細なコメントとデバッグ用のシリアル印刷行をコードに含めました。以下のサイモン曰くゲームの動作のビデオをチェックしてください!
サイモンはゲームビデオを言う
*注:このビデオでは、勝つために必要なライトの数を5に設定しました。これはゲームを難しくするために変更できますが、ビデオを比較的短くしたかったです:)
これで、ブレッドボードをPCBに変える準備ができました。ブレッドボードからPCBへのパート2-Upverterを使用したPCBの設計方法を学びます。
コード
- SimonはArduinoコードを言います
SimonはArduinoコードを言う Arduino
int ledArray [] ={12、9、5、2}; // ledArray [0]は緑、ledArray [1]は赤、ledArray [2]は黄色、ledArray [3]は青です。 int buttonArray [] ={13、10、6、3}; // buttonArray [0]は緑、buttonArray [1]は赤、buttonArray [2]は黄色、buttonArray [3]は青です。 int pinCount =4; // ledArrayとbuttonArrayの両方が同じpinCountを持っています->これをボタンとledsの両方に使用しますintbuzzer =8; int ledState =0; int gameState =0; #define NUMBERTOWIN 5 //勝つために一致しなければならないライトの数->この数を変更して、ゲームを勝つために多かれ少なかれ挑戦的にすることができますint gameValues [NUMBERTOWIN]; int roundNum =0; unsigned long previousMillis =0; //遅延なしでライトを点滅させるためのゲーム前の状態にこれが必要です->遅延を使用する場合、ボタンを押してゲームを開始すると、unsigned longinterval1 =500に気付かない場合があります。 //まばたきの間の時間にこれが必要//関数を宣言するvoidsetLed(int ledNum); void displayClue(int roundNum); boolean waitForInput(int buttonNum); void setup(){Serial.begin(9600); Serial.println( "setup"); for(int Pin =0; Pin関数setLed()は、ledNumが0未満の場合、LEDはLOWであると述べていますsetLed(-1); //ラウンド数をゼロに設定して、最初のラウンドから開始しますroundNum =0;遅延(1000); // gameStateを1に設定gameState =1; }} if(gameState ==1){gamePlay(); } if(gameState ==2){//あなたが勝ちます!! -勝利の音を再生し、LED(winDisplay)を3回スクロールした後、表示を1回失って、適切なトランジションを実現します。 //勝つサウンドが再生される前にボタンを押す時間をプレーヤーに与えるための遅延delay(500); wining_sound(); winDisplay(); winDisplay(); winDisplay(); lostDisplay(); Serial.println( "winDisplay"); // pre_game delay(1000);を実行する前に少し遅延します。 // gameStateをゼロにリセットして、pre_game gameState =0を呼び出します。 } if(gameState ==3){//あなたは負けます:(-負けた音とフラッシュLED(loseDisplay)を3回再生して、適切な遷移を行います。; lost_sound(); lostDisplay(); lostDisplay(); lostDisplay(); Serial.println( "loseDisplay"); // pre_gameを実行する前に少し遅延しますdelay(1000); // gameStateをゼロにリセットしてpre_gamegameState =0を呼び出します;}} // pre_gamevoid pre_game(){// LEDが点灯する間に十分な時間が経過したかどうかを確認しますunsignedlong currentMillis =millis(); if(currentMillis-previousMillis> interval1){//十分な時間が経過した場合更新ライトif( ledState ==0){Serial.println( "pre green"); setLed(0); ledState =1;} else if(ledState ==1){Serial.println( "pre red"); setLed(1); ledState =2;} else if(ledState ==2){Serial.println( "pre yellow"); setLed(2); ledState =3;} else if(ledState ==3){Serial.println ( "プレブルー"); setLed(3); ledState =0; } //リセット時間previousMillis =currentMillis; }} //ゲームのプレイ中の関数voidgamePlay(){Serial.println( "gamePlay"); //ゲームの乱数を含む配列をプリロードしますfor(int i =0; i いずれかのボタンが押された場合は、コードの残りの部分に移動しますif(!button0 ||!button1 ||!button2 ||!button3){//二重カウントボタンを押すのを避けるために少し遅延しますdelay( 250); //ボタンが押されたときに対応するLEDを点灯if(buttonNum ==0){digitalWrite(ledArray [0]、HIGH); delay(250); digitalWrite(ledArray [0]、LOW); } else if(buttonNum ==1){digitalWrite(ledArray [1]、HIGH); delay(250); digitalWrite(ledArray [1]、LOW); } else if(buttonNum ==2){digitalWrite(ledArray [2]、HIGH); delay(250); digitalWrite(ledArray [2]、LOW); } else if(buttonNum ==3){digitalWrite(ledArray [3]、HIGH); delay(250); digitalWrite(ledArray [3]、LOW); } //正しいボタンが押されたかどうかを確認if(buttonNum ==0 &&button0 ==0){Serial.println( "0 Pressed"); trueを返します。 } else if(buttonNum ==1 &&button1 ==0){Serial.println( "1 Pressed"); trueを返します。 } else if(buttonNum ==2 &&button2 ==0){Serial.println( "2 Pressed"); trueを返します。 } else if(buttonNum ==3 &&button3 ==0){Serial.println( "3 Pressed"); trueを返します。 } else {falseを返す; }}}} //勝利後-ライトをすばやくスクロールさせるvoidwinDisplay(){digitalWrite(ledArray [0]、HIGH); delay(75); digitalWrite(ledArray [0]、LOW); delay(75); digitalWrite(ledArray); [1]、HIGH); delay(75); digitalWrite(ledArray [1]、LOW); delay(75); digitalWrite(ledArray [2]、HIGH); delay(75); digitalWrite(ledArray [2]、LOW ); delay(75); digitalWrite(ledArray [3]、HIGH); delay(75); digitalWrite(ledArray [3]、LOW); delay(75); digitalWrite(ledArray [2]、HIGH); delay(75 ); digitalWrite(ledArray [2]、LOW); delay(75); digitalWrite(ledArray [1]、HIGH); delay(75); digitalWrite(ledArray [1]、LOW); delay(75); digitalWrite(ledArray); [0]、HIGH); delay(75); digitalWrite(ledArray [0]、LOW); delay(75);} void wining_sound(void){//トーン(ピン番号、周波数-これをオンラインで調べて見つけました必要な音の周波数、チューニングの長さ)Serial.println( "buzzer1");トーン(ブザー、294、250); delay(200);トーン(ブザー、294、250); delay(200);トーン(ブザー、294、250); delay(200);トーン(ブザー、392、500); delay(500); Serial.println( "second 392");トーン(ブザー、392、250); delay(200);トーン(ブザー、440、250); delay(200);トーン(ブザー、392、250); delay(200);トーン(ブザー、440、250); delay(200); tone(buzzer、494、500);} void lostDisplay(){digitalWrite(ledArray [0]、HIGH); digitalWrite(ledArray [1]、HIGH); digitalWrite(ledArray [2]、HIGH); digitalWrite(ledArray [3]、HIGH); delay(200); digitalWrite(ledArray [0]、LOW); digitalWrite(ledArray [1]、LOW); digitalWrite(ledArray [2]、LOW); digitalWrite(ledArray [3]、LOW); delay(200);} void lost_sound(void){Serial.println( "losing_sound");トーン(ブザー、98、250); delay(250);トーン(ブザー、93、250); delay(250);トーン(ブザー、87、250); delay(250);}
回路図
simon_says_fritzing_Yb8EdKPqD4.fzz 製造プロセス