NeoMatrix Arduino Pong
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> |
|
アプリとオンラインサービス
> |
|
このプロジェクトについて
マトリックス
いいえ、映画ではなく、NeoPixelマトリックスです!マトリックスを作成するには、個別にアドレス指定可能なNeoPixelLEDのストリップを1つ購入するだけです。ストリップをほどいて、その上の矢印に注意してください。それらは一方向にしか取り付けることができません。方向が間違っていると、それらを台無しにする可能性があります。
私は30led / m 5mのストリップを使用し、それぞれ10個のLEDのストリップにカットしました。次に、方向を変えながら、厚紙の上にストリップを置き始めました。次に、ワイヤーを正しい長さに切断し、NeoPixel端子にはんだ付けしました。それを14回行った後、私のマトリックスはついに完成しました!次に、マルチメーターで短絡がないことを確認しました。短絡するとNano、マトリックス、そしておそらくUSBポートが揚げるからです(私は経験から知っています)。 「NEO_BOTTOM + NEO_LEFT + NEO_COLUMNS + NEO_ZIGZAG」パラメータを使用してneomatrixテストスケッチをアップロードします。ディスプレイ上で「ハウディ」にスクロールすると、ディスプレイ部分は完了です!
ロジック
ポンゲームには、パドル、壁、ボールなど、いくつかのオブジェクトがあります。コードには、ボールの位置を追跡するボールX変数とボールY変数があります。ボールの方向は、方向変数に割り当てられた1または-1のいずれかによって処理されます。パドルは、0〜15にマッピングされているポテンショメータを介して制御される長方形です。パドルのYは変更されないため、マッピング用の変数は必要ありません。ゲームの開始時に、ボールは1,1から始まり、プレーヤーはボールを1回バウンドさせて開始する必要があります。物理学では、ボールの方向とパドルのどこに当たるかが考慮されます。
楽しい時間です!
ここで、NeoPixelマトリックスをArduino Nanoに接続し、ジョイスティックの+ 5Vを5vに接続し、GNDをArduino GNDに接続し、最後にX軸をA0に接続します。新しいポンゲームを楽しんでください!チャレンジのために、より多くのプレーヤーとより良い物理学を追加してみてください!
コード
- Arduinoコード
- Arduinoコード
Arduinoコード C / C ++
#include#include #include #define PIN 6Adafruit_NeoMatrix matrix =Adafruit_NeoMatrix(15、10、PIN、NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_; //ボールとパドルの位置の変数intpaddleX =0; int paddleY =0; int oldPaddleX、oldPaddleY; int ballDirectionX =1; int ballDirectionY =1; int score =0; int ballSpeed =10; //数値が小さいほど高速ですintballX、ballY、oldBallX、oldBallY; void setup(){Serial.begin(9600); //表示を初期化しますmatrix.begin(); //黒の背景matrix.fillScreen(0); matrix.setTextColor(matrix.Color(0,255,0)); matrix.print( "GO"); matrix.show(); delay(2000); matrix.fillScreen(0); matrix.show();} void loop(){//画面の幅と高さを保存しますint myWidth =matrix.width(); int myHeight =matrix.height(); //パドルの位置をポテンショメータの位置にマッピングしますpaddleX =map(analogRead(A0)、0、1023、0、12); paddleY =8; //塗りつぶしの色を黒に設定し、現在と異なる場合は//パドルの前の位置を消去しますif(oldPaddleX!=paddleX || oldPaddleY!=paddleY){matrix.fillRect(oldPaddleX、oldPaddleY、4、1、matrix。 Color(0,0,0)); } //画面上にパドルを描画し、現在の位置を//前の位置として保存します。//if(paddleX> =0 &&paddleX <=11){matrix.fillRect(paddleX、paddleY、4、1、matrix.Color( 0,0,255)); //} // else if(paddleX <0){// paddleX =0; //matrix.fillRect(paddleX、paddleY、3、1、matrix.Color(0,0,255)); //} // else if(paddleX> =13){//} oldPaddleX =paddleX; oldPaddleY =paddleY; matrix.show(); //ボールの位置を更新し、画面上に描画しますif(millis()%ballSpeed <2){moveBall(); } matrix.show(); if(ballY> 8 &&(millis()> 10000)){スコア+ =1; matrix.fillScreen(0); matrix.setTextColor(matrix.Color(255,0,0)); matrix.setCursor(0,2); matrix.print(String(score)); matrix.show(); delay(4000); ballX =random(3,11); ballY =random(1,1); matrix.fillScreen(0); matrix.show(); delay(1000); } delay(5);} //この関数は画面上のボールの位置を決定しますvoidmoveBall(){//ボールが画面外に出る場合は、方向を逆にします:if(ballX> matrix.width()-1 || ballX <0) {ballDirectionX =-ballDirectionX; } if(ballY> matrix.height()|| ballY <0){ballDirectionY =-ballDirectionY; } //ボールとパドルが画面上の同じスペースを占めるかどうかを確認if(inPaddle(ballX、ballY、paddleX、paddleY、4、1)){if(ballX ==paddleX &&ballY ==paddleY){ballDirectionX =- ballDirectionX; ballDirectionY =-ballDirectionY; } else if(ballX ==paddleX + 3 &&ballY ==paddleY){ballDirectionX =ballDirectionX; ballDirectionY =-ballDirectionY; } else if(ballX ==paddleX + 1 &&ballY ==paddleY){ballDirectionX =-ballDirectionX; ballDirectionY =-ballDirectionY; } else if(ballX ==paddleX + 2 &&ballY ==paddleY){ballDirectionX =ballDirectionX; ballDirectionY =-ballDirectionY; }} //ボールの位置を更新するballX + =ballDirectionX; ballY + =ballDirectionY; //ボールの前の位置を消去しますif(oldBallX!=ballX || oldBallY!=ballY){matrix.drawPixel(oldBallX、oldBallY、matrix.Color(0,0,0)); } //ボールの現在の位置を描画しますmatrix.drawPixel(ballX、ballY、matrix.Color(150,150,0)); oldBallX =ballX; oldBallY =ballY;} //この関数は、ボールの位置をチェックします//ボールがパドルブール値と交差するかどうかを確認しますinPaddle(int x、int y、int rectX、int rectY、int rectWidth、int rectHeight){boolean result =false; if((x> =rectX &&x <=(rectX + rectWidth))&&(y> =rectY &&y <=(rectY + rectHeight))){result =true; }結果を返す;}
Arduinoコード C / C ++
#include#include #include #define PIN 6Adafruit_NeoMatrix matrix =Adafruit_NeoMatrix(15、10、PIN、NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_; //ボールとパドルの位置の変数intpaddleX =0; int paddleY =0; int oldPaddleX、oldPaddleY; int ballDirectionX =1; int ballDirectionY =1; int score =0; int ballSpeed =10; //数値が小さいほど高速ですintballX、ballY、oldBallX、oldBallY; void setup(){Serial.begin(9600); //表示を初期化しますmatrix.begin(); //黒の背景matrix.fillScreen(0); matrix.setTextColor(matrix.Color(0,255,0)); matrix.print( "GO"); matrix.show(); delay(2000); matrix.fillScreen(0); matrix.show();} void loop(){//画面の幅と高さを保存しますint myWidth =matrix.width(); int myHeight =matrix.height(); //パドルの位置をポテンショメータの位置にマッピングしますpaddleX =map(analogRead(A0)、0、1023、0、12); paddleY =8; //塗りつぶしの色を黒に設定し、現在と異なる場合は//パドルの前の位置を消去しますif(oldPaddleX!=paddleX || oldPaddleY!=paddleY){matrix.fillRect(oldPaddleX、oldPaddleY、4、1、matrix。 Color(0,0,0)); } //画面上にパドルを描画し、現在の位置を//前の位置として保存します。//if(paddleX> =0 &&paddleX <=11){matrix.fillRect(paddleX、paddleY、4、1、matrix.Color( 0,0,255)); //} // else if(paddleX <0){// paddleX =0; //matrix.fillRect(paddleX、paddleY、3、1、matrix.Color(0,0,255)); //} // else if(paddleX> =13){//} oldPaddleX =paddleX; oldPaddleY =paddleY; matrix.show(); //ボールの位置を更新し、画面上に描画しますif(millis()%ballSpeed <2){moveBall(); } matrix.show(); if(ballY> 8 &&(millis()> 10000)){スコア+ =1; matrix.fillScreen(0); matrix.setTextColor(matrix.Color(255,0,0)); matrix.setCursor(0,2); matrix.print(String(score)); matrix.show(); delay(4000); ballX =random(3,11); ballY =random(1,1); matrix.fillScreen(0); matrix.show(); delay(1000); } delay(5);} //この関数は画面上のボールの位置を決定しますvoidmoveBall(){//ボールが画面外に出る場合は、方向を逆にします:if(ballX> matrix.width()-1 || ballX <0) {ballDirectionX =-ballDirectionX; } if(ballY> matrix.height()|| ballY <0){ballDirectionY =-ballDirectionY; } //ボールとパドルが画面上の同じスペースを占めるかどうかを確認if(inPaddle(ballX、ballY、paddleX、paddleY、4、1)){if(ballX ==paddleX &&ballY ==paddleY){ballDirectionX =- ballDirectionX; ballDirectionY =-ballDirectionY; } else if(ballX ==paddleX + 3 &&ballY ==paddleY){ballDirectionX =ballDirectionX; ballDirectionY =-ballDirectionY; } else if(ballX ==paddleX + 1 &&ballY ==paddleY){ballDirectionX =-ballDirectionX; ballDirectionY =-ballDirectionY; } else if(ballX ==paddleX + 2 &&ballY ==paddleY){ballDirectionX =ballDirectionX; ballDirectionY =-ballDirectionY; }} //ボールの位置を更新するballX + =ballDirectionX; ballY + =ballDirectionY; //ボールの前の位置を消去しますif(oldBallX!=ballX || oldBallY!=ballY){matrix.drawPixel(oldBallX、oldBallY、matrix.Color(0,0,0)); } //ボールの現在の位置を描画しますmatrix.drawPixel(ballX、ballY、matrix.Color(150,150,0)); oldBallX =ballX; oldBallY =ballY;} //この関数は、ボールの位置をチェックします//ボールがパドルブール値と交差するかどうかを確認しますinPaddle(int x、int y、int rectX、int rectY、int rectWidth、int rectHeight){boolean result =false; if((x> =rectX &&x <=(rectX + rectWidth))&&(y> =rectY &&y <=(rectY + rectHeight))){result =true; }結果を返す;}
回路図
製造プロセス