Jogo Pong Neon em Matriz NeoPixel com Arduino Nano
Componentes e Materiais
| Fita NeoPixel (LED endereçável individualmente) | × | 1 |
| Jumpers | × | 1 |
| Arduino Nano R3 | × | 1 |
| Header Fêmea 8 pinos (0,1") | × | 1 |
| Perma-Proto Meia Placa (Adafruit) | × | 1 |
| Joystick Analógico (genérico) | × | 1 |
| Potenciômetro Rotativo (genérico) | × | 1 |
Ferramentas
- Ferro de solda
Software
- Arduino IDE
- Bibliotecas: Adafruit_GFX, Adafruit_NeoMatrix, Adafruit_NeoPixel
Sobre o Projeto
A Matriz
Não é o filme, é a matriz de NeoPixels! Compre uma fita de LEDs NeoPixel endereçáveis individualmente. Desenrole e observe as setas na fita: a conexão só funciona em UM SENTIDO; inverter a orientação pode queimar os LEDs.

Usei fita de 30 LEDs/m (5 m) e cortei em segmentos de 10 LEDs. Colei sobre papel cartão alternando a orientação (zig-zag). Soldei os fios nos terminais de cada segmento. Após 14 soldas, a matriz estava pronta. Testar com multímetro para evitar curtos (um curto pode queimar o Nano, a matriz e a porta USB — experiência própria). Carregue o sketch de teste neomatrix com parâmetros NEO_BOTTOM + NEO_LEFT + NEO_COLUMNS + NEO_ZIGZAG. Se rolar "howdy", a matriz está OK.

A Lógica do Jogo
O Pong tem: pala, paredes, bola. Variáveis ballX, ballY guardam posição da bola. Direção controlada por +1 ou -1 nas variáveis de direção. A pala é um retângulo controlado por potenciômetro mapeado para 0–15 (eixo Y fixo). No início, a bola nasce em (1,1) e o jogador deve deixar quicar uma vez para iniciar. A física considera a direção da bola e onde ela atingiu a pala.
Diversão!
Conecte a matriz ao Arduino Nano: +5V do joystick no 5V do Arduino, GND no GND, eixo X no A0. Divirta-se! Tente adicionar mais jogadores e física melhorada como desafio.
Código
Arquivo principal (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, paddleY = 0;
int oldPaddleX, oldPaddleY;
int ballDirectionX = 1, ballDirectionY = 1;
int score = 0;
int ballSpeed = 10; // menor = mais rápido
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;
}
Esquemático

Processo de manufatura
- Detector de Idiomas TinyML com Edge Impulse no Arduino Nano 33 BLE Sense
- Construa um Jogo em Tempo Real com Giroscópio: Arduino Nano + Sensor MPU-6050
- Dados Digital com Arduino: Gere Números Aleatórios 1-6 em LCD 16x2
- Construa um Homem de Ferro com Arduino: Componentes, Sensores e Guia Passo a Passo
- Find Me: Localizador Inteligente de Objetos com Arduino e Bluetooth
- Controlador de Umidificador DIY com Arduino e Relé – Configuração Segura de Alta Tensão
- Medição de Distância em Tempo Real com Sonar Arduino e Visualização no Processing
- MobBob: Construa Seu Próprio Robô Arduino, Controlado via Smartphone Android
- Lâmpada de Mesa Reativa a Áudio com Arduino Nano
- Volante Joystick Arduino Personalizado para Jogos