quinta-feira, 7 de abril de 2016

Projeto #3: Recriando o Pong usando seu Arduino

Sim, você leu direito!
Lembra do clássico Pong, de 1977? Sim, você pode recriá-lo usando um Arduino. Quer saber como?
Só fique ligado!

Pong foi o primeiro jogo que conquistou o mercado da massa (ou seja, nóis). Pela primeira vez na história, o conceito de um "vídeo-game" foi trazido para dentro das casas, graças ao Atari 2600 - então seria legal homenagear essa joia histórica aqui no blog.
Agora, você (que já sabe o que é fliperama e tal) pode reviver esses tempos de nostalgia (é claro que com a mesma qualidade gráfica, né) usando um Arduino e alguns componentes comuns.
Eu não vou mentir - não é como se sua colega fosse desistir do Nintendo DS dela ou algo do tipo, e também não vai trazer horas de diversão pra família inteira - mas vai ser um experimento super legal e fácil de se fazer para melhorar suas habilidades com o Arduino.
Nós vamos fazer dois controles básicos, e a saída de vídeo será para uma TV (nada de moderno ou sofisticado como HDMI por aqui) usando um cabo RCA.

Nossos componentes:

  • Resistor de 470 ohms
  • Resistor de 1k ohm
  • Dois potenciômetros de 10k ohm
  • Um Arduino (lógico, né)
  • Um plugue RCA (para aprender sobre a conexão, veja o projeto anterior)
  • Um Botão
  • Um resistor de 10k ohm
arduino pong
Baixe a biblioteca TVOut para seu Arduino. Se já baixou, beleza. Se não, veja o projeto anterior.


Mas, antes de tudo, teste sua saída RCA pra não dar problemas depois.
Teste também os potenciômetros e o botão, por que não tem como jogar sem controles, né?

O código do jogo Pong (não o original de 1977)

Estou usando o código escrito por Lamonica, modificado por duboisvb para duas pessoas, e atualizado por um cara aí para usar a última versão da biblioteca.Você pode baixar o código e vê-lo daqui.
É meio que grande, mas simples, nem precisa de explicação minha. Que nem a maioria dos jogos, têm estados do jogo (menu, dentro do jogo, game over), e lê as entradas de ambos controles e do botão a cada iteração do loop. Além disso, temos métodos para desenhar a bolinha, a tela, as raquetes, e a lógica do jogo.
arduino pong project
Note que o jogo inclui saída de áudio também: Eu não achei mais plugs RCA pra testar, mas se você tiver algum, coloque o cabo do sinal no pino D11 e você terá aqueles sons nostálgicos do Pong.
arduino pong
Tá aí o resultado. Gostaram? Deixem seu comentário!
Até a próxima!

sexta-feira, 4 de dezembro de 2015

Colaborações

Pessoal,
ultimamente ando meio sem tempo para atualizar o blog.

Se você souber como fazer algo com o Arduino ou viu alguma coisa interessante que alguém fez com o Arduino, me mande um e-mail ou fale comigo pelo Facebook.

Até mais.

terça-feira, 27 de outubro de 2015

Projeto #2: Fazendo sua TV se conectar com seu Arduino (e ainda com áudio!)

Voltei galera!
Hoje eu ensino vocês a conectar seu Arduino na sua TV lá da sala, aquela que a sua mãe não deixa nem você conectar seu Play 2 pra jogar GTA.
Enfim, mão na massa!
Do que eu preciso?
Primeiramente, você vai precisar de:
- Dois cabos RCA
- Um Arduino Uno ou qualquer outro que tenha um ATMega328;
- 1 resistor de 1K e 2 resistores de 470 ohms;
e só.
Conectando
Conecte seu duino assim:
Screen Shot 06-25-14 at 10.06 AM
Você deve conectar a parte de fora (a casca) do conector no terra e a parte de dentro nos resistores de 1K e 470 ohms.
No conector de áudio, conecte a parte de dentro no resistor de 470 ohms que sobrou e a parte externa no terra.
Baixe a biblioteca TVout, que possibilita a você fazer essa proeza, nesse endereço aqui.

Programando

A resolução máxima suportada é de 128x96. Mas dá pra você fazer bastante coisa, inclusive mostrar bitmaps!
O Robson Couto, do Dragão sem Chama, mostrou seus próprios bitmaps. E o código que ele usou é esse:

#include 
#include 
#include "met.h"
#include "invader.h"

TVout TV;
void setup() {
  TV.begin(PAL,120,96);
  TV.select_font(font6x8);
  TV.println(0,40,"Arduino e TV com a\nbiblioteca TVout\n");
  TV.delay(2500);
  TV.clear_screen();
  TV.println(0,40,"Desenhando Imagens:");
  TV.delay(1500);
  TV.clear_screen();
  TV.bitmap(18,0,met);
  TV.delay(10000);
  
  for(int i=0;i<90;i--){
  TV.clear_screen();
  TV.bitmap(i,0,invader);
  TV.delay(100);
  }
 
  TV.clear_screen();
  TV.print(9,44,"Dragao sem Chama");
  TV.delay(2000); 
}

void loop() {
}
Os headers "met.h" e "invader.h" podem ser baixados aqui.

Bônus: Como mostrar seus próprios bitmaps

No Paint, redimensione a imagem que você quer mostrar até um tamanho menor que 128x96 e salve como bitmap monocromático.
Baixe o programa Image2Code nesse link aqui.
Abra ele e arraste o bitmap no programa.
Escolha a terceira opção da esquerda para a direita.
Screen Shot 06-24-14 at 11.07 PM
Se você quiser que ele apareça "branco no preto", escolha a opção "Invert image".
Escolha C array writer e clique em "Convert".
O Bloco de notas vai abrir.
Escolha "Editar > Substituir..." e coloque "{" sem as aspas no campo Procurar por. Não coloque nada no campo Substituir por. Clique em Substituir tudo e faça o mesmo com o símbolo "}". Já a última vírgula do arquivo, apague manualmente.
Crie um novo arquivo .cpp com o nome da imagem e com o seguinte código:

#include "<nome-da-imagem>.h"

PROGMEM const unsigned char <nome-da-imagem>[] = {
(cole aqui o código convertido antes)
};
e depois crie um arquivo .h com o nome da imagem na mesma pasta e com o seguinte código:

#include <avr/pgmspace.h>
#ifndef <nome-da-imagem-em-maiusculo>_H
#define <nome-da-imagem-em-maiusculo>_H

extern const unsigned char <nome-da-imagem>[];

#endif
Daí, inclua o header que você criou, assim:
#include "<nome-da-imagem>.h"
Depois inclua o código no meio:
TV.bitmap(<pos_X>,<pos_Y>,<nome-da-imagem>);
E... ta-da! A sua imagem aparece!

Dúvidas? Comente e eu te respondo.
É isso aí! Até mais!

Projeto #1: Conectando um mouse ou um teclado PS/2 ao seu Arduino

Bem amigos, hoje vou ajudar vocês a conectar um teclado ao seu "duino".

Do que vamos precisar?

Vamos precisar de:
- Um conector PS/2 fêmea (pra conectar nosso teclado ou mouse);
- Um "duino" (óbvio!)
e só.
Você deve estar se perguntando: "mas é só isso mesmo"? Eu, quando eu vi, disse "é bom demais pra ser verdade", mas depois olhei bem e vi que era assim mesmo.

Conectando

O conector PS/2 tem as seguintes saídas:


Sendo os pinos:
1 – DATA (dados)
2 – Esse a gente não usa
3 – GND (terra)
4 – Vcc (+5V)
5 – Clock (CLK)
6 – Esse a gente também não usa
Conecte

O Vcc no 5V, o GND no GND, o CLK no pino digital 2 e o DATA no pino digital 3.
Se for conectar um mouse, use o pino 5 como DATA e o pino 6 como CLOCK.

Hora de programar!

Para programar para seu teclado, você pode usar o exemplo e baixar a biblioteca nesse link aqui.
O código do exemplo para o seu teclado:
#include <PS2Keyboard.h>

const int DataPin = 8;
const int IRQpin =  5;

PS2Keyboard keyboard;

void setup() {
  delay(1000);
  keyboard.begin(DataPin, IRQpin);
  Serial.begin(9600);
  Serial.println("Keyboard Test:");
}

void loop() {
  if (keyboard.available()) {
    
    // read the next key
    char c = keyboard.read();
    
    // check for some of the special keys
    if (c == PS2_ENTER) {
      Serial.println();
    } else if (c == PS2_TAB) {
      Serial.print("[Tab]");
    } else if (c == PS2_ESC) {
      Serial.print("[ESC]");
    } else if (c == PS2_PAGEDOWN) {
      Serial.print("[PgDn]");
    } else if (c == PS2_PAGEUP) {
      Serial.print("[PgUp]");
    } else if (c == PS2_LEFTARROW) {
      Serial.print("[Left]");
    } else if (c == PS2_RIGHTARROW) {
      Serial.print("[Right]");
    } else if (c == PS2_UPARROW) {
      Serial.print("[Up]");
    } else if (c == PS2_DOWNARROW) {
      Serial.print("[Down]");
    } else if (c == PS2_DELETE) {
      Serial.print("[Del]");
    } else {
      
      // otherwise, just print all normal characters
      Serial.print(c);
    }
  }
}
Se você está usando um mouse, entre por aqui.
Ah, e dá também pra você fazer seu "duino" virar um mouse ou teclado!
É só usar a biblioteca desse link aqui e seguir o exemplo.

Bem-vindos!

Olá, e bem vindos ao Arduino Infinity.
Eu criei esse blog com o objetivo de postar projetos que você pode fazer (ou um dia vai precisar fazer) usando um Arduino.
Tem bastante coisa, desde fazer um LED piscar até fazer seu próprio sintetizador, passando por mostrar imagens numa TV.
É isso aí. Boa sorte com os projetos!