Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
必要な部品と材料
- NeoPixelストリップ (個別アドレス指定可能) × 1
- ジャンパーワイヤ (汎用) × 1
- Arduino Nano R3 × 1
- メスヘッダ 8ピン 1列 (2.54mmピッチ) × 1
- Perma-Proto基板 ハーフサイズ × 1
- アナログジョイスティック (汎用) × 1
- ロータリーポテンショメータ (汎用) × 1
必要な工具と機器
- はんだごて (汎用)
アプリとオンラインサービス
- Arduino IDE
プロジェクト概要
マトリックスの作り方
映画『マトリックス』ではなく、NeoPixelマトリックスの話です! 個別にアドレス指定可能なNeoPixel LEDストリップを1本購入します。ストリップを広げ、矢印の向きを確認してください。1方向にしか接続できません。向きを間違えると破損する恐れがあります。

私は30 LED/mの5mストリップを使用し、10 LEDずつにカットしました。厚紙の上にストリップを敷き、向きを交互に(ジグザグに)配置します。適切な長さにカットした配線をNeoPixelの端子にはんだ付けします。これを14回繰り返せばマトリックス完成! 次にテスターでショートしていないか確認します。ショートがあるとNano、マトリックス、場合によってはUSBポートまで焼損します(経験済み)。「NEO_BOTTOM + NEO_LEFT + NEO_COLUMNS + NEO_ZIGZAG」パラメータでneomatrixテストスケッチを書き込みます。「howdy」が画面をスクロールすればディスプレイ部分は完成です!

ゲームロジック
Pongゲームにはいくつかのオブジェクトがあります:パドル、壁、ボール。コードにはボールの位置を追跡する ballX と ballY 変数があります。ボールの方向は、方向変数に 1 または -1 を代入して管理します。パドルはポテンショメータで制御される長方形で、0〜15にマッピングされます。パドルのY座標は固定なので、マッピング用変数は不要です。ゲーム開始時、ボールは (1,1) からスタートし、プレイヤーはボールを1回バウンドさせてゲームを開始します。物理演算ではボールの方向と、パドルのどこに当たったかを考慮します。
プレイタイム!
NeoPixelマトリックスをArduino Nanoに接続し、ジョイスティックの+5Vを5Vに、GNDをArduinoのGNDに、X軸をA0に接続するだけです。新しいPongゲームをお楽しみください! プレイヤーを増やしたり、物理演算を改良したりして、さらに面白くしてみてください!
コード
- The Arduino Code
- Arduino Code
The Arduino Code (C/C++)
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define PIN 6
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(15, 10, PIN,
NEO_MATRIX_BOTTOM + NEO_MATRIX_LEFT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
// パドルとボールの位置変数
int paddleX = 0;
int paddleY = 0;
int oldPaddleX, oldPaddleY;
int ballDirectionX = 1;
int ballDirectionY = 1;
int score = 0;
int ballSpeed = 10; // 小さいほど高速
int ballX, 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));
}
matrix.fillRect(paddleX, paddleY, 4, 1, matrix.Color(0,0,255));
oldPaddleX = paddleX;
oldPaddleY = paddleY;
matrix.show();
if (millis() % ballSpeed < 2) {
moveBall();
}
matrix.show();
if(ballY > 8 && (millis() > 10000)){
score += 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);
}
void moveBall() {
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;
}
boolean 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;
}
return result;
}
回路図

製造プロセス
- TinyML言語検出器:Edge ImpulseとArduino Nano 33 BLE Senseで「はい」を多言語判別
- Arduino NanoとMPU-6050で作るリアルタイムジャイロスコープゲーム
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- Arduinoでアイアンマンを自作:部品・センサー・手順ガイド
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- DIY Arduino加湿器コントローラー:リレーを用いた安全な高電圧制御
- Arduino超音波センサーとProcessingで作るリアルタイム距離測定ソナー
- MobBob:Arduino製ロボットをAndroidスマホでシームレスに制御
- Arduino Nanoで作る音声反応デスクライト:音楽に合わせて光るイルミネーション
- ゲーム用カスタムArduinoジョイスティックハンドルの製作
- Arduino 101で作る万歩計:DHT11温湿度センサー&LCD表示付き