PS2 mus och BASIC Stamp dator
Colin Fahey
1. Inledning
Denna artikel beskriver hur en PS/2 musen kan avtryck i BASIC Stamp dator.
Denna undersökning är informella.

Interiören i en gammaldags (flyttar bollen) av musen: ”Microsoft Intellimouse” (Jag ersatte optiska sensorer med långa trådar.)
En mus har två huvudinriktningar: ”X” och ”Y”. När musen flyttas ”horisontellt,” ”X” hjul inuti musen roterar. När musen flyttas ”vertikalt” (på en yta), ”Y” hjul inuti musen roterar. För godtyckliga musen rörelse, ”X” och ”Y” hjul flytta enligt den ”horisontella” och ”vertikala” komponenter av musen rörelse.

Optisk interruptor hjul inuti musen
Kallelse hålen i hjulen inuti musen. När hjulet roterar, det infraröda (IR) utsända ljuset från en IR Light Emitting Diode (LED) avbrutits flera gånger, med en hastighet proportionell mot andelen hjulet roterar. Således musen vet hur många ”höjningar” (kallas även ”fästingar)” musen axel har gått in för en viss tidsperiod.
Fastställande rörelsens riktning förutsätter användning av 2 ljussensorer, som ligger mycket nära tillsammans, längs en axel som är parallell med förflyttningen av hjulet. (Både sensorer är i en enda 3-pin komponent visas nedan.)

Mouse IR ljussensor (har två IR detektorer i ett enda paket)
Den center pin av paketet är den positiva insamlare spänning;
Den vänstra och högra stiften är höger och vänster sensor output utsläppskällor.
Låt oss namnge två sensorer i paketet ”A” och ”B”. Antag att hjulet är först vid en rotation vinkeln sådan att IR ljuset blockeras från att nå både sensorer.
När hjulet roterar, IR ljuset från de släpper ut så småningom kommer att kunna passera genom ett hål i hjulet och nå en av de två sensorer, exempelvis sensorer ”A”. Om hjulet fortsätter att rotera i samma riktning, så småningom den andra sensorn, ”B”, kommer att kunna mottas IR ljus. Om hjulet fortsätter att rotera i samma riktning, så småningom IR ljus kommer att blockeras från att nå sensorn ”A”. Om hjulet fortsätter att rotera i samma riktning, så småningom IR ljus kommer att blockeras från att nå sensorn ”B”.
Det sekvens är:
(A,B): ..., (0,0), (1,0), (1,1), (0,1), ...
Om hjulet roterar i motsatt riktning, 4-term sekvens visas ovan kommer att vändas, från nuvarande status.
Med dessa två sensor signaler vi kan avgöra varvtal och riktning.

Det kretskort i Microsoft Intellimouse
För att förstå mer om hur musen kretssystem tolkar ljussensorer och kommunicerar med persondator (PC) (via PS/2 signaler) har jag studerat kretskort.
Mikrochipet har följande namn tryckt på det: SPCP05A.
En sökning på Internet för "”SPCP05A” indikerar att chippet är tillverkade av ett företag som heter ”Sunplus Technology Co.”. Information om ”SPCP05A” mikrochip kan förvärvas från bolaget.
Här är de tekniska specifikationerna för ”SPCP05A” mikrochip:
Följande bild visar signalerna av stiften i ”SPCP05A (PS/2 3D mouse)” mikrochip.

Signaler av stiften i ”SPCP05A (PS/2 3D mouse)” mikrochip
Den ”SPCP05A” är egentligen en liten dator! Den har en instruktion uppsättning och RAM och ROM och inre timers etc. Faktum är att beskrivningen av ”SPCP05A” mikrochip i den information som Sunplus Co. knappt hänvisar till den specifika användningen av mikrochip till ”datorn musen” kretsar. Detta chip är en mångsidig mikrokontroller.
Jag har studerat banan spår på kretskort av Microsoft Intellimouse att bilda ungefär följande schema:

Ungefärligt schema för Microsoft Intellimouse (Jag saknar ett par kondensatorer, men detta schema är nästan perfekt.)
Bui Van Chu, i Australien, läs min artikel och skickade mig en mer komplett schema som visas i följande bild.

