“Arduino Leonardo”,可以非常方便的链接电脑,模拟鼠标和键盘,正好淘到了一块mini leonardo,拿来做个快捷“键盘”!

考虑下整个产品的结构,……,手里正好一块洞洞板,考虑做个小型“快捷键”,比如针对己习惯使用的Ctrl+C/Ctrl+V等,可以做个快捷按键。

板子尺寸非常小,刚好排布六个按键。打算洞洞板的一半是Leonardo,另外一部分是按键。


Leonardo焊接短排针,缩小高度和体积。

用P40的插座做Leonardo底座,非常合适!个人原创哦!

这个就是完成品了,原理很简单,就是普通的ButtonPin,不同的按键链接在不同的数字引脚上,然后loop程序轮询引脚状态!

数字引脚需要下拉电阻,设计的时候忽略了,结果实际使用时候引脚状态乱跳,最后还是加上了下拉电阻,不过没有设计好漏在外边了,其实可以隐藏在40Pin插座里的。

成品了,怎么样很酷吧!这下输入快捷键方便了,编程、登陆时候可以节省不少输入时间!
其实,这款产品不单单可以做快捷键,还可以做个人密码登陆什么的,到时候一键登陆!嘿嘿!我什么都没有说!
补充资料:键盘键值。

按键值有些和ASCII码是对应的,但是有些不是,需要具体对照:

路径:arduino-1.0.5-r2-windows\hardware\arduino\cores\arduino\USBAPI.h 文件。
具体已有键值:
// Keyboard
#define KEY_LEFT_CTRL 0x80
#define KEY_LEFT_SHIFT 0x81
#define KEY_LEFT_ALT 0x82
#define KEY_LEFT_GUI 0x83
#define KEY_RIGHT_CTRL 0x84
#define KEY_RIGHT_SHIFT 0x85
#define KEY_RIGHT_ALT 0x86
#define KEY_RIGHT_GUI 0x87
#define KEY_UP_ARROW 0xDA
#define KEY_DOWN_ARROW 0xD9
#define KEY_LEFT_ARROW 0xD8
#define KEY_RIGHT_ARROW 0xD7
#define KEY_BACKSPACE 0xB2
#define KEY_TAB 0xB3
#define KEY_RETURN 0xB0
#define KEY_ESC 0xB1
#define KEY_INSERT 0xD1
#define KEY_DELETE 0xD4
#define KEY_PAGE_UP 0xD3
#define KEY_PAGE_DOWN 0xD6
#define KEY_HOME 0xD2
#define KEY_END 0xD5
#define KEY_CAPS_LOCK 0xC1
#define KEY_F1 0xC2
#define KEY_F2 0xC3
#define KEY_F3 0xC4
#define KEY_F4 0xC5
#define KEY_F5 0xC6
#define KEY_F6 0xC7
#define KEY_F7 0xC8
#define KEY_F8 0xC9
#define KEY_F9 0xCA
#define KEY_F10 0xCB
#define KEY_F11 0xCC
#define KEY_F12 0xCD
程序代码:代码有些山寨,欢迎大家多提意见,谢谢!
const int ButtonPinA = 7;
const int ButtonPinB = 4;
const int ButtonPinC = 6;
const int ButtonPinD = 5;
const int ButtonPinE = 3;
const int ButtonPinF = 2;
void setup(){
//--------------------------------------
Serial.begin(115200);
Button_Setup();
Keyboard.begin();
//--------------------------------------
Serial.print("ButtonPin Start......");
//--------------------------------------
}
void loop(){
Button_Loop();
}
void Button_Setup(){
//--------------------------------------
//按钮端子作为输入
pinMode(ButtonPinA,INPUT);
pinMode(ButtonPinB,INPUT);
pinMode(ButtonPinC,INPUT);
pinMode(ButtonPinD,INPUT);
pinMode(ButtonPinE,INPUT);
pinMode(ButtonPinF,INPUT);
//--------------------------------------
}
void Button_Loop(){
Button_Read(ButtonPinA);
Button_Read(ButtonPinB);
Button_Read(ButtonPinC);
Button_Read(ButtonPinD);
Button_Read(ButtonPinE);
Button_Read(ButtonPinF);
}
void Button_Read(int ButtonPin){
//------------------------------------------------------
if(digitalRead(ButtonPin)==HIGH) //检测电平变高
{
//------------------------------------------------------
WorkRun(ButtonPin);
//------------------------------------------------------
delay(20);
//延时一段时间,防止按钮突然断开再按下。
//判断按钮状态,如果仍然按下的话,等待松开。
//------------------------------------------------------
while(digitalRead(ButtonPin)==HIGH)
{
delay(10);
}
//------------------------------------------------------
}
//------------------------------------------------------
}
void WorkRun(int ButtonPin){
//------------------------------------------
Serial.print("ButtonPin=");
Serial.println(ButtonPin);
//------------------------------------------
switch (ButtonPin) {
case ButtonPinA:
WorkRunA();
break;
case ButtonPinB:
WorkRunB();
break;
case ButtonPinC:
WorkRunC();
break;
case ButtonPinD:
WorkRunD();
break;
case ButtonPinE:
WorkRunE();
break;
case ButtonPinF:
WorkRunF();
break;
}
//------------------------------------------
}
void WorkRunA(){//Ctrl+c
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(67);//c
delay(100);
Keyboard.releaseAll();
}
void WorkRunB(){//Ctrl+v
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(86);//v
delay(100);
Keyboard.releaseAll();
}
void WorkRunC(){
}
void WorkRunD(){
}
void WorkRunE(){
//------------------------------------------
//Keyboard.press(KEY_LEFT_CTRL);
//Keyboard.press(KEY_LEFT_ALT);
//Keyboard.press(KEY_DELETE);
//------------------------------------------
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press('Q');
delay(100);
Keyboard.releaseAll();
Keyboard.write(KEY_RETURN);
//------------------------------------------
}
void WorkRunF(){
//------------------------------------------
// CTRL-ALT-DEL:
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_DELETE);
delay(100);
Keyboard.releaseAll();
//ALT-s:
delay(2000);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('l');
Keyboard.releaseAll();
//------------------------------------------
}
/*
开关连接实验
接线方法:
材料:一个轻触开关、一个10kΩ电阻,一个0.1uF电容(可选)
连接方法:
开关接在Arduino D3和+5V之间;
10kΩ电阻接在Arduino D3和GND之间;
0.1uF电容接在Arduino D3和+5V之间(可以不用电容);
74
65
32
*/
代码参考了老大的帖子:http://www.geek-workshop.com/thread-74-1-1.html
ps: 键盘值应该是参考ASCII码表的值,图片键盘值是不对的。
ASCII表
ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 | ASCII值 | 控制字符 |
0 | NUT | 32 | (space) | 64 | @ | 96 | 、 |
1 | SOH | 33 | ! | 65 | A | 97 | a |
2 | STX | 34 | ” | 66 | B | 98 | b |
3 | ETX | 35 | # | 67 | C | 99 | c |
4 | EOT | 36 | $ | 68 | D | 100 | d |
5 | ENQ | 37 | % | 69 | E | 101 | e |
6 | ACK | 38 | & | 70 | F | 102 | f |
7 | BEL | 39 | , | 71 | G | 103 | g |
8 | BS | 40 | ( | 72 | H | 104 | h |
9 | HT | 41 | ) | 73 | I | 105 | i |
10 | LF | 42 | * | 74 | J | 106 | j |
11 | VT | 43 | + | 75 | K | 107 | k |
12 | FF | 44 | , | 76 | L | 108 | l |
13 | CR | 45 | - | 77 | M | 109 | m |
14 | SO | 46 | . | 78 | N | 110 | n |
15 | SI | 47 | / | 79 | O | 111 | o |
16 | DLE | 48 | 0 | 80 | P | 112 | p |
17 | DCI | 49 | 1 | 81 | Q | 113 | q |
18 | DC2 | 50 | 2 | 82 | R | 114 | r |
19 | DC3 | 51 | 3 | 83 | S | 115 | s |
20 | DC4 | 52 | 4 | 84 | T | 116 | t |
21 | NAK | 53 | 5 | 85 | U | 117 | u |
22 | SYN | 54 | 6 | 86 | V | 118 | v |
23 | TB | 55 | 7 | 87 | W | 119 | w |
24 | CAN | 56 | 8 | 88 | X | 120 | x |
25 | EM | 57 | 9 | 89 | Y | 121 | y |
26 | SUB | 58 | : | 90 | Z | 122 | z |
27 | ESC | 59 | ; | 91 | [ | 123 | { |
28 | FS | 60 | < | 92 | 124 | | | |
29 | GS | 61 | = | 93 | ] | 125 | } |
30 | RS | 62 | > | 94 | ^ | 126 | ~ |
31 | US | 63 | ? | 95 | — | 127 | DEL |
NUL | VT 垂直制表 | SYN 空转同步 |
SOH 标题开始 | FF 走纸控制 | ETB 信息组传送结束 |
STX 正文开始 | CR 回车 | CAN 作废 |
ETX 正文结束 | SO 移位输出 | EM 纸尽 |
EOY 传输结束 | SI 移位输入 | SUB 换置 |
ENQ 询问字符 | DLE 空格 | ESC 换码 |
ACK 承认 | DC1 设备控制1 | FS 文字分隔符 |
BEL 报警 | DC2 设备控制2 | GS 组分隔符 |
BS 退一格 | DC3 设备控制3 | RS 记录分隔符 |
HT 横向列表 | DC4 设备控制4 | US 单元分隔符 |
LF 换行 | NAK 否定 | DEL 删除 |
键盘常用ASCII码 |
ESC键 VK_ESCAPE (27) 回车键: VK_RETURN (13) TAB键: VK_TAB (9) Caps Lock键: VK_CAPITAL (20) Shift键: VK_SHIFT ($10) Ctrl键: VK_CONTROL (17) Alt键: VK_MENU (18) 空格键: VK_SPACE ($20/32) 退格键: VK_BACK (8) 左徽标键: VK_LWIN (91) 右徽标键: VK_LWIN (92) 鼠标右键快捷键:VK_APPS (93) Insert键: VK_INSERT (45) Home键: VK_HOME (36) Page Up: VK_PRIOR (33) PageDown: VK_NEXT (34) End键: VK_END (35) Delete键: VK_DELETE (46) 方向键(←): VK_LEFT (37) 方向键(↑): VK_UP (38) 方向键(→): VK_RIGHT (39) 方向键(↓): VK_DOWN (40) F1键: VK_F1 (112) F2键: VK_F2 (113) F3键: VK_F3 (114) F4键: VK_F4 (115) F5键: VK_F5 (116) F6键: VK_F6 (117) F7键: VK_F7 (118) F8键: VK_F8 (119) F9键: VK_F9 (120) F10键: VK_F10 (121) F11键: VK_F11 (122) F12键: VK_F12 (123) Num Lock键: VK_NUMLOCK (144) 小键盘0: VK_NUMPAD0 (96) 小键盘1: VK_NUMPAD0 (97) 小键盘2: VK_NUMPAD0 (98) 小键盘3: VK_NUMPAD0 (99) 小键盘4: VK_NUMPAD0 (100) 小键盘5: VK_NUMPAD0 (101) 小键盘6: VK_NUMPAD0 (102) 小键盘7: VK_NUMPAD0 (103) 小键盘8: VK_NUMPAD0 (104) 小键盘9: VK_NUMPAD0 (105) 小键盘.: VK_DECIMAL (110) 小键盘*: VK_MULTIPLY (106) 小键盘+: VK_MULTIPLY (107) 小键盘-: VK_SUBTRACT (109) 小键盘/: VK_DIVIDE (111) Pause Break键: VK_PAUSE (19) Scroll Lock键: VK_SCROLL (145) |