【雕爷学编程】Arduino动手做(118)---PS2接口模块
37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验一百一十八:PS2鼠标 键盘插座接口 PS2模块
PS/2通讯协议
PS/2鼠标接口采用一种双向同步串行协议。即每在时钟线上发一个脉冲,就在数据线上发送一位数据。在相互传输中,主机拥有总线控制权,即它可以在任何时候抑制鼠标的发送。方法是把时钟线一直拉低,鼠标就不能产生时钟信号和发送数据。在两个方向的传输中,时钟信号都是由鼠标产生,即主机不产生通信时钟信号。 如果主机要发送数据,它必须控制鼠标产生时钟信号。方法如下:主机首先下拉时钟线至少100μs抑制通信,然后再下拉数据线,最后释放时钟线。通过这一时序控制鼠标产生时钟信号。当鼠标检测到这个时序状态,会在10ms内产生时钟信号。如图3中 A 时序段。主机和鼠标之间,传输数据帧的时序如图2、图3所示。2.2 数据包结构在主机程序中,利用每个数据位的时钟脉冲触发中断,在中断例程中实现数据位的判断和接收。在实验过程中,通过合适的编程,能够正确控制并接收鼠标数据。但该方案有一点不足,由于每个CLOCK都要产生一次中断,中断频繁,需要耗用大量的主机资源。
PS/2接口的引脚定义
是第1针传数据,第2针闲置,第3针接地(负极),第4针接+5V电源,第5针是时钟,第6针也是闲置的。拆开PS/2接口的键盘,你会发现除了一张‘电路图’外,还有一块比豆腐大不了多少的PCB板。这块电路板上标有V、G、C、D四个焊点——V是Vcc电源,就是接电源正极,多数是接红线;G是地线,就是电源负极,多数是接黑线;C是时钟,有的接黄线,有的是绿线;D是数据,多数是绿线或者蓝线,也有黄线。颜色不靠谱,建议你先把负极和正极接好,然后把剩下的C、D两根线随便接上试试,不行再对调就好了。
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。
此模块是由PS2接口转普通2.54MM接口,方便电脑键盘或鼠标与arduino连接。
PS2接口模块参数
工作电压:5V(DC)
接口:4PIN接口5V、GND、DAT、CLK
输出信号:数字信号
尺寸:21*17*17mm
重量:5.5g
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); } }
实验串口返回情况
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); } } }
实验串口返回情况
Arduino实验场景图