PS2 mus og BASIC Stamp datamaskin
Colin Fahey
1. Innledning
Denne artikkelen beskriver hvordan en PS/2 musen kan bli simulert av en BASIC Stamp datamaskinen.
Dette leting er uformell.

Interiøret i en gammel stil (bevegelige ball) mus: "Microsoft Intellimouse" (Jeg byttet ut den optiske sensorer med lange ledninger.)
En mus har to akser: "X" og "Y". Når musen er flyttet "horisontalt," "X" hjulet inne i musen roterer. Når musen er flyttet "vertikalt" (på en overflate), "Y" hjulet inne i musen roterer. For vilkårlig musen bevegelse, "X" og "Y" hjul flytte i henhold til de "horisontale" og "vertikale" komponenter av musen bevegelse.

Optisk interruptor hjul inni musen
Legg merke til hullene i hjulene på innsiden av musen. Når hjulet roterer, Infrarødt (IR) lys slippes ut av en IR Light Emitting Diode (LED) blir avbrutt gjentatte ganger, med en hastighet proporsjonal med frekvensen av hjulet rotasjon. Dermed musen vet hvor mange "trinn" (også kalt "ticks)" musen aksen har beveget seg i en bestemt tidsperiode.
Avgjøre bevegelsesretning involverer bruk av 2 lys sensorer, som ligger svært tett sammen langs en akse parallell til bevegelsen av hjulet. (Begge sensorer er i en enkelt 3-pin komponent vist nedenfor.)

Mus IR lyssensor (har to IR detektorer i én pakke)
Den midterste pin av pakken er positiv kollektor spenning;
Den venstre og høyre pins er venstre og høyre sensor output emitters.
La oss gi navn til to sensorer i pakken "A" og "B". Anta at hjulet er i utgangspunktet på en rotasjon vinkel slik at IR lys er blokkert fra å nå både sensorer.
Som hjulet roterer, IR lys fra emitter vil til slutt kunne passere gjennom et hull i hjulet og nå en av de to sensorer, slik som sensor "A". Hvis hjulet roterende fortsetter i samme retning, til slutt den andre sensoren, "B", vil kunne mottas IR lys. Hvis hjulet roterende fortsetter i samme retning, eventuelt i IR lys vil bli blokkert fra å nå sensor "A". Hvis hjulet roterende fortsetter i samme retning, eventuelt i IR lys vil bli blokkert fra å nå sensor "B".
Dermed sekvensen er:
(A,B): ..., (0,0), (1,0), (1,1), (0,1), ...
Hvis hjulet roterer i motsatt retning, de 4-sekvens vist ovenfor vil bli reversert, fra dagens status.
Med disse to sensor signaler vi kan bestemme prisen for rotasjon, og retning.

The circuit styret for Microsoft Intellimouse
For å forstå mer om hvordan musen krets tolker lys sensorer og kommuniserer med den personlige datamaskinen (PC) (via PS/2 signaler), jeg studerte krets bord.
Den microchip har følgende navn trykt på det: SPCP05A.
Et søk på Internett etter ordet "SPCP05A" indikerer at chip er produsert av et firma som heter "Sunplus Technology Co.". Informasjon om "SPCP05A" microchip kan være kjøpt fra det selskapet.
Her er de tekniske spesifikasjonene av "SPCP05A" microchip:
Følgende bilde viser signaler av pins av "SPCP05A (PS/2 3D mouse)" microchip.

Signaler av pins av "SPCP05A (PS/2 3D mouse)" microchip
Den "SPCP05A" er faktisk en liten datamaskin! Den har en instruksjon sett, og RAM, og ROM, og interne klokker, osv. In fact, beskrivelse av "SPCP05A" microchip på den informasjonen som gis av Sunplus Co. neppe refererer til den konkrete bruken av mikrobrikke for "mus" kretser. Denne chip er en allsidig microcontroller.
Jeg studerte krets spor på krets styret for Microsoft Intellimouse å danne følgende omtrentlige skjematisk:

Omtrentlige skjematisk av Microsoft Intellimouse (Jeg mangler noen få kondensatorer, men dette skjematisk er nesten perfekt.)
Bui Van Chu, i Australia, kan du lese artikkelen min og sendte meg en mer fullstendig skjematisk, som vises i følgende bilde.

Den PS/2 musen skjematisk, sendt til meg av Bui Van Chu fra Australia
Kretsene er svært enkel.
Museknappene (venstre, midten, høyre) gå direkte til innganger på microchip.
De tre parene av lys sensorer, (("X", "Y", "Z"), (horisontal bevegelse, vertikale bevegelse, og midt musehjulet)) sender signaler direkte til andre innganger på brikken.
Den PS/2 signaler DATA og CLK (klokke) også tilsvarer I/O signaler på brikken.
Jeg forsto det skjematisk så snart jeg er ferdig å tegne den (ved å følge spor på circuit board).
En ting jeg ikke forstår i utgangspunktet var måten IR LEDs var koblet til microchip (pin 16: "PB1"), i stedet for sine negative terminaler (Cathode) bare å bli koblet direkte til bakken. Dette er viktig!
2. Mine første forsøk på å styre musen bevegelse
De følgende kommentarer refererer til bevegelse langs en akse (for eksempel "X", eller horisontalt, aksen).
Det første jeg prøvde var å flytte et objekt mellom IR LED og sensor pair - for å simulere virkningen av roterende hjul med musen. Dette arbeidet. Jeg kan føre markøren til å flytte rundt på skjermen ved å bare flytte et hinder gjennom IR lysstråle gjentatte ganger, i samme retning.
Neste Jeg fjernet 3-pin sensor del fra mus krets bord, og koblet ledninger til krets bord i stedet for sensoren. Jeg manuelt koblet til en ledning til positiv spenning for å simulere sensor aktivitet. Jeg koblet de to signaler til makten i henhold til følgende mønster (slik at "0" "representerer," og "1" representerer "på):"
(0,0), (1,0), (1,1), (0,1), ...
Dette arbeidet. Jeg kunne flytte markøren på skjermen ved denne kjedelige tilkobling og frakobling av kabler i mønsteret som vist ovenfor. Reverserte mønster fra den nåværende status i sekvensen ville flytte markøren i motsatt retning.
Fordi det var å gå så bra, jeg bestemte meg for å koble ledninger til reléer (kontrollert av RS-232). Dette vil i hovedsak tillate meg å gjøre akkurat hva jeg gjorde med løse ledninger: koble sensoren signaler til makten terminalen i riktig rekkefølge. Den eneste forskjellen vil være det faktum at det menneskelige (meg) ville ikke gjøre det kjedelige tilkobling og frakobling.
Men ... det fungerte ikke!
Etter mye justering av motstander og kondensatorer, osv. Jeg har gjort en underlig oppdagelse: Hvis jeg var rørende bestemte terminaler i kretsene, det fungerte utmerket! Løsningen på dette mysterium vises i neste avsnitt.
3. Den infra-rødt (IR) lys må være modulated
Etter noen frustrerende forsøk hadde jeg en ny tanke: IR lys kan være pulserende på en høy frekvens, og chip kan forvente å få denne frekvensen. Konstant lys (eller min simulert konstant sensor output) kan bli avvist. Jeg var litt perplexed av det faktum at lys fra omgivelsene av en halogen gulv lampe var akseptabelt, men jeg visste at selv incandescent lamps har detectable modulering.
Jeg prøvde pulserende en IR LED på høy frekvens og blokkerer sensorer i henhold til den forventede mønsteret. Det virket!
Det var det! Den IR LEDs på musen krets styret skal være blinkende i høy hastighet, og microchip må forvente denne blinkende i tillegg til relativt lav sats i lys avbrudd av roterende hjul (med hull).
Ved pulserende den IR LEDs, og venter denne pulserende på en avblokkert sensor output signal, chip kan avvise enhver ambient IR signaler fra forstyrre med musen. For eksempel streif lys fra andre (konstant) IR kilder vil ikke interefere med musen.
Jeg koblet en lyd-forsterker til sensoren utgang, og jeg la sensoren ta i omgivelseslyset cast av mine halogen gulv lampe. Jeg hørte en tydelig tone (60 Hz). Når jeg nedtonet lampen, tonen vokste svak, og til slutt stoppet når lyset ble slått av. Så denne sensoren lett plukker opp 60 Hz modulation i hvitglødende pære av mine halogen gulv lampe!
Ser nå på skjematisk av PS/2 musen krets bord, betydningen av IR LEDs blir koblet til en PIN-kode på mikrobrikke (i stedet for til likestrøm) er åpenbare. Den microchip styrer blinkende av IR LEDs gjennom I/O pin, og microchip kan relatere sin hensikt å blinke med ID LEDs med mottatt sensor innganger, og dermed avvise noen streif signaler (på grunn av ikke-blinkende IR lys). (Men korrelasjon er ikke nødvendig. Simply oppdager et minimum antall blinkende teller kunne være en terskel for å akseptere sensor input.)
4. IR sensorer med Båndpassdesign filtre
Du kan finne spesielle IR sensorer, pakket i transistor-aktig form med tre potensielle kunder, som er "innstilt" til bestemte modulated IR lys frekvenser (f.eks 38 kHz).

Tuned IR lyssensor (maksimum følsomhet for lys 38 kHz modulation)
BÅNDPASSSUBWOOFER krets er inne i enheten, sammen med IR bilde-transistorer.
Så, IR LED kan vanligvis være Pulsed på en frekvens av 38 kHz slik at sensoren får lys og la det elektriske signalet gå til sensor utganger.
Å formidle informasjon, lyset fra IR LED kan bli avbrutt av en relativt lav rente (for eksempel 1-100 ganger per sekund). Dette lavfrekvent pulserende er i forbindelse med en jevn høy frekvens pulserende, dvs. de lavfrekvente pulserende kan betraktes som modulating den høyfrekvente pulserende. Den høyfrekvente pulserende som en "transportør bølge" som informasjonen signal (relativt lav frekvens modulering) er gjennomført.
Men jeg bekreftet at IR sensorer i Microsoft Intellimouse ikke har slike modulation filtrering. Men kretsene gjør at IR lys være modulated på noen måte, i tillegg til de lavfrekvente forstyrrelser i lys av hjulet med hull.
Følgende skisse illustrerer forskjellen i sensoren signaler for konstant IR LED lys og blinkende IR LED lys for de forskjellige faser av musehjulet snu.

Sensor utgangs signaler for den konstante IR lett sak og blinkende lys IR tilfelle.
5. Simulating mus input ved hjelp av en BASIC Stamp datamaskin
Den "BASIC Stamp 2" datamaskinen har tilstrekkelig programmering for å implementere PS/2 protokollen. Derfor er "BASIC Stamp 2" datamaskin kan være koblet direkte til PS/2 porten på en PC (PC) og kan etterligne en PS/2 musen eller tastaturet.
5.1 Den PS/2 protokoll
I år 1998 gjennom 2003, de fleste av personlige datamaskiner hadde PS/2 porter for mus og tastatur.
Den PS/2 port har 4 signaler: (1) CLOCK; (2) DATA; (3) +5V; (4) GROUND.
Den PS/2 port lar enheter for å sende data til verten, og vert kan sende data til enheter. Alle parter på en PS/2 port (vanligvis bare en enhet, og verts) må dele signaler og må oppdage hvis en annen part er for tiden bruker signaler.
Hvordan kan signaler bli delt? Et signal (f.eks CLOCK eller DATA) er vanligvis "flytende" høy, noe som betyr at signalet er koblet til en positiv spenning gjennom en motstand med høy motstand (f.eks 4 kilo-Ohms). Dermed signalet er tolket som en logisk "høy" etter all lytting parter. Enhver part kan trekke linjen lav (via TTL logikk) når partene har til hensikt å sende data. Når en part slutter å sende en pakke, det kan gå av signaler på ubestemt tid, slik at de svever høyt igjen.
For å sende data fra en enhet (for eksempel mus eller tastatur) til den personlige datamaskinen (PC), må du sende data i 11-bits pakker bestående av følgende biter: (1) starte bit ("0"); (2) 8 data bits (LSB først); (3) parity bit "(odd" parity); (4) stop bit "(1)." Vær oppmerksom på at "odde paritet" er når det totale antall "1" bits i data biter og parity bit kombinert er et oddetall.
Følgende diagram illustrerer overføring av en enkelt data informasjonsbrosjyren:

PS/2 protokollen: enheten til å betjene (PC) pakkedata
Den DATA linje skal være satt til riktig verdi før få CLOCK linje lav. Den DATA verdien skal være satt til CLOCK linje returneres tilbake til høy. Når CLOCK er bekreftet å være høy, DATA Verdien kan bli endret til neste bit.
Den typiske klokke hastighet er relativt lav, om 10 kHz til 17 kHz. Det er 100 microseconds ned til 70 microseconds for hver klokke periode.
Scenariet av verten (PC) sende data til en enhet er lik enheten sende data til verten, men i alle tilfeller enheten styrer CLOCK signal i data overføring seg selv. Også en bit data som sendes fra verten (upon enheten innstillingen CLOCK lav) bør latched når enheten lar CLOCK signal foreta en overgang for høy.
Et Internett-søk vil avdekke mange beskrivelser av PS/2 signaler og informasjon om protokollen.
5.2 PS/2 musen data pakker
Når datamaskinen starter opp, operativsystemet starter, og til slutt kommuniserer med musen for å bestemme hvilken type mus. Som standard musen kan fungere som et generisk PS/2 musen. Men hvis operativsystemet avgjør at musen er faktisk en "3D PS/2" mus (for eksempel en mus med et hjul), den kan fortelle musen til å endre til 3D PS/2 musen protokollen.
Når du beveger musen, eller trykker eller utløsning museknappene, musen krets sender data til verten (PC), som indikerer hva staten endringer har skjedd siden forrige staten indikasjon.
Generisk PS/2 musen sender følgende tre pakker til verten:
------------------------
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
Det er veldig vanlig å ha en "3D PS/2" mus (f.eks med musehjulet som også fungerer som en midt-knappen). Slike musen sender fire data-pakker til verten (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 Min første krets for å simulere en PS/2 mus
Følgende skjematisk var mine første arbeider teknikk for å få min "BASIC Stamp 2" datamaskinen til å sende PS/2 musen data til verten (PC).

Skjematisk av krets for å tillate at BASIC Stamp datamaskinen til å sende PS/2 pakker til verten (PC).
Merk at dette krets elektrisk isolater min BASIC Stamp datamaskinen fra verten (PC) datamaskinen. Vær også oppmerksom på at denne kretsen er bare for å tilfredsstille de elektriske kravene i PS/2 data overføring (fra enheten til verten). Dermed kan jeg sende PS/2 tastaturet meldinger ved hjelp av den samme krets hvis jeg kobler til PS/2 tastatur port på verten (PC)!
Siden mottar signaler er vanligvis ikke-invasiv (dvs. lytter ikke forstyrre elektriske signaler), det eneste som kreves for å tillate "BASIC Stamp" datamaskinen til å motta PS/2 CLOCK og DATA signaler er en direkte forbindelse fra de signaler til andre BASIC Stamp I/O pins (konfigurert til å være innganger). Jeg vil prøve noen form for bufring - men jeg definitivt ikke kan bruke en opto-isolator direkte, siden det ville sette en last på "flytende" signaler (og dermed "synker" dem!). Jeg kunne bruke +5V til makten en buffer, og deretter bruke buffer utgang for å drive opto-isolators som til slutt sender signaler til BASIC Stamp I/O pins (konfigurert som inngang).
Følgende bilde viser mitt BASIC Stamp 2 datamaskin som er koblet til en krets som samsvarer med skjematisk ovenfor.

BASIC Stamp 2 datamaskin som er koblet til en PS/2 Mouse Port via en opto-isolator circuit.
Følgende BASIC Stamp 2 program, skrevet i PBASIC programmeringsspråk, var min første vellykkede forsøk på å kontrollere PS/2 musen via BASIC Stamp 2 datamaskinen.
Programmet bare gjør markøren flyttes langs en liten diagonal linje.
'====================================================================
'{$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
'====================================================================
Dette programmet fungerer perfekt. Jeg la det kjøre i timevis, og det feilfritt gjort markøren flytte mellom to eksakte steder på skjermen. Dette er hva jeg var ute etter: presis styring av musen, slik at jeg kan kommunisere med programvare.
Etter søk på Internett oppdaget jeg at noen andre brukte en BASIC Stamp datamaskinen til grensesnittet PS/2 (simulere et tastatur). Denne personen brukte PBASIC instruksjon SHIFTOUT å håndtere CLOCK og DATA signaler, noe som er virkelig stor. Dette vil gjøre mitt "TransmitPacket" subroutine mye kortere, kanskje 5 linjer med kode totalt!
Jeg så også at andre mennesker brukes TTL buffere, med inngang koblet direkte fra PS/2 signaler (CLOCK og DATA), og utganger koblet direkte til pins på microcontroller chip. I samme krets, produksjon linjer fra microcontroller gikk direkte til base pins på transistorer som hadde sine samlere er koblet direkte til PS/2 signaler. Alt dette direkte coupling av ulike kretser ser ut som en dårlig idé til meg, lest en krets yngel den andre. Jeg vet ikke hva jeg vil gjøre hvis jeg stekt den PS/2 port på min PC. Kjøp et nytt hovedkort, I guess! En unnskyldning for å oppgradere. Jeg tror ikke en PS/2 port hovedkort Meltdown er sannsynlig, men jeg gjorde umiddelbart nedleggelse datamaskinen min når jeg tilfeldigvis short-circuited den +5V og GROUND signaler gå til PS/2 musen. Kanskje det er en funksjon! Jeg kan legge til en ny knapp på musen som bare kortslutninger musen makt for umiddelbar nedleggelse av PC. ;-)
Her er link til informasjon om bruk av SHIFTOUT for PS/2 protokollen:
Se etter følgende 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).
Lokalt hurtigbufret kopi av filen:
keybtst.zip
10655 bytes
MD5: c5667557f96db53fb878bd11bfbe4f74
Følgende lenke gir mer informasjon om PS/2 musen tilkopling: