上一篇文件介绍了如何使用Arduino通过PS2模块读取PS2键盘信息,接下来顺理成章的就是如何让Arduino通过PS2模块读取PS2的鼠标信息。于是找了一个PS2口的鼠标,实物如下:
![Arduino通过PS2模块使用PS2鼠标 - gc_2299 - gc_2299的博客 Arduino通过PS2模块使用PS2鼠标 - gc_2299 - gc_2299的博客](http://img0.ph.126.net/1vUJUbfUwAsdNdLyDADjtg==/6632156282212761321.jpg)
不管具体的通信原理,先在网上找一个能用的PS2Mouse库来进行测试,看Arduino能不能正常的与鼠标通信,我在网上找了两个库,分别是:
2)http://playground.arduino.cc/ComponentLib/Ps2mouse
在使用这两个库中自带的示例程序进行测试时,一开始Arduino程序编译报错,说是找不到WProgram.h头文件,通过在百度上搜索原因,发现原来是这个头文件过时了,现在Arduino编译时使用的头文件名称是Arduino.h,网上给出的解决方法是将
# include<WProgram.h>
这句改为
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
将两个库中相关的代码进行替换后在进行编译,问题解决。
本文采用第一个库文件中自带的示例进行测试,测试代码如下:
测试代码的实物连接图如下:#include <PS2Mouse.h>
#define MOUSE_DATA 5
#define MOUSE_CLOCK 6
PS2Mouse mouse(MOUSE_CLOCK, MOUSE_DATA, STREAM);
void setup()
{
Serial.begin(38400);
mouse.initialize();
}
void loop()
{
int data[2];
mouse.report(data);
Serial.print(data[0]); // Status Byte
Serial.print(":");
Serial.print(data[1]); // X Movement Data
Serial.print(",");
Serial.print(data[2]); // Y Movement Data
Serial.println();
}
![Arduino通过PS2模块使用PS2鼠标 - gc_2299 - gc_2299的博客 Arduino通过PS2模块使用PS2鼠标 - gc_2299 - gc_2299的博客](http://img0.ph.126.net/z-fG7cs50Nx0RjIReqsYeQ==/6632599385396081826.jpg)
代码测试一切正常,这里就不在贴串口输出的数据了。需要说明的是,由于库函数实现方式不同,使用本文提及的PS2mouse库时没有像PS2Keyboard一样限制CLK引脚必须要连接在Arduino上支持中断的引脚上,本文提及的两个库可以使用Arduino中的所有数字引脚。
2、通信原理简介
参考文献1对PS2口的鼠标通信原理进行了详细的介绍,我在这里仅对里面的部分内容进行简介,感兴趣的同志可以去看参考文献1的原文。
PS2口的鼠标最初是二十世纪八十年底在IBM的Personal System/2计算机上出现的,但现在慢慢被USB口的鼠标给替代了。
PS2口的鼠标接口使用双向的串口协议想计算机传递鼠标移动和按钮信息,同时计算机也可以向鼠标发送命令来设置信息发送频率、精度、重启鼠标、停用鼠标等。
标准的PS2口的鼠标支持以下信息:X方向运动(左、右)、Y方向运动(上下)、左边按钮、中间按钮、右边按钮。鼠标会定期根据这些信息计算位移和按钮状态,然后更新计数器和标志位。
鼠标有四种模式:
1)Reset Mode:该模式用于初始化。在该模式中,鼠标执行初始化和自检操作;
2)Stream Mode:默认的模式。在该模式中,如果鼠标发生移动,或者鼠标按钮状态发生变化,鼠标会想PS2口发送信息包;
3)Remote Mode:在该模式中,与鼠标通信的设备会主动向鼠标获取位移信息;
4)Wrap Mode:该模式是一个单一的调试模式,在该模式中,鼠标会将与其通信的设备发送的信息包再返回给设备。
可以向鼠标发送以下命令进行通信:
名称 | 意义 |
0xFF | 重启,鼠标进入Reset Mode |
0xFE | 重新发送命令,设备如果从鼠标接收到错误信息,可以发送此命令要求鼠标重新发送信息包 |
0xF6 | 该命令将鼠标设置重置为默认值 |
0xF5 | 停止数据发送命令,该命令使鼠标不在向设备发送数据包,并 重置位移计数器 |
0xF4 | 重新发送数据命令 |
0xF3 | 该命令用于设置鼠标的采样频率 |
0xF2 | 该命令用于活动鼠标的设备ID |
0xF0 | 鼠标进入Remote Mode |
0xEE | 鼠标进入Wrap Mode |
0xEC | 重置鼠标的位移计数器,并将鼠标模式设置为进入Wrap Mode之前的模式 |
0xEB | 鼠标想PS2口发送一个运动数据包,这是Remote Mode下设备读取鼠标信息的唯一方式 |
0xEA | 重置鼠标的位移计数器,并将鼠标模式设置为Stream Mode |
0xE9 | 该命令获取鼠标的状态信息 |
我就翻译了参考文献1中的一小部分内容,如果对其感兴趣,可以直接去看原文。
参考文献
[1]http://www.computer-engineering.org/ps2mouse/
[2]http://playground.arduino.cc/ComponentLib/Ps2mouse