Adaptando controle GameCube pra USB

Há um tempo atrás comprei esse controle barato de GameCube no Ebay. Estava esperando adaptar pra PC porque queria jogar Wind Waker e tal. Porém, o protocolo se mostrou bem chatinho. Primeiro, os dados são transmitidos por apenas um fio, o que exige timings perfeitos. Segundo, os bits são transmitidos a alta frequência, o que exige alguns esquemas de interrupção e um pouco de assembly. Acabei deixando esse projeto de lado por um tempo.

Ok. O controle tinha estado na minha mesa por um bom tempo sem nenhuma utilidade já que eu não tenho um GameCube . Estava sem sono e pensei em montar algo bem rápido. Hora de apelar, procurei sobre na internet. De fato, esse projeto é baseado no trabalho de Raphaël Assénat, recomendo que passe lá antes. Na verdade, se você tiver interesse em reproduzir o projeto vai ter que passar lá pra baixar os executáveis pro atmega.

*O Dragão sem chama não é responsável por danos ao microcontrolador ou controle ou seu PC, é esperado que o leitor tenha conhecimento e experiência médios em eletrônica e microcontroladores em geral. Utilize as informações disponibilizadas por sua conta e risco.*

Firmware

Conforme dito anteriormente, eu não escrevi o código. Os arquivos podem ser baixados no site de Raphaël Assénat. No meu caso, como não usei uma pcb e soldei tudo fica inviável a programação do micro depois de montado o circuito. Recomendo fortemente gravar o firmware antes de começar a montar o circuito.

Pra que o atmega use o cristal externo é necessário mudar os valores dos fuse bits. Uso o avrdude e meu gravador é o usbasp.

avrdude -p atmega8 -c usbasp -U lfuse:w:0xFF:m  -U hfuse:w:0xC9:m

Gravando o firmware com o avrdude:

upload

Esquemático

O esquemático está abaixo. Fiz algumas alterações em relação ao original, já que não tinha alguns componentes.

schematic

*A imagem do conector do controle é no console, no cabo deve-se espelhar a imagem. No final, acabei cortando o cabo e usando pra USB.*

Os zeners que limitavam a tensão nas linhas USB foram removidos, pois o atmega roda a 3.3V e não 5V. O atmega teoricamente não deveria estar rodando a 3.3V, mas funciona sem reclamar.  Na minha montagem ficou faltando os capacitores do cristal e da alimentação, mas tudo funciona ‘de boa’.

Fotos da montagem:

Ok. Pra um serviço rápido, soldei tudo em estilo deadbug.

WP_20160205_03_31_25_Pro

Comecei errado! xD Estava um pouco com sono e nem percebi que estava soldando errado (O chip está de cabeça pra baixo).

WP_20160205_04_03_33_Pro

Agora sim, consertei os erros. Tudo segundo o esquemático. Exceto pelos capacitores que estavam faltando.

WP_20160205_04_03_39_Pro

Mais uma vista do circuito.

WP_20160205_04_04_40_Pro

Agora onde colocar o atmega? Muito pouco espaço livre.

WP_20160205_04_04_52_Pro

Exceto por esse cantinho. Constatei que o chip cabia aqui.

WP_20160205_04_08_23_Pro

Como o chip ia ficar dentro do controle, cortei o cabo perto  da placa. Assim dava pra aproveitar o máximo do cabo na hora de adaptar pra usb.

WP_20160205_04_08_36_Pro

Esse é um controle paralelo, não é de se esperar muito da placa. Ainda sim é possível ver marcações para os sinais do controle. +5V(Motor) e GND pra alimentação, S pra linha do sinal e V pra tensão lógica do controle, nesse caso 3.3V.

WP_20160205_04_23_29_Pro

Soldando o atmega no lugar. Todo cuidado possível pra não trocar nenhum fio.

WP_20160205_04_57_21_Pro

Prontinho.

WP_20160205_04_57_37_Pro

Depois de tudo no lugar, eu fiz os testes das tensões pra ver se estava tudo certo. Esse passo é muito importante, pois evita de queimar alguma coisa. Uma dica, antes de conectar o controle na usb é bom testar com outra fonte, nesse caso usei uma bateria com regulador pra alimentar com os 5V requeridos, daí fui testando cada pinos pra ver se as tensões estavam corretas. Se a tensão for invertida, pode ocorrer dano a porta USB do PC ou talvez ao PC em si.

usb

Detalhe da conexão usb. O cabo do controle foi reaproveitado, o fio amarelo é a linha D+ e o fio branco é o D-.  O pinout usb pode ser encontrado aqui.

WP_20160205_05_14_27_Pro

Melhor ir dormir. Depois eu arrumo essa mesa.

Conclusões.

Até fiquei surpreso, o controle foi reconhecido de primeira. Mesmo sem os capacitores e com o atmega rodando a 3.3V.  Testei o controle no Dolphin e funciona tudo normalmente. Não são necessários drivers, pois o controle é reconhecido como um dispositivo HID.

Bom, é isso. Dúvida? Comentário.

Até o próximo post o/

Robson Couto

Recentemente graduado Engenheiro Eletricista. Gosto de dedicar meu tempo a aprender sobre computadores, eletrônica, programação e engenharia reversa. Documento meus projetos no Dragão quando possível.

21 thoughts to “Adaptando controle GameCube pra USB”

  1. Bom dia, meu caro. Estou com o mesmo projeto. Vou adquirir a programadora, mas o que mais preciso adquirir para fazer a programação? Eu sei que já tenho que estar com o Xtal soldado na Atmega8 para fazer a programação (ao menos foi o que o Raphael disse), mas preciso saber como plugar a programadora na Atmega8, ainda.

    Eu vou montar dois adaptadores destes numa placa universal e juntar os dois com um hub USB que irá pro PC. Assim vou fazer um adaptador externo mesmo de dois controles de 64/GC pra USB.

    Obrigado!

      1. Olá Andre.
        Pra programar o firmware no Atmega, basta utilizar qualquer gravador AVR. O que eu uso e confio bastante é o USBASP. Os passos estão na segunda imagem desse post, porém é necessário ter o avrdude instalado. Uma alternativa gráfica seria o Extreme burner https://goo.gl/vkyhfN.
        Quando o Atmega vem da fabrica, este usa o oscilador interno, de 8MHz, mas dividido pra 1MHz. Gravando-se os fuse bits mencionados no post, este passa a precisar de um oscilador externo, nesse caso 12MHz necessario pela V-USB.
        Quanto ao conector, geralmente uso pinos macho pra prototipagem (male pin headers) https://goo.gl/kN80vY . Até as placas Arduino usam esses headers, só é preciso ter cuidado pra não inverter.
        Robson.

        1. Beleza! Comprei tudo e alguns pinos pra usar pra fazer um header pra programadora. Já tenho as pinagens e tudo, então fazer o header vai ser tranquilo! Vou usar uma placa de N64 estragada pra retirar os conectores.

          Só uma pergunta: nos esquemas do Raphael tem uns diodos zener 3V6 no sentido GND -> D- e D+ do USB. Eu vi que você não usou. Vai ter algum problema se eu usar?

          1. Olá andré.
            Você tem que seguir um dos dois esquematicos, sem misturar. Exemplo, repare que o meu atmega está rodando a 3.3V, assim o micro controla D+ e D- diretamente. No esquema do Raphael, ele usa o atmega a 5V, por isso os zeners pra limitar a tensao nesses pinos.
            Quanto aos fuses, não ativei o BOD e se não me engano estou com o maior tempo de start up possível. Você pode usar tanto a minha configuração quanto a dele.
            É preciso tomar cuidado no entanto com o high fuse. Há um bit nesse fuse que pode desativar a gravação serial, mas use 0xC9 que é de boa.

          1. Beleza!!! Consegui aqui com o Atmega8, mas me venderam por engano um Atmega88PA em vez de outro Atmega8. Só notei depois de todas as soldas feitas. Tentei o hex da 168 e os Fuses da 168 mas não resultaram em nada… Só um.dispositivo USB HID que não é reconhecido. Sabe de algum.jeito de funcionar na 88? O Raphael disse que a da 168 deveria funcionar, mas não foi o caso e desfazer as soldas pra colocar uma 8 ta me dando aquela preguiça hahaha

            No mais, muito obrigado pelo tutorial e pela ajuda! Nunca tinha programado um Avr antes e seu post e suas respostas ajudaram muito!

          2. Olá André.
            Você verificou se os fuses foram gravados corretamente no 88? Acredito que o 88 seria compativel com o 168. Você disse que o micro é reconhecido como HID mesmo asssim? A versão do firmware é a mais nova? Vou checkar se os fuses do 88 são os mesmos e depois volto aqui.
            Fico feliz em ter ajudado. Fique a vontade pra olhar os outros posts no blog, são mais ou menos nesse estilo haha.

          3. Consegui! Entrei em contato com o Raphael e ele me disse que eu precisava compilar especialmente pro 88. Por algum motivo, simplesmente mudar o target pro 88 não funcionou, mas mudando pro 88P (que é o que eu tenho, apesar de que o 88 deveria ter funcionado porque o .hex gerado foi o mesmo) funcionou. Notando que eu usei o avrdude com o target m88p para ambos os .hex. Enfim, funcionou.

            No fim das contas, o Raphael adicionou um makefile pro 88 e um pro 88P com as minhas modificações!

            E os fuses estão corretos, apesar de que o site do Raphael manda colocar efuse 0x01 e o avrdude 6.3 não deixava colocar o efuse para algo diferente de 0x9F, então usei o 6.0.1 e deu tudo certo.

            Muitíssimo obrigado, Robson!

    1. Olá George
      Como a comunicação USB é muito complexa não há bibliotecas pra AVR que façam o chip funcionar como host USB. Então eu penso em duas alternativas:
      1 – Remover o chip usb original e usar o micro pra ler o estado dos botoes e analogicos e “imitar” o protocolo de comunicação do controle de game cube.
      2 – Converter um controle de PS2 que tem protocolo bem mais simples que USB e inclusive é bem documentado, não precisando nem desmontar o controle.
      Link que podem te ajudar:
      http://www.int03.co.uk/crema/hardware/gamecube/gc-control.html
      http://spritesmods.com/?art=xpad&page=1

      1. Robson bom dia, pensei algo parecido com o amigo acima mas não o mesmo.
        Gostaria de usar uma placa zero delay e montar um arcade controle p\ gamecube\wii, usando do controle do gamecube apenas o cabo p\ envio de dados.
        eu vi a alimentação que você fez, então se eu adpatar so o cabo de dado\alimentação, eu conseguiria usar a placa dessas abaixo “talvez” ou precisaria saber algo mais?
        Imagina que com as diferenças de layout da placa, vc vai me dizer q n funciona, mas vou perguntar mesmo assim, pois sodar placa do controle joystick aos botoes gera alguns problemas, mal contato, etc… por isso essas placas zero delay são uma mão na roda

        Obrigado

        https://http2.mlstatic.com/kit-placa-usb-zero-delay-arcade-eletromatic-sanwa-pc-ps3-ps4-D_NQ_NP_458815-MLB25340473624_022017-F.webp

        https://http2.mlstatic.com/kit-placa-usb-zero-delay-arcade-eletromatic-sanwa-pc-ps3-ps4-D_NQ_NP_666817-MLB25581824200_052017-F.webp

        http://produto.mercadolivre.com.br/MLB-837365141-kit-placa-usb-zero-delay-arcade-eletromatic-sanwa-pc-ps3-ps4-_JM

        1. Olá, Emerson.
          Seus links não funcionam.
          Então, não sei se entendi direito, mas se você está sugerindo conectar uma placa usb na entrada gamecube do console, não vai funcionar.
          O protocolo usado pelo controle de gamcube e controles usb são diferentes.

          Robson

          1. Obrigado Robson, resumindo seria uma uma placa ‘usb-ps3’, mas p\ ser sincero é isso mesmo que você falou.
            Bem a minha segunda opção é soldar os botões do arcade direto no controle, porem não sei como faria com o direcional?
            São 4 pinos metálicos na placa? porque eu olhei a peça na net e parece ter seis pernas.
            Como você fez com o direcional p\ soldar com o chip? preciso arrancar o direcional da placa p\ ter uma visão melhor?
            Obrigado novamente

  2. que materia maneira, obrigado. seria possivel um cabo adaptador que de um lado seja o macho do game cube e do outro um usb? que funcione no wii? ou de uma lado o plug do wii e do outro um usb que funcione no proprio video game?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *