极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 36139|回复: 26

我的“随身Key”~ 简单、实用!(上图、上代码)

[复制链接]
发表于 2014-11-18 16:55:00 | 显示全部楼层 |阅读模式
本帖最后由 wetnt 于 2014-11-27 13:15 编辑

        “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 文件。

        具体已有键值:

[pre lang="arduino" line="1" file="Key"]

//        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

[/code]

程序代码:代码有些山寨,欢迎大家多提意见,谢谢!

[pre lang="arduino" line="1" file="ButtonPin.ino"]
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之间(可以不用电容);
*/

[/code]

代码参考了老大的帖子:http://www.geek-workshop.com/thread-74-1-1.html


ps: 键盘值应该是参考ASCII码表的值,图片键盘值是不对的。


ASCII表
ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符
0NUT32(space)64@96
1SOH3365A97a
2STX3466B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39,71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92124|
29GS61=93]125}
30RS62>94^126~
31US63?95127DEL

NULVT 垂直制表SYN 空转同步
SOH     标题开始FF      走纸控制ETB     信息组传送结束
STX     正文开始CR      回车CAN     作废
ETX     正文结束SO      移位输出EM      纸尽
EOY     传输结束SI       移位输入SUB     换置
ENQ     询问字符DLE     空格ESC     换码
ACK     承认DC1     设备控制1FS      文字分隔符
BEL     报警DC2     设备控制2GS      组分隔符
BS      退一格DC3     设备控制3RS      记录分隔符
HT      横向列表DC4     设备控制4US      单元分隔符
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)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2014-11-18 17:30:22 | 显示全部楼层
光看电路板,电阻,导线的布置方式就该顶一下!
回复 支持 反对

使用道具 举报

发表于 2014-11-18 18:45:12 | 显示全部楼层
期待程序代码。。。
回复 支持 反对

使用道具 举报

发表于 2014-11-18 18:46:59 | 显示全部楼层
必须顶一下
回复 支持 反对

使用道具 举报

发表于 2014-11-18 21:16:07 | 显示全部楼层
其实如果好好设计的话完全可以锡接过线
回复 支持 反对

使用道具 举报

发表于 2014-11-18 22:12:02 | 显示全部楼层
期待有接线图,什么的,这个帖子才是完整的
回复 支持 反对

使用道具 举报

发表于 2014-11-18 22:49:10 | 显示全部楼层
你这个是什么板来的 都没见过的
回复 支持 反对

使用道具 举报

发表于 2014-11-19 00:01:23 | 显示全部楼层
布列松 发表于 2014-11-18 22:49
你这个是什么板来的 都没见过的

那个是32U4核心的ARDUINO  2560MEGA用来做上位机串口通讯用的那个也是这个核心
原生支持 USB口通讯
可以方便的模拟成键盘 鼠标 以及其他USB设备。
由于芯片原生支持USB不需要下载器。。。

说句粗话 真的是 吊爆了。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-11-19 09:25:30 | 显示全部楼层
____消失灬 发表于 2014-11-18 21:16
其实如果好好设计的话完全可以锡接过线

“锡接过线”费锡,嘿嘿,想省一点,……

PS:网线内芯真是最好的连接线……
回复 支持 反对

使用道具 举报

发表于 2014-11-19 12:17:23 | 显示全部楼层
把按键换成脚踏板,一踩放大招
回复 支持 反对

使用道具 举报

发表于 2014-11-20 12:26:48 | 显示全部楼层
不错,值得一做
回复 支持 反对

使用道具 举报

发表于 2014-11-20 17:38:37 | 显示全部楼层
对了 你这个数字口上的下拉电阻是多大的
回复 支持 反对

使用道具 举报

发表于 2014-11-20 17:40:18 | 显示全部楼层
darkorigin 发表于 2014-11-19 00:01
那个是32U4核心的ARDUINO  2560MEGA用来做上位机串口通讯用的那个也是这个核心
原生支持 USB口通讯
可以 ...

好像官方无出过这型号,而且好像模拟口少了几个哦
回复 支持 反对

使用道具 举报

发表于 2014-11-20 18:20:13 | 显示全部楼层
本帖最后由 Alex.CK 于 2014-11-20 18:41 编辑

我一直想知道这个keybord 库除了常用的KEY, 怎么添加其它的功能键, 比如本本上的 Fn 键,有些机械键盘上的 多功能键?(这些键盘的生产产家,都没有安装第3方驱动。应该 HID 底层就有) 比如我的本本上 Fn + 下 播放音乐。
回复 支持 反对

使用道具 举报

发表于 2014-11-21 02:34:42 | 显示全部楼层
布列松 发表于 2014-11-20 17:40
好像官方无出过这型号,而且好像模拟口少了几个哦

一般来说 模拟口用不了那么多滴。

而且可以用多片单片机组成一个大的系统

目前有成品的飞行手柄系统的板子 用的就是32U4 可以实现 X+Y+Z+ 油门 +100个按键 2块32u4
XY是坐标值 Z是旋转值 100个按键 基本上扩展一个全键盘出来了 很吓人
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-27 16:56 , Processed in 0.056242 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表