我的“随身Key”~ 简单、实用!(上图、上代码)
本帖最后由 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 文件。
具体已有键值:
// 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之间(可以不用电容);
*/
代码参考了老大的帖子:http://www.geek-workshop.com/thread-74-1-1.html
ps: 键盘值应该是参考ASCII码表的值,图片键盘值是不对的。
ASCII表
ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符
0NUT32(space)64@96、
1SOH33!65A97a
2STX34”66B98b
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?95—127DEL
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)
光看电路板,电阻,导线的布置方式就该顶一下! 期待程序代码。。。 必须顶一下 其实如果好好设计的话完全可以锡接过线 期待有接线图,什么的,这个帖子才是完整的 你这个是什么板来的 都没见过的 布列松 发表于 2014-11-18 22:49 static/image/common/back.gif
你这个是什么板来的 都没见过的
那个是32U4核心的ARDUINO2560MEGA用来做上位机串口通讯用的那个也是这个核心
原生支持 USB口通讯
可以方便的模拟成键盘 鼠标 以及其他USB设备。
由于芯片原生支持USB不需要下载器。。。
说句粗话 真的是 吊爆了。。。。 ____消失灬 发表于 2014-11-18 21:16 static/image/common/back.gif
其实如果好好设计的话完全可以锡接过线
“锡接过线”费锡,嘿嘿,想省一点,……
PS:网线内芯真是最好的连接线…… 把按键换成脚踏板,一踩放大招 不错,值得一做
对了 你这个数字口上的下拉电阻是多大的 darkorigin 发表于 2014-11-19 00:01 static/image/common/back.gif
那个是32U4核心的ARDUINO2560MEGA用来做上位机串口通讯用的那个也是这个核心
原生支持 USB口通讯
可以 ...
好像官方无出过这型号,而且好像模拟口少了几个哦 本帖最后由 Alex.CK 于 2014-11-20 18:41 编辑
我一直想知道这个keybord 库除了常用的KEY, 怎么添加其它的功能键, 比如本本上的 Fn 键,有些机械键盘上的 多功能键?(这些键盘的生产产家,都没有安装第3方驱动。应该 HID 底层就有) 比如我的本本上 Fn + 下 播放音乐。 布列松 发表于 2014-11-20 17:40 static/image/common/back.gif
好像官方无出过这型号,而且好像模拟口少了几个哦
一般来说 模拟口用不了那么多滴。
而且可以用多片单片机组成一个大的系统
目前有成品的飞行手柄系统的板子 用的就是32U4 可以实现 X+Y+Z+ 油门 +100个按键 2块32u4
XY是坐标值 Z是旋转值 100个按键 基本上扩展一个全键盘出来了 很吓人
页:
[1]
2