PS2 mouse e BASIC Stamp computador
Colin Fahey
1. Introdução
Este artigo descreve como um PS/2 mouse pode ser copiado por uma BASIC Stamp computador.
Esta exploração é informal.

O interior de um velho de estilo (bola em movimento) computador mouse: o “Microsoft Intellimouse” (I substituiu a sensores ópticos com longos fios.)
Um rato tem dois eixos: “X” e “Y”. Quando o mouse é movido “horizontalmente,” o “X” roda dentro da roda do mouse. Quando o mouse é movido “verticalmente” (sob uma superfície), o “Y” roda dentro da roda do mouse. Para a resolução arbitrária do mouse, o “X” e “Y” rodas, de acordo com o movimento “horizontal” e “vertical” componentes do movimento do mouse.

Optical INTERRUPTOR rodas no interior do mouse
Observe os buracos nas rodas no interior do mouse. Quando a roda gira, a infra-vermelho (IR) luz emitida por uma IR díodo electroluminescente (LED) é interrompida várias vezes, a uma taxa proporcional à taxa de rotação da roda. Assim, o rato sabe quantos “incrementos” (também chamados de “carrapatos)” o eixo do mouse foi movido em um determinado período de tempo.
Determinando a direção do movimento envolve o uso de luz 2 sensores, situado muito perto umas das outras, bem como um eixo paralelo ao movimento da roda. (Ambos os sensores estão em um único componente 3 pinos mostrado abaixo.)

Mouse IR luz sensor (IR tem dois detectores em um único pacote)
O centro pino do pacote é o coletor de tensão positiva;
A esquerda ea direita são os pinos esquerda e direita sensor saída emissores.
Vamos citar o nome dos dois sensores do pacote “A” e “B”. Suponha que a roda se inicialmente a uma rotação IR ângulo de tal forma que a luz é impedido de alcançar os dois sensores.
À medida que a roda gira, o IR luz do emissor acabe por ser capaz de passar por um buraco na roda e chegar a um dos dois sensores, tais como o sensor “A”. Se a roda continua girando na mesma direção e, eventualmente, o segundo sensor, “B”, será capaz de IR recebeu luz. Se a roda continua girando na mesma direção, acabou a luz IR serão bloqueadas a partir de sensores atingindo “A”. Se a roda continua girando na mesma direção, acabou a luz IR serão bloqueadas a partir de sensores atingindo “B”.
Assim, a seqüência é:
(A,B): ..., (0,0), (1,0), (1,1), (0,1), ...
Se a roda gira na direção oposta, a 4 prazo seqüência mostrado acima será revertida, a partir do status atual.
Com estes dois sinais sensor podemos determinar taxa de rotação, e da direção.

A placa de circuito do Microsoft Intellimouse
Para entender mais sobre a forma como o mouse circuito interpreta a luz sensores e comunica com o computador pessoal (PC) (via PS/2 sinais), foi estudada a placa de circuito.
O circuito tem o seguinte nome impresso que lhe: SPCP05A.
Uma pesquisa da Internet para a palavra “SPCP05A” indica que o chip é fabricado por uma empresa denominada “Sunplus Technology Co.”. Informação sobre o microchip “SPCP05A” podem ser adquiridos a partir dessa empresa.
Aqui estão as especificações técnicas do circuito “SPCP05A”:
A imagem seguinte mostra os sinais dos pinos do “SPCP05A (PS/2 3D mouse)” microchip.

Sinais dos pinos do microchip “SPCP05A (PS/2 3D mouse)”
O “SPCP05A” é na verdade um pequeno computador! Ele tem um conjunto instrução, e RAM, e ROM, temporizadores e internas, etc Na verdade, a descrição do microchip “SPCP05A” nas informações fornecidas pelos Sunplus Co. praticamente não se refere à utilização específica do circuito “do mouse” para “computador” circuitos. Este chip é um versátil microcontrolador.
Eu estudei o circuito vestígios sobre a placa de circuito do Microsoft Intellimouse forma a aproximar o seguinte esquema:

