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鼠标接口: