Pixel Chaser: Jogo LED Interativo de Um Toque com Arduino Nano
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Arduino Nano R3 | 1 |
| Anel Adafruit NeoPixel: WS2812 5050 RGB LED | 1 |
| Protoboard Meio Tamanho Sem Solda | 1 |
| Resistor 10k ohm | 1 |
| Botão SparkFun 12mm | 1 |
| Fios jumpers (genéricos) | 1 |
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
Costumava ser desenvolvedor de jogos, e um dos "santos graais" no desenvolvimento de jogos mobile é criar o jogo definitivo de "um toque".
Quis ver se conseguia fazer um incrível jogo de "física" de um clique usando um microcontrolador, um botão e alguma forma de feedback visual.
Apresentando PIXEL CHASER!
É uma construção bastante fácil, então vamos direto a ela!
Que peças precisamos?

- Arduino Nano (ou qualquer microcontrolador com 2 pinos IO disponíveis)
- Anel ou tira RGB "NeoPixel"
- Botão momentâneo
- Resistor 10k
- Protoboards
- Fios
Passo 1
Coloque o Nano em uma extremidade da protoboard com o conector USB na borda.

Passo 2
Coloque o botão na outra extremidade da protoboard, o mais próximo da borda possível para fácil acesso.

Passo 3
Adicione o resistor 10k entre um dos lados do botão e o trilho GND da protoboard. Este será o estado LOW padrão do botão. Usamos um resistor para garantir que não haja curto entre VCC e GND quando o botão é pressionado, pois isso pode danificar o microcontrolador e outros componentes.

Passo 4
Conecte um fio jumper do lado oposto do botão ao trilho VCC. O botão irá para HIGH quando pressionado.

Passo 5
Conecte um fio jumper do lado GND do botão ao D3 no Nano. Leremos D3 para determinar o estado do botão.

Passo 6
Conecte a tira/anél RGB à protoboard. Conecte o fio VCC ao trilho de alimentação VCC, o fio GND ao trilho GND e o fio DI (Data In) ao D4 no Nano. Controlaremos os pixels com D4.

Passo 7
Conecte um fio jumper do pino 5V no Nano ao trilho VCC, então conecte um fio jumper do pino GND no Nano ao trilho GND.

Passo 8
Envie o código e jogue!

Espero que tenha gostado deste projeto!
Você pode encontrar mais projetos divertidos como este no meu canal do YouTube.
Siga-me:
- https://twitter.com/unexpectedmaker
- https://www.facebook.com/unexpectedmaker/
- https://www.instagram.com/unexpectedmaker/
- https://www.patreon.com/unexpectedmaker
- https://www.tindie.com/stores/seonr/
Código
- Pixel Chaser Game - Arduino Code
Pixel Chaser Game - Arduino Code Arduino
Adicione este código no Arduino e siga as instruções de montagem!
/* ---------------------------------------------------------------------------
Pixel Chaser Game - v1.0.0 - 24/03/2019.
AUTOR/LICENÇA:
Criado por Seon Rozenblum - seon@unexpectedmaker.com
Copyright 2016
Licença: GNU GPL v3
https://www.gnu.org/licenses/gpl-3.0.html
LINKS:
Blog: unexpectedmaker.com
YOUTUBE: youtube.com/c/unexpectedmaker
AVISO:
Este software é fornecido "como está", sem suporte técnico, e sem garantia, expressa ou implícita, quanto à sua utilidade para qualquer propósito.
PROPÓSITO:
Este controlador é o software que roda no controlador de forno toaster Reflow Master feito por Unexpected Maker
HISTÓRICO:
24/03/2019 v1.0.0 - Lançamento inicial.
NOTA: Este é um trabalho em andamento...
--------------------------------------------------------------------------- */
// Precisamos destas bibliotecas instaladas do gerenciador de bibliotecas
#include <Adafruit_NeoPixel.h>
#include "OneButton.h"
// Qual GPIO a tira está conectada
#define PIXELPIN 4
// Quantos NeoPixels na tira
#define NUMPIXELS 24
// Qual GPIO o botão está conectado?
#define BUTTON_TAP 3
// Inicializa o botão, com LOW padrão
OneButton buttonTAP(BUTTON_TAP, false);
// Inicializa a tira de pixels
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIXELPIN, NEO_GRB + NEO_KHZ800);
// Variáveis
int playerIndex = -1;
int playerIndexTrail = -1;
int playerDirection = 1;
float nextMove = 0;
float currentPlayerSpeed = 150;
unsigned long countdown = 0;
int enemyIndex = -1;
int coinIndex = -1;
int score = 0;
int bestScore = 0;
int lastScore = 0;
bool gameOver = false;
void setup() {
// torna pino do botão entrada
pinMode( BUTTON_TAP, INPUT );
// Anexa funções de clique ao botão
buttonTAP.attachClick(singleClick);
buttonTAP.attachLongPressStart(longClick);
// Inicializa a tira e define brilho para 20%
pixels.begin();
pixels.setBrightness(20);
// define contagem regressiva de 2 segundos antes do jogador aparecer e começar a mover
countdown = millis() + 2000;
}
void loop() {
// Cada ciclo precisamos atualizar estado do botão
buttonTAP.tick();
// Se jogo em game over, sai do loop cedo
if ( gameOver ) return;
// Define estado de exibição do nível
// Isso define posição do inimigo e da moeda
SetLevel();
// espera um segundo para o jogador se preparar
if ( countdown > millis() ) {
pixels.show();
return;
}
// Toda lógica de exibição, movimento e jogo do jogador está aqui
DisplayPlayer();
// Envia cores atualizadas para o hardware.
pixels.show();
}
// Limpa o nível, definindo todos pixels como pretos
void ClearLevel() {
for(int i=0;i= 0 )
pixels.setPixelColor(playerIndexTrail, pixels.Color(0, 0, 0));
if ( playerIndex >= 0) {
pixels.setPixelColor(playerIndex, pixels.Color(0, 100, 0));
playerIndexTrail = playerIndex;
}
// Move jogador na direção atual
playerIndex += playerDirection;
// Envolve jogador nas bordas da tira
if ( playerIndex < 0 ) playerIndex = NUMPIXELS - 1;
else if ( playerIndex == NUMPIXELS ) playerIndex = 0;
pixels.setPixelColor(playerIndex, pixels.Color(0, 255, 0));
// Jogador acertou a moeda?
// Se sim, aumenta pontuação, reseta posições de moeda e inimigo e limpa nível
// Próximo loop SetLevel() resetará inimigo e moeda
// Velocidade do jogador também aumenta para cada moeda acertada
if ( playerIndex == coinIndex ) {
enemyIndex = -1;
coinIndex = -1;
score++;
currentPlayerSpeed = constrain( currentPlayerSpeed - 10, 50, 150 );
ClearLevel();
pixels.setPixelColor(playerIndex, pixels.Color(0, 255, 0));
}
// Jogador acertou o inimigo?
// Define última/melhor pontuação e chama game over
else if ( playerIndex == enemyIndex ) {
lastScore = score;
if ( score >= bestScore ) bestScore = score;
GameOver();
gameOver = true;
enemyIndex = -1;
coinIndex = -1;
playerIndex = -1;
}
}
}
// Clique simples no botão
void singleClick() {
// Sem entrada até jogador ficar visível
if ( countdown > millis() ) return;
// inverte direção do jogador
playerDirection = -playerDirection;
}
// Clique longo no botão
void longClick() {
// Alterna estado game over
// Se era game over, inicia jogo, senão cancela jogo em andamento
gameOver = !gameOver;
if ( gameOver ) {
enemyIndex = -1;
coinIndex = -1;
playerIndex = -1;
currentPlayerSpeed = 150;
ClearLevel();
} else {
ClearLevel();
score = 0;
currentPlayerSpeed = 150;
countdown = millis() + 2000;
}
}
Processo de manufatura
- 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 o Clássico Jogo Pong no Arduino UNO com Display OLED – Tutorial Passo a Passo
- Construa Seu Próprio Jogo de Roleta com 37 LEDs e Arduino Nano
- Controle USB para Jogos DIY com Arduino – Construa Seu Próprio Gamepad de Alto Desempenho
- Jogo Breakout Touch com Arduino: Arcade Clássico em LCD TFT 2,4″
- Construa um Jogo Tetris com Arduino Nano em Matriz LED 16×8 DIY
- Levitação Magnética Repulsiva com Arduino: Circuito Simples e Guia DIY
- Automatize o Jogo do Dinossauro do Chrome com Arduino e LDR
- Controlador Residencial Arduino com Alexa: Automação Inteligente Simplificada