Aproximado esquemática do Microsoft Intellimouse (Estou faltando alguns capacitores, mas esse esquema está quase perfeita.)
Bui Van Chu, na Austrália, leia o meu artigo e enviou-me uma mais completa esquemática, que aparece na imagem seguinte.

O mouse PS/2 esquemática, enviou-me por Bui Van Chu da Austrália
O circuito é muito simples.
Os botões do rato (esquerdo, centro, direita) ir directamente para os contributos sobre a microchip.
Os três pares de luz sensores, ((“X”, “Y”, “Z”), para (movimento horizontal, vertical movimento, e roda do meio do mouse)) enviar sinais diretamente para outras entradas no chip.
O PS/2 sinais DATA e CLK (relógio) também correspondem a I/O sinais sobre o chip.
Eu compreendi o esquema logo que acabei chamando-o (a seguir sobre os traços da placa de circuito impresso).
Uma coisa que eu não estava inicialmente compreender a forma como o IR LEDs estavam ligadas à microchip (pin 16: “PB1”), em vez dos seus terminais negativo (cátodo) simplesmente ser ligado directamente à terra. Isto é importante!
2. Minha primeira tentativa de controlar a circulação do mouse
As observações seguintes referem-se ao longo de um movimento único eixo (como o “X”, ou horizontal, eixo).
A primeira coisa que eu tentei era um objeto em movimento entre os IR LED eo sensor par - para simular o efeito de rotação da roda dentro do mouse. Isso funcionou. Eu poderia fazer com que o cursor do mouse para se deslocar na tela por simplesmente movendo um obstáculo através do feixe luminoso IR repetidas vezes, na mesma direcção.
Em seguida, eu removidos os 3 pinos sensor parte do mouse placa de circuito, e acompanha a placa de circuito fios no lugar do sensor. Eu manualmente um fio ligado à tensão positiva para simular atividade sensor. Eu ligado a dois sinais para a alimentação de acordo com o seguinte padrão (tais que representa “0” “fora,” e representa “a” “1”):
(0,0), (1,0), (1,1), (0,1), ...
Isso funcionou. Eu poderia passar o cursor do mouse sobre a tela por este tedioso ligar e desligar de fios no padrão mostrado acima. Inverter o padrão a partir do atual estado na seqüência iria mover o cursor na direcção oposta.
Porque coisas estavam indo tão bem, eu decidi-me ligar os fios de relés (controlada pelo RS-232). Isto permite-me essencialmente para fazer exatamente o que eu fiz com fios soltos: ligar o sensor sinais ao poder terminal na seqüência adequada. A única diferença seria o fato de que os humanos (me) não teria que fazer o incômodo ligar e desligar.
... Mas não funcionou!
Depois de um lote de ajuste de resistências e condensadores, etc, eu fiz uma curiosa descoberta: Se eu estava tocando alguns terminais no circuito, ele funcionou perfeitamente! A solução para este mistério aparece na próxima seção.
3. A luz infra-vermelha deve ser modulada (IR)
Após algumas experiências frustrantes eu tinha um novo pensamento: O IR luz possa ser agitada, a uma elevada frequência, eo chip pode esperar para receber esta frequência. Constante luz (ou a minha simulada constante sensor de saída) poderá ser rejeitada. Fiquei um pouco perplexo com o facto de que a luz ambiente de uma lâmpada halógena chão era aceitável, mas eu sabia que mesmo que as lâmpadas incandescentes têm detectável modulação.
Eu tentei uma pulsação IR LED em alta freqüência e bloqueando os sensores de acordo com o perfil esperado. Funcionou!
Essa foi isso! O IR LEDs o mouse em placas de circuito deve ser piscando em alta velocidade, e os microchips devem esperar esta piscando para além da taxa relativamente baixa de interrupção pela luz rotativa roda (com buracos).
A pulsação da IR LEDs, e esperando este pulsante desbloqueou um sensor no sinal de saída, o chip pode rejeitar qualquer ambiente IR sinais de interferir no funcionamento do mouse. Por exemplo, a luz de outros parasitas (constante) IR fontes não interefere com o mouse.
Eu conectado a um amplificador de áudio de saída do sensor, e então eu deixar o sensor de ter a luz ambiente expressos pelo meu andar lâmpada halógena. Eu ouvi um tom distinto (60 Hz). Quando eu velados a lâmpada, o tom cresceu desmaiar, e finalmente parou quando a luz foi desligada. Portanto, este sensor facilmente pega na 60 Hz modulação na lâmpada incandescente de minha lâmpada halógena chão!
Olhando, agora, no esquema do circuito do mouse PS/2 bordo, o significado do IR LEDs estar ligado a um pino sobre o microchip (em vez de para a corrente contínua) é óbvia. O circuito de controle a piscar o IR LEDs através do I/O pino, eo chip pode correlacionar a sua intenção de flash a ID LEDs com o sensor contributos recebidos, e, portanto, rejeitar quaisquer sinais parasitas (devido à não-IR luz piscando). (No entanto, correlação não é necessária. Basta detectar um número mínimo de piscar contagens poderia ser um limiar de aceitação sensor input.)
4. IR sensores com filtros bandpass
Você pode encontrar IR sensores especiais, embalados em transistor-como forma conduz a três, que estão “sintonizados” para frequências específicas moduladas IR luz (por exemplo, 38 kHz).

Sintonizado IR luz sensor (máximo de sensibilidade à luz 38 kHz modulação)
Bandpass circuito está contido dentro do dispositivo, juntamente com o IR foto-transístores.
Portanto, o IR LED geralmente podem ser impulsos a uma frequência de 38 kHz de modo a que o sensor irá receber a luz e deixar o sinal elétrico ir para o sensor saídas.
Para transmitir informações, a luz do IR LED pode ser interrompido a uma taxa relativamente baixa (por exemplo, de 1 a 100 vezes por segundo). Esta é pulsante de baixa frequência, em conjugação com o firme de alta freqüência pulsante, isto é, a componente de baixa frequência pulsação pode ser considerada como de alta frequência, modulando a pulsação. Os pulsos de alta frequência, é como uma “onda transportadora” mediante a qual a informação sinal (a modulação de frequência relativamente baixa) é transportado.
No entanto, tenho verificado que os sensores IR no Microsoft Intellimouse não têm essa modulação filtragem. No entanto, o circuito não exige que a luz IR ser modulada em algumas modalidades, para além das interrupções de baixa freqüência de luz com a roda de buracos.
O seguinte esquema ilustra a diferença de sinais de sensor constante IR LED luz piscando e IR LED luz para as diferentes fases do mouse roda girar.

Sensor sinais de saída para a luz constante IR caso e IR luz piscando o caso.
5. Simulando usando um mouse input BASIC Stamp computador
O computador tem “BASIC Stamp 2” programabilidade suficientes para implementar o protocolo PS/2. Por isso, o “BASIC Stamp 2” computador pode ser ligado directamente à porta PS/2 de um computador pessoal (PC) e PS/2 pode emular um mouse ou teclado.
5.1 O protocolo PS/2
Nos anos 1998 através 2003, a maioria dos computadores pessoais tinham PS/2 portas para o mouse eo teclado.
O porto tem 4 sinais PS/2: (1) CLOCK; (2) DATA; (3) +5V; (4) GROUND.
O porto permite PS/2 dispositivos para enviar dados para o acolhimento, e de acolhimento podem enviar dados para os dispositivos. Todas as partes em um porto PS/2 (normalmente apenas um dispositivo, bem como o acolhimento) deve partilhar os sinais e tem de se detectar uma outra parte está usando os sinais.
Como sinais podem ser compartilhados? Um sinal (como CLOCK ou DATA) normalmente é “flutuante” elevado, o que significa que o sinal é ligado a uma tensão positiva através de uma resistência a alta resistência (por exemplo, 4 kilo-Ohms). Assim, o sinal é interpretado como uma lógica “alto” por ouvir todos os partidos. Qualquer parte pode puxar a linha baixa (via TTL lógica), quando o partido tem a intenção de enviar dados. Quando um partido acabamentos envio de um pacote, ele permite que os sinais de ir indefinidamente, para que eles flutuam elevada novamente.
Para enviar dados a partir de um dispositivo (por exemplo, mouse ou teclado) para o computador pessoal (PC), você deve enviar 11-bits de dados em pacotes, composto pelos seguintes bits: (1) começar bit (“0”); (2) dados 8 bits (primeiro LSB); (3) paridade bit (paridade “impar);” (4) bit de paragem “(1).” Note que “paridade” é “ímpar” quando o número total de “1” bits de dados em bits e paridade bit combinado é um número ímpar.
O diagrama a seguir ilustra a transmissão de dados num único pacote:

