English  Español  Português  Français  Italiano  Deutsch  Nederlands  Svenska  Dansk  Suomi  Norsk  Русский  Polski  Română  Български  Hrvatski  Česky  中国  中國  日本語  한국어  Ελληνική  हिन्दी  العربية 
PS2鼠標和BASIC Stamp電腦
Colin Fahey

1. 導言

本文介紹如何在一PS/2鼠標可以效仿一BASIC Stamp電腦。 

這種探索是非正式的。 
ps2_mouse_interior.jpg
內部的一個舊型(移動球)電腦鼠標: “Microsoft Intellimouse”  (我取代光學傳感器長的電線。 )
鼠標有兩條軸線: “X”和“Y” 。  當鼠標移到“水平” , “X”車輪內的鼠標旋轉。  當鼠標移動“垂直” (後表面) , “Y”車輪內的鼠標旋轉。  對於任意的鼠標議案, “X”和“Y”車輪動議根據“橫向”和“縱向”組成部分,鼠標議案。 
ps2_mouse_interruptor_wheels.jpg
光學interruptor車輪內的鼠標
通知洞在車輪內的鼠標。  當車輪轉動時,紅外線(IR)輕所排放的一IR發光二極管(LED)中斷多次,在率成正比率車輪旋轉。  因此,鼠標,不知有多少“增量” (也稱為“蜱” )鼠標軸提出了在一個特定時期的。 

確定的方向運動,涉及使用2輕型傳感器,位於非常接近,兩者合計,沿一軸平行運動的車輪。  (兩種傳感器是在一個單一的3引腳組成如下所示) 。 
mouse_sensor01.jpg
鼠標IR光傳感器(有兩個IR探測器在一個單封裝)
該中心的私人密碼的政改方案是積極集電極電壓; 
左,右腳是左和右傳感器輸出排放。 

讓我們的名稱兩個傳感器在包裝“A”和“B” 。  假設車輪最初是在一個轉角,例如說, IR輕是阻止從深遠的兩種傳感器。 

由於車輪轉動, IR光從發射最終將能夠通過一個洞,車輪和達到其中的兩個傳感器,如傳感器“A” 。  如果車輪繼續旋轉,在同一方向,最終第二個傳感器, “B” ,將可收到IR輕。  如果車輪繼續旋轉,在同一方向,最終IR輕將被封鎖,從深遠的傳感器“A” 。  如果車輪繼續旋轉,在同一方向,最終IR輕將被封鎖,從深遠的傳感器“B” 。 

因此,序列是: 
(A,B):   ..., (0,0), (1,0), (1,1), (0,1), ...
如果車輪轉動,在相反的方向, 4 -任期序列如上所示將得到扭轉,從目前的狀況。
與這兩個傳感器信號,我們可以判斷利率的輪換,和方向。
ps2_mouse_circuit_board.jpg
電路板的Microsoft Intellimouse
要了解更多關於如何鼠標電路解釋輕型傳感器和溝通,與個人電腦(PC) (經PS/2信號) ,我研究了電路板。 

該芯片具有以下名稱印後: SPCP05A 。 

搜索互聯網一詞“SPCP05A”表明,該芯片是製造由一間公司名為“Sunplus Technology Co.”  。  有關“SPCP05A”芯片能夠獲取從該公司。 

這裡是技術規格的“SPCP05A”芯片: 
sunplus_ps2_3dmouse_datasheet.pdf
(技術規格的“SPCP05A”微晶片)
1125022 字節
MD5: 359a9210275e021cc19a5e2391499dc5
以下圖片顯示的信號管腳的“SPCP05A (PS/2 3D mouse)”芯片。
spcp05a_chip_signals_bmp01.jpg
信號管腳的芯片“SPCP05A (PS/2 3D mouse)”
該“SPCP05A”其實是一個微型電腦!  它有一個指令集,和RAM , ROM ,和內部定時器,等等。  事實上,在說明該“SPCP05A”芯片在所提供的資料, Sunplus Co.幾乎是指以特定用途的芯片為“電腦鼠標”電路。  這種芯片是一種多功能的微控制器。 

我學電路的痕跡,對電路板的Microsoft Intellimouse形成以下近似示意圖:
ps2_mouse_my_schematic.jpg
近似示意圖的Microsoft Intellimouse  (我失踪數電容器,但這個方案幾乎是完美的) 。
Bui Van Chu ,在澳大利亞,讀我的文章,並寄給我的一個較完整的示意圖,它會出現在以下的形象。
ms_ps2_mouse_schematic.jpg
該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 ) 。 
tuned_sensor01.jpg
調諧IR光傳感器(最高的敏感性38 kHz光調製)
帶電路是包含在設備,隨IR光晶體管。 

因此, IR LED一般都可以在一個脈衝的頻率38 kHz ,使傳感器將接收到輕,讓電信號到傳感器的產出。 

傳達信息,輕從IR LED可以被打斷,在相對低的利率(例如,第1到100倍,每秒) 。  這低頻脈衝是在與穩定的高頻率脈衝;也就是說,低頻脈衝,可被視為調節高頻率的脈動。  高頻率脈衝是像一個“載波”後,該信息信號(相對較低的頻率調製)進行。 

不過,我驗證了該IR傳感器,在Microsoft Intellimouse 沒有這樣的調製過濾。  然而,電路是否要求該IR光調製以某種方式中,除了低頻干擾輕,由車輪與漏洞。 

以下示意圖顯示了不同的傳感器信號不斷IR LED輕和閃動IR LED輕為不同階段的鼠標滾輪轉折。
ps2_mouse_quadrature_sketch.jpg
傳感器的輸出信號為常數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”位,在數據位和奇偶校驗位組合是單數。 

下面的圖表說明,傳輸一個單一的數據包: 
ps2_clock_data_dev2pc01_adj.jpg
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) 。
2002june03_basicstamp_to_ps2mouse_circuit.jpg
示意圖電路,讓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計算機連接到電路匹配的示意圖以上。 
2002june03_basicstamp_mousecircuit01_adj.jpg
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協議:
http://ourworld.compuserve.com/homepages/steve_lawther/keybinfo.htm
尋找以下鏈接:
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鼠標接口:
http://panda.cs.ndsu.nodak.edu/ 〜 achapwes/picmicro/ps2/ps2.htm
colinfahey.com
聯繫信息
English  Español  Português  Français  Italiano  Deutsch  Nederlands  Svenska  Dansk  Suomi  Norsk  Русский  Polski  Română  Български  Hrvatski  Česky  中国  中國  日本語  한국어  Ελληνική  हिन्दी  العربية