PS2鼠標和BASIC Stamp電腦
Colin Fahey
1. 導言
本文介紹如何在一PS/2鼠標可以效仿一BASIC Stamp電腦。
這種探索是非正式的。

內部的一個舊型(移動球)電腦鼠標: “Microsoft Intellimouse” (我取代光學傳感器長的電線。 )
鼠標有兩條軸線: “X”和“Y” 。 當鼠標移到“水平” , “X”車輪內的鼠標旋轉。 當鼠標移動“垂直” (後表面) , “Y”車輪內的鼠標旋轉。 對於任意的鼠標議案, “X”和“Y”車輪動議根據“橫向”和“縱向”組成部分,鼠標議案。

光學interruptor車輪內的鼠標
通知洞在車輪內的鼠標。 當車輪轉動時,紅外線(IR)輕所排放的一IR發光二極管(LED)中斷多次,在率成正比率車輪旋轉。 因此,鼠標,不知有多少“增量” (也稱為“蜱” )鼠標軸提出了在一個特定時期的。
確定的方向運動,涉及使用2輕型傳感器,位於非常接近,兩者合計,沿一軸平行運動的車輪。 (兩種傳感器是在一個單一的3引腳組成如下所示) 。

鼠標IR光傳感器(有兩個IR探測器在一個單封裝)
該中心的私人密碼的政改方案是積極集電極電壓;
左,右腳是左和右傳感器輸出排放。
讓我們的名稱兩個傳感器在包裝“A”和“B” 。 假設車輪最初是在一個轉角,例如說, IR輕是阻止從深遠的兩種傳感器。
由於車輪轉動, IR光從發射最終將能夠通過一個洞,車輪和達到其中的兩個傳感器,如傳感器“A” 。 如果車輪繼續旋轉,在同一方向,最終第二個傳感器, “B” ,將可收到IR輕。 如果車輪繼續旋轉,在同一方向,最終IR輕將被封鎖,從深遠的傳感器“A” 。 如果車輪繼續旋轉,在同一方向,最終IR輕將被封鎖,從深遠的傳感器“B” 。
因此,序列是:
(A,B): ..., (0,0), (1,0), (1,1), (0,1), ...
如果車輪轉動,在相反的方向, 4 -任期序列如上所示將得到扭轉,從目前的狀況。
與這兩個傳感器信號,我們可以判斷利率的輪換,和方向。

電路板的Microsoft Intellimouse
要了解更多關於如何鼠標電路解釋輕型傳感器和溝通,與個人電腦(PC) (經PS/2信號) ,我研究了電路板。
該芯片具有以下名稱印後: SPCP05A 。
搜索互聯網一詞“SPCP05A”表明,該芯片是製造由一間公司名為“Sunplus Technology Co.” 。 有關“SPCP05A”芯片能夠獲取從該公司。
這裡是技術規格的“SPCP05A”芯片:
以下圖片顯示的信號管腳的“SPCP05A (PS/2 3D mouse)”芯片。

信號管腳的芯片“SPCP05A (PS/2 3D mouse)”
該“SPCP05A”其實是一個微型電腦! 它有一個指令集,和RAM , ROM ,和內部定時器,等等。 事實上,在說明該“SPCP05A”芯片在所提供的資料, Sunplus Co.幾乎是指以特定用途的芯片為“電腦鼠標”電路。 這種芯片是一種多功能的微控制器。
我學電路的痕跡,對電路板的Microsoft Intellimouse形成以下近似示意圖:

近似示意圖的Microsoft Intellimouse (我失踪數電容器,但這個方案幾乎是完美的) 。
Bui Van Chu ,在澳大利亞,讀我的文章,並寄給我的一個較完整的示意圖,它會出現在以下的形象。

該PS/2鼠標的示意圖,給我的Bui Van Chu來自澳洲
該電路是很簡單的。
鼠標按鍵(左,中,右)直接轉到的投入芯片。
該3雙光傳感器, ( ( “X” , “Y” , “Z” ) , (水平運動,垂直運動,和中東鼠標滾輪) )發出信號,直接向其他投入,在芯片上。
該PS/2信號DATA和CLK ( 24小時)也對應I/O信號在芯片上。
我理解的示意圖,盡快制定我完成它(以下痕跡,對電路板) 。
一件事,我不明白是最初的方式IR LEDs被連接到微芯片(引腳16 : “PB1” ) ,而非其負面影響碼頭(陰極)只是被直接連接到地面。 這是很重要的!
2. 我第一次試圖控制鼠標移動
以下評論指的議案,沿一個單一的軸(如“X” ,或橫向,軸) 。
第一件事,我試圖移動一個對象之間的IR LED和傳感器對-模擬的效果旋轉車輪內的鼠標。 這個工作。 我可以造成鼠標光標走動屏幕上,只需移動的障礙,通過IR光束反复,在相同的方向。
接下來,我刪除了3引腳傳感器的一部分,從小鼠電路板,並附帶以電線電路板在的地方,該傳感器的。 我手動連接電線,以積極的電壓來模擬傳感器的活動。 i連接兩個信號的權力,按照下列方式(如說, “0”代表“富裕” , “1”代表“對” ) :
(0,0), (1,0), (1,1), (0,1), ...
這個工作。 我可以移動鼠標光標在屏幕上,由這繁瑣的連接和斷開的電線在模式上面顯示的。 扭轉格局,從目前的狀況序列,將光標移動在相反的方向。
因為事情去這麼好,我決定要連接電線,以繼電器(控制RS-232 ) 。 這將基本上是讓我做的正是我所做的與鬆散的電線:連接傳感器的信號,電力終端在適當的序列。 唯一的區別將是一個事實,即人類(我)不會有這樣做的繁瑣連接與斷開。
但是… … 它沒有工作 !
經過了很多調整,電阻和電容器等,我作出了一個奇怪的發現:如果我是感人的某些碼頭的電路,它的工作絕對! 解決這個神秘的出現在下一節。
3. 紅外線(IR)輕,必須調製
之後,一些令人沮喪的實驗,我有一個新思路: IR光脈衝可能在一個較高的頻率,以及芯片可能會期望能獲得這個頻率。 恆光(或我的模擬常數傳感器輸出)可能會被拒絕。 我感到有些困惑的事實,即環境光線的一個鹵素落地燈是可以接受的,但我知道,即使是白熾燈有可探測的調製。
我曾嘗試脈動一IR LED在高頻率和封鎖傳感器根據預期的格局。 它的工作!
這是它! 該IR LEDs在鼠標電路板必須閃動高速,芯片必須預期這個閃動在除了相對較低的利率輕中斷由旋轉輪(洞) 。
由脈衝該IR LEDs ,並期待這個脈衝在一個暢通傳感器的輸出信號,該芯片可以拒絕任何環境IR信號干擾鼠標操作。 舉例來說,雜散光從其他(常數) IR來源將不會interefere與鼠標。
i連接一音頻放大器,以傳感器輸出,然後我讓傳感器採取在空氣中輕投我的鹵素落地燈。 我聽到一個獨特的語氣(60 Hz) 。 當我暗淡的燈,語氣增長微弱,終於停止時,輕脫落。 因此,該傳感器很容易拿起了60 Hz調製,在白熾燈的燈泡我的鹵素落地燈!
看,現在,在示意圖的PS/2鼠標電路板,意義的認識IR LEDs被連接到一個PIN就芯片(而不是向直流)是顯而易見的。 該微芯片控制閃動的IR LEDs通過I/O針,以及芯片可以關聯,它打算快閃ID LEDs與收到的傳感器的投入,從而拒絕任何雜散信號(因非閃動IR輕) 。 (不過,相關性是沒有必要的。只需檢測的最低數目閃動計數可能是一個門檻,接受傳感器輸入) 。
4. IR傳感器與帶通濾波器
你可以找到特別IR傳感器,裝在晶體管樣的形式與三線索,正在“調整,”以具體的調製IR光的頻率(例如, 38 kHz ) 。

