Controle de Super Nintendo no PC com Arduino Micro.

IMG_20151128_000144

O Super Nintendo, juntamente com o Megadrive (ou Gênesis) foram os consoles representantes da era 16-bits. Eu tive o Megadrive, mas joguei um bocado em Super Nintendo também.

Já joguei bastante em emuladores, um monte deles, incluindo os de Super Nintendo. Eu não acho que eu jogo mal no teclado, mas eu prefiro usar controles, ainda melhor se os controladores são os do console emulado. Por falar nisso, algum tempo atrás, eu construí um adaptador para ligar controladores SNES para PC a partir das instruções  nesse site de Raphaël Assénat’, usando um ATmega 8 e a biblioteca VUSB. Achei que a implementação USB difícil de entender, então eu apenas segui as instruções. O que posso dizer? Funcionou.

WP_20150310_11_05_13_Pro

Eu queria jogar Super Mario, mas não tinha esse adaptador mais. No entanto, eu tinha um Arduino Micro e placa perfurada. A coisa especial sobre o Arduino Micro, é que como o Leonardo, ele possui USB nativa, sendo capaz de ser reconhecido pelo PC como um teclado, um mouse, um joystick, ou o quer que seja. O Arduino Leonardo é provavelmente adequado para esse propósito também, como também possui uma porta USB nativa.

Nota: Os outros modelos Arduino geralmente usam outro ATmega para lidar com o protocolo USB, enquanto o chip maior é usad0 para o código. Normalmente, o usuário pode nem perceber que a placa tem dois processadores. Os modelos Micro e Leonardo tem uma porta USB no ATmega utilizado (32u4), e apenas um chip é usado para a comunicação USB e código em geral.

Hardware

Eu tive que conectar os controles no Arduino. Para isso eu usei uma veroboard e pinos macho, basicamente. Você pode ver os detalhes abaixo:

IMG_20151128_000010
Dois pinos machos foram usados pra connectar cada pino à veroboard.
IMG_20151127_235920
A minha desculpa é que a ponta desse ferro estava péssima.

A pinagem do controle de Super Nintendo é :

snes

Eu conectei da seguinte forma, mas os pinos podem ser editados em código.

Controle         Arduino

       5v                        5v

       data                      D7

       clock                     D4

        latch                     D5

        GND                 GND

Nota: Cada linha é compartilhada entre os controles, exceto a linha data, isto significa que latch, clock, 5v e GND são os mesmos pros controles conectados, enquanto as linhas de dado devem ser separadas, eu usei o pino D6 para a linha data do segundo joypad. A leitura do código pode esclarecer isso um pouco.

Biblioteca

Eu ainda não sei muito sobre o protocolo USB e sua forma de comunicação, e sempre digo a mim mesmo que vou estudar, mas nunca checo. A questão era que eu queria concluir o projeto em uma tarde. Então fui procurar uma biblioteca.

Opa, eu assumo que você tem a última versão do software Arduino, porque a biblioteca não funciona com a versão 1.6.5 ou abaixo. Se você não tiver a versão 1.6.6, por favor atualize para que possamos continuar. :)

Ok, voltando para o código. A biblioteca eu encontrei funciona muito bem, foi codificada por Matthew Heironimus, e pode ser encontrado aqui. Basta baixá-la e extrair na pasta bibliotecas dos arquivos da IDE do Arduino .

Com esta biblioteca, você pode fazer o Arduino aparecer no computador como até 3 controles. Assim, você pode programar a placa para receber os estados dos botões no controlade e enviá-los para o PC como um controlador USB HID. Eu optei por usar o código para dois controles, pois eu só tinha dois joypads de SNES de qualquer maneira.

Protocolo do controle de SNES

O protocolo de controle de SNES é bastante simples. No conector do controle, têm-se duas linhas de alimentação (5V e terra), e outras três linhas, uma para clock, um para a saida serial(data), e o outro é a linha latch. Para ler os botões, o procedimento é:

  1. Pulso em alto no pino de latch por 12uS. Isso instrui o controle a guardar o estado dos botões para a leitura.
  2. O primeiro bit(button B state) já vai estar no pino data, esse bit é lido.
  3. Troca-se o estado da linha de clock de baixo pra alto, lê-se o bit, e tráz-se a pra estado baixo novamente.
  4. Repete-se o passo 3 pra os outros 14 bits(16 bits são lidos, mas alguns sempre são ‘1’).

Como dito antes, muito simples. Mais informações podem ser encontradas nesse documento.

Código Arduino.

Finalmente. Se você já instalou a biblioteca e conectou tudo, só gravo o código abaixo e seu adaptador está pronto. Yay!

 Projeto completo!

É isso, espero que tenha gostado. Obrigado pela leitura e até o próximo artigo o/

 

 

Robson Couto

Estudante de engenharia elétrica. As vezes parece gostar mais dos consoles antigos que dos jogos. Tem interesse em dominar bits, bytes e afins.

10 comentários em “Controle de Super Nintendo no PC com Arduino Micro.

    1. Oi amigo, depende.
      1- Voce pode fazer o adapter do site do Rafael seguindo olink notexto, mas ainda precisando de um atmega8, o circuito minimo(cristal, capacitores e diodos). Mas ainda é necessário gravar o hex no micro, sendo necessario um gravador AVR.
      2-Voce pode usar o microcontrolador do Arduino Micro (Atmega32u4) e gravar esse programa que escrevi, mas ainda é necessario o crystal e os capacitores. Alem disso é necessario gravar o programa usando um gravador AVR ou outro Arduino.
      Obrigado pela leitura.

    1. Vi que usando o Arduino uno apresenta essa mensagem, usando o leonardo funciona perfeitamente. Qual Avr vc usou? qual procedimento para gravação?
      Estava querendo usa o uno pois era so remover o avr e montar o circuito breadboard.

  1. Olá! tudo bem Parabéns pelo projeto. tenho uma dúvida, vc usou um atmega 32u4 standalone na foto da pra ver, você conseguiu gravar o bootloader simplesmente usando um arduino uno??? eu não tava afim de comprar um micro arduino, queria comprar só o chip da atmega gravar o boot nele e depois o código. será que da certo?? to pensando certo??? valew!!!

  2. Olá Robson,

    Estou com um projeto interessante, estou transformando um raspberry em um game boy color, porém estou com dificuldades para usar o direcional original do console e estou a ideia de usar o nano v3.0 para controlar o gamepad e se comunicar com o raspberry pelo usb. Você tem ideia de como fazer isto? desde já.

    1. Oi Tiago.

      Bacana sua ideia, hoje estava tentando emular alguns jogos no meu Raspberry. Bom, controle usb não dá no Nano, porque o Atmega presente nesse modelo não se comunica diretamente com a USB, mas sim usa um conversor USB-Serial.
      Recomendo comprar um Arduino com um Atmega32u4(Tem que ser esse chip em especial) e seguir o tutorial. Exemplo:
      http://www.ebay.com/itm/New-Pro-Micro-ATmega32U4-5V-16MHz-Replace-ATmega328-Arduino-Pro-Mini-/131513277878?hash=item1e9ecd5db6:g:rUAAAOSwPgxVNhve.

      No entanto, talvez haja a possibilidade de se usar as próprias GPIOs do Raspberry pra ler os botoes, recomendo passar nesse link:
      https://github.com/recalbox/mk_arcade_joystick_rpi
      Boa sorte!

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

*