Arduino 打造自动输入器

某些时候因为一些特殊的原因,使得我们不能直接使用U盘之类的存储设备,比如:不容许使用U盘,只能让你手工编辑文档然后按上机时间收费。但是,只要运行在Windows系统上,USB键盘还能使用,我们就有办法输入我们需要的代码进去。

先说一下原理,Windows自带了一个叫做“写字板”的程序,他定义了一种 RTF 格式的文件。在这种文件中,可以根据需要插入一些附件,RTF内容完全是可见的 ASCII字符组成。

比如,我在下面这个文档中插入了一个图片:

image003

保存之后在用十六进制编辑工具打开看到的内容如下,可以看到全部都是可见的ASCII 字符(除了换行和回车):

image004

如果我们在目标机器上从键盘输入这些 ASCII 字符,保存之后即可重建整个文件。

设计这样的设备要求能够模拟为USB键盘,我选择Arduino Pro Micro 外加一个SD卡读卡器和一张SD卡即可。

image005

代码如下:

#include <SPI.h>

#include <SD.h>

// On the Ethernet Shield, CS is pin 4. Note that even if it's not

// used as the CS pin, the hardware CS pin (10 on most Arduino boards,

// 53 on the Mega) must be left as an output or the SD library

// functions will not work.

const int chipSelect = 10;

int RUNMARK=false;

void setup()

{

// make sure that the default chip select pin is set to

// output, even if you don't use it:

pinMode(10, OUTPUT);

pinMode(3, INPUT_PULLUP);

Keyboard.begin();

// see if the card is present and can be initialized:

if (!SD.begin(chipSelect)) {

return;

}

}

void loop()

{

if ((digitalRead(3)==LOW)&&(RUNMARK==false)) {

// open the file. note that only one file can be open at a time,

// so you have to close this one before opening another.

File dataFile = SD.open("type.rtf");

// if the file is available, write to it:

if (dataFile) {

while (dataFile.available()) {

Keyboard.print(char(dataFile.read()));

delay(10);

}

dataFile.close();

}

Keyboard.end();

RUNMARK=true;

}

}

设计上特别之处在于:

设定Pin3为开关,更新程序之后,短接GND和Pin3即打开自动输入功能。在使用USB键盘鼠标模拟的时候,这是必须的,否则你会发现下一次刷写用于干扰会难以完成;
在发送字符的时候,还有一个Delay,这是多次实验得到的值,如果不放这个的话,输入1.8K 左右个字符之后,会停止,我比较怀疑是Arduino内存耗尽导致的。
工作的视频:

最后:当然如果你没有我这个装置,有足够的耐心的话,手工敲入每个字符也是可以的。

最近在看书,上面讲中世纪的僧侣抄写《圣经》,为了防止出错,给每一个字母编上一个数字,先计算原文每行字母之和,再计算抄写之后每行字母之和这样能保证抄写结果和原文完全一致。不知道除了让人一遍遍看中文是否有这样的纠错办法?

最后鸣谢Windows专家,天杀同学~

前几天看吴军《数学之美》 P11 提到

当司马迁用近53万字记载了总过上千年历史的同时,远在中东的犹太人也用类似的篇幅记载了自创世纪以来,主要是摩西以来他们祖先的历史,这就是《圣经》中的《旧约》部分。《圣经》简洁的文风和中国的《史记》颇有相似之处。但是和史记这本由唯一作者写成的史书不同,《圣经》的写作持续了很多世纪,后世的人在做补充时,看到的是几百年前甚至上千年前原作的抄本,抄写的错误便在所难免,据说今天也只有牛津大学保留了一本没有任何错误的古本。虽然做事认真的犹太人要求在抄写《圣经》时,要虔诚并且打起十二分精神,尤其每写道上帝(GOD和Lord)这个词时要去洗手起到,但是抄写错误还是难以避免。于是犹太人发明了一种类似于我们今天计算机和通信中校验码的方法。他们把每一个希伯来字母对应一个数字,这样每行文字加起来便得到一个特殊的数字,这个数字便成为了这一行的校验码。同样,对于每一列也是这样处理,当犹太学者抄完一页《圣经》时,他们需要把每一行的文字加起来,看看新的校验码是否和原文的相同,然后对每一页进行同样的处理。如果这一页每一行和每一列的校验码和原文完全相同,说明这一页的抄写无误。如果某行的校验码和原文中的对应不上,则说明这一行至少有一个抄写错误。当然,错误的对应列的校验码也一定和原文对不上,这样可以很快找到出错的地方,这背后的原理我们今天的各种校验是相同的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注