PS2 souris et BASIC Stamp ordinateur
Colin Fahey
1. Introduction
Cet article décrit comment un PS/2 souris peut être émulé par un BASIC Stamp ordinateur.
Cette exploration est informel.

L'intérieur d'un vieux-style (passage à billes) souris d'ordinateur: la « Microsoft Intellimouse » (J'ai remplacé les capteurs optiques avec de longs fils.)
Une souris a deux axes: « X » et « Y ». Quand la souris est déplacé « horizontalement, » la roue « X » intérieur de la souris à tour de rôle. Quand la souris est déplacé « verticalement » (sur une surface), la roue « Y » l'intérieur de la souris à tour de rôle. Pour arbitraire souris motion, le « X » et « Y » roues selon déplacer à « l'horizontale » et « verticale » des composants de la souris motion.

Interrupteur optique roues intérieur de la souris
Notez les trous dans les roues intérieur de la souris. Lorsque la roue tourne, l'infra-rouge (IR) lumière émise par une IR Light Emitting Diode (LED) est interrompu à maintes reprises, à un taux proportionnel au taux de rotation de la roue. Ainsi, la souris sait combien « d'augmentations » (également appelé « tiques) » la souris a déplacé l'axe dans une période donnée.
Déterminer le sens de circulation implique l'utilisation de 2 capteurs de lumière, situé très près les uns, le long d'un axe parallèle au mouvement de la roue. (Les deux capteurs sont dans un unique 3-broches composante ci-dessous.)

Souris IR capteur de lumière (a IR deux détecteurs dans un seul paquet)
Le centre de la broche paquet est le collecteur de tension positive;
La gauche et droit sont les broches à gauche et à droite de sortie du capteur émetteurs.
Laissez-nous le nom de deux capteurs dans l'emballage « A » et « B ». Supposons que la roue est d'abord à un angle de rotation de telle sorte que la IR lumière est bloquée d'atteindre les deux capteurs.
Comme la roue tourne, IR la lumière de l'émetteur sera en mesure de passer à travers un trou dans la roue et de parvenir à un des deux capteurs, telles que des senseurs « A ». Si la roue en rotation continue dans la même direction, en fin de la deuxième capteur, « B », sera en mesure de recevoir IR lumière. Si la roue en rotation continue dans la même direction, en fin de la IR lumière sera bloqué d'atteindre « A » capteur. Si la roue en rotation continue dans la même direction, en fin de la IR lumière sera bloqué d'atteindre « B » capteur.
Ainsi, la séquence est la suivante:
(A,B): ..., (0,0), (1,0), (1,1), (0,1), ...
Si la roue tourne dans le sens inverse, les 4-terme séquence ci-dessus sera inversée, à partir de la situation actuelle.
Avec ces deux signaux émis par les capteurs, nous pouvons déterminer le taux de rotation, et la direction.

Le circuit de la Microsoft Intellimouse
Pour mieux comprendre comment la souris circuits interprète les capteurs de lumière et communique avec l'ordinateur personnel (PC) (par l'intermédiaire de signaux PS/2), j'ai étudié la carte de circuit imprimé.
La puce a pour nom imprimé sur: SPCP05A.
Une recherche de l'Internet pour le mot « SPCP05A » indique que la puce est fabriquée par une société nommée « Sunplus Technology Co. ». Informations sur la « SPCP05A » puce peuvent être acquises de cette société.
Voici les spécifications techniques du microprocesseur « SPCP05A »:
L'image suivante montre les signaux des broches de la puce « SPCP05A (PS/2 3D mouse) ».

Signaux des broches de la puce « SPCP05A (PS/2 3D mouse) »
Le « SPCP05A » est en fait un petit ordinateur! Il a un jeu d'instructions, et RAM, et ROM, interne et à temps, etc En fait, la description des « SPCP05A » puce dans les informations fournies par Sunplus Co. guère fait référence à l'utilisation spécifique de la puce « souris d'ordinateur » pour les circuits. Cette puce est un microcontrôleur.
J'ai étudié le circuit des traces sur la carte de circuit imprimé de la Microsoft Intellimouse pour former le schéma approximatives suivantes:

Approximative du schéma Microsoft Intellimouse (Il me manque un peu de condensateurs, mais ce schéma est presque parfait.)
Bui Van Chu, en Australie, lisez mon article et m'a envoyé un schéma plus complet, qui apparaît dans l'image ci-dessous.

Le schéma PS/2 souris, m'a envoyé par Bui Van Chu de l'Australie
Le circuit est très simple.
Les boutons de la souris (gauche, centre, droit) se rend directement aux intrants sur la puce.
Les trois paires de capteurs de lumière, ((« X », « Y », « Z »), (mouvement horizontal, vertical, middle et la molette de la souris)) envoyer des signaux directement à d'autres intrants sur la puce.
Le PS/2 signaux DATA et CLK (horloge) correspondent également à I/O signaux sur la puce.
J'ai bien compris le schéma dès que j'ai fini le dessin (en suivant les traces sur la carte de circuit imprimé).
Une chose que je ne comprends pas, initialement, était la manière dont les IR LEDs étaient liés à la puce (broche 16: « PB1 »), au lieu de leurs effets négatifs sur les terminaux (cathode) le simple fait d'être connecté directement à la masse. C'est important!
2. Ma première tentative de contrôle de mouvement de souris
Les commentaires qui suivent se réfèrent au mouvement le long d'un axe unique (comme la « X », ou horizontale, l'axe).
La première chose que j'ai essayé était un objet en mouvement entre les IR LED et le capteur paire - pour simuler l'effet de rotation des roues au sein de la souris. Cela a bien fonctionné. Je pourrais causer le curseur de la souris pour se déplacer sur l'écran en déplaçant simplement un obstacle à travers le faisceau lumineux IR à maintes reprises, dans la même direction.
Ensuite, j'ai supprimé les 3 broches partie capteur de la souris circuit imprimé, fils et joint à circuit imprimé en place du capteur. Je manuellement un fil connecté à la tension positive capteur pour simuler l'activité. Je reliait les deux signaux à la puissance selon la répartition suivante (tels que représente « 0 » « décollage, » et représente « en » « 1 »):
(0,0), (1,0), (1,1), (0,1), ...
Cela a bien fonctionné. Je pourrais passer le curseur de la souris sur l'écran par cette fastidieuse connexion et la déconnexion des fils de la configuration ci-dessus. Inverser la tendance de la situation actuelle dans l'ordre de déplacer le curseur dans la direction opposée.
Parce que les choses allaient si bien, j'ai décidé de connecter les câbles à relais (contrôlé par RS-232). Ce serait essentiellement permettez-moi de faire exactement ce que j'ai fait avec des fils en vrac: Connecter le capteur de signaux à la puissance administration dans la séquence. La seule différence serait le fait que l'être humain (moi) n'aurait pas à faire de fastidieuses de connexion et déconnexion.
... Mais ça n'a pas marché!
Après une adaptation de beaucoup de résistances et des condensateurs, etc, j'ai fait une étrange découverte: Si j'étais touchant certains terminaux dans le circuit, cela a fonctionné parfaitement! La solution à ce mystère apparaît dans la section suivante.
3. L'infra-rouge (IR) éclairage doit être modulé
Après quelques expériences frustrantes, j'ai eu une pensée nouvelle: Le IR d'éclairage, pourrait être impulsions à haute fréquence, et la puce peut s'attendre à recevoir cette fréquence. Constant lumière (ou simulé mon constante de sortie du capteur) pourrait être rejetée. Je suis quelque peu perplexe par le fait que la lumière ambiante d'un lampadaire halogène est acceptable, mais je savais que même les lampes à incandescence et présentent des concentrations détectables de la modulation.
J'ai essayé une pulsation IR LED à haute fréquence et en bloquant les capteurs selon le schéma prévu. Cela a fonctionné!
That was it! Le IR LEDs chez la souris carte de circuit imprimé doit être clignotant, à haute vitesse, et la puce doit s'attendre clignotent en plus du taux relativement faible de la lumière interruption par la rotation des roues (avec des trous).
Par la pulsation IR LEDs, et s'attend à ce que cette pulsation dans un déblocage de sortie du capteur de signal, la puce peut rejeter toute ambiante IR signaux d'interférer avec la souris. Par exemple, la lumière des autres (constant) IR sources interefere pas avec la souris.
J'ai connecté un amplificateur audio à la sortie du capteur, puis-je prendre le capteur dans la lumière ambiante exprimés par mon lampadaire halogène. J'ai entendu un ton (60 Hz). Quand j'ai grisé le feu, le ton a augmenté faible, et finalement arrêté quand la lumière était éteinte. Ainsi, ce capteur facilement reprend 60 Hz la modulation dans l'ampoule à incandescence de ma lampe halogène parole!
La recherche, maintenant, au schéma de la souris PS/2 circuit imprimé, l'importance de la IR LEDs être connecté à une broche sur la puce (au lieu de le courant) est évident. Le microprocesseur contrôle le clignotement de la IR LEDs par la I/O broches, et la puce peut corréler son intention de le flash ID LEDs avec le capteur de contributions reçues, et donc à repousser toute stray signaux (en raison de la non-IR lumière clignotante). (Cependant, la corrélation n'est pas nécessaire. Il suffit de détecter un nombre minimum de clignotement compte pourrait être un seuil d'acceptation d'entrée capteur.)
4. IR capteurs avec des filtres passe-bande
Vous pouvez trouver spéciale IR capteurs, emballés dans transistor-forme avec trois pistes, qui sont à « l'écoute » des IR lumière modulée fréquences (par exemple, 38 kHz).

Tuned IR capteur de lumière (sensibilité maximale à la lumière 38 kHz modulation)
Circuit passe-bande est contenue dans l'appareil, ainsi que la photo-IR transistors.
Ainsi, le IR LED peuvent généralement être pulsé à une fréquence de 38 kHz afin que le capteur reçoit la lumière et laisser le signal électrique aller au capteur produits.
Pour transmettre de l'information, la lumière de la IR LED peut être interrompu à un taux relativement faible (par exemple, de 1 à 100 fois par seconde). Cette faible fréquence des impulsions est en liaison constante avec la haute fréquence des impulsions, c'est-à-dire, la faible fréquence des impulsions peut être considérée comme la modulation à haute fréquence des impulsions. La haute-fréquence des impulsions est comme un « transporteur vague » sur laquelle les informations du signal (relativement faible modulation de fréquence) est assurée.
Toutefois, je vérifié que les capteurs IR dans le Microsoft Intellimouse n'ont pas cette modulation de filtrage. Toutefois, le circuit ne doit exiger que la lumière IR être modulée en quelque manière que ce soit, en plus de la faible fréquence des interruptions de la lumière par la roue avec des trous.
Le schéma suivant illustre la différence de capteur de signaux pour IR LED constante et lumière clignotante IR LED lumière pour les différentes phases de tourner la molette de la souris.

De sortie du capteur de signaux pour la constante IR cas lumière et la lumière clignote IR cas.
5. Simuler la souris d'entrée en utilisant un ordinateur BASIC Stamp
Le « BASIC Stamp 2 » ordinateur dispose de suffisamment de programmation pour mettre en oeuvre les PS/2 protocole. Par conséquent, la « BASIC Stamp 2 » ordinateur peut être connecté directement au port de PS/2 un ordinateur personnel (PC) et peut PS/2 émuler une souris ou un clavier.
5.1 Le protocole PS/2
Dans les années 1998 par 2003, la majorité des ordinateurs personnels a PS/2 ports de la souris et le clavier.
PS/2 Le port dispose de 4 signaux: (1) CLOCK; (2) DATA; (3) +5V; (4) GROUND.
Le port PS/2 dispositifs permet d'envoyer des données à l'hôte, et l'hôte mai envoyer des données vers les appareils. Toutes les parties sur un port PS/2 (généralement juste et un dispositif d'accueil) doivent partager les signaux et doit détecter si une autre partie est actuellement en utilisant les signaux.
Comment les signaux peuvent être partagées? Un signal (comme CLOCK ou DATA) est généralement élevé « flottant, » ce qui signifie que le signal est connecté à une tension positive à travers une résistance à haute résistance (par exemple, 4 kilo-Ohms). Ainsi, le signal est interprété comme une logique de « haut » par toutes les parties d'écoute. Toute partie peut tirer la ligne faible (par TTL logique) lorsque l'intention d'envoyer des données. Quand une partie se termine l'envoi d'un paquet, il permet de passer des signaux de durée, de sorte qu'ils flottent haut.
Pour envoyer des données depuis un appareil (par exemple, la souris ou clavier) à la (PC) ordinateur personnel, vous devez envoyer des données en 11 bits, composé des éléments suivants bits: (1) bit de démarrage (« 0 »); (2) 8 bits de données (LSB premier); (3) bit de parité (parité « impaire); » (4) bit d'arrêt « (1). » Il est à noter que « la parité » est « étrange » lorsque le nombre total de « 1 » bits dans les bits de données et la parité bit combiné est un nombre impair.
Le schéma suivant illustre la transmission d'un seul paquet de données:

PS/2 protocole: dispositif d'accueillir (PC) sachet
Le DATA ligne doit être réglé sur la juste valeur avant de porter la ligne CLOCK faible. Le DATA valeur devrait rester ensemble jusqu'à la ligne CLOCK est retourné à élevé. CLOCK Lorsque la ligne est confirmée, être élevé, le DATA valeur peut être changé à l'autre peu de valeur.
La vitesse d'horloge typique est relativement lent, environ 10 kHz à 17 kHz. Cela est de 100 microsecondes à 70 microsecondes pour chaque période d'horloge.
Le scénario du pays hôte (PC) l'envoi des données à un dispositif est similaire à l'appareil d'envoi des données à l'hôte, mais dans tous les cas, le dispositif contrôle la CLOCK signal pendant la transmission de données elle-même. Aussi, un bit de données envoyés à partir de l'hôte (dispositif de mise à CLOCK faible) doivent être verrouillées lorsque le dispositif permet à l'CLOCK signal faire une transition vers la haute.
Une recherche sur Internet va révéler de nombreuses descriptions de PS/2 signaux et les détails sur le protocole.
5.2 PS/2 souris paquets de données
Lorsque l'ordinateur démarre, le système d'exploitation démarre et finalement communique avec la souris pour déterminer le type de souris. Par défaut, la souris mai comporter comme une souris générique PS/2. Toutefois, si le système d'exploitation détermine que la souris est en fait un « 3D PS/2 » souris (par exemple, une souris avec une roue), il peut dire la souris pour passer à l'3D PS/2 protocole de souris.
Lorsque vous déplacez la souris, ou appuyez sur la libération ou les boutons de la souris, la souris envoie des données circuits à l'hôte (PC), indiquant l'état de changements ont eu lieu depuis l'état précédent indication.
Le générique PS/2 la souris envoie trois paquets à l'hôte:
------------------------
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
Il est très fréquent de présenter une « 3D PS/2 » souris (par exemple, avec une molette de la souris qui agit également comme un bouton central). Cette souris envoie quatre paquets de données à l'hôte (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 Mon premier circuit pour simuler une souris PS/2
Le schéma suivant a été mon premier travail technique pour obtenir « BASIC Stamp 2 » mon ordinateur pour envoyer des données PS/2 souris à l'hôte (PC).

Schéma de circuit pour permettre la BASIC Stamp ordinateur pour envoyer des paquets PS/2 à l'hôte (PC).
Il est à noter que ce circuit électrique BASIC Stamp isolats de mon ordinateur de l'hôte (PC) ordinateur. Notez également que ce circuit est tout à satisfaire les exigences électriques de PS/2 de transmission de données (du dispositif destiné à l'hôte). Ainsi, je peux envoyer des messages PS/2 clavier en utilisant ce même circuit si je branche le clavier PS/2 port sur l'hôte (PC)!
Après avoir reçu des signaux est généralement non-invasive (c'est-à-dire, ne l'écoute pas interférer avec les signaux électriques), la seule chose nécessaire pour permettre à la « BASIC Stamp » ordinateur pour recevoir la PS/2 CLOCK et DATA signaux est une connexion directe de ces signaux à d'autres BASIC Stamp I/O broches (configuré pour être intrants). J'aimerais essayer une sorte de tampon - mais je ne peut utiliser un opto-isolateur directement, car cela mettrait une charge sur les signaux « flottants » (ce qui leur « naufrage!). » Que je pouvais utiliser la +5V à un pouvoir tampon, puis ensuite utiliser le tampon de sortie de conduire opto-isolateurs qu'en fin de compte, envoyer des signaux à la BASIC Stamp I/O broches (configuré comme intrants).
L'image suivante montre BASIC Stamp 2 mon ordinateur connecté à un circuit correspondant au schéma ci-dessus.

BASIC Stamp 2 ordinateur connecté à un port souris PS/2 via un opto-isolateur circuit.
Le programme BASIC Stamp 2 suivant, écrit dans le langage de programmation PBASIC, a été ma première tentative réussie pour contrôler la souris PS/2 via le BASIC Stamp 2 ordinateur.
Le programme fait simplement le curseur de la souris se déplacer le long d'une petite ligne diagonale.
'====================================================================
'{$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
'====================================================================
Ce programme fonctionne parfaitement. Je laisser fonctionner pendant des heures, et il fait parfaitement le curseur de la souris se déplacer entre deux positions exactes sur l'écran. C'est ce que je cherchais: un contrôle précis de la souris pour que je puisse interagir avec le logiciel.
Après une recherche Internet, j'ai découvert que quelqu'un d'autre BASIC Stamp utilisé un ordinateur à l'interface PS/2 (simulant un clavier). Cette personne a utilisé le PBASIC instruction SHIFTOUT à faire les CLOCK et DATA signaux, ce qui est vraiment grande. Cela rendrait mon sous-« TransmitPacket » beaucoup plus courte, peut-être 5 lignes de code total!
J'ai également vu que d'autres personnes ont utilisé TTL tampons, avec les contributions liées directement à partir de signaux PS/2 (CLOCK et DATA), et les produits liés directement aux broches du microcontrôleur sur puce. Dans le même circuit, lignes de sortie du microcontrôleur est allé directement à la base les pins de transistors qui ont leurs collectionneurs connectés directement à la PS/2 signaux. Tout cela couplage direct de différents circuits semble être une mauvaise idée à moi, un circuit de peur que les autres alevins. Je ne sais pas ce que je faire si je le frit PS/2 port sur mon PC. Acheter une nouvelle carte mère, je suppose! Une excuse pour la mise à niveau. Je ne pense pas que PS/2 un port carte mère fusion est probable, mais je ne l'ai immédiatement l'arrêt de mon ordinateur quand je accidentellement court-circuitée et la +5V signaux GROUND aller au PS/2 souris. Peut-être que c'est une fonctionnalité! Je pourrais ajouter un nouveau bouton de la souris qui vient de courts-circuits pouvoir la souris pour l'instant d'arrêt de la PC. ;-)
Voici le lien pour les informations concernant l'utilisation de SHIFTOUT pour la PS/2 protocole:
Cherchez le lien suivant:
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).
Les employés copie en cache du fichier:
keybtst.zip
10655 octets
MD5: c5667557f96db53fb878bd11bfbe4f74
Le lien suivant fournit de plus amples informations en ce qui concerne l'interface souris PS/2: