最近手勢控制的筆記本電腦或計算機變得非常有名。這種技術稱為Leap運動,它使我們能夠通過簡單地在計算機/筆記本電腦前揮手來控制計算機/筆記本電腦上的某些功能。這樣做非常酷和有趣,但這些筆記本電腦的價格確實很高。因此,在這個項目中,讓我們嘗試通過結合Arduino和Python的強大功能來構建我們自己的手勢控制筆記本電腦/計算機。
我們將使用兩個超聲波傳感器來確定我們手的位置并根據位置控制媒體播放器 (VLC)。我已經使用它進行演示,但是一旦您了解了該項目,您只需更改幾行代碼并以您喜歡的方式控制您最喜歡的應用程序,您就可以做任何事情。
項目背后的概念:
該項目背后的概念非常簡單。我們將在顯示器頂部放置兩個超聲波(US)傳感器,并使用Arduino讀取顯示器和手之間的距離,根據此距離值,我們將執行某些操作。為了在我們的計算機上執行操作,我們使用Pythonpyautogui庫。來自Arduino的命令通過串行端口(USB)發送到計算機。然后,該數據將由計算機上運行的python讀取,并根據讀取的數據執行操作。
電路圖:
要使用手勢控制PC,只需將兩個超聲波傳感器與Arduino連接即可。我們知道美國傳感器使用 5V 工作,因此它們由 Arduino 的板載穩壓器供電。Arduino可以連接到PC /筆記本電腦,為模塊供電,也可以進行串行通信。連接完成后,將它們放在顯示器上,如下所示。我用雙面膠帶把它貼在我的顯示器上,但你可以發揮自己的創造力。將其固定在一個地方后,我們可以繼續進行編程。
對 Arduino 進行編程:
Arduino應該被編程為讀取手與美國傳感器的距離。本頁末尾給出了完整的程序;就在下面,我已經給出了該程序的解釋。如果您不熟悉超聲波傳感器,只需通過Arduino和超聲波傳感器基于距離測量。
通過讀取距離的值,我們可以到達某些要用手勢控制的動作,例如,在這個程序中,我已經編程了5 個動作作為演示。
操作 1:當兩只手都放在傳感器前的特定遠距離時,VLC播放器中的視頻應播放/暫停。
行動2:當右手放在傳感器前的特定遠距離時,視頻應快進一步。
行動3:當左手放在傳感器前的特定遠距離時,視頻應倒帶一步。
行動4:當右手放在傳感器前的特定近距離,然后如果向傳感器移動,視頻應快進,如果移開,視頻應倒帶。
行動5:當左手以特定的近距離放在傳感器之前,然后如果朝向傳感器移動,視頻的音量應該增加,如果移開,音量應該減小。
讓我們看看如何編寫程序來執行上述操作。因此,像所有程序一樣,我們從定義I / O引腳開始,如下所示。兩個美國傳感器連接到數字引腳2、3、4和5,由+5V引腳供電。觸發引腳是輸出引腳,回顯引腳是輸入引腳。
Arduino和python之間的串行通信以9600的波特率進行。
const int trigger1 = 2; //Trigger pin of 1st Sesnor
const int echo1 = 3; //Echo pin of 1st Sesnor
const int trigger2 = 4; //Trigger pin of 2nd Sesnor
const int echo2 = 5;//Echo pin of 2nd Sesnor
void setup() {
Serial.begin(9600);
pinMode(trigger1, OUTPUT);
pinMode(echo1, INPUT);
pinMode(trigger2, OUTPUT);
pinMode(echo2, INPUT);
}
在結束任何動作之前,我們需要每次計算傳感器和手之間的距離。所以我們必須做很多次,這意味著這段代碼應該作為一個函數使用。我們編寫了一個名為 calculate_distance() 的函數,它將返回傳感器和手之間的距離。
/*###Function to calculate distance###*/
void calculate_distance(int trigger, int echo)
{
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
time_taken = pulseIn(echo, HIGH);
dist= time_taken*0.034/2;
if (dist>50)
dist = 50;
}
在我們的主循環中,我們檢查距離的值并執行上述操作。在此之前,我們使用兩個變量 distL 和 distR,它們使用當前距離值進行更新。
calculate_distance(trigger1,echo1);
distL =dist; //get distance of left sensor
calculate_distance(trigger2,echo2);
distR =dist; //get distance of right sensor
由于我們知道兩個傳感器之間的距離,因此我們現在可以將其與預定義的值進行比較并得出某些操作。例如,如果兩只手都放在 40 mc 的距離,那么我們播放/暫停視頻。這里“播放/暫停”一詞將通過串口發送出去
if ((distL >40 && distR>40) && (distL <50 && distR<50)) //Detect both hands
{Serial.println("Play/Pause"); delay (500);}
如果將右手單獨放在模塊之前,那么我們將視頻快進一步,如果是左手,我們將倒帶一步。根據動作,這里“倒帶”或“轉發”一詞將通過串口發送出去
if ((distL >40 && distL<50) && (distR ==50)) //Detect Left Hand
{Serial.println("Rewind"); delay (500);}
if ((distR >40 && distR<50) && (distL ==50)) //Detect Right Hand
{Serial.println("Forward"); delay (500);}
敵人對音量和軌道的詳細控制我們使用不同的方法來防止錯誤觸發。為了控制音量,我們必須將左手放在大約。在距離 15 厘米 ,然后您可以將其移向傳感器以減少體積,將其移離傳感器以增加體積。相同的代碼如下所示。根據動作,這里“Vup”或“Vdown”一詞將通過串口發送出去
//Lock Left - Control Mode
if (distL>=13 && distL<=17)
{
delay(100); //Hand Hold Time
calculate_distance(trigger1,echo1);
distL =dist;
if (distL>=13 && distL<=17)
{
Serial.println("Left Locked");
while(distL<=40)
{
calculate_distance(trigger1,echo1);
distL =dist;
if (distL<10) //Hand pushed in?
{Serial.println ("Vup"); delay (300);}
if (distL>20) //Hand pulled out
{Serial.println ("Vdown"); delay (300);}
}
}
}
我們也可以對右側傳感器使用相同的方法來控制視頻的軌跡。也就是說,如果我們將右手移向傳感器,它將快進電影,如果您將其移離傳感器,它將倒帶電影。根據動作,這里“倒帶”或“轉發”一詞將通過串口發送出去
您現在可以閱讀頁面末尾給出的此手勢控制PC的完整代碼,并嘗試將其作為一個整體進行輕描淡寫,然后將其復制到Arduino IDE。
對你的 Python 進行編程:
這個項目的python程序非常簡單。我們只需要通過正確的波特率與Arduino建立串行通信,然后執行一些基本的鍵盤操作。python的第一步是安裝pyautogui模塊。確保遵循此步驟,因為如果沒有pyautogui模塊,該程序將無法運行。
為 Windows 安裝 pyautogui 模塊:
請按照以下步驟安裝 pyautogui for Windows。如果您使用的是其他平臺,則步驟也或多或少相似。確保您的計算機/筆記本電腦已連接到互聯網,然后繼續執行以下步驟
第 1 步:打開Windows命令提示符,并將目錄更改為已安裝python的文件夾。默認情況下,該命令應為
cd C:Python27
第 2 步:在你的 python 目錄中使用命令 python –m pip install –upgrade pip 來升級你的 pip。Pip 是 python 中的一個工具,可以幫助我們輕松安裝 python 模塊。升級此模塊后(如下圖所示),繼續下一步。
python –m pip install –upgrade pip
第 3 步:使用命令“python –m pip install pyautogui”來安裝 pyautogui 模塊。該過程成功后,您應該會看到類似于下面的屏幕。
python –m pip install –upgrade pip
現在 pyautogui 模塊和 pyserial 模塊(安裝在前面的教程中)已成功與 python 一起安裝,我們可以繼續使用 python 程序了。完整的 python 代碼在本教程末尾給出,但解釋如下。
讓我們導入此項目所需的所有三個模塊。它們是pyautogui,serial python和time。
import serial #Serial imported for Serial communication
import time #Required to use delay functions
import pyautogui
接下來,我們通過COM端口與Arduino建立連接。在我的電腦中,Arduino連接到COM 18。使用設備管理器查找Arduino連接到的COM端口,并相應地更正以下行。
ArduinoSerial = serial.Serial('com18',9600) #Create Serial port object called arduinoSerialData
time.sleep(2) #wait for 2 seconds for the communication to get established
在無限的while循環中,我們反復收聽COM端口,并將關鍵字與任何預先確定的作品進行比較,并相應地按下鍵盤。
while 1:
incoming = str (ArduinoSerial.readline()) #read the serial data and print it as line
print incoming
if 'Play/Pause' in incoming:
pyautogui.typewrite(['space'], 0.2)
if 'Rewind' in incoming:
pyautogui.hotkey('ctrl', 'left')
if 'Forward' in incoming:
pyautogui.hotkey('ctrl', 'right')
if 'Vup' in incoming:
pyautogui.hotkey('ctrl', 'down')
if 'Vdown' in incoming:
pyautogui.hotkey('ctrl', 'up')
如您所見,要按下一個鍵,我們只需要使用命令“pyautogui.typewrite(['space'], 0.2)”,它將按下鍵空格 0.2 秒。如果您需要像ctrl + S這樣的熱鍵,那么您可以使用熱鍵命令“pyautogui.hotkey('ctrl', 's')”。
我使用這些組合是因為它們適用于 VLC 媒體播放器,您可以按照您喜歡的任何方式調整它們,以創建自己的應用程序以通過手勢控制計算機中的任何內容。
動作中的手勢控制計算機:
按照上面定義建立連接,并將Arduino代碼上傳到Arduino板上。然后使用下面的python腳本并在筆記本電腦/計算機上啟動該程序。
現在,您可以使用VLC媒體播放器在計算機上播放任何電影,并用手控制電影,如下面的視頻所示。
Arduino Code:
/*
* Program for gesture control VLC Player
* Controlled uisng Python
* Code by B.Aswinth Raj
* Dated: 11-10-2017
*/
const int trigger1 = 2; //Trigger pin of 1st Sesnor
const int echo1 = 3; //Echo pin of 1st Sesnor
const int trigger2 = 4; //Trigger pin of 2nd Sesnor
const int echo2 = 5;//Echo pin of 2nd Sesnor
long time_taken;
int dist,distL,distR;
void setup() {
Serial.begin(9600);
pinMode(trigger1, OUTPUT);
pinMode(echo1, INPUT);
pinMode(trigger2, OUTPUT);
pinMode(echo2, INPUT);
}
/*###Function to calculate distance###*/
void calculate_distance(int trigger, int echo)
{
digitalWrite(trigger, LOW);
delayMicroseconds(2);
digitalWrite(trigger, HIGH);
delayMicroseconds(10);
digitalWrite(trigger, LOW);
time_taken = pulseIn(echo, HIGH);
dist= time_taken*0.034/2;
if (dist>50)
dist = 50;
}
void loop() { //infinite loopy
calculate_distance(trigger1,echo1);
distL =dist; //get distance of left sensor
calculate_distance(trigger2,echo2);
distR =dist; //get distance of right sensor
//Uncomment for debudding
/*Serial.print("L=");
Serial.println(distL);
Serial.print("R=");
Serial.println(distR);
*/
//Pause Modes -Hold
if ((distL >40 && distR>40) && (distL <50 && distR<50)) //Detect both hands
{Serial.println("Play/Pause"); delay (500);}
calculate_distance(trigger1,echo1);
distL =dist;
calculate_distance(trigger2,echo2);
distR =dist;
//Control Modes
//Lock Left - Control Mode
if (distL>=13 && distL<=17)
{
delay(100); //Hand Hold Time
calculate_distance(trigger1,echo1);
distL =dist;
if (distL>=13 && distL<=17)
{
Serial.println("Left Locked");
while(distL<=40)
{
calculate_distance(trigger1,echo1);
distL =dist;
if (distL<10) //Hand pushed in?
{Serial.println ("Vup"); delay (300);}
if (distL>20) //Hand pulled out
{Serial.println ("Vdown"); delay (300);}
}
}
}
//Lock Right - Control Mode
if (distR>=13 && distR<=17)
{
delay(100); //Hand Hold Time
calculate_distance(trigger2,echo2);
distR =dist;
if (distR>=13 && distR<=17)
{
Serial.println("Right Locked");
while(distR<=40)
{
calculate_distance(trigger2,echo2);
distR =dist;
if (distR<10) //Right hand pushed in
{Serial.println ("Rewind"); delay (300);}
if (distR>20) //Right hand pulled out
{Serial.println ("Forward"); delay (300);}
}
}
}
delay(200);
}
Python Code:
import serial #Serial imported for Serial communication
import time #Required to use delay functions
import pyautogui
ArduinoSerial = serial.Serial('com18',9600) #Create Serial port object called arduinoSerialData
time.sleep(2) #wait for 2 seconds for the communication to get established
while 1:
incoming = str (ArduinoSerial.readline()) #read the serial data and print it as line
print incoming
if 'Play/Pause' in incoming:
pyautogui.typewrite(['space'], 0.2)
if 'Rewind' in incoming:
pyautogui.hotkey('ctrl', 'left')
if 'Forward' in incoming:
pyautogui.hotkey('ctrl', 'right')
if 'Vup' in incoming:
pyautogui.hotkey('ctrl', 'down')
if 'Vdown' in incoming:
pyautogui.hotkey('ctrl', 'up')
incoming = "";
-
計算機
+關注
關注
19文章
7513瀏覽量
88160 -
超聲波傳感器
+關注
關注
18文章
583瀏覽量
35944 -
python
+關注
關注
56文章
4797瀏覽量
84787 -
Arduino
+關注
關注
188文章
6471瀏覽量
187288 -
手勢控制
+關注
關注
4文章
44瀏覽量
21754
發布評論請先 登錄
相關推薦
評論