美文网首页Arduino雕爷学编程
【雕爷学编程】Arduino动手做(118)---PS2接口模块

【雕爷学编程】Arduino动手做(118)---PS2接口模块

作者: 驴友花雕 | 来源:发表于2023-06-21 17:27 被阅读0次

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。

    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    实验一百一十八:PS2鼠标 键盘插座接口 PS2模块

    0.jpg

    PS/2接口
    上古接口之一,PS/2接口曾经是最常见的鼠标接口,最初是IBM公司的专利,俗称“小口”。这是一种鼠标和键盘的专用接口,一种6针的圆型接口。但鼠标只使用其中的4针传输数据和供电,其余2个为空脚。PS/2接口的传输速率比COM接口稍快一些,而且是ATX主板的标准接口,当时应用最为广泛的鼠标接口之一,但仍然不能使高档鼠标完全发挥其性能,而且不支持热插拔。在BTX主板规范中,这也是即将被淘汰掉的接口。需要注意的是,在连接PS/2接口鼠标时不能错误地插入键盘PS/2接口(当然,也不能把PS/2键盘插入鼠标PS/2接口)。一般情况下,符合PC99规范的主板,其鼠标的接口为绿色、键盘的接口为紫色,另外也可以从PS/2接口的相对位置来判断:靠近主板PCB的是键盘接口,其上方的是鼠标接口。

    0-.jpg 01.jpg

    PS/2通讯协议
    PS/2鼠标接口采用一种双向同步串行协议。即每在时钟线上发一个脉冲,就在数据线上发送一位数据。在相互传输中,主机拥有总线控制权,即它可以在任何时候抑制鼠标的发送。方法是把时钟线一直拉低,鼠标就不能产生时钟信号和发送数据。在两个方向的传输中,时钟信号都是由鼠标产生,即主机不产生通信时钟信号。 如果主机要发送数据,它必须控制鼠标产生时钟信号。方法如下:主机首先下拉时钟线至少100μs抑制通信,然后再下拉数据线,最后释放时钟线。通过这一时序控制鼠标产生时钟信号。当鼠标检测到这个时序状态,会在10ms内产生时钟信号。如图3中 A 时序段。主机和鼠标之间,传输数据帧的时序如图2、图3所示。2.2 数据包结构在主机程序中,利用每个数据位的时钟脉冲触发中断,在中断例程中实现数据位的判断和接收。在实验过程中,通过合适的编程,能够正确控制并接收鼠标数据。但该方案有一点不足,由于每个CLOCK都要产生一次中断,中断频繁,需要耗用大量的主机资源。

    01-0.jpg

    PS/2接口的引脚定义

    是第1针传数据,第2针闲置,第3针接地(负极),第4针接+5V电源,第5针是时钟,第6针也是闲置的。拆开PS/2接口的键盘,你会发现除了一张‘电路图’外,还有一块比豆腐大不了多少的PCB板。这块电路板上标有V、G、C、D四个焊点——V是Vcc电源,就是接电源正极,多数是接红线;G是地线,就是电源负极,多数是接黑线;C是时钟,有的接黄线,有的是绿线;D是数据,多数是绿线或者蓝线,也有黄线。颜色不靠谱,建议你先把负极和正极接好,然后把剩下的C、D两根线随便接上试试,不行再对调就好了。

    03.jpg 04.jpg 05- (1).jpg 05.jpg

    PS/2接口和USB接口的区别

    PS2接口的特性:

    1.物理连接:一般,具有五脚连接器的键盘称之为AT键盘,而具有六脚mini-DIN连接器的键盘则称之为PS/2键盘。其实这两种连接器都只有四个脚有意义。它们分别是Clock、Data、+5V和Ground。在PS/2键盘与PC机的物理连接上只要保证这四根线一一对应就可以了。PS/2键盘靠PC的PS/2端口提供+5V电源,另外两个脚Clock和Data都是集电极开路的,所以必须接大阻值的上拉电阻。它们平时保持高电平,有输出时才被拉到低电平,之后自动上浮到高电平。

    2.电气特性:PS/2通讯协议是一种双向同步串行通讯协议。

    通讯的两端通过Clock同步,并通过Data交换数据。任何一方如果想抑制另外一方通讯时,只需要把Clock拉到低电平。如果是PC机和PS/2键盘间的通讯,则PC机必须做主机,也就是说,PC机可以抑制PS/2键盘发送数据,而PS/2键盘则不会抑制PC机发送数据。一般两设备间传输数据的最大时钟频率是33kHz,大多数PS/2设备工作在10~20kHz。推荐值在15kHz左右,也就是说,Clock高、低电平的持续时间都为40μs。

    USB接口的优势:

    1.可以热插拔。就是用户在使用外接设备时,不需要关机再开机等动作,而是在电脑工作时,直接将USB插上使用。

    2.携带方便。USB设备大多以“小、轻、薄”见长,对用户来说,随身携带大量数据时,很方便。当然USB硬盘是首要之选了。

    3.标准统一。大家常见的是IDE接口的硬盘,串口的鼠标键盘,并口的打印机扫描仪,可是有了USB之后,这些应用外设统统可以用同样的标准与个人电脑连接,这时就有了USB硬盘、USB鼠标、USB打印机等等。

    4.可以连接多个设备。USB在个人电脑上往往具有多个接口,可以同时连接几个设备,如果接上一个有四个端口的USB HUB时,就可以再连上;四个USB设备,以此类推,尽可以连下去,将你家的设备都同时连在一台个人电脑上而不会有任何问题。

    USB支持热插拨,而PS2接口不可以,所以论便捷性USB完胜PS2,其次就是鼠标USB接口的传输率比PS2要高一些,主要体现在游戏里的鼠标移动上,不过一般来说感觉不出来,至于键盘接口是USB或者是PS2那就没什么区别了,不过最主要还是USB支持热插拨,这点很重要,而且USB接口也是主流标准了,PS2已经完全失去意义了。包括价格上USB也比PS2贵不了多少钱,所以USB接口完胜。

    但在键位组合上,PS/2可以实现全无冲突,USB下只能是最多6个可以同时按下。 USB键盘的一个数据包只有8个字节(为什么只有8个,这是因为协议规定,为什么协议这么规定,是因为早期的时候USB速度慢,使用中断传输一个包最大就8个字节),其中2个字节标记状态,其余6个字节用来记录当前按下或者弹起的按键的扫描码,所以,USB键盘最多同时描述6个按键的状态。

    在稳定上,PS/2还是要好过USB的,当然USB的话虽没有PS/2的稳定,可有不错的扩展,如可以在USB的键盘中加入USB HUB。

    05- (2).jpg

    关于USB接口和PS/2接口转换
    电脑中四根线USB接口,两边的两根是电源线,中间的两根是数据线。usb接口的4根线一般是下面这样分配的,需要注意的是千万不要把正负极弄反了,否则会烧掉usb设备或者电脑的南桥芯片:
    黑线:gnd 电源负极
    红线:vcc 电源正极
    绿线:data+ 信号正极
    白线:data- 信号负极

    06 (1).jpg

    此模块是由PS2接口转普通2.54MM接口,方便电脑键盘或鼠标与arduino连接。

    07- (1).jpg 07 (2).jpg

    PS2接口模块参数
    工作电压:5V(DC)
    接口:4PIN接口5V、GND、DAT、CLK
    输出信号:数字信号
    尺寸:211717mm
    重量:5.5g

    08.jpg 09-.jpg 10 (1).jpg

    根据图上的引脚把 PS/2 接口与 Arduino 连接起来,对应关系如下表。
    5V : - Arduino 5V out
    Ground : - Arduino GND
    Clock : - Arduino Pin 3
    Data : - Arduino Pin 8

    06-0.jpg

    Arduino实验开源代码

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
    实验一百一十八:PS2鼠标 键盘插座接口 PS2模块
    
    1、安装< PS2Keyboard.h>库
    
    (https://www.pjrc.com/teensy/arduino_libraries/PS2Keyboard.zip)
    
    2、项目:在 Arduino 上使用 PS/2 键盘进行输入测试
    
    3、PS/2 接口与 Arduino 接脚
    
    5V :    - Arduino 5V out
    
    Ground : - Arduino GND
    
    Clock :  - Arduino Pin 3
    
    Data :    - Arduino Pin 8
    
    */
    
      
    
    #include <PS2Keyboard.h>
    
    const int DataPin = 8;
    
    const int IRQpin =  3;
    
    PS2Keyboard keyboard;
    
    
    
    void setup() {
    
      //keyboard.begin(DataPin, IRQpin, PS2Keymap_US);
    
      keyboard.begin(DataPin, IRQpin, PS2Keymap_German);
    
      //keyboard.begin(DataPin, IRQpin, PS2Keymap_French);
    
      Serial.begin(9600);
    
      Serial.println("International Keyboard Test:");
    
    }
    
    
    
    void loop() {
    
      if (keyboard.available()) {
    
      char c = keyboard.read();
    
      Serial.println(c);
    
      }
    
    }
    

    实验串口返回情况

    11.jpg

    Arduino实验开源代码之二

    /*
    
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
    
    实验一百一十八:PS2鼠标 键盘插座接口 PS2模块
    
    1、安装< PS2Keyboard.h>库
    
    (https://www.pjrc.com/teensy/arduino_libraries/PS2Keyboard.zip)
    
    2、项目:在 Arduino 上使用 PS/2 键盘进行输入测试(识别一些特殊按键)
    
    3、PS/2 接口与 Arduino 接脚
    
    5V :    - Arduino 5V out
    
    Ground : - Arduino GND
    
    Clock :  - Arduino Pin 3
    
    Data :    - Arduino Pin 8
    
    */
    
      
    
    #include <PS2Keyboard.h>
    
    const int DataPin = 8;
    
    const int IRQpin =  3;
    
    PS2Keyboard keyboard;
    
    
    
    void setup() {
    
      delay(1000);
    
      keyboard.begin(DataPin, IRQpin);
    
      Serial.begin(9600);
    
      Serial.println("Keyboard Test:");
    
    }
    
    
    
    void loop() {
    
      if (keyboard.available()) {
    
      // read the next key
    
      char c = keyboard.read();
    
      // check for some of the special keys
    
      if (c == PS2_ENTER) {
    
        Serial.println();
    
      } else if (c == PS2_TAB) {
    
        Serial.print("[Tab]");
    
      } else if (c == PS2_ESC) {
    
        Serial.print("[ESC]");
    
      } else if (c == PS2_PAGEDOWN) {
    
        Serial.print("[PgDn]");
    
      } else if (c == PS2_PAGEUP) {
    
        Serial.print("[PgUp]");
    
      } else if (c == PS2_LEFTARROW) {
    
        Serial.print("[Left]");
    
      } else if (c == PS2_RIGHTARROW) {
    
        Serial.print("[Right]");
    
      } else if (c == PS2_UPARROW) {
    
        Serial.print("[Up]");
    
      } else if (c == PS2_DOWNARROW) {
    
        Serial.print("[Down]");
    
      } else if (c == PS2_DELETE) {
    
        Serial.print("[Del]");
    
      } else { 
    
        // otherwise, just print all normal characters
    
        Serial.print(c);
    
      }
    
      }
    
    }
    

    实验串口返回情况

    12.jpg

    Arduino实验场景图

    13.jpg

    相关文章

      网友评论

        本文标题:【雕爷学编程】Arduino动手做(118)---PS2接口模块

        本文链接:https://www.haomeiwen.com/subject/jfxpydtx.html