0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Arduino通过手势控制计算机

科技观察员 来源:circuitdigest 作者:阿斯文斯·拉吉 2022-11-30 16:55 次阅读

最近手势控制的笔记本电脑或计算机变得非常有名。这种技术称为Leap运动,它使我们能够通过简单地在计算机/笔记本电脑前挥手来控制计算机/笔记本电脑上的某些功能。这样做非常酷和有趣,但这些笔记本电脑的价格确实很高。因此,在这个项目中,让我们尝试通过结合ArduinoPython的强大功能来构建我们自己的手势控制笔记本电脑/计算机。

我们将使用两个超声波传感器来确定我们手的位置并根据位置控制媒体播放器 (VLC)。我已经使用它进行演示,但是一旦您了解了该项目,您只需更改几行代码并以您喜欢的方式控制您最喜欢的应用程序,您就可以做任何事情。

项目背后的概念:

该项目背后的概念非常简单。我们将在显示器顶部放置两个超声波(US)传感器,并使用Arduino读取显示器和手之间的距离,根据此距离值,我们将执行某些操作。为了在我们的计算机上执行操作,我们使用Pythonpyautogui库。来自Arduino的命令通过串行端口USB)发送到计算机。然后,该数据将由计算机上运行的python读取,并根据读取的数据执行操作。

电路图:

pYYBAGOHGo6ALG4LAACK3opti8Y248.png

要使用手势控制PC,只需将两个超声波传感器与Arduino连接即可。我们知道美国传感器使用 5V 工作,因此它们由 Arduino 的板载稳压器供电。Arduino可以连接到PC /笔记本电脑,为模块供电,也可以进行串行通信。连接完成后,将它们放在显示器上,如下所示。我用双面胶带把它贴在我的显示器上,但你可以发挥自己的创造力。将其固定在一个地方后,我们可以继续进行编程

poYBAGOHGo-Abq7VAACJjdIfV2k056.jpg

pYYBAGOHGpGAT0jdAAB0Bb5wGoM347.jpg

对 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

poYBAGOHGpOAIqMwAABPc_62rmY856.png

现在 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媒体播放器在计算机上播放任何电影,并用手控制电影,如下面的视频所示。

poYBAGOHGpaAIcLxAADVwlMIQRI690.jpg

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

    文章

    7488

    浏览量

    87850
  • 超声波传感器

    关注

    18

    文章

    583

    浏览量

    35927
  • python
    +关注

    关注

    56

    文章

    4792

    浏览量

    84627
  • Arduino
    +关注

    关注

    188

    文章

    6468

    浏览量

    186954
  • 手势控制
    +关注

    关注

    4

    文章

    44

    浏览量

    21710
收藏 人收藏

    评论

    相关推荐

    计算机控制设备改造

    计算机控制他,不用手动,主要是通过计算机设置哪个档位,把测试到的压敏电阻参数传到计算机上显示出来。请问应该如何实现。以下是该设备的操作和显示面:谢谢!`
    发表于 08-20 10:27

    计算机控制技术简介

    Hefei University课程综述课程题目:计算机控制技术姓 名:胡年军学 号: 0805070111专 业: 自动化(1)班授课老师:丁健一、计算机控制技术简介计算机控制技术是一门以电子技术
    发表于 09-01 08:09

    计算机控制技术简介

    个人收集整理仅供参考学习个人收集整理仅供参考学习PAGE / NUMPAGES个人收集整理仅供参考学习Hefei课程综述课程题目:计算机控制技术姓 名:胡年军学 号: 0805070111专 业
    发表于 09-01 08:02

    浅析计算机接口与控制技术

    计算机接口与控制技术》 教学大纲课程名称:计算机接口与控制技术(Computer Interface and Control Technique )课程编号:S031030课程学时:
    发表于 09-10 06:45

    计算机模糊控制的相关知识

    计算机接口与控制技术课程总结.doc 中国石油大学机电工程学院计算机接口与控制技术课程总结计算机接口与
    发表于 09-10 06:08

    怎样通过手势隔空控制电脑?

    怎样通过手势隔空控制电脑?
    发表于 02-11 06:14

    基于Arduino创建一个手势控制

    到 PCB,如图所示。现在,我们需要将组件一个一个地安装到 PCB 上。在以下模式中:安装完组件后,我们需要上传本文附件中给出的代码。注意:在上传代码之前,请确保将 Arduino Nano 与您的计算机
    发表于 06-22 06:55

    如何将文件内容从Arduino无线发送到计算机

    Arduino UNO 正在将带有格式化文本行的约 8 MB 文件记录到 SD 卡中。我已经将 ESP8266-01 插入到 Arduino 的软件串行端口中。局域网内的计算机最终会请求一个日志文件
    发表于 05-04 06:47

    使用带有计算机视觉的手势控制伺服电机

    电子发烧友网站提供《使用带有计算机视觉的手势控制伺服电机.zip》资料免费下载
    发表于 11-02 11:10 0次下载
    使用带有<b class='flag-5'>计算机</b>视觉的<b class='flag-5'>手势</b><b class='flag-5'>控制</b>伺服电机

    使用手势通过Arduino控制YouTube播放

    电子发烧友网站提供《使用手势通过Arduino控制YouTube播放.zip》资料免费下载
    发表于 12-21 16:55 3次下载
    使用<b class='flag-5'>手势</b><b class='flag-5'>通过</b><b class='flag-5'>Arduino</b><b class='flag-5'>控制</b>YouTube播放

    手势识别数据集:让计算机了解你的表情与手势

    在当今数字化时代,我们离不开计算机、手机和其他电子设备。与此同时,手势识别技术也越来越受关注。手势是我们与生俱来的一种表达方式,通过它们可以传达思想和情感。因此,
    的头像 发表于 04-13 16:36 1369次阅读

    手势识别:让你的手成为计算机的新界面

    势识别是一种新兴的人机交互技术,它通过识别人类手部的动作和姿态,来控制计算机或其他设备,从而实现更加自然和直观的人机交互。手势识别技术不仅可以用于操作
    的头像 发表于 04-25 17:51 991次阅读

    将量子计算机连接到Arduino

    电子发烧友网站提供《将量子计算机连接到Arduino.zip》资料免费下载
    发表于 06-25 15:09 1次下载
    将量子<b class='flag-5'>计算机</b>连接到<b class='flag-5'>Arduino</b>

    使用APDS9960和NodeMCU通过手势控制Chromecast

    电子发烧友网站提供《使用APDS9960和NodeMCU通过手势控制Chromecast.zip》资料免费下载
    发表于 06-26 09:51 1次下载
    使用APDS9960和NodeMCU<b class='flag-5'>通过手势</b><b class='flag-5'>控制</b>Chromecast

    数控加工计算机辅助编程步骤

    数控加工程序可通过手工编程或计算机自动编程来获得。目前计算机自动编程采用图形交互式自动编程,即计算机辅助编程。
    发表于 10-18 09:39 646次阅读