Den PS/2 musen schematisk, skickat till mig av Bui Van Chu från Australien
Kretsen är mycket enkel.
Musens knappar (vänster, mitten, höger) gå direkt till ingångarna på den mikrochip.
De tre par ljussensorer, ((”X”, ”Y”, ”Z”), (horisontell rörelse, vertikala rörelse, och mitt mushjulet)) skickar signaler direkt till andra insatsvaror på chipet.
Den PS/2 signaler DATA och CLK (klocka) också motsvara I/O signaler på chipet.
Jag förstod den schematiska så snart jag färdig ritning det (genom att följa spåren på kretskort).
En sak som jag inte omedelbart förstår var hur IR LEDs var anslutna till mikrochip (stifts 16: ”PB1”), i stället för deras negativa terminaler (katod) helt enkelt vara ansluten direkt till marken. Detta är viktigt!
2. Mitt första försök att kontrollera musrörelse
De följande kommentarerna avser rörelse längs en axel (såsom ”X”, eller horisontellt, axel).
Det första jag försökte var att flytta ett objekt mellan IR LED och sensorn pair - för att simulera effekten av det roterande hjulet på musen. Det fungerade. Jag skulle kunna orsaka muspekaren för att flytta runt på skärmen genom att helt enkelt flytta ett hinder genom IR ljusstråle upprepade gånger, i samma riktning.
Nästa jag tagit bort 3-pin sensor del från musen kretskort, och bifogade sladdar till kretskort i stället för sensorn. Jag manuellt kopplade en kabel till positiv spänning att simulera sensor verksamhet. Jag kopplade de två signaler till makten enligt följande mönster (sådana som ”0” är ”släckt” och ”1” representerar ”den):”
(0,0), (1,0), (1,1), (0,1), ...
Det fungerade. Jag skulle kunna flytta pekaren på skärmen genom denna tråkiga Ansluta och koppla trådar i det mönster som visas ovan. Att vända mönstret från nuvarande status i sekvensen skulle flytta markören i motsatt riktning.
Eftersom saker och ting gick så bra, jag beslutat att ansluta sladdar till reläer (som kontrolleras av RS-232). Detta skulle i huvudsak tillåter mig att göra precis vad jag gjorde med lös tråd: Anslut sensorn signaler till makten terminal i lämplig ordningsföljd. Den enda skillnaden skulle vara det faktum att människor (mig) skulle inte göra det tråkiga Ansluta och koppla.
Men ... det inte fungerat!
Efter en hel del anpassning av motstånd och kondensatorer, etc, jag gjorde en underlig upptäckt: Om jag tog i vissa terminaler i banan, det fungerade perfekt! Lösningen på detta mysterium visas i nästa avsnitt.
3. Den infraröda (IR) ljus måste justeras
Efter några frustrerande experiment hade jag en ny tanke: Den IR ljus kan vara pulserande på en hög frekvens, och chippet kan räkna med att få denna frekvens. Konstant ljus (eller min simulerade konstant sensor output) kan komma att avvisas. Jag blev något förbryllad av att den omgivande ljuset av en halogen golv lampa var acceptabelt, men jag visste att även glödlampor har detekterbara modulering.
Jag försökte pulserande en IR LED vid hög frekvens och blockerar sensorerna enligt det förväntade mönstret. Det fungerade!
Det var det! Den IR LEDs i musen kretskort måste blinka i hög hastighet, och mikrochip måste räkna detta som blinkar i tillägg till de relativt låga ljuset avbrott av roterande hjul (med hål).
Genom pulserande den IR LEDs, och väntar sig att pulserande i ett tog bort blockering sensor utsignal, chipet kan avvisa varje ambient IR signaler från störande med musen operation. Exempelvis Stray light från andra (konstant) IR källor kommer inte interefere med musen.
Jag kopplade en ljud-förstärkare till sensor output, och sedan jag låta sensorn fatta i den omgivande belysning av min halogenlampor ordet lampa. Jag hörde en avgränsad tonen (60 Hz). När jag nedtonade lyktan tonen växte svag, och slutligen stannade när ljuset var avstängd. Så här sensorn lätt fångar upp 60 Hz modulering i glödlampa av mina halogenlampor golv lampa!
Söker, nu, i den schematiska av PS/2 musen kretskort, betydelsen av IR LEDs att vara ansluten till ett stift på chipset (i stället för till likström) är uppenbart. Mikroprocessorn kontrollerar den blinkande av IR LEDs genom I/O stift, och mikrochip kan koppla sin avsikt att blinka de ID LEDs med mottagits sensor ingångar, och därmed avvisa alla kringströvande signaler (på grund av icke-blinkande IR ljus). (Men sambandet är inte nödvändigt. Simply upptäcka ett minsta antal blinkande räknas skulle kunna vara en tröskel för att acceptera larmingång.)
4. IR sensorer med bandpass filter
Du hittar speciella IR sensorer, förpackad i transistor-liknande form med tre leder, som är ”anpassad efter” specifika modulerade IR ljus frekvenser (t.ex. 38 kHz).

