模擬鍵盤輸入信息
本示例將演示使用Arduino Leonardo模擬USB鍵盤輸出信息。
[sf]
要直接模擬鍵盤輸入信息很簡單,只需使用Keyboard.print() 或者Keyboard.println() 即可。這里我們要做個(gè)文本發(fā)送器,每按一次按鍵,輸入一條信息。
實(shí)驗(yàn)連接示意圖如圖9-1所示,在2號(hào)引腳上連接了一個(gè)10K上拉電阻,如果你使用的是按鍵模塊,那你可能需要將對應(yīng)引腳口設(shè)置開啟內(nèi)部上拉電阻。
模擬鍵盤輸入實(shí)驗(yàn)連接示意圖
示例程序如下,你可以在文件>示例>09.USB>Keyboard>KeyboardMessage找到該程序。
#include "Keyboard.h"
const int buttonPin = 4; // 按鍵連接引腳
int previousButtonState = HIGH; // 之前按鍵狀態(tài)
int counter = 0; // 按鍵計(jì)數(shù)器
void setup() {
// 初始化按鍵引腳,如果沒有上拉電阻,需要使用INPUT_PULLUP
pinMode(buttonPin, INPUT);
// 初始化模擬鍵盤功能
Keyboard.begin();
}
void loop() {
// 讀按鍵狀態(tài)
int buttonState = digitalRead(buttonPin);
// 如果按鍵狀態(tài)改變,且當(dāng)前按鍵狀態(tài)為高電平
if ((buttonState != previousButtonState) && (buttonState == HIGH)) {
// 按鍵計(jì)數(shù)器加1
counter++;
// 模擬鍵盤輸出信息
Keyboard.print("You pressed the button ");
Keyboard.print(counter);
Keyboard.println(" times.");
}
// 保存當(dāng)前按鍵狀態(tài),用于下一次比較
previousButtonState = buttonState;
}
下載程序后,選擇一個(gè)可以輸入文本的輸入框,按下按鍵,你可以看到文本框中隨即出現(xiàn)了“You pressed the button 1 times.”文本,再次按下按鍵,程序中計(jì)數(shù)器會(huì)將數(shù)字加1,因此你會(huì)看到“You pressed the button 2 times.”文本。
9.2.1 Arduino Leonardo在模擬USB設(shè)備后,無法正常下載程序。
當(dāng)用Arduino Leonardo模擬鼠標(biāo)鍵盤時(shí),鍵盤鼠標(biāo)可能會(huì)出現(xiàn)失靈亂跳的情況,這往往是因?yàn)槌绦蛑袑?yīng)控制按鍵操作的I/O口懸空所致。當(dāng)I/O懸空時(shí),檢測到的輸入電平為不定值,可能會(huì)誤觸發(fā)鼠標(biāo)鍵盤操作。你可以通過pinMode(pin,INPUT_PULLUP) 語句開啟對應(yīng)引腳上的內(nèi)部上拉電阻,或者外接上下拉電阻,讓懸空時(shí)引腳檢測到的電平穩(wěn)定。本示例中即是通過給按鍵外接上拉電阻,確保按鍵未按下時(shí)I/O能讀到高電平。
在模擬USB設(shè)備后,USB口處于USB通信狀態(tài),此時(shí)可能無法正確下載程序,解決方法如下:
按住Arduino Leonardo上的復(fù)位按鍵不放,點(diǎn)擊上傳,等待IDE編譯,待Arduino提示上傳中時(shí),放開復(fù)位按鈕,等待完成下載。
更推薦的方法是,給USB設(shè)備模擬程序都添加一個(gè)按鍵開關(guān),當(dāng)點(diǎn)擊這個(gè)按鍵開關(guān)后,Arduino才開始模擬USB設(shè)備。
模擬鍵盤組合按鍵
以下程序,可以將Arduino Leonardo模擬成鍵盤,通過觸發(fā)2號(hào)引腳上連接的按鍵或者傳感器,可以讓你的計(jì)算機(jī)自動(dòng)注銷登錄狀態(tài)。
[sf]
實(shí)現(xiàn)原理即是使用當(dāng)前系統(tǒng)對應(yīng)的快捷鍵功能,先通過Keyboard.press() 將需要使用的按鍵都選中,然后使用Keyboard.releaseAll() 釋放按鍵,即可模擬鍵盤同時(shí)按下組合按鍵的效果。
在示例程序中,我們將通過以上方法模擬組合按鍵按下效果,以達(dá)到注銷登錄狀態(tài)的目的。
你可以在文件>示例>09.USB>Keyboard>Keyboard Logout找到該程序。
#define OSX 0
#define WINDOWS 1
#define UBUNTU 2
// 設(shè)置你的操作系統(tǒng)
int platform = WINDOWS;
void setup() {
// 將2號(hào)引腳設(shè)置為輸入狀態(tài)
// 并開啟內(nèi)部上拉電阻
pinMode(2, INPUT_PULLUP);
Keyboard.begin();
}
void loop() {
while (digitalRead(2) == HIGH) {
// 等待2號(hào)引腳變成低電平
delay(500);
}
delay(1000);
switch (platform) {
case OSX:
Keyboard.press(KEY_LEFT_GUI);
// Shift+Q組合按鍵
Keyboard.press(KEY_LEFT_SHIFT);
Keyboard.press('Q');
delay(100);
Keyboard.releaseAll();
// 回車確認(rèn):
Keyboard.write(KEY_RETURN);
break;
case WINDOWS:
// CTRL+ALT+DEL組合按鍵
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_DELETE);
delay(100);
Keyboard.releaseAll();
// ALT+L組合按鍵:
delay(2000);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press('l');
Keyboard.releaseAll();
break;
case UBUNTU:
// CTRL+ALT+DEL組合按鍵
Keyboard.press(KEY_LEFT_CTRL);
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_DELETE);
delay(1000);
Keyboard.releaseAll();
// 回車鍵確認(rèn)登出
Keyboard.write(KEY_RETURN);
break;
}
// 進(jìn)入死循環(huán),相當(dāng)于結(jié)束程序
while(true);
}
每種系統(tǒng)的對應(yīng)的快捷鍵均不一樣,因此,下載該程序前,你需要先將程序設(shè)置為你對應(yīng)的系統(tǒng),這里使用了宏定義來實(shí)現(xiàn)直接將系統(tǒng)名稱賦值給一個(gè)變量的效果。
#define OSX 0
#define WINDOWS 1
#define UBUNTU 2
// 設(shè)置你的操作系統(tǒng)
int platform = WINDOWS;
下載并運(yùn)行程序,通過觸發(fā)2號(hào)引腳上的按鍵或者傳感器,當(dāng)2號(hào)引腳讀到低電平時(shí),即會(huì)觸發(fā)計(jì)算機(jī)執(zhí)行注銷當(dāng)前用戶的操作。
承擔(dān)因您的行為而導(dǎo)致的法律責(zé)任,
本站有權(quán)保留或刪除有爭議評(píng)論。
參與本評(píng)論即表明您已經(jīng)閱讀并接受
上述條款。