Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);
Pong (Atari 1972) foi, o primeiro vídeo-grame lucrativo da história (veja matéria completa em http://pt.wikipedia.org/wiki/Pong).
Com Arduino é muito fácil reproduzir este jogo e com poucos recursos de Hardware, necessitando apenas de uma Placa Arduino e uma matriz de LEDs.
O HARDWARE:
1 x Arduino UNO ou Duemilanove
1 x BreadBoard
1 x Matriz de LEDs, catodo comum
2 x Potenciômetros de 10KO Deslizantes
Fios e Cabos
O CIRCUITO:
Acima podemos ver a pinagen da matriz de LEDs e a correta conexão ao Arduino
Se necessário coloque resistores de 220O em série com os pinos das colunas.
Circuito Completo |
Detalhe da Matiz de LEDs |
Para inserir os potenciômetros deslizantes, conecte os terminais do extremo ao positivo e negativo da alimentação, o terminal central dos potenciômetors devem ser conectados aos pinos analógico 4 (controle da esquerda) e ao pino analógico 5 (controle da direita) do Arduino.
O SOFTWARE:
Consultas:
Biblioteca TimerOne:
http://www.arduino.cc/playground/Code/Timer1
Interfaceamento direto de matriz de LEDs com Arduino: http://www.arduino.cc/playground/Main/DirectDriveLEDMatrix
Este é um projeto do Bruno Soares, todos os créditos de programação vão para ele.
* Ping Pong with 8x8 Led Dot Matrix on Arduino
*
* @author Bruno Soares
* @website www.bsoares.com.br
*/
#include "TimerOne.h"
#define PIN_LEFT 4
#define PIN_RIGHT 5
unsigned int left = 0;
unsigned int right = 0;
int angle = 0;
int radians;
byte rows[8] = {9, 14, 8, 12, 1, 7, 2, 5};
byte cols[8] = {13, 3, 4, 10, 6, 11, 15, 16};
byte pins[16] = {5, 4, 3, 2, 14, 15, 16, 17, 13, 12, 11, 10, 9, 8, 7, 6};
byte screen[8] = {0, 0, 0, 0, 0, 0, 0, 0};
volatile byte screenRow = 0;
volatile byte screenCol = 0;
int _angle;
int _px;
int _py;
int _w = 7;
int _h = 7;
int _wall[] = {3, 3};
int _count = 0;
int _speed = 3;
int _countPoints = 0;
void setup() {
Timer1.initialize(100);
for (int i = 2; i <= 17; i++)
pinMode(i, OUTPUT);
Timer1.attachInterrupt(doubleBuffer);
Serial.begin(9600);
face();
reset();
}
void doubleBuffer() {
digitalWrite(translatePin(rows[screenRow]), LOW);
digitalWrite(translatePin(cols[screenCol]), HIGH);
screenCol++;
if (screenCol >= 8) {
screenCol = 0;
screenRow++;
if (screenRow >= 8) {
screenRow = 0;
}
}
if((screen[screenRow] >> screenCol) & B1 == B1) {
digitalWrite(translatePin(rows[screenRow]), HIGH);
digitalWrite(translatePin(cols[screenCol]), LOW);
} else {
digitalWrite(translatePin(rows[screenRow]), LOW);
digitalWrite(translatePin(cols[screenCol]), HIGH);
}
}
byte translatePin(byte original) {
return pins[original - 1];
}
void allOFF() {
for (int i = 0; i < 8; i++)
screen[i] = 0;
}
void on(byte row, byte column) {
screen[column-1] |= (B1 << (row - 1));
}
void off(byte row, byte column) {
screen[column-1] &= ~(B1 << (row - 1));
}
void calcWall()
{
left = analogRead(PIN_LEFT);
right = analogRead(PIN_RIGHT);
left = constrain(map(left, 223, 800, 0, 6), 0, 6);
right = constrain(map(right, 223, 800, 6, 0), 0, 6);
clearWall();
on(1, left + 1);
on(1, left + 2);
on(8, right + 1);
on(8, right + 2);
_wall[0] = left;
_wall[1] = right;
show();
}
void clearWall()
{
for (int i = 0; i < 8; i++)
screen[i] &= B01111110;
}
void clearGame()
{
for (int i = 0; i < 8; i++)
screen[i] &= B10000001;
}
void loop() {
calcWall();
enterFrameHandler();
delay(50);
}
void enterFrameHandler()
{
if (_count++ < _speed)
return;
_count = 0;
checkCollision();
calcAngleIncrement();
show();
}
void retorted(int angle)
{
Serial.println(angle);
_angle = angle;
if (++_countPoints % 5 == 0 && _speed > 1)
_speed--;
}
void resetAnim()
{
for (int i = 0; i < 8; i++)
{
screen[i] = B11111111;
delay(25);
}
for (int i = 0; i < 8; i++)
{
screen[i] = B00000000;
delay(25);
}
}
void face()
{
on(1, 1);
on(1, 2);
on(2, 1);
on(2, 2);
on(7, 1);
on(7, 2);
on(8, 1);
on(8, 2);
on(1, 1);
on(1, 2);
on(4, 4);
on(4, 5);
on(5, 4);
on(5, 5);
on(2, 7);
on(7, 7);
on(3, 8);
on(4, 8);
on(5, 8);
on(6, 8);
delay(5000);
}
void reset()
{
resetAnim();
_px = random(3, 5);
_py = random(3, 5);
_angle = random(0, 2) == 0 ? 0 : 180;
_speed = 5;
_countPoints = 0;
show();
delay(500);
}
void show()
{
clearGame();
on(_px + 1, _py + 1);
}
void checkCollision()
{
if (_px == _w - 1)
{
if (_angle == 315 || _angle == 0 || _angle == 45)
{
if (_py == _wall[1] || _py == _wall[1] + 1)
{
if (_angle == 0 && _py == _wall[1])
retorted(225);
else if (_angle == 0 && _py == _wall[1] + 1)
retorted(135);
else if (_angle == 45 && _py == _wall[1])
retorted(135);
else if (_angle == 45 && _py == _wall[1] + 1)
retorted(180);
else if (_angle == 315 && _py == _wall[1])
retorted(180);
else if (_angle == 315 && _py == _wall[1] + 1)
retorted(225);
}
}
}
else if (_px == 1)
{
if (_angle == 225 || _angle == 180 || _angle == 135)
{
if (_py == _wall[0] || _py == _wall[0] + 1)
{
if (_angle == 180 && _py == _wall[0])
retorted(315);
else if (_angle == 180 && _py == _wall[0] + 1)
retorted(45);
else if (_angle == 135 && _py == _wall[0])
retorted(45);
else if (_angle == 135 && _py == _wall[0] + 1)
retorted(0);
else if (_angle == 225 && _py == _wall[0])
retorted(0);
else if (_angle == 225 && _py == _wall[0] + 1)
retorted(315);
}
}
}
if (_px == _w)
{
reset();
}
else if (_px == 0)
{
reset();
}
else if (_py == _h)
{
if (_angle == 45)
_angle = 315;
else if (_angle == 135)
_angle = 225;
}
else if (_py == 0)
{
if (_angle == 225)
_angle = 135;
else if (_angle == 315)
_angle = 45;
}
}
void calcAngleIncrement()
{
if (_angle == 0 || _angle == 360)
{
_px += 1;
}
else if (_angle == 45)
{
_px += 1;
_py += 1;
}
else if (_angle == 135)
{
_px -= 1;
_py += 1;
}
else if (_angle == 180)
{
_px -= 1;
}
else if (_angle == 225)
{
_px -= 1;
_py -= 1;
}
else if (_angle == 315)
{
_px += 1;
_py -= 1;
}
}
O VÍDEO:
Dúvidas e sugestões enviem para: arduinobymyself@gmail.com
Pessoal, o vídeo ficou invertido, prometo arrumar depois.........
Nenhum comentário:
Postar um comentário