PS/2 protocolo: dispositivo de acolhimento (PC) packet
O DATA linha deve ser ajustado para o valor adequado antes da interposição do CLOCK linha baixa. O DATA valor deve permanecer até que o conjunto CLOCK linha é devolvida de volta a alto. Quando a linha é CLOCK confirmou a ser elevada, o DATA valor pode ser alterado para o próximo pouco valor.
A velocidade típica relógio é relativamente lento, cerca de 10 kHz a 17 kHz. Isso é de 100 microsegundos estabelece a 70 microsegundos relógio para cada período.
O cenário do hospedeiro (PC) enviar dados para um dispositivo é semelhante a enviar dados para o dispositivo de acolhimento, mas em todos os casos o dispositivo controla a CLOCK sinal durante a transmissão de dados em si. Além disso, um pouco os dados enviados a partir do hospedeiro (mediante dispositivo estabelecendo CLOCK baixo) deve ser fechada quando o dispositivo permite que o sinal CLOCK fazer uma transição para a alta.
Uma pesquisa da Internet irá revelar muitas descrições de PS/2 sinais e detalhes sobre o protocolo.
5.2 PS/2 rato dados pacotes
Quando o computador inicia, o sistema operacional começa e acaba comunica com o mouse para determinar o tipo de mouse. Por padrão o rato pode se comportar como um genérico PS/2 mouse. No entanto, se o sistema operacional determina que o rato é na verdade um “3D PS/2” mouse (por exemplo, um rato com uma roda), ele pode dizer o rato para mudar para o mouse 3D PS/2 protocolo.
Quando mover o mouse, ou prima ou liberação botões do rato, o rato circuito envia dados para o acolhimento (PC), indicando o estado mudanças têm ocorrido desde a indicação estado anterior.
Os genéricos PS/2 mouse envia os três seguintes pacotes para o acolhimento:
------------------------
D7 D6 D5 D4 D3 D2 D1 D0 (The D0 bit (LSB) is sent first)
------------------------
(1) YV XV YS XS 1 0 R L (overflow, sign, buttons)
(2) X7 X6 X5 X4 X3 X2 X1 X0 (X movement; -128 to +127)
(3) Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 (Y movement; -128 to +127)
L = Left Button State (1 = pressed down)
R = Right Button State (1 = pressed down)
XS = Direction of X movement (1 = LEFT)
YS = Direction of Y movement (1 = UP)
XV = Overflow of X movement value (1 = X overflow occured)
YV = Overflow of Y movement value (1 = Y overflow occured)
X7,...,X0 : X movement; 8-bit 2's-complement signed byte (-128 to +127)
Y7,...,Y0 : Y movement; 8-bit 2's-complement signed byte (-128 to +127)
Here are examples of data sent to the host (PC):
------------------------------------------------
(The least-significant bit of each data byte is sent first.)
Move Left 1 unit : 0x18, 0xFF, 0x00
Move Right 1 unit : 0x08, 0x01, 0x00
Move Down 1 unit : 0x28, 0x00, 0xFF
Move Up 1 unit : 0x08, 0x00, 0x01
Press Left Button : 0x09, 0x00, 0x00
Release Left Button : 0x08, 0x00, 0x00
Press Right Button : 0x0C, 0x00, 0x00
Release Right Button : 0x08, 0x00, 0x00
É muito comum ter um “3D PS/2” mouse (por exemplo, com uma roda do mouse que também age como o botão do meio). Este tipo de mouse envia quatro pacotes de dados de acolhimento (PC).
------------------------
D7 D6 D5 D4 D3 D2 D1 D0 (The D0 bit (LSB) is sent first)
------------------------
(1) YV XV YS XS 1 M R L (overflow, sign, buttons)
(2) X7 X6 X5 X4 X3 X2 X1 X0 (X movement; -128 to +127)
(3) Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0 (Y movement; -128 to +127)
(4) Z7 Z6 Z5 Z4 Z3 Z2 Z1 Z0 (Z movement; -128 to +127)
This is very similar to the generic PS/2 mouse,
with a few additions:
M = Middle Button State (1 = pressed down)
Z7,...,Z0 : Mouse wheel movement; 8-bit 2's-complement signed byte
(The Z value is forced to a range of -8 to +7)
5.3 Meu primeiro circuito para simular um mouse PS/2
O seguinte esquema foi o meu primeiro trabalho “BASIC Stamp 2” técnica para obter o meu computador para enviar dados para o mouse PS/2 acolhimento (PC).

Esquema de um circuito para permitir que o BASIC Stamp computador para enviar PS/2 pacotes para o acolhimento (PC).
Note que este circuito eletricamente isolados BASIC Stamp meu computador a partir do hospedeiro (PC) computador. Além disso, note que este circuito é apenas para satisfazer as necessidades elétricas de PS/2 transmissão de dados (a partir de dispositivo de acolhimento). Assim, eu PS/2 teclado pode enviar mensagens usando o mesmo circuito se eu ligar o teclado ao PS/2 porta do host (PC)!
Uma vez que recebe sinais é geralmente não-invasivos (ou seja, ouvindo não interfere com sinais elétricos), a única coisa necessária para permitir que o “BASIC Stamp” computador para receber o PS/2 CLOCK e DATA sinais é uma conexão direta entre esses sinais para outros BASIC Stamp I/O pinos (configurado para ser insumos). Eu iria tentar uma espécie de tampão - mas eu definitivamente não pode utilizar um dispositivo opto-directa, uma vez que iria colocar uma carga sobre os sinais “flutuantes (naufrágio” assim eles!). Eu poderia usar o poder +5V para um buffer, e depois, então, usar o buffer de saída para a condução opto-isoladores que finalmente enviar sinais ao BASIC Stamp I/O pinos (configurados como entradas).
A imagem seguinte mostra BASIC Stamp 2 meu computador conectado a um circuito que coincidem com os esquemas acima.

