Sei sulla pagina 1di 10

Projeto Arduboy

Introduo:

Tentando facilitar a construo de um Arduboy, trabalhamos em um prottipo funcional


feito com o mnimo de material possvel. Com o desenvolvimento deste espetacular trabalho,
voc construir o seu prprio Arduboy.
Todo mundo que ligado em tecnologia (ou teve um celular Nokia daqueles antigos) j
jogou algum dia o famoso jogo da cobrinha (Snake). Existem vrias verses online desse jogo
clssico, e vamos mostrar como voc pode jogar o Snake com Arduino, montando um circuito
com poucos componentes.
Para quem no conhece o jogo, ele nada mais do que uma cobra que percorre a tela
atrs de ovos. A cada ovo que ela consegue encontrar, o placar incrementado em um ponto, a
cobra ganha mais um crculo, aumentando de tamanho, e aumenta tambm a velocidade do
jogo. Caso a cobra encoste nas laterais da tela ou em si prpria, o jogo encerrado.
Para os Projetistas Fora do Comum que se aventuraram neste projeto, se preparem, pois
ser muito divertido e interessante. Ento mos a obra!

Desenvolvimento:

Trabalhar com o Arduino bem divertido, mas um pouco complexo tratando de alguns
projetos. Este projeto um projeto em nvel mediano, mas um pouco trabalhoso.

O circuito utiliza um Arduino Uno e 4 botes do tipo push-button para controlar a


movimentao da cobra na tela. Pode se substituir esses botes por um Joystick 3 Eixos,
economizando assim 2 portas do Arduino.

Material utilizado:

1-Arduno Nano.
30-centimetros de fio 0,5mm.
1-Resistor de 1k ohm.
1-Placa de Fenolite 5x7 cm
1-buzzer
4-botes tipo push-button
1-Display Nokia 5110
Ao iniciarmos o trabalho cortamos a placa de Fenolite , sendo que ela no vem no
tamanho 5x7cm.
Segundo ato foi colocarmos o arduino na placa juntamente com a tela LCD do Nokia
5110, de forma que a jogabilidade fique confortvel e intuitiva. Feito isso comeamos a soldar
os circutos em seus devidos lugares, tudo milimetricamente medido. Ao soldar os botes,
soldamos o Arduino em lado oposto dos botes. Feito isso, colocamos o resistor na placa
ligando ao buzzer ligado ao arduino, para facilitar a montagem e reduzir o nmero de
componentes, ativamos os resistores pull up internos nas portas utilizadas pelos botes (4, 5, 6 e
7). A outra extremidade dos botes ligada ao GND.

Depois de ter montado a parte pratica do projeto, como a programar o jogo snake no
software do arduino.

A dificuldade maior do projeto na parte de soldagem e programao, precisamos


transferir os 5V de uma bateria para o circuito do arduino e da tela LCD. O fio de alimentao
da bateria soldado ao GND e no VCC, assim conseguimos permitir a ligao do dispositivo
tanto do arduino quanto da tela LCD, com a preocupao de que o projeto no fosse to robusto
para no prejudicar a pegada do Arduboy.

Dados de programao:

//Programa: Snake com Arduino Uno


//Alteracoes e adaptacoes: FILIPEFLOP
//
//Baseado no codigo original de Abhinav Faujdar *****/

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>

//Inicializa o display
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 10, 11, 12);

#define LEFT 7
#define DOWN 5
#define RIGHT 4
#define UP 6
#define speakerPin 17

//Verifica em qual direcao a cobra esta se movendo


boolean dl = false, dr = false, du = false, dd = false;

int x[50], y[50], i, slength, tempx = 10, tempy = 10, xx, yy;
unsigned int high;
uint8_t bh, bl;
int xegg, yegg;
int freq, tb;
int l, r, u, d, p;
unsigned long time = 280, beeptime = 50;
int score = 0, flag = 0;

