2011年11月26日 星期六

USBKeyboard Library

簡介

USBKeyboard 是專門為 darran Arduino UNO Keyboard HID 而寫的一個 library。有了 USBKeyboard library,要讓 Arduino 送出鍵盤敲擊動作 (keystrokes) 給電腦會變得很簡單。我假設你已經學會「如何讓 Arduino Uno 進入 DFU mode」而且也已經知道「如何用 FLIP 更新 Atmega8u2 的韌體」,並且已讀過文後的參考資料。

安裝

USBKeyboard library 可以在底下的網址取得:

https://github.com/coopermaa/USBKeyboard

安裝方法很簡單,把檔案解壓縮放到 Arduino 速寫簿 (Sketchbook) 資料夾的 Libraries 資料夾底下或 arduino-00xx\libraries 資料夾下即可。Arduino 速寫簿 (Sketchbook) 資料夾的預設位置是在「我的文件 > Arduino」這個地方。

image

範例

1) 要用 USBKeyboard 送出按鍵敲擊動作 (keystrokes),最簡單的方法是呼叫 Keyboard.print(),用法就跟 Serial.print() 一樣,差別只在 Keyboard.print() 印出的訊息會變成按鍵敲擊動作 (keystrokes)。你可以用它印出英文字串、數字、標點符號等。

底下是 hello world 範例,程式每隔 5 秒鐘會送出 "hello world" 的 keystrokes 給電腦,你可以拿它跟原版 Arduino Uno Keyboard 的寫法做個比較,你會發現程式寫法簡單多了:

2) 要送出單一個按鍵敲擊動作,你可以用 Keyboard.print(),也可以選擇用 Keyboard.sendKeyStroke()。底下這支程式改寫自「送出按鍵敲擊動作 (Send a keystroke)」一文的範例,程式每隔 3 秒鐘會送出一個小寫英文字母 a 給電腦。

下表是標準鍵盤的 Key Code Table:

Key Code
KEY_A KEY_B KEY_C KEY_D KEY_E
KEY_F KEY_G KEY_H KEY_I KEY_J
KEY_K KEY_L KEY_L KEY_M KEY_N
KEY_O KEY_P KEY_Q KEY_R KEY_S
KEY_T KEY_U KEY_V KEY_W KEY_X
KEY_Y KEY_Z KEY_1 KEY_2 KEY_3
KEY_4 KEY_5 KEY_6 KEY_7 KEY_8
KEY_9 KEY_0 KEY_ENTER KEY_ESCAPE KEY_BACKSPACE
KEY_TAB KEY_SPACE KEY_MINUS KEY_EQUALS KEY_LBRACKET
KEY_RBRACKET KEY_BACKSLASH KEY_NONUS_NUMBER KEY_SEMICOLON KEY_QUOTE
KEY_TILDE KEY_COMMA KEY_PERIOD KEY_SLASH KEY_CAPSLOCK
KEY_F1 KEY_F2 KEY_F3 KEY_F4 KEY_F5
KEY_F6 KEY_F7 KEY_F8 KEY_F9 KEY_F10
KEY_F11 KEY_F12 KEY_PRNTSCRN KEY_SCROLLLOCK KEY_PAUSE
KEY_INSERT KEY_HOME KEY_PAGEUP KEY_DELETE KEY_END
KEY_PAGEDOWN KEY_RIGHT_ARROW KEY_LEFT_ARROW KEY_DOWN_ARROW KEY_UP_ARROW
KEY_NUM_LOCK _

如果要送出大寫字母,只需在 Keyboard.sendKeyStroke() 第二個參數上加上 SHIFT 組合鍵,用 MOD_SHIFT_LEFT 或 MOD_SHIFT_RIGHT 都可以,像這樣:

底下這張是組合鍵對照表 (Modifier Keys Table)

Key Code
MOD_CONTROL_LEFT MOD_SHIFT_LEFT MOD_ALT_LEFT MOD_GUI_LEFT MOD_CONTROL_RIGHT
MOD_SHIFT_RIGHT MOD_ALT_RIGHT MOD_GUI_RIGHT _ _

3) 跟原先的的寫法比起來,讀取鍵盤燈號狀態的寫法變得更簡單了,你只要呼叫 Keyboard.readLedStatus() 就可以取得鍵盤燈號的狀態。以下是改寫自「讀取鍵盤燈號狀態 」的範例,程式的邏輯仍然一樣,每 100 mS 讀取一次鍵盤燈號狀態,然後判斷 Caps Lock 有沒被按下,有的話就打開 pin 13 上的 led,否則就關掉 pin 13 上的 led:

參考資料

8 意見:

Unknown 提到...

你好,我的電腦每次執行完程式之後,鍵盤都會出現問題...
有時候整個鍵盤都無法使用,有時候是幾個鍵偵測不到,請問這樣是什麼問題呢?
程式執行都很順利,但是結束之後卻會讓電腦鍵盤故障...

Cooper Maa 提到...

跑完這篇的範例後鍵盤就會故障嗎?還是你有改過程式碼?

我之前是在 Windows XP 上測試的,我不曉得在其它作業系統相不相容。

Unknown 提到...

我的電腦是win7
有改過程式 不過都是像範例這樣簡單的幾行程式而以

Cooper Maa 提到...

Sorry, 我也不曉得是哪邊的問題
USB 通訊比較複雜,一不小心就會造成通訊異常
我想可能需要多做一些實驗才行

Unknown 提到...

恩 好的 還是謝謝你喔^^
看了你的文章受益良多~^^

Cooper Maa 提到...

忘了說,Uno 的 USB 通訊是由另一顆 MCU 負責的,因為要更新功能兩顆 MCU 的韌體都得更換,會比較麻煩

如果你有 Arduino Leonardo,建議你用看看.Leonardo 只有一顆 MCU,MCU 內建 USB,而且官方有提供 Mouse & Keyboard library,有經過測試,應該會比較有品質穩定些。

底下有一些資料,你參考看看:

http://arduino.cc/en/Main/arduinoBoardLeonardo
http://arduino.cc/en/Reference/MouseKeyboard

Edward Chen 提到...

請問一下版主
您的文章的確讓我這個ARDUINO新手獲益良多。
這篇文章的方法的確能簡化程式編譯不少
非常吸引我
目前我的計畫是結合RFID系統能夠在電腦輸入文字

看完這篇文章我有個小問題
您文章中沒有明寫出來
但是不是要先把程式碼寫入ARDUINO中後
還要接著把 Arduino 切到 DFU mode
用 FLIP 把 Arduino-keyboard-0.3.hex 燒錄到 atmega8u2 晶片上
然後重新插拔 Arduino 的電源

還有如果要重新修改ARDUINO中的程式碼要把atmega8u2晶片寫回Arduino-usbserial-uno.hex嗎?
還是可以直接用ARDUINO IDE程式上載程式碼?

幾個問題麻煩您了
新年快樂

Cooper Maa 提到...

你說的沒錯,當你要上傳程式到 Arduino 時,要先把 atmega8u2 晶片寫回 Arduino-usbserial-uno.hex,等上傳完後再把 Arduino-keyboard-0.3.hex 寫到 atmega8u2