使用arduino uno做一个简单的windows切屏器(arduino自定义键盘)

写在前面

作为一个windows10的重度用户,基本每天都要和它打交道,无论是画图建模还是打代码。同时在如今屏幕大小象征生产力,按键数量代表战斗力的时代,我也是一直在努力提升自己的战斗力。
比如我的屏幕就从一个21寸的小屏幕换成了21:9的带鱼屏,然后鼠标也是g502和各种各样的轨迹球换了一圈,不过这些鼠标都是有一个共同的特点,就是自定义按键多,最多的甚至有12个自定按键。不过作为一个重度快捷键使用者,巴不得自己所有操作 ,都可以有一个快捷键一键实现。
比如我的快捷桌面就使用rolan 2 ,通过alt+space 直接呼出,鼠标上什么ctrl、shift、alt、delete、ctrl+c、ctrl+v、前进后退、win+tab..... 然后这一波下来,鼠标上的键位根本就不够用了。同时windows10有一个我非常中意的功能就是可以设置多个界面,然后可以直接进行左右切屏,这也是我很高频的操作,因为切屏的过程中,有一种说不出的快感,感觉自己在做一件非常高级的事情。当然排出这种感觉,更多的桌面会很直接的提升效率。不过这个切屏的操作,在触摸板上4指滑动就可以很方便,但是在外接键盘鼠标的情况下,切屏竟然要令人发指的3个按键,ctrl+win+左右,这就意味着你在切屏的时候,你的双手必须同时操作,这也就让本来很快乐的切屏,变得不快乐了,但是就这么3个按键的编辑,竟然很多鼠标的硬件宏不支持,而且编到鼠标上,有时候也很容易产生误触,所以出于自己使用的角度,我决定自己去动手,做一个专门给windows切屏的键盘。

所需要的材料

关于arduino做键盘,很多教程都是用arduino arduino leonardo去实现,因为arduino leonardo 已经有一个可以直接使用的keyborad的库,用起来很方便。不过我手上一时也没有arduino leonardo(pro mini也可以的)只有几块uno和nano。实际上已经有人针对uno也开发了一套键盘事件的库叫做USBkeyborad。只需要重新针对arduino烧写bootloader,就可以了。
这样一来,材料实际上很简单

  • arduino uno x1
  • 数据线x1
  • 按键、面包板、杜邦线若干

基本上就是最基本的配置了。然后你需要下载所需的一些软件(Filp 以及arduino对应的库)
由于flip需要注册后才能下载,而且网上大多数的安装包不带java环境,容易报错。同时默认USBkeyborad的库里面按键没有直接定义ctrl、alt、shift、win键,所以我根据HID键盘的codes,自己补全了这个这个按键的定义。整体打包如下:链接 提取码:sex6 ,下载下来,导入库,安装好filp。

Let's do it

上面都准备好了之后,首先就要把我们的程序烧进去。

#include <USBKeyboard.h>

void setup() 
{
  //初始化
  Keyboard.init();
  //设置A0,A1上拉输入,作为按键接口
  pinMode(A0,INPUT_PULLUP);
  pinMode(A1,INPUT_PULLUP);
  //按键指示灯,初始化阶段先亮2S
  pinMode(13, OUTPUT);
  digitalWrite(13, HIGH);
  delay(2000);
  digitalWrite(13, LOW);
}

void loop() 
{
  if(digitalRead(A0)==0){
  Keyboard.sendKeyStroke(80,(0x09));//按下ctrl+win+左
  digitalWrite(13, HIGH);
  delay(200);
  digitalWrite(13, LOW);
  }
  else if(digitalRead(A1)==0){
  Keyboard.sendKeyStroke(79,(0x09));//按下ctrl+win+右
  digitalWrite(13, HIGH);
  delay(200);
  digitalWrite(13, LOW);
  }
  delay(100);
}

关于这个库其实很容易理解sendKeyStroke函数,发送对应的按键,不过关键的是modifiers,通过对modifiers定义同时按下ctrl或者win键

  void sendKeyStroke(byte keyStroke, byte modifiers) {
    uint8_t keyNone[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };    
    uint8_t sendKey[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
    sendKey[0] = modifiers;
    sendKey[2] = keyStroke;
    Serial.write(sendKey, 8);          // Keycode 6  
  
    Serial.write(keyNone, 8);    // Release Key   
  }

在keycodes文件里面给出了modifiers的定义

#define MOD_CONTROL_LEFT    (1<<0)
#define MOD_SHIFT_LEFT      (1<<1)
#define MOD_ALT_LEFT        (1<<2)
#define MOD_GUI_LEFT        (1<<3)
#define MOD_CONTROL_RIGHT   (1<<4)
#define MOD_SHIFT_RIGHT     (1<<5)
#define MOD_ALT_RIGHT       (1<<6)
#define MOD_GUI_RIGHT       (1<<7)

所以sendKeyStroke(KEY_C, MOD_CONTROL_LEFT)就是发送ctrl+c,不过如果要发送ctrl+win呢,实际上就是把modifiers上对应的值加起来,也就是1<<0+1<<3,那1<<0是多少呢?就是1*2^0=1,然后写成二进制就是0000 0001,1<<3就是 0000 1000,所以这两个加起来就是00001001,这个modifiers值就是两个按键一起按下了。转换成16进制就是0x09。就是这个问题也是困扰了我2个小时,如何按下。如果要更加详细的了解得去看一下HID键盘事件的数据格式了。可以参考一下后面的资料。


然后把两个按键接到A0 A1,因为用了内部上拉,所以也不需要外接电阻了。



然后就是让arduino uno进入DFU模式,这样我们就可以烧入新的bootloader,使得PC直接将arduino uno看作一个HID 键盘了。


  • 保持usb连接到电脑的时候,直接短接图上引脚,即可听见系统叮咚一声音,arduino变成了未知设备。
  • 在设备管理器中手动更新驱动,将目录选择到Flip的目录 C:\Program Files (x86)\ATMEL\Flip 3.4.7\usb 安装即可
  • 打开flip软件,首先选择芯片的类型,然后在File里导入下载文件里的Arduino-keyboard-0.3.hex,打开USB,12345点一遍,完成烧写。这个时候重新连接就完成可以用拉!

    注意,烧写Arduino-keyboard-0.3.hex是将arduino变成了键盘,这样就不能上传程序了,所以如果要更新程序,就需要重新把Arduino-usbserial-uno.hex烧回去。
    这样一来,就可以快乐的翻页了!

*参考资料
arduino变hid设备(键盘)
Arduino UNO R3 软件实现HID键盘功能
HID Key codes
DIY键盘教程(arduino leonardo)无声音带字幕

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 148,637评论 1 318
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 63,443评论 1 266
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 99,164评论 0 218
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,075评论 0 188
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,080评论 1 266
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,365评论 1 184
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,901评论 2 283
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,649评论 0 176
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,122评论 0 223
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,734评论 2 225
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,093评论 1 236
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,548评论 2 222
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,028评论 3 216
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,765评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,291评论 0 178
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,162评论 2 239
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,293评论 2 242

推荐阅读更多精彩内容