Tuned IR ljussensor (maximal känslighet för 38 kHz ljus modulering)
Bandpass kretssystem finns inom enheten, tillsammans med IR foto-transistorer.
Så, det IR LED allmänhet kan pulsade med en frekvens av 38 kHz så att sensorn kommer att få ljuset och låt den elektriska signal gå till sensorn utgångar.
Att förmedla information, ljuset från IR LED kan avbrytas på en relativt låg ränta (t.ex. 1 till 100 gånger per sekund). Detta lågfrekvent pulserande är jämförd med stadig hög frekvens pulserande, alltså den lågfrekvent pulserande kan betraktas som modulera den högfrekventa pulserande. De högfrekventa pulserande är som en ”bärvåg” på vilken information signal (den relativt låga frekvensmodulering) är genomförda.
Men jag kontrollerat att IR sensorer i Microsoft Intellimouse inte har sådan modulering filtrering. Men banan har kräva att IR ljus anpassas på något sätt, förutom de lågfrekventa avbrott i ljuset av hjulet med hål.
Följande skiss illustrerar skillnaden i sensor signaler för konstant IR LED ljus och blinkande IR LED ljus för de olika faserna av musen hjulet.

Sensor utgångssignaler för konstant IR ljus fallet och blinkande IR lätta fall.
5. Simulering av musen ingång med hjälp av en BASIC Stamp dator
Den ”BASIC Stamp 2” dator har tillräckligt med programmerbarhet att genomföra PS/2 protokollet. Därför är ”BASIC Stamp 2” datorer kan anslutas direkt till PS/2 porten på en persondator (PC) och kan emulera en PS/2 musen eller tangentbordet.
5.1 Den PS/2 protokoll
Under åren 1998 genom 2003, de flesta persondatorer hade PS/2 portar för mus och tangentbord.
Den PS/2 hamn har 4 signaler: (1) CLOCK; (2) DATA; (3) +5V; (4) GROUND.
Den PS/2 hamn medger anordningar för att skicka data till värden, och den mottagande kan skicka data till enheter. Alla parter i en PS/2 port (vanligtvis bara en apparat och värdlandet) måste dela de signaler och måste upptäcka om en annan part för närvarande med hjälp av signaler.
Hur kan signalerna fördelas? En signal (exempelvis CLOCK eller DATA) är vanligen ”flytande” hög, vilket innebär att signalen är ansluten till en positiv spänning genom ett motstånd med hög motståndskraft (t.ex. 4 kilo-Ohms). Således signalen tolkas som en logisk ”hög” av alla lyssnar man. En part kan dra linjen låg (via TTL logik) då de avser att skicka data. När ett parti slutar att skicka ett paket, det kan gå på de signaler på obestämd tid, så de sväva högt igen.
För att skicka data från en enhet (t.ex. musen eller tangentbordet) till persondator (PC) måste du sända data i 11-bitars paket, som består av följande bitar: (1) börja lite (”0”); (2) 8 databitar (LSB först); (3) paritetsbit ”(udda” paritet); (4) stop bit ”(1).” Observera att ”udda paritet” är när det totala antalet ”1-bitar” i databitar och paritetsbit kombination är ett udda tal.
Följande tabell visar överföring av en enda datapaket:

PS/2 protokollet: anordning som värd (PC) packet
Den DATA linje ska vara inställd på ett korrekt värde före föra CLOCK linje låg. Den DATA värde bör förbli som tills CLOCK linje returneras tillbaka till hög. När CLOCK linje bekräftas att vara hög, DATA värdet kan ändras till nästa bit värde.
Den typiska klockhastighet är relativt långsam, ca 10 kHz att 17 kHz. Det är 100 mikrosekunder ned till 70 mikrosekunder för varje klocka.
Scenariot i värdlandet (PC) skicka data till en anordning som liknar den enhet att skicka data till värden, men i alla fall att enheten kontrollerar CLOCK signal under dataöverföring. Även en bit data som skickas från värdlandet (vid enheten inställningen CLOCK låg) bör vara låst när enheten låter CLOCK signal göra en övergång till hög.
En Internet-sökning kommer att avslöja många beskrivningar av PS/2 signaler och information om protokollet.
5.2 PS/2 musen datapaket
När datorn startar upp, operativsystemet startar och eventuellt kommunicerar med musen för att avgöra vilken typ av mus. Som standard musen maj bete sig som en generisk PS/2 musen. Men om operativsystemet bestämmer att musen är egentligen en ”3D PS/2” musen (t.ex. en mus med ett hjul), kan berätta musen för att ändra till 3D PS/2 musen protokollet.
När du flyttar musen eller trycker eller release musknappar, musen kretssystem skickar data till den mottagande (PC) om vilka statliga förändringar har skett sedan tidigare tillstånd beteckning.
Den generiska PS/2 musen skickar följande tre paket till värden:
------------------------
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 är mycket vanligt att ha en ”3D PS/2” musen (t.ex. med mushjulet som också fungerar som en mitten-knappen). En sådan musen skickar fyra datapaket till den mottagande (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örsta krets för att simulera en PS/2 musen
Följande schematiska var min första arbetsdag teknik för att få min ”BASIC Stamp 2” dator för att skicka PS/2 musen uppgifter till värdlandet (PC).

Schematisk av banan att tillåta BASIC Stamp dator för att skicka PS/2 paket till värdlandet (PC).
Observera att denna krets elektriskt isolat min BASIC Stamp dator från värdlandet (PC) dator. Observera också att denna krets är bara att uppfylla de elektriska kraven i PS/2 dataöverföring (från enhet till värd). Alltså, jag kan skicka PS/2 tangentbord meddelanden med samma krets om jag kopplar in till PS/2 tangentbord porten på den mottagande (PC)!
Sedan tar emot signaler är i allmänhet icke-invasiv (dvs lyssnar inte störa elektriska signaler), det enda som krävs för att kunna ”BASIC Stamp” dator för att få PS/2 CLOCK och DATA signaler är en direkt anslutning från dessa signaler till andra BASIC Stamp I/O stift (konfigureras till att insatsvaror). Jag vill prova något slags buffert - men jag definitivt inte kan använda en optisk-isolator direkt, eftersom det skulle lägga en belastning på ”flytande” signaler (alltså ”förlisning” dem!). Jag skulle kunna använda +5V till makten en buffert, så använd sedan buffert produktionen att köra optisk-anordningar som i slutändan skickar signaler till BASIC Stamp I/O pins (konfigureras som ingångar).
Följande bild visar min BASIC Stamp 2 dator ansluten till en krets som matchar de schematiska ovan.

BASIC Stamp 2 dator ansluten till ett PS/2 musen port via en optisk-isolator krets.
Följande BASIC Stamp 2 program, skrivna i PBASIC programmeringsspråk, var min första lyckade försök att kontrollera PS/2 mus via BASIC Stamp 2 dator.
Programmet helt enkelt gör på muspekaren flyttas längs 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
'====================================================================
Detta program fungerar perfekt. Jag låter det köra i timmar, och det felfritt gjorts på muspekaren flyttas mellan två exakta platser på skärmen. Detta är vad jag letade efter: exakt kontroll av musen så att jag kan interagera med programvaran.
Efter att söka på Internet upptäckte jag att någon annan använt en BASIC Stamp dator till gränssnittet PS/2 (simulerar ett tangentbord). Denna person använde PBASIC instruktion SHIFTOUT att hantera CLOCK och DATA signaler, vilket är riktigt bra. Detta skulle göra mitt ”TransmitPacket” subrutin mycket kortare, kanske 5 rader kod totalt!
Jag såg också att andra människor används TTL buffertar, med ingångar anslutas direkt från PS/2 signaler (CLOCK och DATA) och utgångar är anslutna direkt till stiften på mikrokontroller chip. I samma krets, produktion linjer från mikrokontroller gick direkt till grund stift transistorer som hade sina samlare anslutas direkt till PS/2 signaler. Allt detta direkta kopplingar av olika kretsar verkar vara en dålig idé för mig, att inte en krets stek den andra. Jag vet inte vad jag skulle göra om jag stekt det PS/2 porten på min PC. Köp ett nytt moderkort, I guess! En ursäkt för att uppgradera. Jag tror inte ett PS/2 hamn moderkort meltdown är troligt, men jag gjorde direkt avstängning min dator när jag av misstag på kort circuited den +5V och GROUND signaler går till PS/2 musen. Kanske det är en funktion! Jag skulle kunna lägga till en ny knapp med musen som bara kort-kretsar musen makt för omedelbar stängning av PC. ;-)
Här är länken till information om användning av SHIFTOUT för PS/2 protokollet:
Leta efter följande länk:
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 cachad kopia av filen:
keybtst.zip
10655 bytes
MD5: c5667557f96db53fb878bd11bfbe4f74
Följande länk ger mer information om PS/2 musen gränssnitt: