在看過前兩篇文章後,相信你已經學會「如何讓 Arduino Uno 進入 DFU mode」而且也已經知道「如何用 FLIP 更新 Atmega8u2 的韌體 」。接下來我們來玩 Arduino Keyboard,我們將使用 darran 所寫的 Arduino UNO Keyboard HID 並且試著跑一支範例程式讓 Arduino 送出按鍵敲擊動作 (Keystroke) 給電腦。
準備設備
你需要一張 Arduino Uno 或是 Mega 2560 的板子,還有一條單蕊線:
▲ 用單蕊線主要目的是把 Arduino 切到 DFU mode
下載
請連到底下的網址取得 Arduino Keyboard 韌體:
下載解壓縮後,把 Arduino-keyboard 資料夾放到 Arduino 速寫簿 (Sketchbook) 資料夾底下。Arduino 速寫簿 (Sketchbook) 資料夾的預設位置是在「我的文件 > Arduino」這個地方。
Arduino-keyboard 資料夾的內容如下:
編譯與執行
1) 打開 Arduino IDE, 載入 "File > Sketchbook > Arduino-keyboard > helloworld" 然後把程式上傳到 Arduino 板子上:
底下是 helloworld 範例的完整程式碼:
2) 把 Arduino 切到 DFU mode,用 FLIP 把 Arduino-keyboard-0.3.hex 燒錄到 atmega8u2 晶片上,然後重新插拔 Arduino 的電源。如下圖,這時候「裝置管理員」視窗裏會多出一個「USB 人性化介面裝置」:
3) 最後打開任何一個編輯器 (例如記事本),你就會看到記事本視窗上每 5 秒鐘就會多出一個 "hello world" 的字串,這些就是 Arduino 透過 USB 送給電腦的按鍵敲擊動作 (keystrokes):
3 意見:
buf[2] = *chp - 'a' + 4;
為什麼要 "+4"??
好問題!
是這樣的,HID Usage Tables 這份文件定義了鍵盤的所有 keycodes,寫在第 10 章裏。HID Usage Tables 連結:
http://www.usb.org/developers/devclass_docs/Hut1_12v2.pdf
跳到第 53 頁,這頁的 Table 12 就是 keycodes table。你看一下 table 12,就會發現英文字母是從 4 開始定義的,這就是為什麼要 "+4" 的原因
USB 通訊的技術成份比較高
本來我預期應該是不會收到網友的回應說
沒想到你這麼用功,有點令我驚訝 :)
除了處理 keycode 的對應外 (mapping)
另一個要注意的地方是下面這三行:
buf[0] = 0;
buf[2] = 0;
Serial.write(buf, 8); // Release key
這三行會送出一個 keyNone 的 keystroke,目的是讓電腦以為按鍵已經放開,不然的話,電腦會一直收到 keystroke,會停不下來喔.
PS: keyNone 也就是 keycode table 的第一個 keycode 0
張貼留言