void setup()
{
Serial.begin(9600);
display.begin();

//Informacoes iniciais display


display.setContrast(50);
display.clearDisplay();
display.drawRoundRect(0, 0, 84 , 25, 1, 2);
display.setTextSize(2);
display.setTextColor(BLACK);
display.setCursor(12, 6);
display.println("SNAKE");
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(12, 29);
display.println("FILIPEFLOP");
display.setCursor(13, 29);
display.println("FILIPEFLOP");
display.setCursor(0, 40);
display.println("filipeflop.com");

display.display();
delay(2000);

pinMode(LEFT, INPUT);
pinMode(RIGHT, INPUT);
pinMode(UP, INPUT);
pinMode(DOWN, INPUT);
pinMode(speakerPin, OUTPUT);
digitalWrite(LEFT, HIGH);
digitalWrite(RIGHT, HIGH);
digitalWrite(UP, HIGH);
digitalWrite(DOWN, HIGH);

slength = 8;
xegg = (display.width()) / 2;
yegg = (display.height()) / 2;
display.clearDisplay();
display.drawRect(0, 0, 84, 48, 1);
display.setCursor(4, 2);
display.print("P: R:");
display.setCursor(22, 2);
display.print(score);
display.setCursor(64, 2);
display.print(high);
display.drawRect(0, 0, 84, 11, 1);
//Define coordenadas iniciais
for (i = 0; i <= slength; i++)
{
x[i] = 25 - 3 * i;
y[i] = 30;
}
for (i = 0; i < slength; i++) //Draw the snake
{
display.drawCircle(x[i], y[i], 1, BLACK);
}
display.display();
dr = true;
}

void loop()
{
movesnake();
}

void movesnake()
{
//Leitura do valor dos botoes
l = digitalRead(LEFT);
d = digitalRead(DOWN);
r = digitalRead(RIGHT);
u = digitalRead(UP);

if (flag == 0)
{
direct();
}

if (millis() % time == 0)
{
if (flag == 0)
{
if (dr == true) {
tempx = x[0] + 3;
tempy = y[0];
}
if (dl == true) {
tempx = x[0] - 3;
tempy = y[0];
}
if (du == true) {
tempy = y[0] - 3;
tempx = x[0];
}
if (dd == true) {
tempy = y[0] + 3;
tempx = x[0];
}
}
flag = 0;
//Verifica se a cobra esta nas mesmas coordenadas do ovo
checkgame();
checkegg();

//Altera as coordenadas de todos os pontos da cobra


for (i = 0; i <= slength; i++)
{
xx = x[i];
yy = y[i];
x[i] = tempx;
y[i] = tempy;
tempx = xx;
tempy = yy;
}
//Desenha a cobra e o ovo nas novas coordenadas
drawsnake();
}
}

void checkgame()
{
for (i = 1; i < slength; i++)
{
//Verifica se o recorde foi batido e
//mostra na tela o novo valor
high = (((0xff00 + bh) << 8) + bl);
if (score > high)
{
high = score;
bh = (high >> 8);
bl = high & 0xff;
display.fillRect(61, 1, 20, 9, 0);
display.setCursor(65, 2);
display.print(high);
}
//Verifica se tocou nas bordas
if ((x[0] <= 1 || x[0] >= 83) || (y[0] <= 12 || y[0] >= 47) ||
(x[i] == x[0] && y[i] == y[0]) )
{
//Jogo terminado. Mostra informacoes na tela
display.clearDisplay();
display.fillRoundRect(0, 0, 84 , 31, 1, 2);
display.setTextColor(WHITE);
display.setTextSize(2);
display.setCursor(18, 1);
display.print("GAME");
display.setCursor(18, 16);
display.print("OVER");
display.setTextColor(BLACK);
display.setTextSize(1);
display.setCursor(12, 33);
display.print("PLACAR");
display.setCursor(60, 33);
display.print(score);
display.setCursor(12, 41);
display.print("RECORDE");
display.setCursor(60, 41);
display.print(high);
display.display();
//Aguarda 5 segundos e reinicia o jogo
delay(5000);

//Apaga a tela
display.clearDisplay();
//Retorna aos valores iniciais
slength = 8;
score = 0;
time = 280;
redraw();
}
}
}

void checkegg() //Snake meets egg


{
//Verifica se a cobra est nas mesmas coordenadas do ovo
if (x[0] == xegg or x[0] == (xegg + 1) or x[0] == (xegg + 2) or x[0]
== (xegg - 1))
{
if (y[0] == yegg or y[0] == (yegg + 1) or y[0] == (yegg + 2) or
y[0] == (yegg - 1))
{
//Incrementa a cobra em uma posio, incrementa o placar e
//aumenta a velocidade do jogo, diminuindo o tempo
score += 1;
display.fillRect(21, 1, 20, 9, 0);
display.setCursor(22, 2);
display.print(score);
slength += 1;
if (time >= 90)
{
time -= 10;
}
display.fillRect(xegg, yegg, 3, 3, WHITE);
display.display();
beep(35, beeptime);
//Cria novo ovo em posicao aleatoria
xegg = random(2, 80);
yegg = random(15, 40);
}
}
}

void direct()
{
//Altera o movimento caso uma tecla tenha sido pressionada
if (l == LOW and dr == false)
{
dl = true; du = false; dd = false;
//Salva novas coordenadas em Tempx, Tempy
tempx = x[0] - 3;
tempy = y[0];
flag = 1;
}
else if (r == LOW and dl == false)
{
dr = true; du = false; dd = false;
tempx = x[0] + 3;
tempy = y[0];
flag = 1;
}
else if (u == LOW and dd == false)
{
du = true; dl = false; dr = false;
tempy = y[0] - 3;
tempx = x[0];
flag = 1;
}
else if (d == LOW and du == false)
{
dd = true; dl = false; dr = false;
tempy = y[0] + 3;
tempx = x[0];
flag = 1;
}
}

void drawsnake()
{
display.fillRect(xegg, yegg, 3, 3, BLACK);
display.drawCircle(x[0], y[0], 1, BLACK);
display.drawCircle(x[slength], y[slength], 1, WHITE);
display.display();
}

void redraw()
{
display.drawRect(0, 0, 84, 48, 1);
display.drawRect(0, 0, 84, 48, 1);
display.setCursor(4, 2);
display.print("P: R:");
display.drawRect(0, 0, 84, 11, 1);
display.fillRect(21, 1, 20, 9, 0);
display.setCursor(22, 2);
display.print(score);
display.fillRect(61, 1, 20, 9, 0);
display.setCursor(65, 2);
display.print(high);
xegg = (display.width()) / 2;
yegg = (display.height()) / 2;
dl = false, dr = false, du = false, dd = false;
dr = true;
display.setCursor(4, 2);
display.print("P: R:");
display.drawRect(0, 0, 84, 11, 1);
//Retorna as coordenadas iniciais
for (i = 0; i <= slength; i++)
{
x[i] = 25 - 3 * i;
y[i] = 30;
}
tempx = 33 - 3 * i;
tempy = 30;
display.display();
}

void beep (int freq, long tb)


{
int x;
long delayAmount = (long)(500 / freq);
long loopTime = (long)(tb / (delayAmount * 2));
for (x = 0; x < loopTime; x++)
{
digitalWrite(speakerPin, HIGH);
delay(delayAmount);
digitalWrite(speakerPin, LOW);
delay(delayAmount);
}
delay(2);
}

Abaixo temos o circuito do Arduboy:


Concluso:

Este projeto teve como objetivo complementar o aprendizado de sala de aula na matria
de sistemas digitais 2, e agregar um maior conhecimento sobre lgica e as possibilidades que a
placa Arduino e a montagem dos circuitos nos oferecem. Alm de muito trabalho, o projeto
torna-se divertido, acrescentando muitos valores de conhecimentos.

Bibliografia:

http://blog.filipeflop.com/arduino/jogue-snake-com-arduino.html

Potrebbero piacerti anche