37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
标题 实验一百一十八:PS2鼠标 键盘插座接口 PS2模块
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的是键盘接口,其上方的是鼠标接口。
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。
关于USB接口和PS/2接口转换
电脑中四根线USB接口,两边的两根是电源线,中间的两根是数据线。usb接口的4根线一般是下面这样分配的,需要注意的是千万不要把正负极弄反了,否则会烧掉usb设备或者电脑的南桥芯片:
黑线:gnd 电源负极
红线:vcc 电源正极
绿线:data+ 信号正极
白线:data- 信号负极
此模块是由PS2接口转普通2.54MM接口,方便电脑键盘或鼠标与arduino连接。
PS2接口模块参数
工作电压:5V(DC)
接口:4PIN接口5V、GND、DAT、CLK
输出信号:数字信号
尺寸:211717mm
重量:5.5g
根据图上的引脚把 PS/2 接口与 Arduino 连接起来,对应关系如下表。
5V : - Arduino 5V out
Ground : - Arduino GND
Clock : - Arduino Pin 3
Data : - Arduino Pin 8
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实验场景图