sábado, 25 de outubro de 2014

Telas Touchscreen Resistivas


Recentemente adquiri no Mercado Livre uma tela touchscreen resistiva dessas usadas em tablets chineses de primeira geração. Estas telas são muito baratas, a minha custou algo em torno de R$23,00.

O funcionamento destas telas é muito simples. Elas são compostas de duas camadas de material resistivo sobrepostas e isoladas uma da outra por minúsculos pontos.
Eletricamente, o equivalente é o seguinte.


Quando a tela é tocada a resistência entre o ponto do toque e os eletrodos é proporcional à distância entre o ponto e o eletrodo.



Uma das maneiras de se medir o ponto de toque é alimentando-se um dos eixos com uma tensão conhecida e medir a tensão resultante em um dos eletrodos do outro eixo.

Se a resistência interna do medidor (RM) for muito grande em relação à resistência dos eixos podemos considerar que a posição do ponto de toque no eixo X é proporcional à tensão medida no eletrodo Y+.



Para medir o outro eixo, no exemplo o eixo Y, aplica-se a tensão sobre os eletrodos Y+ e Y- e mede-se a tensão resultante no eletrodo X+.
Analogamente, para o eixo Y.

Para se medir uma tela touchscreen com um microcontrolador, é necessário que o mesmo possua portas de entrada e saída e conversores A/D.

Para se medir o eixo Y, Ativam-se como saídas os pinos conectados aos eletrodos Y+ (nível alto) e Y-(nível baixo) e configura-se o pino conectado ao pino X+ como entrada do ADC.
Considerando-se a resolução do ADC como o valor de ESCALA e a tensão de alimentação VCC como referência do ADC, basta-se fazer a leitura do ADC para se ter o valor de posição. Simples assim!!!

POSICAO=ADC_READ( );


Bom... nem tanto!!! Na prática é preciso levar outras coisas em consideração:

A resistência típica de uma eixo de tela de toque costuma estar entre 100 Ohms e 900 Ohms. Isso significa que, se alimentado com 5Volts, a corrente que atravessa a tela pode chegar a 50mA, o que é bem maior do que a maioria dos microcontroladores consegue fornecer, que é algo em torno dos 25mA. Mesmo que a corrente fique abaixo desse valor, é preciso considerar-se as quedas de tensão nos elementos de chaveamento do microcontrolador, que aparecem em nosso circuito como as resistências R-HI e R-LO.


Para resolver o problema da queda de tensão nos elementos de chaveamento alguns chips dedicados à leitura de telas resistivas, como o AD7843 da Analog Devices, possuem um modo de leitura diferencial, onde as referências para o ADC são retiradas diretamente dos terminais de saída


Como não dispomos deste recurso na maioria dos microcontroladores, cuja referência para o conversor A/D é a própria tensão de alimentação a solução é inovar.

Vamos nos aproveitar de uma característica intrínseca de alguns microcontroladores, e entre eles o PIC16F688.  Usaremos como exemplo os pinos RC0/RC1.
Como pode ser visto no circuito acima, o ADC fica conectado o tempo todo ao pino de I/O. Isso significa que é possível medir a tensão no pino sob carga! Ou seja, é possível medir a diferença de tensão entre os pinos (+) e (-) e compensar nos cálculos as quedas de tensão nos elementos de chaveamento:

Desta forma, para o eixo X:


E para o eixo Y:



Observações Finais:


  • A medição de tensão diretamente nos pinos resolve o problema da compensação, mas o resultado final tem menos bits do que a resolução intrínseca do ADC.
  • A tela 'touch' é um sensor ruidoso, portanto é necessário verificar se a tensão no ponto de toque está entre V_HI e V_LO. 

  • A fim de economizar energia, principalmente se a tela for utilizada numa aplicação com baterias, mantenha em alta impedância todos os pinos conectados aos eletrodos, e faça medições somente 
  • Para se detectar se a tela está sendo pressionada ou não, utilize a configuração abaixo e meça como entrada digital o pino conectado ao eletrodo Y+. Caso a tela esteja sendo tocada, o valor lido vai ser "0". 










terça-feira, 14 de outubro de 2014

Programador de dispositivos TL866

Adquiri recentemente pelo Ali Express um multi-programador de dispositivos modelo TL866CS. O preço foi de $58,00 que convertido deu aproximadamente R$143,00

O produto chegou em menos de 1 mês a partir do vencimento do boleto. Considerando o tempo médio de compras na China, foi bem rápido.

Testei ele aqui para ler várias EPROMS, EEPROMS, SRAMs em FLASHes e funcionou tudo certinho.

Seguem algumas fotos do 'unboxing'. Depois coloco um passo a passo das telas que capturei desde o download da aplicação, passando pela instalação dos 'drivers', até estar pronto para os primeiros testes.

Pacote recém chegado do além mar.

Conteúdo da caixaa: Programador, seis adaptadores e extrator.

Minha versão é a CS. Esta não tem conector ISP.

Seis adaptadores para CIs SMD mais extrator.

'Close' nos adaptadores.

O programador veio bem protegido.

Acompanha cabo USB de boa qualidade, CD de 'drivers' e certificado de garantia em chinês.

O programador é bem compacto, e bem mais prático de usar que meu Willem v3.5

Ensaiando o adaptador PLCC44.

Agora com o SOIC28 (ou é TSSOP?)
 Aqui uma ressalva em relação ao adaptador PLCC32. Se colocar o chip até o final, os terminais da memória não encostam direito nos terminais do soquete e a leitura/gravação costumam falhar. Tem que deixar o corpo do chip rente com o soquete, mas isso é fácil de fazer, basta colocar o chip de pernas pra cima sobre a bancada e encaixar o soquete por cima dele (depois posto uma foto para ilustrar)
Agora o PLCC32.

A minha versão é a CS, que não possui conector ICSP. Para mim não faz diferença.

Usando o extrator, fica bem fácil tirar os chips do soquete.


domingo, 5 de outubro de 2014

Documentação do teclado LABO

Segue abaixo uma pequena documentação a respeito do teclado LABO.

A pinagem do conector DB-25 encontra-se abaixo.



O teclado consome 480mA de corrente. então é recomendado alimentar ele com uma fonte com capacidade de pelo menos 600mA, para ter uma folga.

O sinal /CAPS é uma entrada ativa em nível baixo e serve para acender a luz que fica dentro da tecla SHIFT LOC e drena por volta de 20mA quando conectado ao terra.

O sinal /UPPER fica normalmente em nível alto (TTL) porém vai a nível zero quando se pressiona a tecla UPPER FUNCTION.

O sinal TX DATA é a saída do teclado, em nível TTL. A velocidade de transmissão é de  1200 bauds com 8 bits de dados, sem paridade e 1 bit de parada (1200 8N1).

A cada tecla pressionada seu código correspondente é transmitido. A tecla SHIFT não possui código próprio, sendo usada apenas para acessar os símbolos alternativos das teclas numéricas e de pontuação.
O teclado não tem auto-repetição automática. Para isso o teclado tem a tecla REP que quando pressionada em conjunto com uma tecla, repete sua transmissão a cada 100ms.

A tecla SHIFT LOC possui dois códigos que transmite alternadamente ao ser pressionada 0xBA para as teclas minúsculas (a, b, c, d, ....) e 0xBB para as teclas maiúsculas (A. B, C, D,...). Esta tecla não altera o estado dos símbolos alternativos das teclas numéricas e de pontuação.
Quando as teclas minúsculas estão selecionadas e se pressiona SHIFT as teclas maiúsculas são transmitidas. Já o oposto não acontece: quando as teclas maiúsculas estão selecionadas pressionar SHIFT não altera o estado para minúsculas.

O mapeamento das teclas encontra-se abaixo. As teclas que não possuem código, quando pressionadas, equivalem ao código ASCII grafado na tecla.

As teclas que possuem apenas um código, quando pressionadas em conjunto com a tecla SHIFT transmitem o caractere 0x00.

Os números do teclado numérico não enviam os mesmos códigos que os números do teclado normal. As teclas Y e N do teclado numérico não possuem os mesmos códigos das teclas Y e N do teclado normal.

A tecla "-" ao lado do SHIFT da direita é um "underscore" e não um sinal de menos.

A tecla na segunda posição à esquerda de BACKSPACE é a tecla de Circunflexo/Til. São teclas ASCII normais, porém a grafia adotada na tecla (setas) não corresponde à grafia normal (^/~).

As teclas ESCAPE e BACKSPACE não usam os códigos ASCII padrão .



Teclado LABO depois do banho

Depois de desmontar todas as teclas eu as coloquei de molho na água com detergente neutro por várias horas. O mesmo fiz com a carcaça.

Depois do banho limpei as teclas uma a uma e as montei de volta (vídeo). Algumas teclas duplas estavam agarrando, e por isso coloquei um pouco de graxa de silicone para lubrificar as partes móveis de plástico. Isso resolveu o problema. As que não estavam agarrando deixei como estavam.

A carcaça eu esfreguei com uma esponja ainda dentro da vasilha onde deixei o conjunto de molho. Depois enxaguei com água corrente. A sujeira preta que estava incrustada na pintura da carcaça saiu por completo.

O teclado agora está com cara de novo.



Para dar uma idéia do tamanho do teclado, eis duas fotos dele ao lado do meu TK90X


Aqui uma vista de cima


sábado, 4 de outubro de 2014

Teclado serial LABO

Recentemente comprei no Mercado Livre um teclado LABO pra ver ser fazia um MOD para usar no PC. Afinal estes teclados antigos são gostosos de digitar pra caramba.

Quando o teclado chegou fiquei contente, pois apesar do gabinete estar impregnado de poeira e ter algumas teclas agarrando, o estado do teclado está muito bom, considerando que foi fabricado em 1982.


Infelizmente não sei o modelo do mesmo. A etiqueta só traz número de série

Abrindo o teclado outra agradável surpresa. A placa estava em ótimas condições de conservação.


A inteligência do teclado é construída em torno de uma UART da AMI modelo S1602P (compatível com os MB8868A da Fujitsu) e quase duas dúzias de CIs de lógica TTL dos antigos, série 74XX.



Como tudo parecia estar em ordem, resolvi seguir as trilhas do regulador de tensão para ver onde ligar a alimentação. Aproveitei e medi as ligações do conector interno do teclado, de 5 pinos ao conector externo de 25 pinos para deixar documentado.


Pino Interno Pino Ext (DB-25) Função
1 6 Alimentação (>8V)
2 8 GND
3 13 TX Out (TTL RS232, 1200 8N1)
4 10 /CAPS LED In
5 11 /UPPER FUNCTION Out

Acabei descobrindo que a conexão entre o pino 5 do conector interno e o pino 11 do DB-25 estava ruim. Será que é por isso que tiraram o teclado do uso?



Depois de ligado, conferi o clock estava funcionando e parti direto para verificar o sinal nos outros pinos do conector e nova surpresa... O teclado está funcionando perfeitamente! Apesar da idade, apesar dos longos anos sem uso, está tudo funcionando, todas as teclas, tudo!

Analisando a forma de onda ao se transmitir um caractere conhecido como a letra "A", consegui medir a velocidade e a quantidade de bits por palavra: 1200 8N1



Uma coisa interessante neste teclado, é que o tratamenteo da tecla SHIFT é feito no teclado, ou seja a tecla SHIFT não transmite nenhum código.

O traço de baixo da forma de onda é o sinal /UPPER FUNCTION, que vai a zero quando esta tecla é pressionada.



Cada tecla pressionada gera apenas 1 transmissão, mesmo que seja mantida pressionada. Para a auto-repetição existe uma tecla específica que, quando pressionada em conjunto com outra tecla, gera um pressionamento a cada 100ms.


Outra curiosidade é que a tecla Caps Lock (SHIFT LOC) não muda o estado do código transmitido, como no caso da tecla SHIFT, porém o bit menos significativo do código transmitido muda de estado cada vez que a tecla é pressioanda. Além disso, o LED indicador de Caps Lock não é processado no teclado, mas externamente, e acende ao se levar o pino /CAPS a nível zero.




O próximo passo vai ser desmontar as teclas uma por uma, e dar um banho de água com detergente em tudo e remontar.




sábado, 23 de agosto de 2014

Mais testes com o emulador de teclado

Depois de um longo tempo sem mexer no circuito do emulador de teclado por causa de compromissos profissionais, hoje finalmente consegui avançar mais um pouco.

Depois de acertar alguns parâmetros do software de controle vi que o circuito ainda não estava gerando o acionamento das teclas. Desconfiei então que pudesse estar acontecendo retenção do barramento, de modo semelhante ao que acontece com o TK85 quando se usa a interface JOY81 do Kelly Murta. Fiz algumas medições para investigar. Nas figuras abaixo o sinal laranja corresponde ao sinal de leitura da ULA enquanto o sinal azul representa a linha D0. Sem nenhuma tecla pressionada, a tensão na linha D0 no momento da leitura é de aproximadamente 4,0 Volts.

Tecla "A" solta.
Quando se pressiona a tecla "A", as linhas A9 e DD5 são conectadas, fazendo com que o sinal da linha D0 caia para aproximadamente 0,16 Volts, puxado para baixo pelo LS365 interno ( o o conector interno (ligando as linhas A9 e DD5) .

Tecla "A" pressionada





Por outro lado, quando se ativa a mesma linha de um um driver externo (74LS365) acontece a retenção pois ao mesmo tempo que o 365 externo tenta abaixar o nível da linha, o interno tenta jogar um nível alto. Com isso a tensão resultante é por volta dos 1,44 Volts que o Z80 entende como nível alto.

Linhas A9 e DD0 externas pressionadas - contenção de barramento.

A conclusão é que infelizmente, para que meu circuito funcione vai ser necessária uma adaptação interna no TK90 que consiste na inclusão de 5 diodos, novamente de modo semelhante à modificação do JOY81.  Talvez sejam necessários também resistores de pullup, mas tenho que dar uma estudada melhor no assunto.



sábado, 21 de junho de 2014

Emulador de Teclado - fotos e testes com o protótipo

Fiz hoje alguns testes com o emulador de teclado conectado ao TK.


Alguns problemas se apresentaram, a começar pela contenção da linha A13 por parte do AVR (vide post anterior).

Outro problema que eu tive foi com a rotina de interrupção em assembly. Em alguns momentos eu notava que o AVR parava de responder às interrupções e o TK travava com o sinal /wait em nível baixo. Por enquanto retornei o atendimento à interrupção de leitura de teclado para uma interrupção padrão do Arduino e mesmo com o overhead o TK parou de travar.

Ainda estou com dois problemas que tenho que resolver. Um deles é que de vez em quando o TK demora a iniciar ou não inicia, mas isso não é mais problema de contenção. Desconfio que ainda esterja relacionado ao acionamento incorreto do sinal que libera a linha de /WAIT.

Outro problema é que apesar da matriz estar sendo preenchida corretamente quando se pressionam as teclas (o circuito imprime o estado dos bits na serial) nenhum bit muda de estado na entrada do LS367. Vou precisar debugar esta rotina em separado (fora da interrupção) para descobrir o problema.

Por último, pode ser que eu precise colocar uns resistores em série com as linhas D0 a D4 do LS365 interno do TK a fim de evitar a contenção do barramento de dados quando o LS367 do emulador de teclado estiver ativo.