Jogar num equipamento Android com um controlador SNES

Antes de avançar para o tutorial, pergunto e respondo a uma questão. Sabem do que se trata o Andoid? O Android é um sistema operativo open-source, desenvolvido pela Google para telemóveis. E como todos sabemos um dispositivo táctil não é o mais indicado para jogar, então foi daí que nasceu a ideia de utilizar um controlador (comando) externo para aumentar a experiência de jogo. E porquê um SNES? Porque é pino a pino compatível com o Arduino, ou seja, não necessita de conversor.

Toda a electrónica deste projecto é composta por: um Arduino Pro Mini e um modulo bluetooth BlueSMiRF Gold para comunicar com o telemóvel de uma forma livre de fios. Ao se usar um Arduino, este corre um programa que emula os dados vindos do comando e envia-os para o telemóvel via Bluetooth, o telemóvel ao receber considera-os como atalhos de teclado.

Para começares a alterar o teu comando SNES tens de compreender os pinos da fixa e o seu funcionamento, por exemplo ao clicar no botão B o controlador irá enviar o Byte 0111111111111111 ou o botão Y o Byte 1011111111111111 e se estes dois botões forem pressionados ao mesmo tempo será enviado o Byte 0011111111111111.

Seguimos para a montagem do Hardware, a primeira coisa a fazer é configurar o módulo de Bluetooth para isso vamos emparelhá-lo com o pc e usar um software para o configurar como o Zterm por exemplo. Tem atenção que para que isto funcione tens de alimentar o módulo, ou seja os pinos VCC e GND tem de estar correctamente conectados. Assim que o computador pedir o código de acesso só terás de colocar ’1234′.

Agora que estás na configuração do módulo tens de realizar algumas alterações, primeira é mudar o nome por exemplo SNES, segundo alteras a Baud Rate para 115200.

 

Está na altura de ligar tudo, o módulo bluetooth: Ligar o TX ao TX do Arduino e o RX ao RX do Arduino e o CTS ao RTS (só tens de colocar um fio entre estes dois pinos). O controlador SNES:  o pino SNES Latch Line ao pino 2 do Arduino, o SNES Clock Line ao pino 3 e o SNES Data Line ao pino 4. Depois é só ligar o VCC e o GND respectivamente.

Por última basta-te fazer Download da biblioteca MeetAndroid e realizar o upload do seguinte código:

// SNES controller code for Arduino Pro Mini 328 (3.3V)
// Author: Rich Degenhardt
#include 
 
MeetAndroid meetAndroid;
int latch = 2; // set the latch pin
int clock = 3; // set the clock pin
int data = 4; // set the data pin
int controllerData[16]; // array to store data from 16 clock cycles
 
/* SETUP */
void setup()
{
  // set baud rate to 57.6k
  Serial.begin(57600);
 
  // set output/input pins
  pinMode(latch,OUTPUT);
  pinMode(clock,OUTPUT);
  pinMode(data,INPUT);
 
  // set latch and clock high
  digitalWrite(latch,HIGH);
  digitalWrite(clock,HIGH);
}
 
/* THIS READS DATA FROM THE CONTROLLER */
void controllerRead()
{
  // set latch and clock low
  digitalWrite(latch,LOW);
  digitalWrite(clock,LOW);
 
  // set latch high to trigger controller data send
  digitalWrite(latch,HIGH);
  delayMicroseconds(12);
  digitalWrite(latch,LOW);
  delayMicroseconds(6);
 
  // Clock Cycle 1
  controllerData[0] = digitalRead(data);
 
  // Clock Cycles 2-16
  for (int i = 1; i <= 15; i++)
  {
    digitalWrite(clock,HIGH);
    delayMicroseconds(6);
    digitalWrite(clock,LOW);
    delayMicroseconds(6);
    controllerData[i] = digitalRead(data);
  }
}
 
// Button Reference
// 01111111 11111111 - B
// 10111111 11111111 - Y
// 11011111 11111111 - Select
// 11101111 11111111 - Start
// 11110111 11111111 - Up
// 11111011 11111111 - Down
// 11111101 11111111 - Left
// 11111110 11111111 - Right
// 11111111 01111111 - A
// 11111111 10111111 - X
// 11111111 11011111 - L
// 11111111 11101111 - R
 
/* MAIN LOOP */
void loop()
{
  controllerRead();
  String Out = "";
  int length = 1;
 
  // B
  if (controllerData[0] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "J";
    length = length + 1;
  }
 
  // Y
  if (controllerData[1] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "U";
    length = length + 1;
  }
 
  // SELECT
  if (controllerData[2] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "2";
    length = length + 1;
  }
 
  // START
  if (controllerData[3] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "1";
    length = length + 1;
  }
 
  // UP+RIGHT
  if (controllerData[4] == 0 && controllerData[7] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "E";
    length = length + 1;
  }
 
  // UP+LEFT
  else if (controllerData[4] == 0 && controllerData[6] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "Q";
    length = length + 1;
  }
 
  // DOWN+RIGHT
  else if (controllerData[5] == 0 && controllerData[7] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "C";
    length = length + 1;
  }
 
  // DOWN+LEFT
  else if (controllerData[5] == 0 && controllerData[6] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "Z";
    length = length + 1;
  }
 
  // UP
  else if (controllerData[4] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "W";
    length = length + 1;
  }
 
  // DOWN
  else if (controllerData[5] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "S";
    length = length + 1;
  }
 
  // RIGHT
  else if (controllerData[7] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "D";
    length = length + 1;
  }
 
  // LEFT
  else if (controllerData[6] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "A";
    length = length + 1;
  }
 
  // A
  if (controllerData[8] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "K";
    length = length + 1;
  }
 
  // X
  if (controllerData[9] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "I";
    length = length + 1;
  }
 
  // L
  if (controllerData[10] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "L";
    length = length + 1;
  }
 
  // R
  if (controllerData[11] == 0)
  {
    if (Out != "")
    {
      Out = Out + ",";
      length = length + 1;
    }
    Out = Out + "R";
    length = length + 1;
  }
 
  char outData[length];
  Out.toCharArray(outData, length);
 
  meetAndroid.send(outData);
  delay(16);
}

 

Escrito por André Delgado

Fundador e administrador do Make Bits, desde cedo que se interessou por robótica e micro-controladores, principalmente pelo Arduino. Já escreveu 116 artigos no Make Bits sobre os mais variados temas da robótica.

Artigos Relacionados:

1 Comentário

  • Es o maior… pelo menos melhor do k eu :P

Comenta


Make Bits no teu email



* obrigatório


Publicidade:


Sistema Dinheiro Teste Drive