最近,手势控制的笔记本电脑或计算机越来越出名。这种技术称为“跳跃运动”,它使我们能够通过简单地在其前面挥动手来控制计算机/笔记本电脑上的某些功能。这样做非常酷又有趣,但是这些笔记本电脑的价格确实很高。因此,在这个项目中,让我们尝试通过结合Arduino和Python的功能来构建自己的手势控制笔记本电脑/计算机。
我们将使用两个超声波传感器确定手的位置,并根据该位置控制媒体播放器(VLC)。我已将其用于演示,但是一旦您了解了项目,就可以通过更改几行代码并以自己喜欢的方式控制自己喜欢的应用程序来执行任何操作。
先决条件:
我们已经介绍了将Arduino与Python相结合的几个项目。因此,我假设您已经安装了Python及其串行库,并且已经成功尝试了一些基本项目,例如LED闪烁。如果没有,请不要担心,您可以回到Arduino-Python Led Controling教程并继续学习。因此,在继续操作之前,请确保已安装Python和pyserial库。
项目背后的概念:
该项目的概念非常简单。我们将两个超声波(US)传感器放置在显示器的顶部,并使用Arduino读取显示器和手之间的距离,基于该距离值,我们将执行某些操作。要在我们的计算机上执行操作,我们使用Python pyautogui库。来自Arduino的命令通过串行端口(USB)发送到计算机。然后,将通过计算机上运行的python读取此数据,并根据读取的数据执行操作。
电路原理图:
要使用手势控制PC,只需将两个超声波传感器与Arduino连接即可。我们知道美国传感器的工作电压为5V,因此它们由Arduino的板载稳压器供电。Arduino可以连接到PC /笔记本电脑,以为模块供电以及进行串行通信。连接完成后,如下所示将它们放置在显示器上。我已经用双面胶带将其粘贴在显示器上,但是您可以发挥自己的创造力。将其固定到位后,我们可以继续进行编程。
编程Arduino:
Arduino应该被编程为从美国传感器读取手的距离。该完整的程序是在本页面的结尾给出; 在下面,我给出了该程序的说明。如果您不熟悉超声波传感器,只需进行Arduino和基于超声波传感器的距离测量。
通过读取距离值,我们可以得出某些要用手势控制的动作,例如,在此程序中,我已将5个动作编程为演示。
动作1:如果两只手都放在传感器之前一定距离处,则VLC播放器中的视频应播放/暂停。
动作2:将右手放在传感器前一定距离的位置时,视频应快进一个步骤。
动作3:将左手放在传感器前一定距离的位置时,视频应快退一步。
动作4:将右手放在传感器之前一定距离的位置,然后如果将其移向传感器,则视频应快进,如果移开,则应倒带视频。
动作5:将左手放在传感器附近一定距离处,然后朝传感器移动时,视频量应增加,而如果移开,则应减小音量。
让我们看看如何编写程序来执行上述操作。因此,像所有程序一样,我们首先定义I / O引脚,如下所示。两个US传感器连接到数字引脚2、3、4和5,并由+ 5V引脚供电。触发引脚为输出引脚,回波引脚为输入引脚。
Arduino和python之间的串行通信以9600的波特率进行。
const int trigger1 = 2; //第一个Sesnor触发引脚const int echo1 = 3; //第一个Sesnor const int trigger2的回显引脚= 4; //第二个Sesnor的触发引脚const int echo2 = 5; //第二个Sesnor的触发引脚void setup(){Serial.begin(9600); pinMode(trigger1,OUTPUT); pinMode(echo1,INPUT); pinMode(trigger2,OUTPUT); pinMode(echo2,INPUT); }
在结束任何动作之前,我们需要每次计算传感器与手之间的距离。因此,我们必须执行多次,这意味着此代码应作为函数使用。我们编写了一个名为 calculate_distance() 的函数,该函数将向我们返回传感器与手之间的距离。
/ * ###计算距离的函数### * / void compute_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; 如果(dist> 50)dist = 50; }
在主 循环中, 我们检查距离值并执行上述操作。在此之前,我们使用两个变量 distL 和 distR ,并使用当前距离值 对其 进行更新。
计算距离(trigger1,echo1); distL = dist; //获取左传感器的距离calculate_distance(trigger2,echo2); distR = dist; //获取右传感器的距离
由于我们知道两个传感器之间的距离,因此我们现在可以将其与预定义值进行比较并得出某些动作。例如,如果两只手都放在40 mc的距离处,则我们播放/暂停视频。在这里,“播放/暂停”一词将通过串口发送出去
if((distL> 40 && distR> 40)&&(distL <50 && distR <50))//检测两只手{Serial.println(“ Play / Pause”); 延迟(500);}
如果将右手放在模块之前,则我们将视频快进一步,如果是左手,则将视频快退一步。根据操作,此处将通过串行端口发送“倒带”或“转发”一词
if((distL> 40 && distL <50)&&(distR == 50))//检测左手{Serial.println(“ Rewind”); delay(500);} if((distR> 40 && distR <50)&&(distL == 50))//检测右手{Serial.println(“ Forward”); 延迟(500);}
对音量和轨道的详细控制,我们使用了不同的方法,以防止错误触发。为了控制音量,我们必须将左手放在大约。在15 cm的距离处,您既可以将其移向传感器以减小其体积,也可以将其从传感器移离以增大其体积。相同的代码如下所示。根据操作,此处将通过串行端口发送“ Vup”或“ Vdown”一词
//左锁-如果(distL> = 13 && distL <= 17){delay(100); //手保持时间calculate_distance(trigger1,echo1); distL = dist; 如果(distL> = 13 && distL <= 17){Serial.println(“ Left Locked”); while(distL <= 40){calculate_distance(trigger1,echo1); distL = dist; if(distL <10)//手推入{Serial.println(“ Vup”); 延迟(300);} if(distL> 20)//拉出{Serial.println(“ Vdown”); 延迟(300);}}}}
我们也可以对右侧传感器使用相同的方法来控制视频的轨迹。也就是说,如果我们将右手移向传感器,它将使电影快进;如果将其移离传感器,将使电影后退。根据操作,此处将通过串行端口发送“倒带”或“转发”一词
您现在可以阅读页面末尾提供的该手势控制PC的完整代码,并尝试将其总体上低估,然后将其复制到Arduino IDE。
编写您的Python:
这个项目的python程序非常简单。我们只需要通过正确的波特率与Arduino建立串行通信,然后执行一些基本的键盘操作即可。使用python的第一步是安装p yautogui 模块。确保执行此步骤,因为没有pyautogui模块,该程序将无法运行。
为Windows安装pyautogui模块:
请按照以下步骤为Windows安装 pyautogui 。如果您正在使用其他平台,则步骤也将或多或少地相似。确保您的计算机/笔记本电脑已连接到Internet,然后继续执行以下步骤
步骤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,串行python和时间。
导入串行#为串行通信导入串行导入时间#需要使用延迟功能import pyautogui
接下来,我们通过COM端口与Arduino建立连接。在我的计算机中,Arduino连接到COM18。使用设备管理器查找Arduino连接到哪个COM端口,并相应地更正以下行。
ArduinoSerial = serial.Serial('com18',9600)#创建名为arduinoSerialData的串行端口对象time.sleep(2)#等待2秒以建立通信
在无限的 while 循环内,我们反复收听COM端口,并将关键字与任何预先定义的作品进行比较,并相应地按下键盘。
while 1:incoming = str(ArduinoSerial.readline())#读取串行数据,如果传入:pyautogui.typewrite(,0.2)如果传入:pyautogui中的“ Rewind”,则将其打印为行打印传入。 hotkey('ctrl','left')如果传入是'Forward':pyautogui.hotkey('ctrl','right')如果传入是'Vup':pyautogui.hotkey('ctrl','down')如果'传入中的Vdown'':pyautogui.hotkey('ctrl','up')
如您所见,要按下按键,我们只需要使用命令 “ pyautogui.typewrite(,0.2)” ,它将按下按键空间 0.2 秒。如果您需要像ctrl + S这样的热键,则可以使用热键命令 “ pyautogui.hotkey('ctrl','s')”。
我之所以使用这些组合,是因为它们可以在VLC媒体播放器上运行,您可以用任何喜欢的方式来调整它们,以创建自己的应用程序来控制计算机中的任何手势。
手势控制计算机的实际应用:
按照上面的定义进行连接,然后将Arduino代码上传到Arduino板上。然后使用下面的python脚本在笔记本电脑/计算机上启动该程序。
现在,您可以使用VLC媒体播放器在计算机上播放任何电影,并用您的手来控制电影,如下面的视频所示。
希望您理解该项目并喜欢它。这只是一个演示,您可以利用自己的创造力来构建更多更酷的手势控制内容。让我知道这是否有用,您将在评论部分中使用它创建什么,我将很高兴知道。