|
鍵盤作為經典的輸入設備,使用在很多互動中都有特別的優勢,比如我們可以通過鍵盤直接給flash傳遞按鍵事件。而無需通過串口之類的特殊接口,雖然我們可以拆一個傳統的鍵盤,然后將里面的按鍵引出來,但是這樣有一個缺點,就是鍵值不能動態改變并且不能一次多鍵。使用模擬鍵盤的話,我們就可以隨意在程序設置按鍵的時間和鍵值。比如本文的例子就是按下一個按鍵,模擬鍵盤就在電腦輸入“HELLO WORLD”。
硬件部分:
材料清單:
Arduino x1
68Ω電阻 x2 (沒有68Ω的話,用50~100Ω電阻也行)
2.2kΩ電阻 x1 (沒有2.2kΩ的話,用1.5k~2.2k電阻也行)
USB連接線(一端是USB口,另一端是電線) x1
3.6v 穩壓管(建議選用功耗0.25~0.5w的)x2
電路原理圖:
電路圖解說:
1、兩個68Ω的電阻起到限流和保護作用,防止在意外情況下損壞計算機的USB端口或單片機的端口。
2、2.2kΩ電阻是上拉電阻,用于分辨總線狀態。如果上拉電阻接于D+和+5v端則是高速USB設備,接于D-與+5v端,則是低速設備。此處鍵盤傳輸速率不高,接到D-作為低速設備即可。
3、D+和D-上的3.6V穩壓二極管D1和D2起到限制數據線上的電平的作用。因為在USB規范中規定數據線D+和D-上的電平范圍是3.0V至3.6V,而AVR單片機的輸出電平是Vcc。如果單片機的Vcc是5V,在沒有D1和D2的情況下將造成電平不匹配,會造成在很多計算機中無法正確識別出USB設備。如果用戶系統的Vcc在3.0V至3.6V之間,就可以省略這兩個穩壓二極管。從這里也可以看出用戶系統的Vcc必須高于3V。
4、由于低速AVRUSB所需要的是1.5MHz時鐘,而單片機每8條指令就能精確完成一個數據位的采集。所以AVRUSB最小單片機時鐘頻率是12MHz。并且可以使用的時鐘頻率有12MHz、12.8MHz、15MHz、16MHz、16.5MHz、20MHz,其他的不支持。所以如果使用最小系統制作此模擬鍵盤的話8MHz的話,ATMega8L不能用。
————————
軟件部分:
Arduino支持庫文件:
UsbKeyboard.zip
(112.45 KB, 下載次數: 52)
2016-4-18 01:12 上傳
點擊文件名下載附件
文件下載后解壓到arduino編譯器的libraries文件夾下面。
注意:
1、UsbKeyboard庫中,usbconfig.h里面可以更改USB接線的引腳定義,下面給出一個大概解釋(下面的PORTD是指AVR單片機的PORTD,要查詢Arduino原理圖:
Arduino_Uno_Rev3-schematic.pdf
(81.39 KB, 下載次數: 15)
2016-4-18 01:13 上傳
點擊文件名下載附件
才能得到是Arduino的哪個引腳):
#define USB_CFG_IOPORTNAME D | USB輸入輸出引腳使用AVR單片機的PORTD,如果改成B就是使用PORTB | #define USB_CFG_DMINUS_BIT 4 | USB的D-接PORTD的第四位PD4,對應Arduino D4 | #define USB_CFG_DPLUS_BIT 2 | USB的D+接PORTD的第二位PD2,對應Arduino D2 | #define USB_CFG_PULLUP_IOPORTNAME D | USB上拉引腳使用AVR單片機的PORTD,如果改成B就是使用PORTB | #define USB_CFG_PULLUP_BIT 5 | USB的上拉電阻接PORTD的第五位PD5,對應Arduino D5 |
2、在UsbKeyboard庫的UsbKeyboard.h里面,有關于模擬鍵值的表
#define KEY_A 4
#define KEY_B 5
#define KEY_C 6
#define KEY_D 7
#define KEY_E 8
等。但不齊全。經過測試,其實這個鍵盤基本可以模擬幾乎所有鍵值(Power,Sleep,Pause似乎不能)。
比如方向鍵右左下上分別對應79,80,81,82數字。即寫成
UsbKeyboard.sendKeyStroke(79);
UsbKeyboard.sendKeyStroke(81);
等。由于整理比較麻煩,大家可以自己下載個KeyboardTest軟件測試不同數字下面的鍵值。
程序示例:
下面的例子演示了用Arduino虛擬鍵盤的應用例子。打開記事本,然后將Arduino的D12引腳和GND連起來,就會打印HELLO WORLD字樣。
- /*
- Arduino模擬鍵盤 by Ansifa
- 2012.6.8
-
- 功能描述:插上此模擬鍵盤,打開記事本,然后按下按鈕,即可在記事本打印出HELLO WORLD字樣
-
- 接線方法:
- Arduino D2接68Ω電阻后,接USB線D+
- Arduino D4接68Ω電阻后,接USB線D-
- Arduino D5接2.2kΩ電阻后,接USB線D-
- Arduino D2接3.6v穩壓管到GND
- Arduino D4接3.6v穩壓管到GND
- +5v接USB線VCC
- GND接USB線GND
- Arduino D1接一個開關到GND
-
- 附:USB線序顏色(由于各生產廠不同,不一定準確,僅供參考)
- *USB鍵鼠: | *USB接口
- 白<->VCC | 紅<->VCC
- 橙<->D- | 白<->D-
- 綠<->D+ | 綠<->D+
- 藍<->GND | 黑<->GND
-
- */
-
- #include "UsbKeyboard.h"
- int KEYPIN = 1; //按鍵接在D1引腳,也可以改成任何引腳
- void setup()
- {
- TIMSK0 &= !(1 << TOIE0); //
- pinMode(KEYPIN, INPUT);
- digitalWrite(KEYPIN, HIGH);
- }
- void loop()
- {
- UsbKeyboard.update();
- if(digitalRead(KEYPIN) == HIGH)
- {
- delay(100);
- if(digitalRead(KEYPIN) == LOW)
- {
- UsbKeyboard.sendKeyStroke(KEY_H);
- UsbKeyboard.sendKeyStroke(KEY_E);
- UsbKeyboard.sendKeyStroke(KEY_L);
- UsbKeyboard.sendKeyStroke(KEY_L);
- UsbKeyboard.sendKeyStroke(KEY_O);
- UsbKeyboard.sendKeyStroke(KEY_SPACE);
- UsbKeyboard.sendKeyStroke(KEY_W);
- UsbKeyboard.sendKeyStroke(KEY_O);
- UsbKeyboard.sendKeyStroke(KEY_R);
- UsbKeyboard.sendKeyStroke(KEY_L);
- UsbKeyboard.sendKeyStroke(KEY_D);
- UsbKeyboard.sendKeyStroke(KEY_ENTER);
- }
- }
- }
復制代碼
注意,先插上Arduino數據線,將程序寫入Arduino。然后拔掉數據線,將模擬鍵盤USB線接到電腦,即可使用。
下面隨便點實物圖
剛焊好的正反面
插數據線寫程序進Arduino:
|
|