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

3.png

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

6.png

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

8.png

 

9.png

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

112.png

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

111.png

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

1113.png

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

1114.png

成品了,怎么样很酷吧!这下输入快捷键方便了,编程、登陆时候可以节省不少输入时间!

其实,这款产品不单单可以做快捷键,还可以做个人密码登陆什么的,到时候一键登陆!嘿嘿!我什么都没有说!

补充资料:键盘键值。

3b87e950352ac65cdb06c6c0fbf2b21193138a06.gif

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

09f015d8d347023832fa1ce5.jpg

路径: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)

 

更新日期: 2014-11-27 13:12:44
文章标签:
文章链接: 我的“随身Key”~ 简单、实用!
站方声明: 除特别标注, 本站所有文章均为原创, 互联分享, 尊重版权, 转载请注明.