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