domingo, 30 de agosto de 2015

Ensaio para joystick (4) - Versão USB funcionando!

Continuando o Post anterior seguem algumas fotos da montagem

Cabo de conexão foi construído
Primeiro a posição dos componentes foi definida. Os botões estão do lado de baixo

Depois cada componente recebeu um ponto de solda para permanecer no lugar.

A posição do cabo flat foi então definida
As ligações então foram feitas com fio esmaltado


O cabo flat foi então soldado à placa
E na sequência o cabo USB foi soldado

A caixa foi fechada e o circuito testado 

Testando a empunhadura.

Link para os arquivos do projeto (CR-096 Controller).

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.




 



Script para caixa PATOLA CR-096

Para poder fazer a fixação dos push-buttons na caixa CR-096 precisei de desenhar a referência da posição dos botões, mas os desenhos no site da Patola não possuem nenhuma medida da caixa montada, apenas das partes e várias dessas medidas tomam como referência as dimensões externas da caixa.  Por isso precisei desenhar as peças no sketchup, sobrepor as janelas dos botões e descontar a espessura da caixa, mantendo as medidas do 'outline' da placa em múltiplos de décimos de polegada.
Usando o Sketchup para desenhar e tomar as medidas

A partir dos desenhos tomei as medidas e criei o script para gerar o script que desenha a placa.

# Caixa Patola CR-096 - Danjovic 2015
# http://www.patola.com.br/index.php?route=product/product&product_id=254


#Ajusta Grid
Grid mm 1 off;
Set Wire_Bend 0;
#Outline
Layer Dimension;
Wire 0  (-39.37 -26.77) (39.37 26.77) (-39.37 -26.77);
#Furos
Hole 2.6 (-10.5 0);  # furo principal
Hole 2.6 (17.5 22.5);
Hole 2.6 (17.5 -22.5);
#detalhes
Layer vRestrict;
Circle (-10.5 0)  (-10.5 2.5);   # torre principal
Circle (17.5 22.5)  (17.5 25);   # torre 1
Circle (17.5 -22.5)  (17.5 -25); # torre 2

#referencias de montagem
layer tDocu
Circle (35.5 -22.5) (35.5 -24);  #led
Circle (11.5 9.5) (11.5 11.5);   #botao 1
Circle (11.5 -9.5) (11.5 -11.5); #botao 2

wire (10 2) (25 17) (10 2);
wire (10 -2) (25 -17) (10 -2);

#Restaura Grid
Grid Last;
Window Fit;


Depois de executado temos o desenho da placa.

Placa gerada pelo script

Aproveitei e criei uma biblioteca eagle e coloquei junto com o script numa pasta do dropbox. Coloquei junto a placa PB-083 do post anterior

sexta-feira, 28 de agosto de 2015

Pinguino com alguns extras (2)

Fiz uma ligeira modificação na placa do Pinguino porque o header para RS232 não estava permitindo encaixar o PICKIT direto no conector ICSP. Por isso foi necessário retirar os dois pinos N.C. Aproveitei e corrigi a figura com a pinagem do conector para refletir as modificações, bem como incluir a pinagem sequencial do conector (1 a 22) e reordenar os botões e leds BT1-3 e LED1-3 para ficarem numa ordem coerente com os pinos do PIC.


Pinagem e componentes da placa

Também desenhei o diagrama no Eagle para facilitar o trabalho com a placa

Diagrama do Pinguino

O diagrama encontra-se disponível neste em formato eagle e pdf (link para dropbox).

quinta-feira, 27 de agosto de 2015

Ensaio para joystick (2)


Escrevi e simulei as rotinas para ler os potenciômetros e transformar os sinais analógicos dos potenciômetros dos eixos X e Y nas 4 posições básicas dos controles direcionais. O código atual implementa uma 'dead zone' em torno do meio do curso dos potenciômetros mas isso pode ser melhorado.

Também escrevi e simulei as rotinas para transformar os sinais analógicos em sinais temporizados nos pinos dos controles direcionais. O Loop ficou com exatos 12us por iteração que casa exatamente com a temporização do MSX. Um detalhe é que gero temporização para os sinais de forma recíproca, ou seja, se o eixo X está no início do curso a temporização do pino UP dura muito pouco e a do pino DOWN dura exatamente o complemento do pino left. Em números, se a leitura do paddle (0) resultasse em 45, a do paddle(1) resultaria em 210, que é exatamente o complemento para 255.

A primeira parte do funcionamento ( como joystick normal) eu já testei no proto-board usando o PIC16F688 como plataforma.

Testes iniciais de conversão do sinal do joystick




quarta-feira, 26 de agosto de 2015

Ensaio para joystick

Aproveitando uma sucata de controle de playstation estou montando um joystick analógico numa caixa Patola CR-096.


Tenho alguns planos para ele, um pouco distintos, mas vou concluir primeiro a montagem mecânica, que é o crítico no projeto, depois decido se ele vai virar um dispositivo USB para o PC ou um 'atari compatível' para os clássicos ou um híbrido (digital/paddles) para o MSX.


Ressuscitando um TK85 (8)

Continuando com a montagem do teclado, hoje terminei de colocar os push-buttons na placa

Com todas as chaves montadas o teclado ganhou forma

Deu trabalho,pois são 40 chaves e para cada uma é necessário conferir a posição e deve se ter cuidado de instalar todas as chaves apontadas para a mesma direção para que todos os contatos normalmente abertos fiquem voltados para o mesmo lado.


Todas as chaves apontam para o mesmo lado
  Deu trabalho, mas foi necessário.


Em seguida foi a vez de fazer as ligações e para isso me orientei por uma figura da membrana do teclado do ZX Spectrum (que é igual à do TK-90 e do TK-85). Para facilitar a montagem eu espelhei a imagem e imprimi numa folha de papel.
Mapa para a fiação da matriz do teclado.

Dois conectores fêmea foram soldados na placa nas posições as mais alinhadas possível com os conectores para o teclado na placa do TK-85

O TK-85 ainda está com a placa do TEK
Depois disso começou a soldagem dos fios seguindo o mapa. Usei fio vermelho para as linhas (A8..A15) e fio verde para as colunas (D0..D4).
Fiação da matriz do teclado está pronta
 Essa também deu bastante trabalho.

Soldagem da matriz do teclado.
o próximo passo vai ser montar dois cabos com 5 e 8 vias e testar o funcionamento.