調諧IR光傳感器(最高的敏感性38 kHz光調製)
帶電路是包含在設備,隨IR光晶體管。
因此, IR LED一般都可以在一個脈衝的頻率38 kHz ,使傳感器將接收到輕,讓電信號到傳感器的產出。
傳達信息,輕從IR LED可以被打斷,在相對低的利率(例如,第1到100倍,每秒) 。 這低頻脈衝是在與穩定的高頻率脈衝;也就是說,低頻脈衝,可被視為調節高頻率的脈動。 高頻率脈衝是像一個“載波”後,該信息信號(相對較低的頻率調製)進行。
不過,我驗證了該IR傳感器,在Microsoft Intellimouse 沒有這樣的調製過濾。 然而,電路是否要求該IR光調製以某種方式中,除了低頻干擾輕,由車輪與漏洞。
以下示意圖顯示了不同的傳感器信號不斷IR LED輕和閃動IR LED輕為不同階段的鼠標滾輪轉折。

傳感器的輸出信號為常數IR輕案和閃動IR輕的情況。
5. 模擬鼠標輸入使用BASIC Stamp電腦
該“BASIC Stamp 2”電腦有足夠的可編程落實PS/2議定書。 因此, “BASIC Stamp 2”電腦可以直接連接到PS/2港口一台個人電腦(PC)和可以學習一PS/2滑鼠或鍵盤。
5.1 該議定書PS/2
在未來幾年1998通過2003 ,大部分的個人電腦已PS/2港口為鼠標和鍵盤。
該PS/2港口有4個信號: (1) CLOCK ; (2) DATA ; (3) +5V ; (4) GROUND 。
該PS/2港口允許設備將數據發送到主機,與東道國可能將資料傳送到設備。 各方對一PS/2港口(通常只是一個設備和主機)必須分擔信號必須檢測,如果另一方是目前使用的信號。
又如何能信號共享? 一個信號(如CLOCK或DATA )通常是“浮動”高,即信號是連接到一個積極的電壓通過一個電阻與高電阻(例如, 4 kilo-Ohms ) 。 因此,信號被解釋為是一個邏輯“高” ,所有聽各方。 任何一方可以拉動線低(經TTL邏輯)當黨打算發送數據。 當一個黨的完成傳送的數據包,它可以讓去的信號無限期,所以他們浮法高。
發送數據從一個設備(如,鼠標或鍵盤)的個人電腦(PC) ,您必須發送數據,在11位的數據包,構成了下列位: (1)起始位(“0”) ; (2) 8個數據位( LSB第一) ; (3)奇偶位( “奇數”平價) ; (4)停止位( “1” ) 。 請注意, “多”是“平價”時的總人數為“1”位,在數據位和奇偶校驗位組合是單數。
下面的圖表說明,傳輸一個單一的數據包:

PS/2協議:設備主機的數據包(PC)
該DATA線應設置適當的價值之前,使CLOCK線低。 該DATA價值應繼續設置,直到CLOCK線是返回到高。 當CLOCK線是被證實為高, DATA價值可以加以變更,以便在未來位元值。
典型的時鐘速度是相對緩慢,約10 kHz ,以17 kHz 。 這是100微秒到70微秒為每個時鐘週期。
劇本的東道國(PC)將數據發送到一個設備是類似的設備將數據發送到主機,但在所有情況下該裝置控制CLOCK信號在數據傳輸本身。 此外, 1位數據發送由主機(當裝置設置CLOCK低)應鎖存時,該裝置可讓CLOCK信號,使過渡到高。
互聯網搜索就會發現很多的描述, PS/2信號和細節,有關議定書。
5.2 PS/2鼠標的數據包
當電腦開機時,作業系統啟動,並最終溝通與鼠標,以確定類型的鼠標。 默認情況下,鼠標可能會像通用PS/2鼠標。 不過,如果作業系統確定該鼠標其實是一個“3D PS/2”鼠標(例如,鼠標與車輪) ,它可以告訴鼠標更改到3D PS/2鼠標議定書。
當您移動鼠標,或按下或釋放鼠標按鍵,鼠標電路傳送數據到主機(PC) ,顯示處於何種狀態發生了變化,因為以前的狀態顯示。
通用PS/2鼠標發送以下三個包到主機:
------------------------
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
這是非常常見的有“3D PS/2”鼠標(例如,一個鼠標滾輪也作為一個中間按鈕) 。 這種鼠標發送的數據包, 4向東道國(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 我的第一電路模擬PS/2鼠標
以下示意圖是我第一次工作的技術讓我“BASIC Stamp 2”計算機發送PS/2鼠標數據傳送到主機(PC) 。

示意圖電路,讓BASIC Stamp計算機發送PS/2包到主機(PC) 。
請注意,此電路電氣株我BASIC Stamp電腦從主機(PC)電腦。 也請注意,此電路只是為了滿足電氣要求PS/2數據傳輸(從設備到主機) 。 因此,我可以發送PS/2 鍵盤郵件使用此同一電路插件,如果我在向PS/2鍵盤端口上,東道國(PC) !
由於接收的信號是一般的非侵入性(即,聽不干預電信號) ,只需要讓“BASIC Stamp”計算機接收PS/2 CLOCK和DATA信號是一個直接連接,從這些信號的其他BASIC Stamp I/O銷(設定為投入) 。 我要嘗試一些種緩衝-但我肯定不能使用的光電隔離器直接,因為這將提出一個負荷對浮“動信”號(因此下“沉了” ! ) 。 我可以使用+5V權力的一個緩衝區,然後,然後使用緩衝區輸出到驅動器光電隔離器,最終發出信號,向BASIC Stamp I/O引腳(配置為投入) 。
以下圖片顯示我BASIC Stamp 2計算機連接到電路匹配的示意圖以上。

BASIC Stamp 2電腦連接到一個PS/2鼠標端口通過光電隔離電路。
以下BASIC Stamp 2程序,書面,在PBASIC編程語言,是我第一次成功的嘗試,以控制PS/2小鼠經BASIC Stamp 2電腦。
該程序簡單,使鼠標光標移動沿一個小對角線。
'====================================================================
'{$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
'====================================================================
這項計劃的工程完全。 我讓,它運行時,它完美地作出了鼠標光標移動間的確切位置在屏幕上。 這是我一直在尋找:精確控制鼠標,使我可以互動軟件。
搜索後,在互聯網上我發現別人用了BASIC Stamp計算機接口PS/2 (模擬鍵盤) 。 此人用PBASIC指示SHIFTOUT處理CLOCK和DATA信號,這是真正的偉大。 這將使我“TransmitPacket”子程序短得多,或許5行代碼,總!
我也看到其他人使用TTL緩衝器,與投入的直接連接,從PS/2信號( CLOCK和DATA ) ,和產出直接連接到插針,微控制器芯片。 在同一電路,輸出線從微控制器直接進入該基地插針,晶體管,其中有他們的收藏家直接連接到PS/2信號。 所有這一切的直接耦合不同的電路好像一個壞主意給我,否則一電路南聯盟其他。 我不知道我想要做的,如果我油炸該PS/2港口對我PC 。 購買一台新的主板,我猜! 藉口升級。 我不認為PS/2港口主板崩潰可能,但我並即刻關機我的電腦時,我不小心短路了+5V和GROUND信號到PS/2鼠標。 也許,這是一個功能! 我可以添加一個新的按鈕,鼠標剛剛短路鼠標的權力進行即時關機的PC 。 ;-)
這裡的鏈接信息關於使用SHIFTOUT為PS/2協議:
尋找以下鏈接:
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).
本地緩存文件的副本:
keybtst.zip
10655 字節
MD5: c5667557f96db53fb878bd11bfbe4f74
以下鏈接提供更多信息,就PS/2鼠標接口: