sábado, 29 de agosto de 2015

Ensaio para joystick (3)

Fiz um controlador USB para o joystick, baseado num projeto de adaptador USB-NES utilizando um ATTiny45. Deu um trabalho do cão, mas finalmente funcionou.

Foram várias as dificuldades, porém consegui ir vencendo uma a uma.

A primeira foi terminar a fixação mecânica dos botões e da manete. Com a ajuda do 'footprint' da caixa CR-096 cortei um pedaço de placa de circuito impresso padrão e soldei os botões de forma que suas hastes ficassem o mais próximo possível dos pontos de apoio da caixa.

Fixação da placa com os botões
Precisei utilizar dois pedaços de plástico colados às teclas para dar a altura correta dos botões. Talvez seja melhor utilizar chaves mais resistentes, possivelmente aproveitadas de um mouse em desuso, mas isso fica para quando estas aqui quebrarem.

Calço plástico colado nas teclas para acionamento dos push-buttons

Eu avaliei um monte de alternativas para fixar a placa com a manete na parte de baixo da caixa e não gostei de nenhuma. A que menos desgostei, no entanto, que foi a cola de contato acabou sendo a utilizada.
Placa colada na caixa com cola de contato. Foi necessário fresar o fundo da caixa à mão.

 O próximo passo foi arrumar um código de joystick para modificar, baseado no V-USB e que utilizasse o ATTiny45. Cheguei a avaliar o uso do digispark, por causa da biblioteca de joystick para USB e da possibilidade de carregar o firmware utilizando o bootloader mas acabei não gostando. Queria algo mais simples e além disso eu queria utilizar o ATTiny45 que tenho aqui sobrando. Mas essa brincadeira acabou tomando tempo.

Digispark caseiro

Resolvi então partir de um adaptador de NES que encontrei na Internet (link). Montei o circuito num proto-board e recompilei o código para conferir se as conexões estavam corretas.

Circuito do V-USB para ATTiny

A gravação do microcontrolador é também trabalhosa porque toda vez tenho que tirar o CI do proto-board e colocar no programador. A propósito meu programador Xing Ling MiniPRO já está se tornando companheiro inseparável de bancada.

Gravador Mini-Pro chinês

Depois de verificar o funcionamento do circuito, procurei informação a respeito dos descritores USB para poder personalizar o código para o meu joystick analógico de 2 botões. Um excelente artigo (eu recomendo) é o tutorial sobre HID Descriptors deste link.

Defini o meu pacote como sendo composto de 3 bytes, o primeiro com os botões, o segundo com o eixo X e o terceiro com o eixo Y

Formato do report USB do controlador.

Para gerar o arquivo de configuração é possível utilizar uma ferramenta disponível no site do consórcio USB chamada HID Tool permite criar o 'report' e exporta-lo na forma de um arquivo .h. Apesar de ter dado conta do serviço, ou seja, ter permitido gerar o arquivo de configuração, essa ferramenta é bem tosquinha.

USB HID Tool

Após a modificação o circuito já era visto como esperado, ou seja como um joystick analógico mais 2 botões.
Circuito com Report correto, porém ainda com a identificação original (USB NES)


A modificação para suportar os dois botões foi bem simples, bastou modificar o código para ler os pinos PB2 e PB5, porém aí apareceu a primeira pegadinha. O pino PB5 é o mesmo do RESET e para utiliza-lo como pino de I/O é necessãrio mudar o 'FUSE' RSTDSLB para ativo, ou seja desativar o RESET externo.



O próximo passo foi mais chato um pouco por causa de uma besteira minha (sempre é). O ADC não estava funcionando de maneira alguma. Li e reli um monte de coisas, tentando entender o que tinha feito. No final, mas BEM NO  FINAL mesmo, descobri que eu estava associando o canal de leitura do ADC incorretamente. Apesar de ser um erro bem bobinho ele me tomou HORAS!

...
#define CH_X 3
...


Errado!:
...
      // Sample Axes
      // X Axis
       ADMUX =  (1 << ADLAR) |   ( 1 << CH_X) ;       // select channel

...

Correto:

       // Sample Axes
      // X Axis

       ADMUX =  (1 << ADLAR) |    CH_X;        // select channel


...

Descoberto esse problema o circuito está funcionando como esperado, e sendo identificado propriamente pelo gerenciador de dispositivos.

Circuito já identificado com o nome de "batismo": CR-096 Controller

Agora falta montar o circuito dentro da caixa e finalizar o projeto. Daí eu coloco o código disponível bem como o .hex pre-compilado.




 



Nenhum comentário: