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  中国  中國  日本語  한국어  Ελληνική  हिन्दी  العربية