quarta-feira, 10 de junho de 2015

Jogo Pong na Matriz de LED 8x8 com Driver Max7219 e Arduino

Palavras-chave: Jogo, Game, Pong, Max7219, 7219, Arduino, Led, Matriz.

Neste post será montado o famoso jogo Pong na matriz de led.

O código utilizado foi extraído do livro Arduino Básico escrito por Michael McRoberts [1].

MATERIAIS

Eletrônica:

- 1 Arduino Uno;
- 1 Matriz de Led 8x8 com driver Max7219;
- 1 Potenciômetro de 10kΩ.

Diversos:

- Fios (jumpers) para ligação em protoboard;
- 1 Protoboard ou proto shield.

MONTAGEM

As Figuras 1 e 2 mostram a matriz de led utilizada e o diagrama elétrico para montagem, respectivamente.
Fig. 1 - Matriz de Led com Driver Max7219.
Fig. 2 - Diagrama elétrico.
PROGRAMAÇÃO - ARDUINO

Copie o código abaixo integralmente e faça o upload.
/*---------------------------------------------------------------------------------------------
 * JOGO PONG NA MATRIZ DE LED 8x8 COM DRIVER MAX7219 E ARDUINO
 *
 * Codigo extraido do livro Arduino Basico - Autor: Michael McRoberts
 *
 * Data: 10/06/2015
 ---------------------------------------------------------------------------------------------*/

#include "LedControl.h"

const byte DIN      = 12;   // Conectado ao DataIn - DIn
const byte CS       = 11;   // Conectado ao LOAD - CS
const byte CLK      = 10;   // Conectado ao CLOCK - CLK 
const byte DEVICES =  1;   // Somenta para MAX72XX -- DEVICES sao a quantidade de dispositivos que estao interligados

LedControl myMatrix = LedControl(DIN, CLK, CS, DEVICES ); // Controle da Matriz de led (myMatrix -> matriz de led)

int column = 1, row = random(8)+1;  // Decide em que ponto a bola deve iniciar
int directionX = 1, directionY = 1; // Certifica-se de que ela vai primeiro da esquerda para a direita
int paddle1 = 1, paddle1Val;        // Pino e valor do potenciometro
int speed = 300;                    // Velocidade da bola declarada em milisegundos
int counter = 0, mult = 10;         // Declaracao de contador e multiplicador


void setup() {
  myMatrix.shutdown(0, false); // O MAX72XX esta em power-saving quando ligamos - fazer uma chamada para "acordar"
  myMatrix.setIntensity(0, 4); // Ajuste de brilho alterando o valor de dois (menos brilho) para 5 (mais brilho) - 0 a 15
  myMatrix.clearDisplay(0);    // Limpa a matriz
  randomSeed(analogRead(0));  
}


void loop() {

  paddle1Val = analogRead(paddle1);              // Le valor inicial do potenciometro 
  paddle1Val = map(paddle1Val, 200, 1024, 1,6);  // Os valores sao mapeados entre 1 e 6

    column += directionX;     // Coordenadas de coluna
  row += directionY;        // Coordenadas de linha

  // Verificar se a bola atingiu a parede ou a raquete
  if (column == 6 && directionX == 1 && (paddle1Val == row || paddle1Val+1 == row || paddle1Val+2 == row))
  {
    directionX = -1; // Inverte a direcao da bola
  }

  // Se a bola atingiu as paredes topo, base ou lateral esquerda - inverte a direcao da bola
  if (column == 0 && directionX == -1 ) {
    directionX = 1;
  }
  if (row == 7 && directionY == 1 ) {
    directionY = -1;
  }
  if (row == 0 && directionY == -1 ) {
    directionY = 1;
  }

  // Se a bola estiver na coluna 7, nao atingiu a raquete e finaliza o jogo com a funcao OOPS
  if (column == 7) { 
    oops(); 
  }   

  myMatrix.clearDisplay(0); // Limpa a tela para o próximo quadro de animação

  myMatrix.setLed(0, column, row, HIGH);  // Desenha bola

  // Desenha a raquete na coluna 7 
  myMatrix.setLed(0, 7, paddle1Val, HIGH);            
  myMatrix.setLed(0, 7, paddle1Val+1, HIGH);
  myMatrix.setLed(0, 7, paddle1Val+2, HIGH);

  if (!(counter % mult)) {
    speed -= 5; 
    mult * mult;
  } // Reinicia bola com menos velocidade
  delay(speed);
  counter++;
}

void oops() // Acende todos os leds
{
  for (int x=0; x<3; x++)
  {
    myMatrix.clearDisplay(0);
    delay(250);
    for (int y=0; y<8; y++)
    {
      myMatrix.setRow(0, y, 255);
    }
    delay(250);
  }

  counter=0;   // Reinicia todos os valores
  speed=300;
  column=1;
  row = random(8)+1; // Escolhe uma nova posição inicial
}
MATERIAIS/LINKS RELACIONADOS

Nenhum comentário: