0×00    什么是Arduino 

Arduino实际上就是一种开发板,将微控制器和必需的元件集成在一块电路板上,扩展出完善的接口和针脚,就可以接上各种各样的传感器,完成你心中的设计,你也可以把它理解成一种电子积木,因为它不需要焊接,也不需要高深的无线电知识,只需要编程基础和基本的电路知识即可。 

Arduino 不需要知道各种硬件的底层知识,这些底层的调用都已经提前帮你实现好了,而且它使用的是c语言而不是汇编,配有一个官方的IDE和各种硬件的调用库,你只需要按照你自己的设计插接好各种硬件,就可以开始编写程序了,编写完之后烧写入微控制器(在arduino中这称为下载),它们会自动开始运行。其本身是一种开源硬件,电路图是公开的,现在官方的和扩展出的各种arduino板子加起来已经有上百种。

Aduino的官方网站:http://www.arduino.cc,要进行下面的内容,请在此下载arduino的官方IDE并安装,在IDE安装目录的drivers子目录中,有烧写arduino所需要的usb转串口驱动,必须要先安装驱动才能开始编程.

0×01    模块

.arduino nano/micro/mini一个    30元左右
.蓝牙模块一个 20元左右
.若干导线 一坨3元左右

用山寨的nano(实战的话得把排针拔掉,焊上导线)也可,价格10元左右。mini也不错,价格也是10元左右,但是需要一个usb ttl来烧写程序。micro山寨的30元左右,这个比nano小点,跟mini差不多,这个板子可以模拟键盘和鼠标实现HID攻击,相当于teensy。指甲大小的lilypad兴许可以,我这里没有这个板子,不太清楚这个板子的情况。

而实战时,把arduino的排针拔掉,直接把这两个模块焊起来,大小就跟下面的差不多了,由于导线会比下面的略大一点。

0×02 思路

最初的思路是,利用micro板子接收ps2键盘然后在再有micro模拟成键盘转发出去。但是因为由于不能完全解码ps2键盘的按键信息,所以我就换了个思路。直接用板子并联在连接线上面,这样键盘发出按键信息后会沿着线路到达两个地方,一个是计算机,一个就是我们的记录器了。

0×03 原理

ps2口一共有6个针脚: clock时钟、GND接地、DATA数据和5V的供电,剩余的两个是没有使用的保留口,排列顺序如下图所示:

其中clock和data用于截获按键信息,剩余两个用于给键盘和装置供电。

接线图:

看起来连线有些眼花缭乱,事实上很简单的几下。键盘正常连接计算机不变,只需要在键盘连接计算机的线路中的这四根线引出导线连接在板子上即可。

蓝牙模块也同样需要连四根线

0×04    连接硬件

上图是装置的全部分,实战时把线路焊接起来而不用杜邦线和排针就可以压缩到u盘大小,而且供电直接取自键盘。可以把此装置塞到键盘当中实现隐秘监控,由于使用的不是转发的方法,即使电路故障(只要焊接好,可能性很低)也不会影响键盘的正常使用。焊好后大小就如同文章开头提到的。

0×05    烧写程序

首先需要下载一个库文件,解压放到arduino ide安装目录中的librarys文件夹中。然后使用arduino ide 给板子烧写程序,在工具菜单栏中选好板子的型号,在选号对应串口号。烧写以下程序

#include <PS2Keyboard.h>

const int DataPin = ;
const int IRQpin = ; PS2Keyboard keyboard; void setup() {
delay();
keyboard.begin(DataPin, IRQpin);
Serial.begin();
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 {
Serial.print(c);
}
}
}

手机上面使用Bluetooth spp连接蓝牙串口,就可以看到键盘的实时按键信息了。

我使用的是笔记本,没有ps2口,所以我用另一arduino板子当作计算机。所以你会看见视频里一坨东西,但装置只有两个小板子,其余都是为了模拟计算机。

视频中可以看到当按键后,手机的蓝牙端实时接收到按键数据,而同时计算机也收到了按键信息。可以看出这个装置是不影响键盘和计算机的通讯,只是听一听它们在聊什么。

0×06    其他问题

有些地方还需要完善:

.功能键部分无法识别(但不影响键盘使用)
.按键信息还可以通过更便宜、更小、传输距离更远的nrf24l01+,代码有点复杂(为我还没有研究明白)
.arduino自身提供了EEPROM存储器,但是容量仅仅只有1k,所以没有往上面存储按键信息,如果加入关键字触发,才写入存储,兴许有点用。也可以用micro sd卡模块,将按键信息存储在存储卡中,等到有人连接装置后通过无线发送出去。我没买这个模块,所以这块没有做。

另外还可以做得更小更廉价!欢迎指教!

50元制作PS2键盘无线监控装置的更多相关文章

  1. 5、Qt Project之键盘数据监控

    键盘数据监控: 同样的,键盘的检测和鼠标的情形很类似,都是以QWidget为基类的工程 Step1:在UI设计中添加该模块需要使用的相关组件,如下所示: <width>141</wi ...

  2. 基于VHDL利用PS2键盘控制的电子密码锁设计

    基于VHDL利用PS2键盘控制的密码锁设计 附件:下载地址 中文摘要 摘 要:现代社会,人们的安全意识正在不断提升.按键密码锁由于其具有方便性.低成本等特征,还是大有用武之地的.但是通常的按键密码锁开 ...

  3. PS2键盘 + LCD12864 实验

    本实验是通过LCD12864来显示键盘上被按下的按键,实验比较简单,在LCD12864固定的DDRAM地址上显示,缺点就是不能保存上一次被按的内容,后者会覆盖掉前面,所以屏上仅有一个字符显示.保存上一 ...

  4. C# Winform制作虚拟键盘,支持中文

    原文:C# Winform制作虚拟键盘,支持中文           最近在做一个虚拟键盘功能,代替鼠标键盘操作,效果如下:        实现思路:          1  构建中文-拼音 数据库, ...

  5. C# WinForm制作电子琴键盘

    上一篇 http://hovertree.com/h/bjaf/y8qol2p4.htm 再上一篇的基础上,使用WinForm制作了一个电子琴键盘: 演示地址 http://hovertree.com ...

  6. Delphi制作软键盘

        { 作者: han 日期: 2006.06.02 } unit softkey; interface uses Windows, Messages, SysUtils, Variants, C ...

  7. PS2键盘扫描码:通码与断码

    键盘扫描码(实用于标准PC的101.102和104 键的键盘),按下发送通码,弹起发送断码. 说明: 第一类按键,通码为1字节,断码为 0xF0+通码 形式.如A键,其通码为 0x1C,断码为 0xF ...

  8. 基于ROS和python,通过TCP通信协议,完成键盘无线控制移动机器人运动

    一.所需工具包 1.ROS键盘包:teleop_twist_keyboard 2.TCP通讯包:socket $ cd ~/catkin_ws/src $ git clone https://gith ...

  9. 50元求解pyqt加载并显示pdf问题

    50块钱求解决pyqt5加载pdf文档并显示,类似briss软件的效果

随机推荐

  1. [JS] 限制上传文件的类型和大小

    <!DOCTYPE html> <!-- saved from url=(0035)http://localhost:9090/qraved/update --> <ht ...

  2. 《基于MVC的Javascript》

    var Class = function(){ var klass = function(){ this.init.apply(this,arguments); } klass.prototype.i ...

  3. Qt之Timers

    简述 QObject是所有Qt objects的基类,在Qt中提供了基础定时器的支持.使用QObject::startTimer(),你可以传递一个毫秒数间隔作为参数启动一个定时器.该函数返回一个唯一 ...

  4. 148. Sort List -- 时间复杂度O(n log n)

    Sort a linked list in O(n log n) time using constant space complexity. 归并排序 struct ListNode { int va ...

  5. poj1258 Agri-Net (prim+heap)

    题目链接:poj1258 Agri-Net 这题我上个月做过,是个大水题,今天看见有人用prim+heap做的,就学习了下. #include<cstdio> #include<cs ...

  6. python中关闭文件

    1.关闭文件,通过f.write把内容写入文件会覆盖之前文件中的内容

  7. 一年成为Emacs高手(像神一样使用编辑器)

    作者: 陈斌(redguardtoo) 版本号: 20150424 更新时间: <2015-04-24 Fri> 原创时间: <2012-01-31 Tue> 版权: 本文采用 ...

  8. HDU 4122

    Alice's mooncake shop Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  9. GBK编码相关

    如上图.的GBK编码是A3AE, 那么·对应的无符号整数值应该是A*16**3+E*16**2+A+3, 无符号整数值所在地址的第一个自己是A3,第二个字节是AE

  10. 所思所想 js模板引擎

    将服务端生成的HTML标记的事情交给了客户端来做 那么服务端的职责是什么呢? 职责就是处理最终的返回结果,纯数据  handler