BASIC Stamp 2 computador conectado a uma porta do rato PS/2 através de um dispositivo opto-circuito.
BASIC Stamp 2 o seguinte programa, escrito em PBASIC a linguagem de programação, foi minha primeira tentativa bem sucedida para controlar o PS/2 mouse BASIC Stamp 2 através do computador.
O programa simplesmente faz mover o cursor do rato ao longo de uma pequena linha diagonal.
'====================================================================
'{$STAMP BS2} 'STAMP directive (specifies a BS2)
DIR0 = %1 'Set pin 0 to OUTPUT
DIR1 = %1 'Set pin 1 to OUTPUT
OUT0 = %0 'Set DATA line high (pin low)
OUT1 = %0 'Set CLOCK line high (pin low)
tempData VAR BYTE
tempParity VAR BYTE
'--------------------------------------------------------------------
MainLoop:
tempCounter VAR WORD
FOR tempCounter = 0 TO 10
tempData = $28
GOSUB TransmitPacket
tempData = $01
GOSUB TransmitPacket
tempData = $ff
GOSUB TransmitPacket
tempData = $00
GOSUB TransmitPacket
PAUSE 100
NEXT
FOR tempCounter = 0 TO 10
tempData = $18
GOSUB TransmitPacket
tempData = $ff
GOSUB TransmitPacket
tempData = $01
GOSUB TransmitPacket
tempData = $00
GOSUB TransmitPacket
PAUSE 100
NEXT
GOTO MainLoop
STOP
'--------------------------------------------------------------------
TransmitPacket:
GOSUB ComputeParity 'First, compute parity
tempData = ~tempData 'Invert data bits
tempParity = ~tempParity 'Invert parity bit
'==== Start Bit ====
OUT0 = %1 'Set data line low (output high)
PULSOUT 1, 25 ' Pulse line 1 for (25*2) = 50 usec
'==== Data Bits ====
OUT0 = tempData.BIT0
PULSOUT 1, 25
OUT0 = tempData.BIT1
PULSOUT 1, 25
OUT0 = tempData.BIT2
PULSOUT 1, 25
OUT0 = tempData.BIT3
PULSOUT 1, 25
OUT0 = tempData.BIT4
PULSOUT 1, 25
OUT0 = tempData.BIT5
PULSOUT 1, 25
OUT0 = tempData.BIT6
PULSOUT 1, 25
OUT0 = tempData.BIT7
PULSOUT 1, 25
'==== Parity Bit ====
OUT0 = tempParity.BIT0
PULSOUT 1, 25
'==== Stop Bit (high) ====
OUT0 = %0 ' pin low is DATA high
PULSOUT 1, 25
PAUSE 1 ' Necessary? Provides 1 msec gap between packets...
RETURN
'--------------------------------------------------------------------
ComputeParity:
tempParity = $01
tempParity = tempParity + tempData.BIT0
tempParity = tempParity + tempData.BIT1
tempParity = tempParity + tempData.BIT2
tempParity = tempParity + tempData.BIT3
tempParity = tempParity + tempData.BIT4
tempParity = tempParity + tempData.BIT5
tempParity = tempParity + tempData.BIT6
tempParity = tempParity + tempData.BIT7
tempParity = tempParity & $01
RETURN
'====================================================================
Este programa funciona perfeitamente. Eu deixo que correr durante horas, e é impecável feita mover o cursor do rato entre duas localizações exatas sobre a tela. Isto é o que eu estava procurando: controle preciso do mouse para que eu possa interagir com o software.
Depois de pesquisar na Internet descobri que alguém BASIC Stamp usado um computador para a interface PS/2 (simulando um teclado). Essa pessoa usou o PBASIC instrução SHIFTOUT para lidar com a CLOCK e DATA sinais, que é realmente grande. Isso tornaria o meu “TransmitPacket” subrotina muito mais curto, talvez 5 linhas de código total!
Eu também vi que outras pessoas TTL buffers usados, com contributos PS/2 conectado diretamente a partir de sinais (CLOCK e DATA), e saídas conectado diretamente a pinos sobre o microcontrolador chip. No mesmo circuito, a partir da saída linhas microcontrolador entrou directamente para a base pinos em transistores que tinham a sua colecção directamente ligada à PS/2 sinais. Tudo isso direto acoplamento de diferentes circuitos parece ser uma má idéia para mim, sob pena um circuito fritar o outro. Não sei o que fazer se eu me frito PS/2 a porta na minha PC. Comprar uma nova placa mãe, eu suponho! Uma desculpa para atualizar. Não me parece que uma porta PS/2 motherboard meltdown é provável, mas eu fiz de imediato desligamento meu computador quando eu acidentalmente curto-circuito a +5V e GROUND sinais PS/2 indo para o mouse. Talvez ele é um recurso! Eu poderia acrescentar um novo botão do mouse que apenas a curto-circuitos do mouse potência instantânea para o encerramento da PC. ;-)
Veja aqui o link para as informações relativas à utilização de SHIFTOUT para o PS/2 protocolo:
Olhe para o seguinte link:
KEYBTST.ZIP gives a very basic program for the parallax
-----------
BASIC stamp II, to send key-codes to the PC's keyboard port.
It also gives a write-up of the XT and AT keyboard interfaces
(although IMO some details could be wrong / different to the
keyboards I've looked at).
Localmente-cópia em cache do arquivo:
keybtst.zip
10655 bytes
MD5: c5667557f96db53fb878bd11bfbe4f74
No link a seguir fornece mais informações sobre PS/2 mouse interface: