PS2 mus og BASIC Stamp computer
Colin Fahey
1. Indledning
Denne artikel beskriver, hvordan en PS/2 musen kan blive efterlignet af en BASIC Stamp computer.
Denne efterforskning er uformel.

Det indvendige af en gammel stil (flytter bolden) Computermus: "Microsoft Intellimouse" (I erstattes den optiske sensorer med lange tråde.)
En mus har to akser: "X" og "Y". Når musen flyttes "vandret," "X" hjulet inde i musen roterer. Når musen flyttes "vertikalt" (på en flade), "Y" hjulet inde i musen roterer. For vilkårlige musen bevægelse, "X" og "Y" hjul færdes i henhold til den "horisontale" og "vertikale" komponenter af musen bevægelse.

Optisk interruptor hjul inde i musen
Bekendtgørelsens hullerne i hjulene inde i musen. Når hjulet roterer, infraroede (IR) lyset udsendes fra en IR lysdiode (LED) afbrydes gentagne gange, med en hastighed proportional med satsen for hjul rotation. Således musen ved, hvor mange "stigninger" (også kaldet "tæger)" musen akse har bevæget sig i en bestemt tidsperiode.
Fastlæggelse kørselsretningen indebærer anvendelse af 2 lys sensorer, som ligger meget tæt sammen, langs en akse parallel med bevægelsen af hjulet. (Begge sensorer er i en enkelt 3-bens komponent vist nedenfor).

Mouse IR lyssensor (har to IR detektorer i én pakke)
Den midterste ben af pakken er de positive opkøber spænding;
Den venstre og højre ben er det venstre og højre sensor output udledere.
Lad os sætte navn på de to sensorer i pakken "A" og "B". Antag at hjulet er i første omgang på en rotationsvinkel sådan, at IR baggrund er blokeret fra at nå både sensorer.
Som hjulet roterer, IR lys fra emitter sidste ende vil være i stand til at passere gennem et hul i hjulet og nå ud til den ene af de to sensorer, såsom sensor "A". Hvis hjulet fortsætter med roterende i samme retning, eventuelt med den anden sensor, "B", vil kunne modtages IR lys. Hvis hjulet fortsætter med roterende i samme retning, i sidste IR lys vil blive blokeret fra at nå sensor "A". Hvis hjulet fortsætter med roterende i samme retning, i sidste IR lys vil blive blokeret fra at nå sensor "B".
Således er rækkefølgen er:
(A,B): ..., (0,0), (1,0), (1,1), (0,1), ...
Hvis hjulet roterer i den modsatte retning, det 4-sigt sekvensen vist ovenfor, vil blive vendt, der starter fra den aktuelle status.
Med disse to sensor signaler vi kan bestemme antallet af rotation, og den retning.

Kredsløbet bestyrelsen for Microsoft Intellimouse
For at forstå mere om, hvordan musen kredsløb fortolker lys sensorer og kommunikerer med den personlige computer (PC) (via PS/2 signaler), jeg studeret kredsløb.
Mikrochippen har følgende navn trykt på det: SPCP05A.
En søgning på internettet til ordet "SPCP05A" angiver, at chippen er fremstillet af et selskab med navnet "Sunplus Technology Co.". Information om "SPCP05A" mikrochip kan erhverves fra dette selskab.
Her er de tekniske specifikationer for det "SPCP05A" mikrochip:
Følgende billede viser signalerne fra stifter af "SPCP05A (PS/2 3D mouse)" mikrochip.

Signaler af stifter af "SPCP05A (PS/2 3D mouse)" mikrochip
De "SPCP05A" faktisk er en lillebitte computer! Det har en instruktion sæt, og RAM, og ROM, og de interne timere osv. Faktisk er beskrivelsen af "SPCP05A" mikrochip i de oplysninger, som Sunplus Co. næppe henvises til den specifikke brug af mikrochip til "computer-musen" kredsløb. Denne chip er en alsidig mikrokontroller.
Jeg studerede kredsløbet spor på kredsløb af Microsoft Intellimouse at danne følgende omtrentlige skematisk:

Omtrentlig skematisk af Microsoft Intellimouse (Jeg mangler et par kondensatorer, men det skematiske er næsten perfekt.)
Bui Van Chu i Australien, kan du læse min artikel og sendte mig et mere komplet skematisk, som vises i følgende billede.

De PS/2 musen skematisk, sendt til mig ved Bui Van Chu fra Australien
Kredsløbet er meget enkel.
Musen knapper (venstre, midt, højre) sejle direkte til input på mikrochip.
De tre par af lys sensorer, (("X", "Y", "Z"), (horisontal bevægelse, lodret bevægelse, og midt hjulet på musen)) sender signaler direkte til andre input på chippen.
De PS/2 signaler DATA og CLK (ur) også svarer til I/O signaler på chippen.
Jeg forstod det skematiske så snart jeg færdig med at trække det (ved at følge spor på kredsløb).
En ting jeg ikke forstår i første omgang var den måde, hvorpå IR LEDs var forbundet med mikrochip (PIN 16: "PB1"), i stedet for deres negative terminaler (katode) simpelthen er koblet direkte til jorden. Dette er vigtigt!
2. Mit første forsøg på at styre musen bevægelighed
De følgende kommentarer henvise til bevægelse langs en enkelt akse (såsom "X" eller vandret akse).
Det første, jeg forsøgte var at flytte et objekt mellem IR LED og sensoren pair - at simulere virkningen af de roterende hjul med musen. Det fungerede. Jeg kunne forårsage musemarkøren til at flytte rundt på skærmen ved blot at flytte en hindring gennem IR lysstrålen gentagne gange i samme retning.
Dernæst vil jeg fjernet 3-bens sensor del fra muse-kredsløb, og som er fastgjort tråde til kredsløb i stedet for sensoren. Jeg manuelt tilsluttet en ledning til den positive spænding til at simulere sensor aktivitet. Jeg tilsluttede de to signaler til magten efter følgende mønster (sådan, at "0" repræsenterer "off," og "1" udgør "i):"
(0,0), (1,0), (1,1), (0,1), ...
Det fungerede. Jeg kunne bevæge musens markør på skærmen ved denne kedelige tilslutning og afbrydelse af tråde i mønstret vist ovenfor. Bakke mønstret fra den aktuelle status i sekvens ville flytte cursoren i den modsatte retning.
Fordi tingene gik så godt, jeg besluttede at slutte ledninger til relæ (kontrolleret af RS-232). Dette vil hovedsageligt tillade mig at gøre præcis hvad jeg gjorde med løse ledninger: forbinde sensoren signaler til magten terminal i de rigtige rækkefølge. Den eneste forskel vil være det faktum, at mennesker (mig) ville ikke have at gøre det trættende at tilslutte og afbryder.
Men ... det virkede ikke!
Efter en masse om tilpasning af modstande og kondensatorer osv., lavede jeg en mærkelig opdagelse: Hvis jeg var rørende visse terminaler i kredsløbet, det fungerede perfekt! Løsningen på dette mysterium vises i næste afsnit.
3. De infraroede (IR) lyset skal være moduleret
Efter nogle frustrerende forsøg jeg havde en ny tanke: IR lys kan være pulserende på en høj frekvens, og chippen kan forvente at modtage denne frekvens. Konstant lys (eller min simuleret konstant sensor output) kan blive afvist. Jeg blev lidt forvirret af, at den omgivende baggrund af en halogen gulv lampe var acceptabelt, men jeg vidste, at selv glødelamper har påviselige graduering.
Jeg forsøgte pulserende en IR LED ved høje hyppighed og blokere sensorer i henhold til den forventede mønster. Det virkede!
Det var det! De IR LEDs i musen kredsløb skal blinke ved høj hastighed, og mikrochip skal forvente denne blinkende som supplement til de relativt lave lys afbrydelse af roterende hjul (med huller).
Ved pulserende den IR LEDs, og forventer dette pulserende i et fjernet blokeringen af sensor output signal, chippen kan afvise enhver omgivende IR signaler fra interfererende med musen operation. F.eks omstrejfende lys fra andre (konstant) IR kilder vil ikke interefere med musen.
Jeg er tilsluttet en audio-forstærker til sensor output, og så lader jeg sensoren træffe i den omgivende lys afgivet af mine halogen gulv lampe. Jeg hørte et særskilt tone (60 Hz). Når jeg nedtonet lampen, tonen steg svagt, og endelig stoppes, når lyset blev slukket. Så denne sensor let hakke op 60 Hz graduering i de incandescent pære af mine halogen gulv lampe!
Ser man nu på skematisk af PS/2 musen kredsløb, hvilken betydning de IR LEDs at blive tilsluttet et ben på mikrochip (i stedet for til jævnstrøm) er åbenbar. Mikrochippen styrer flashing af IR LEDs gennem I/O ben, og chippen kan korrelere sin hensigt om at blinke de ID LEDs med de modtagne sensor input, og dermed afvise enhver omstrejfende signaler (som følge af ikke-blinkende IR lys). (Men sammenhængen er ikke nødvendig. Blot at opdage et minimum af blinkende tæller kunne være en tærskel for accept af sensor input.)
4. IR sensorer med bandpass filtre
Du kan finde specielle IR sensorer, pakket i transistor-lignende form med tre fører, som er "tunet" til specifikke modulerede IR lyset frekvenser (f.eks 38 kHz).

Tuned IR lyssensor (maksimal følsomhed over for 38 kHz lyset graduering)
BANDPASS kredsløb er indeholdt i den anordning, sammen med IR foto-transistorer.
Så det IR LED kan generelt pulserende med en hyppighed 38 kHz således at sensoren vil modtage lyset, og lad det elektriske signal gå til sensoren udgange.
At viderebringe oplysninger, lys fra IR LED kan afbrydes på et relativt lav (f.eks 1 til 100 gange i sekundet). Denne lavfrekvente pulserende er sammenholdt med den stadige højfrekvente pulserende; dvs. den lavfrekvente pulserende kan betragtes som modulere de højfrekvente pulserende. Den højfrekvente pulserende er som et "luftfartsselskab bølge," som de oplysninger signal (det relativt lav frekvens modulation) er foretaget.
Men jeg kontrolleret, at IR sensorer i Microsoft Intellimouse ikke har en sådan graduering filtrering. Men kredsløbet kræver imidlertid ikke, at IR lyset gradueres på nogle måde, ud over de lavfrekvente afbrydelser af lys ved hjulet med huller.
Følgende skitse illustrerer forskellen i sensor signaler for konstant IR LED lys og blinkende IR LED lys for de forskellige faser af muse-hjulet at dreje.

Sensor output signaler for den konstante IR lyset sagen og blinkende IR lyset sag.
5. Simulerer mus input vha. et BASIC Stamp computer
De "BASIC Stamp 2" computer har tilstrækkelig programmerbarhed at gennemføre PS/2 protokol. Derfor er "BASIC Stamp 2" computer kan tilsluttes direkte til PS/2 havn i en personlig computer (PC) og kan emulere en PS/2 mus eller tastatur.
5.1 De PS/2 protokol
I årene 1998 gennem 2003, størstedelen af personlige computere havde PS/2 porte til mus og tastatur.
De PS/2 havn har 4 signaler: (1) CLOCK; (2) DATA; (3) +5V; (4) GROUND.
De PS/2 port tillader udstyr til at sende data til vært, og værten kan sende data til udstyr. Alle parter på et PS/2 port (typisk kun en enhed og vært) skal dele de signaler, og de skal opdage, hvis en anden part er i øjeblikket ved hjælp af signaler.
Hvordan kan signalerne blive delt? Et signal (såsom CLOCK eller DATA) er normalt "flydende" højt, hvilket betyder, at signalet er forbundet til en positiv spænding gennem en modstand med høj resistens (f.eks 4 kilo-Ohms). Således signalet er fortolket som en logisk "højt" af alle lytter parter. Enhver part kan trække linjen lav (via TTL logik), når den pågældende part har til hensigt at sende data. Når en part er færdig med at sende en pakke, det kan gå af signalerne på ubestemt tid, så de svæver højt igen.
For at sende data fra en enhed (fx mus eller tastatur) til den personlige computer (PC), skal du sende data i 11-bit-pakker, bestående af følgende bits: (1) start bit ("0"); (2) 8 data bit (LSB første); (3) paritet bit "(ulige" paritet); (4) stop bit "(1)." Bemærk, at "ulige paritet" er, når det samlede antal af "1" bit i data bits og paritet bit kombineret er et ulige antal.
Nedenstående diagram illustrerer fremsendelse af en enkelt data pakke:

PS/2 protokol: anordning til at være vært (PC) packet
De DATA linje skal sættes til den korrekte værdi før bringe CLOCK linje lav. De DATA værdi bør fortsat være indstillet indtil CLOCK linje er vendt tilbage tilbage til høj. Når CLOCK linje er bekræftet at være høj, DATA værdi kan ændres til næste bit værdi.
Den typiske clock hastighed er forholdsvis langsom, om 10 kHz til 17 kHz. Det er 100 microseconds ned til 70 microseconds for hver clock periode.
Scenariet i vaertslandet (PC) sende data til en enhed svarer til enheden sender data til værten, men i alle tilfælde enheden kontrollerer CLOCK signal på baggrund af datatransmission selv. Desuden er et data bit sendes fra værten (når enheden indstilling CLOCK lav) bør latched når enheden lader CLOCK signal lave en overgang til høj.
En internet-søgning vil afsløre mange beskrivelser af PS/2 signaler og oplysninger om protokollen.
5.2 PS/2 musen data pakker
Når computeren starter op, operativsystemet starter, og til sidst kommunikerer med musen til at afgøre, hvilken type mus. Som standard musen mai opfører sig som en generisk PS/2 musen. Men hvis operativsystemet vurderer, at musen er faktisk en "3D PS/2" mus (eg, en mus med et hjul), kan det fortælle musen til at skifte til den 3D PS/2 muse-protokol.
Når du flytter musen eller tryk eller frigivelse musens knapper, musen kredsløb sender data til værten (PC), med angivelse af, hvad status er indtruffet ændringer siden den foregående tilstand indikation.
De generiske PS/2 musen sender følgende tre pakker til værten:
------------------------
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 meget almindeligt at have en "3D PS/2" mus (fx med en mus hjulet, der også fungerer som en midterste knap). En sådan musen sender fire data-pakker til værten (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 kredsløb at simulere en PS/2 mus
Følgende skematiske var min første arbejdsdag teknik til at få mit "BASIC Stamp 2" computer til at sende PS/2 musen data til værten (PC).

Skematisk af kredsløb til at tillade BASIC Stamp computer til at sende PS/2 pakker til værten (PC).
Bemærk at dette kredsløb elektrisk isolater min BASIC Stamp computer fra værten (PC) computer. Bemærk også, at dette kredsløb er bare for at tilfredsstille det elektriske krav PS/2 datatransmission (fra enheden til at være vært). Derfor kan jeg sende PS/2 tastatur meddelelser ved hjælp af det samme kredsløb, hvis jeg har sluttet til PS/2 tastatur port på værten (PC)!
Siden modtage signaler er generelt ikke-invasive (dvs. lytter ikke interfererer med elektriske signaler), det eneste, der kræves til at tillade "BASIC Stamp" computer til at modtage PS/2 CLOCK og DATA signaler er en direkte forbindelse fra disse signaler til andre BASIC Stamp I/O stifter (konfigureret til input). Jeg vil forsøge en form for bufferkapacitet - men jeg absolut ikke kan bruge en opto-isolator direkte, eftersom det ville lægge en belastning på "flydende" signaler (og dermed "synker" dem!). Jeg kunne bruge +5V til magten en buffer, så derefter bruge buffer output til drev opto-Isolering, der i sidste ende sender signaler til BASIC Stamp I/O stifter (konfigureret som input).
Følgende billede viser min BASIC Stamp 2 computer tilsluttet et kredsløb matcher skematisk ovenfor.

BASIC Stamp 2 computer tilsluttet et PS/2 mus port via et opto-isolator kredsløb.
Følgende BASIC Stamp 2 program, skrevet i PBASIC programmerings-sprog, var min første vellykkede forsøg på at kontrollere PS/2 musen via BASIC Stamp 2 computer.
Programmet blot gør musen bevæger sig langs en lille 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 program virker perfekt. Jeg lader det køre i timevis, og det fejlfrit gjort musemarkøren bevæge sig mellem to eksakte placering på skærmen. Det er, hvad jeg ledte efter: præcis kontrol med musen, så jeg kan interagere med softwaren.
Efter at søge på internettet jeg opdagede, at en anden brugte en BASIC Stamp computer til grænseflade PS/2 (simulerer et tastatur). Denne person har anvendt de PBASIC instruktion SHIFTOUT til at håndtere CLOCK og DATA signaler, som er virkelig stor. Dette vil gøre mit "TransmitPacket" Funktion meget kortere, måske 5 linjer kode alt!
Jeg så også, at andre mennesker bruges TTL buffere, med indgange tilsluttes direkte fra PS/2 signaler (CLOCK og DATA), og udgange tilsluttes direkte til tapperne på mikrokontroller chip. I samme kredsløb, output linjer fra mikrokontroller gik direkte til basen stifter af transistorer, som havde deres samlere tilsluttes direkte til PS/2 signaler. Alt dette direkte sammenkobling af forskellige kredsløb virker som en dårlig idé til mig, for guds skyld en kredsløb steger den anden. Jeg ved ikke, hvad jeg ville gøre, hvis jeg stegte den PS/2 port på min PC. Køb et nyt bundkort, vil jeg gætte! En undskyldning for at opgradere. Jeg tror ikke, at en PS/2 havn bundkort nedsmeltning er sandsynligt, men jeg gjorde øjeblikkelig lukning min computer, når jeg tilfældigt kort circuited de +5V og GROUND signaler komme til den PS/2 musen. Måske er det en funktion! Jeg kunne tilføje en ny knap med musen, der netop kortslutter musen magt til øjeblikkelig lukning af PC. ;-)
Her er linket til de oplysninger vedrørende anvendelsen af SHIFTOUT for PS/2 protokol:
Kig efter 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 cachet kopi af filen:
keybtst.zip
10655 bytes
MD5: c5667557f96db53fb878bd11bfbe4f74
Følgende link indeholder flere oplysninger om PS/2 musen sammenknytning: