Jeu Pong sur Matrice NeoPixel avec Arduino Nano
Composants et fournitures
- 1x Bandeau NeoPixel (LED adressables individuellement)
- 1x Fils de câblage (jumper wires) génériques
- 1x Arduino Nano R3
- 1x Connecteur femelle 8 positions 1 rangée (0,1")
- 1x Plaque Perma-Proto demi-taille
- 1x Joystick analogique (générique)
- 1x Potentiomètre rotatif (générique)
Outils et machines nécessaires
- Fer à souder (générique)
Applications et services en ligne
- Arduino IDE
À propos de ce projet
La Matrice
Non, pas le film, la matrice NeoPixel ! Pour faire une matrice, achetez simplement un bandeau de LED NeoPixel adressables individuellement. Déroulez le bandeau et notez les flèches dessus. Vous ne pouvez les assembler que dans UNE SEULE DIRECTION, vous pourriez les endommager si l'orientation est inversée.

J'ai utilisé un bandeau 30 LED/m de 5m et je l'ai découpé en bandes de 10 LED chacune. J'ai ensuite posé les bandes sur un morceau de carton, en alternant les orientations. J'ai ensuite coupé les fils aux bonnes longueurs et les ai soudés aux bornes des NeoPixel. Après avoir fait cela 14 fois, ma matrice était enfin prête ! Ensuite, j'ai vérifié au multimètre qu'il n'y avait pas de court-circuit, car un court-circuit grillerait le Nano, la matrice, et peut-être votre port USB (je sais par expérience). Téléversez le sketch de test neomatrix avec les paramètres NEO_BOTTOM + NEO_LEFT + NEO_COLUMNS + NEO_ZIGZAG. Si "howdy" défile sur l'affichage, la partie affichage est terminée !

La Logique
Un jeu Pong a plusieurs objets : la raquette, les murs et la balle. Le code utilise les variables ballX et ballY pour suivre la position de la balle. La direction de la balle est gérée par soit 1 soit -1 assigné aux variables de direction. La raquette est un rectangle contrôlé via un potentiomètre mappé sur 0 à 15. La position Y de la raquette ne change pas, donc pas besoin de variable pour la mapper. Au début d'une partie, la balle démarre en 1,1 et le joueur doit laisser la balle rebondir une fois pour commencer. La physique prend en compte la direction de la balle et l'endroit où elle frappe la raquette.
Amusez-vous !
Maintenant, branchez simplement la matrice NeoPixel sur votre Arduino Nano, le +5V du joystick sur 5V, le GND sur GND Arduino, et enfin l'axe X sur A0. Amusez-vous avec votre nouveau jeu Pong ! Essayez d'ajouter plus de joueurs et une meilleure physique pour plus de challenge !
Code
Le Code Arduino (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);
// variables pour la position de la balle et de la raquette
int paddleX = 0;
int paddleY = 0;
int oldPaddleX, oldPaddleY;
int ballDirectionX = 1;
int ballDirectionY = 1;
int score = 0;
int ballSpeed = 10; // nombres plus bas = plus rapide
int ballX, ballY, oldBallX, oldBallY;
void setup() {
Serial.begin(9600);
// initialisation de l'affichage
matrix.begin();
// fond noir
matrix.fillScreen(0);
matrix.setTextColor(matrix.Color(0,255,0));
matrix.print("GO");
matrix.show();
delay(2000);
matrix.fillScreen(0);
matrix.show();
}
void loop() {
// sauvegarde largeur et hauteur de l'écran
int myWidth = matrix.width();
int myHeight = matrix.height();
// mappe la position de la raquette sur celle du potentiomètre
paddleX = map(analogRead(A0), 0, 1023, 0, 12);
paddleY = 8;
// efface la position précédente de la raquette si différente
if (oldPaddleX != paddleX || oldPaddleY != paddleY) {
matrix.fillRect(oldPaddleX, oldPaddleY, 4, 1, matrix.Color(0,0,0));
}
// dessine la raquette, sauvegarde la position courante comme précédente
matrix.fillRect(paddleX, paddleY, 4, 1, matrix.Color(0,0,255));
oldPaddleX = paddleX;
oldPaddleY = paddleY;
matrix.show();
// met à jour la position de la balle et l'affiche
if (millis() % ballSpeed < 2) {
moveBall();
}
matrix.show();
// gestion du score et réinitialisation
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);
}
// cette fonction détermine la position de la balle à l'écran
void moveBall() {
// si la balle sort de l'écran, inverse la direction :
if (ballX > matrix.width() - 1 || ballX < 0) {
ballDirectionX = -ballDirectionX;
}
if (ballY > matrix.height() || ballY < 0) {
ballDirectionY = -ballDirectionY;
}
// vérifie si la balle et la raquette occupent le même espace
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;
}
}
// met à jour la position de la balle
ballX += ballDirectionX;
ballY += ballDirectionY;
// efface la position précédente de la balle
if (oldBallX != ballX || oldBallY != ballY) {
matrix.drawPixel(oldBallX, oldBallY, matrix.Color(0,0,0));
}
// dessine la position courante de la balle
matrix.drawPixel(ballX, ballY, matrix.Color(150,150,0));
oldBallX = ballX;
oldBallY = ballY;
}
// cette fonction vérifie si la balle intersecte la raquette
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;
}
Schémas

Processus de fabrication
- Détecteur de langue TinyML avec Edge Impulse sur Arduino Nano 33 BLE Sense
- Construire un jeu gyroscopique temps réel avec Arduino Nano et capteur MPU-6050
- Dé numérique Arduino sur écran LCD 16x2 – Générateur aléatoire à bouton poussoir
- Construire un Iron Man animé avec Arduino : capteurs, sons et relais
- Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
- Contrôleur d'humidificateur DIY avec Arduino et relais – Installation haute tension sécurisée
- Mesure de distance en temps réel par sonar Arduino et visualisation Processing
- MobBob : Construisez votre propre robot Arduino, contrôlé via smartphone Android
- Construire une lampe de bureau réactive à l'audio avec Arduino Nano