寫在前面
作為一個windows10的重度用戶,基本每天都要和它打交道,無論是畫圖建模還是打代碼。同時在如今屏幕大小象征生產(chǎn)力,按鍵數(shù)量代表戰(zhàn)斗力的時代,我也是一直在努力提升自己的戰(zhàn)斗力。
比如我的屏幕就從一個21寸的小屏幕換成了21:9的帶魚屏,然后鼠標(biāo)也是g502和各種各樣的軌跡球換了一圈,不過這些鼠標(biāo)都是有一個共同的特點,就是自定義按鍵多,最多的甚至有12個自定按鍵。不過作為一個重度快捷鍵使用者,巴不得自己所有操作 ,都可以有一個快捷鍵一鍵實現(xiàn)。
比如我的快捷桌面就使用rolan 2 ,通過alt+space 直接呼出,鼠標(biāo)上什么ctrl、shift、alt、delete、ctrl+c、ctrl+v、前進(jìn)后退、win+tab..... 然后這一波下來,鼠標(biāo)上的鍵位根本就不夠用了。同時windows10有一個我非常中意的功能就是可以設(shè)置多個界面,然后可以直接進(jìn)行左右切屏,這也是我很高頻的操作,因為切屏的過程中,有一種說不出的快感,感覺自己在做一件非常高級的事情。當(dāng)然排出這種感覺,更多的桌面會很直接的提升效率。不過這個切屏的操作,在觸摸板上4指滑動就可以很方便,但是在外接鍵盤鼠標(biāo)的情況下,切屏竟然要令人發(fā)指的3個按鍵,ctrl+win+左右,這就意味著你在切屏的時候,你的雙手必須同時操作,這也就讓本來很快樂的切屏,變得不快樂了,但是就這么3個按鍵的編輯,竟然很多鼠標(biāo)的硬件宏不支持,而且編到鼠標(biāo)上,有時候也很容易產(chǎn)生誤觸,所以出于自己使用的角度,我決定自己去動手,做一個專門給windows切屏的鍵盤。
所需要的材料
關(guān)于arduino做鍵盤,很多教程都是用arduino arduino leonardo去實現(xiàn),因為arduino leonardo 已經(jīng)有一個可以直接使用的keyborad的庫,用起來很方便。不過我手上一時也沒有arduino leonardo(pro mini也可以的)只有幾塊uno和nano。實際上已經(jīng)有人針對uno也開發(fā)了一套鍵盤事件的庫叫做USBkeyborad。只需要重新針對arduino燒寫bootloader,就可以了。
這樣一來,材料實際上很簡單
- arduino uno x1
- 數(shù)據(jù)線x1
- 按鍵、面包板、杜邦線若干
基本上就是最基本的配置了。然后你需要下載所需的一些軟件(Filp 以及arduino對應(yīng)的庫)
由于flip需要注冊后才能下載,而且網(wǎng)上大多數(shù)的安裝包不帶java環(huán)境,容易報錯。同時默認(rèn)USBkeyborad的庫里面按鍵沒有直接定義ctrl、alt、shift、win鍵,所以我根據(jù)HID鍵盤的codes,自己補(bǔ)全了這個這個按鍵的定義。整體打包如下:鏈接 提取碼:sex6 ,下載下來,導(dǎo)入庫,安裝好filp。

Let's do it
上面都準(zhǔn)備好了之后,首先就要把我們的程序燒進(jìn)去。
#include <USBKeyboard.h>
void setup()
{
//初始化
Keyboard.init();
//設(shè)置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);
}
關(guān)于這個庫其實很容易理解sendKeyStroke函數(shù),發(fā)送對應(yīng)的按鍵,不過關(guān)鍵的是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)就是發(fā)送ctrl+c,不過如果要發(fā)送ctrl+win呢,實際上就是把modifiers上對應(yīng)的值加起來,也就是1<<0+1<<3,那1<<0是多少呢?就是1*2^0=1,然后寫成二進(jìn)制就是0000 0001,1<<3就是 0000 1000,所以這兩個加起來就是00001001,這個modifiers值就是兩個按鍵一起按下了。轉(zhuǎn)換成16進(jìn)制就是0x09。就是這個問題也是困擾了我2個小時,如何按下。如果要更加詳細(xì)的了解得去看一下HID鍵盤事件的數(shù)據(jù)格式了??梢詤⒖家幌潞竺娴馁Y料。

然后把兩個按鍵接到A0 A1,因為用了內(nèi)部上拉,所以也不需要外接電阻了。

然后就是讓arduino uno進(jìn)入DFU模式,這樣我們就可以燒入新的bootloader,使得PC直接將arduino uno看作一個HID 鍵盤了。

- 保持usb連接到電腦的時候,直接短接圖上引腳,即可聽見系統(tǒng)叮咚一聲音,arduino變成了未知設(shè)備。
- 在設(shè)備管理器中手動更新驅(qū)動,將目錄選擇到Flip的目錄 C:\Program Files (x86)\ATMEL\Flip 3.4.7\usb 安裝即可
- 打開flip軟件,首先選擇芯片的類型,然后在File里導(dǎo)入下載文件里的Arduino-keyboard-0.3.hex,打開USB,12345點一遍,完成燒寫。這個時候重新連接就完成可以用拉!
注意,燒寫Arduino-keyboard-0.3.hex是將arduino變成了鍵盤,這樣就不能上傳程序了,所以如果要更新程序,就需要重新把Arduino-usbserial-uno.hex燒回去。
這樣一來,就可以快樂的翻頁了!
*參考資料
arduino變hid設(shè)備(鍵盤)
Arduino UNO R3 軟件實現(xiàn)HID鍵盤功能
HID Key codes
DIY鍵盤教程(arduino leonardo)無聲音帶字幕

