簡介
USBKeyboard 是專門為 darran Arduino UNO Keyboard HID 而寫的一個 library。有了 USBKeyboard library,要讓 Arduino 送出鍵盤敲擊動作 (keystrokes) 給電腦會變得很簡單。我假設你已經學會「如何讓 Arduino Uno 進入 DFU mode」而且也已經知道「如何用 FLIP 更新 Atmega8u2 的韌體」,並且已讀過文後的參考資料。
安裝
USBKeyboard library 可以在底下的網址取得:
安裝方法很簡單,把檔案解壓縮放到 Arduino 速寫簿 (Sketchbook) 資料夾的 Libraries 資料夾底下或 arduino-00xx\libraries 資料夾下即可。Arduino 速寫簿 (Sketchbook) 資料夾的預設位置是在「我的文件 > Arduino」這個地方。
範例
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:
你好,我的電腦每次執行完程式之後,鍵盤都會出現問題...
回覆刪除有時候整個鍵盤都無法使用,有時候是幾個鍵偵測不到,請問這樣是什麼問題呢?
程式執行都很順利,但是結束之後卻會讓電腦鍵盤故障...
跑完這篇的範例後鍵盤就會故障嗎?還是你有改過程式碼?
回覆刪除我之前是在 Windows XP 上測試的,我不曉得在其它作業系統相不相容。
我的電腦是win7
回覆刪除有改過程式 不過都是像範例這樣簡單的幾行程式而以
Sorry, 我也不曉得是哪邊的問題
回覆刪除USB 通訊比較複雜,一不小心就會造成通訊異常
我想可能需要多做一些實驗才行
恩 好的 還是謝謝你喔^^
回覆刪除看了你的文章受益良多~^^
忘了說,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
請問一下版主
回覆刪除您的文章的確讓我這個ARDUINO新手獲益良多。
這篇文章的方法的確能簡化程式編譯不少
非常吸引我
目前我的計畫是結合RFID系統能夠在電腦輸入文字
看完這篇文章我有個小問題
您文章中沒有明寫出來
但是不是要先把程式碼寫入ARDUINO中後
還要接著把 Arduino 切到 DFU mode
用 FLIP 把 Arduino-keyboard-0.3.hex 燒錄到 atmega8u2 晶片上
然後重新插拔 Arduino 的電源
還有如果要重新修改ARDUINO中的程式碼要把atmega8u2晶片寫回Arduino-usbserial-uno.hex嗎?
還是可以直接用ARDUINO IDE程式上載程式碼?
幾個問題麻煩您了
新年快樂
你說的沒錯,當你要上傳程式到 Arduino 時,要先把 atmega8u2 晶片寫回 Arduino-usbserial-uno.hex,等上傳完後再把 Arduino-keyboard-0.3.hex 寫到 atmega8u2
回覆刪除