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.






segunda-feira, 24 de agosto de 2015

Ressuscitando um TK85 (7)

Como o 9º encontro de usuários de TK está se aproximando, resolvi deixar meu TK-85 ressuscitado em forma para levá-lo ao encontro.

Comecei a trabalhar num gabinete para ele, baseado na caixa PB-900 da Patola. Esta caixa tem espaço suficiente para caber a placa do TK-85 (vide post anterior) e mais alguns extras como uma fonte de alimentação. r   

Caixa PB-900. Fonte: www.patola.com.br
Apesar da caixa ter uma face perfeita para se colocar um teclado, eu fiquei tentado a deixar instalado o protótipo do TeK e colocar um conector PS/2 na parte de trás do gabinete, mas numa visita a uma loja online de componente eletrônicos encontrei uma chave muito barata e resolvi comprar 40 para fazer um teclado.
Chavinha 8x8mm sem trava
Como a furação destas chaves é alinhada a uma grade de dimensões imperiais (polegadas) a escolha natural da placa para sustentar as chaves foi uma placa padrão com ilhas, de 10x30cm ou algo assim que tinha disponível em minha oficina.

A primeira idéia foi dispor as chaves numa grade de 10 x 4 mas os primeiros ensaios numa folha de papel não ficaram legais. Resolvi então deixar as teclas numa disposição mais natural e para isso imprimi uma cópia do teclado do TK-85 ajustada para as dimensões da placa da caixa PB-900.
Infelizmente não deu para usar uma cópia 1:1 do teclado do TK, pois as teclas dele estão dispostas numa grade em milímetros.

Teclado do TK-85 ajustado ao 'faceplate' da caixa PB-900
 O próximo passo foi encaixar as teclas na placa de forma que a posição batesse com a da folha impressa com as teclas do TK-85, tomando o cuidado de manter o mesmo espaçamento entre elas.

Posição das teclas ajustadas para o 'gabarito' do TK-85.
 Depois de encaixadas, eu fiz uma marca com caneta de retroprojetor do lado de baixo da placa, bem no centro da posição de cada chavinha.

Teclas na disposição final.
Depois disso recortei a placa para caber dentro do gabinete e conferi a altura das chaves em relação à tampa da caixa para ver se seria necessário utilizar algum espaçador. Por sorte não foi preciso pois a parte superior do corpo da se chave se alinha exatamente com a parte inferior da tampa.

Até parece que essa chavinha foi feita para esta caixa.
 Em seguida furei as laterais da placa de forma a se encaixarem nas furções da tampa e prendi com parafusos. Daí eu levei esse 'sanduíche' à furadeira de bancada e com uma broca de 100 eu marquei todos os 40 furos.
Furando a referência para as chavinhas.

Tampa frontal com a furação guia, alinhada pela placa de circuito impresso.
 Depois de fazer a furação das guias eu aumentei todos os furos utilizando uma broca de 5,5mm que se mostrou adequada para deixar passar o pescoço das chavinhas.

A folha de papel é para não riscar a face da tampa plástica

Tampa plástica com toda a furação.
 Depois de terminar a furação da caixa dei uma conferida para ver se tudo estava em ordem.
Conferindo o trabalho
 Em seguida comecei a soldar as chaves uma a uma, tomando o cuidado de deixar todas com a mesma orientação, uma vez que são chaves 2 polos e 2 posições

Primeira chave soldada

Segunda chave soldada

Quatro chaves soldadas.
Quando cheguei nas 8 chaves a bateria da máquina acabou e eu fui consultar o relógio. Já era tarde!! Amanhã tem mais!

domingo, 23 de agosto de 2015

Pinguino com alguns extras

 Montei uma placa de protótipos para PIC baseada no Pinguino 2550 porém com alguns extras
  • Header ICSP
  • Header RS232
  • 3 botões
  • 3 LEDs
  • Jumper para modo RUN
 O conector para ligações externas possui os pinos na ordem do Pinguino , ou seja I/O0 a I/O17 e conta com 2 pinos de GND e um pino de +5V. A placa tem espaço para colocar um regulador de 3,3V e o conector de saída tem um pino reservado para esta tensão.

Placa Pinguino com extras

"Macarrão" debaixo da placa
Pinagem da placa

A placa já está rodando com o bootloader do Pinguino.

IDE do Pinguino: Programa carregado com sucesso