使用加速度计进行DIY手势控制的基于Arduino的空中鼠标
original: https://circuitdigest.com/microcontroller-projects/diy-gesture-controlled-arduino-air-mouse-using-accelerometer
使用加速度计进行DIY手势控制的基于Arduino的空中鼠标
先决条件
- Arduino Nano(任何型号)
- 加速度计ADXL335模块
- 蓝牙HC-05模块
- 按按钮
- 安装了Python的计算机
要了解有关在计算机上安装python的更多信息,请遵循Arduino-Python LED Controling上的上一教程。
电路图
要用手的运动来**控制计算机,**您需要一个加速度计,该加速度计沿X和Y轴发出加速度,并使整个系统无线,蓝牙模块用于将信号无线传输到您的系统。
此处使用的是ADXL335加速度计,它是基于MEMS的三轴模块,可输出沿X,Y和Z轴的加速度,但是如前所述,控制鼠标时,我们只需要沿X和Y轴的加速度即可。了解有关在以前的项目中将ADXL335加速度计与Arduino结合使用的更多信息:
- 使用GPS,GSM和加速度计的基于Arduino的车辆事故警报系统
- 使用Arduino和Accelerometer进行Ping Pong游戏
- 使用Arduino的基于加速度计的手势控制机器人
- 使用Arduino的地震探测器警报
此处,加速度计的Xout和Yout引脚连接至Arduino的Analog,A0和A1引脚,并且此处用于将信号从Arduino传输至系统蓝牙模块HC-05,因为蓝牙在Tx和Rx上工作引脚连接,因此我们使用软件串行引脚D2和D3。它使用软件串行进行连接,因为如果我们将蓝牙与硬件串行连接并开始通过python控制台获取读数,则由于蓝牙将以其自己的波特率与python通信,因此会显示波特率不匹配的错误。通过使用包括Arduino在内的不同微控制器的各种基于蓝牙的项目来了解有关使用蓝牙模块的更多信息。
在这里,我们使用了三个按钮-一个用于触发Air鼠标,另外两个用于左右单击,如下图所示:
空中鼠标的处理流程
流程图显示了基于Arduino的Air Mouse的处理流程:
1.系统会持续检查是否要按下机械触发器,直到没有按下机械触发器,我们才能使用计算机鼠标正常进行操作。
2.当系统检测到按钮按下时,鼠标的控件将转移到空中鼠标。
3.按下触发按钮后,系统开始将鼠标的读数传输到计算机。系统读数由加速度计读数以及左键和右键单击的读数组成。
4.系统读数由1字节或8位的数据流组成,其中前三位由X坐标组成,后三位由Y坐标组成,后第二位是要获取的状态位鼠标左键单击的状态,最后一位是获取右键单击状态的状态位。
5.前三个位的值(即X坐标)可以在100 <= Xcord <= 999的范围内,而Y坐标的值可以在100 <= Ycord <= 800的范围内。右击和左击的值是二进制值0或1,其中1表示进行了单击,0表示用户未进行单击。
6.为了不使按钮的弹跳影响光标的位置,每次单击鼠标的触发按钮后,将保持4秒的已知延迟。
7.对于空中鼠标中的左右单击,我们必须首先按下左或右按钮,然后,我们必须按下触发按钮以移动到所需的空中鼠标的位置。
编程Arduino for Air Mouse
Arduino应该编程为读取X和Y轴上的加速度值。最后给出了完整的程序,下面是代码中的重要片段。
设置全局变量
如前所述,我们将使用软件串行引脚连接蓝牙模块。因此,要设置软件序列,我们需要声明软件序列库,并设置Tx和Rx的引脚。在Arduino Nano和Uno中,Pin 2和3可以用作软件序列。接下来,我们从软件串行库中声明Bluetooth对象,以设置Tx和Rx的引脚。
#include <SoftwareSerial.h>
const int rxpin = 2, txpin = 3;
SoftwareSerial bluetooth(rxpin, txpin);
const int x=A0;
const int y=A1;
int xh, yh;
int xcord, ycord;
const int trigger = 5;
int lstate = 0;
int rstate = 0;
const int lclick = 6;
const int rclick = 7;
const int led = 8;
void setup()
在设置功能中,我们将设置变量以告诉程序它们将充当输入还是输出。触发按钮将被设置为输入上拉,而左键和右键将被声明为输入,并被设置为高电平以使其充当输入上拉。
还要将串行和蓝牙通信的波特率设置为9600。
void setup()
{ pinMode(x,INPUT); pinMode(y,INPUT); pinMode(trigger,INPUT_PULLUP)pinMode(lclick,输入); pinMode(rclick,INPUT); pinMode(led,OUTPUT); digitalWrite(lclick,HIGH); digitalWrite(rclick,HIGH); Serial.begin(9600); bluetooth.begin(9600);
}
void loop()
由于我们需要触发器按钮来告知何时需要向系统发送数据流,因此我们在while循环中设置了整个代码,该代码将连续监视上拉触发器的数字状态,当它变低时,它将将其进一步传递以进行处理。
由于我们已安装了LED指示灯,以便在按下触发按钮时了解系统状态,因此我们最初将led设置为在while循环外的默认状态下设置为低,而在while循环内将其设置为高电平*,*这将使led点亮每当按下触发按钮时。
要读取左右单击按钮**的状态,**我们已全局声明了两个变量lclick和rclick,它们的值最初设置为0。
然后在循环中,根据左右单击按钮的数字状态设置这些变量的值,以检查按钮是否被按下。
我们将使用AnalogRead函数读取加速度计的X和Y out引脚的值,并将这些值映射到屏幕尺寸,以使鼠标指针在整个屏幕上移动。由于屏幕尺寸是屏幕中的像素,因此我们需要相应地进行设置,并且由于我们需要将输出值设置为三位数,因此我们特意将X的范围设置为100 <= X <= 999。 Y的值是100 <= Y <= 800。请记住,像素是从左上角读取的,即,左上角的值为(0,0),但是由于我们已经声明了x和y的三位数,因此将从点(100,100)读取值。
此外,借助Serial.print和bluetooth.print函数,可以打印坐标值以及串行和Bluetooth上的单击状态,它们有助于通过蓝牙在串行监视器和系统上获取这些值。
最后,由于按钮的弹跳,可能会重复单个值,这将导致鼠标光标停留在单个位置上,因此要消除此情况,我们必须添加此延迟。
void loop()
{
digitalWrite(led,LOW);while(digitalRead(trigger)==LOW){digitalWrite(led, HIGH);lstate = digitalRead(lclick);rstate = digitalRead(rclick);xh=analogRead(x);yh=analogRead(y);xcord=map(xh,286,429,100,999);ycord=map(yh,282,427,100,800);Serial.print(xcord);Serial.print(ycord);if (lstate == LOW)Serial.print(1);elseSerial.print(0);if (rstate == LOW)Serial.print(1);elseSerial.print(0);bluetooth.print(xcord);bluetooth.print(ycord);if (lstate == LOW)bluetooth.print(1);elsebluetooth.print(0);if (rstate == LOW)bluetooth.print(1);elsebluetooth.print(0);delay(4000);} }
适用于计算机的****Python驱动程序脚本
到目前为止,我们已经完成了硬件及其固件部分,现在要使空中鼠标正常工作,我们需要一个驱动程序脚本,该脚本可以将来自空中鼠标的信号解码为光标移动,因此,我们选择了Python。Python是一种脚本语言,这里所说的脚本是指它可以帮助我们控制其他程序,因为这里我们要控制鼠标光标。
因此,打开您的python shell并使用以下命令安装以下库:
pip install serial
pip install pyautogui
该***系列*是为Python库,帮助我们摆脱串行接口如COM端口的数据,也让我们对其进行操作,而*pyautogui***是库蟒蛇,并得到了GUI功能的控制,在这种情况下,鼠标。
现在让我们看一下驱动程序的代码,我们要做的第一件事是导入串行和pyautogui库,然后从串行库中,我们必须以9600的波特率设置用于通信的com端口,即与Bluetooth.serial相同。为此,您必须将蓝牙模块连接至系统,然后在系统设置中必须检查其已连接到哪个com端口。
接下来的事情是读取从蓝牙到系统的串行通信,并使其保持连续运行,并在while 1的帮助下将其余代码保持在连续循环中。
如前所述,Arduino将发送8位,前6位用于坐标,后两位用于单击按钮的状态。因此,在ser.read的帮助下读取所有位并将其长度设置为8位。
接下来,将光标坐标和点击的位置划分为多个部分,然后将其进一步划分为X和Y坐标。左键单击和右键单击相同。
现在,从通信中,我们得到一个字节字符串,我们需要将其转换为整数,以便它们适合坐标,我们通过解码它们,然后将其类型转换为整数来做到这一点。
现在要移动光标,我们使用pyautogui moveto函数,该函数将那些整数坐标作为参数并将光标移动到该位置。
下一步检查点击,我们使用后两位和pyautogui的click函数来完成,其默认点击为左,但是我们可以通过将按钮值声明为right来将其设置为right,我们也可以定义点击的次数通过将clicks参数设置为2来将其设置为双击。
以下是要在计算机上运行的完整Python代码:
import serial
import pyautogui
ser=serial.Serial('com3',9600)
while 1:k=ser.read(8)cursor=k[:6]click=k[6:]x=cursor[:3]y=cursor[3:]l=click[0]r=click[1]xcor=int(x.decode('utf-8'))ycor=int(y.decode('utf-8'))pyautogui.moveTo(xcor,ycor)if l==49:pyautogui.click(clicks=2)elif r==49:pyautogui.click(button='right', clicks=2)
测试Arduino Air Mouse
因此,要操作Air Mouse,请为其连接电源。它可以来自Arduino Nano USB插槽,也可以来自使用7805 IC的5v稳压电源。然后通过设置蓝牙连接的com端口运行python驱动程序脚本。当脚本运行时,您会在蓝牙闪烁中看到一个时间滞后,这意味着它已连接到您的系统。然后,对其进行操作,单击“触发”按钮,您将看到坐标的位置将发生变化;如果要单击左键或右键,则首先同时按左或右按钮和触发按钮,您将在以下位置看到单击的动作:光标的位置已更改。
查看下面的详细工作视频。
Python Script:
import serial
import pyautogui
ser=serial.Serial('com3',9600)
while 1:k=ser.read(8)cursor=k[:6]click=k[6:]x=cursor[:3]y=cursor[3:]l=click[0]r=click[1]xcor=int(x.decode('utf-8'))ycor=int(y.decode('utf-8'))pyautogui.moveTo(xcor,ycor)if l==49:pyautogui.click(clicks=2)elif r==49:pyautogui.click(button='right', clicks=2)
Arduino Code:
#include <SoftwareSerial.h>
const int rxpin = 2, txpin = 3;
SoftwareSerial bluetooth(rxpin, txpin);
const int x=A0;
const int y=A1;
int xh, yh;
int xcord, ycord;
const int trigger = 5;
int lstate = 0;
int rstate = 0;
const int lclick = 6;
const int rclick = 7;
const int led = 8;void setup()
{pinMode(x,INPUT);pinMode(y,INPUT);pinMode(trigger,INPUT_PULLUP);pinMode(lclick,INPUT);pinMode(rclick,INPUT);pinMode(led, OUTPUT);digitalWrite(lclick,HIGH);digitalWrite(rclick,HIGH);Serial.begin(9600);bluetooth.begin(9600);
}void loop()
{
digitalWrite(led,LOW);while(digitalRead(trigger)==LOW){ digitalWrite(led, HIGH);lstate = digitalRead(lclick);rstate = digitalRead(rclick);xh=analogRead(x);yh=analogRead(y);xcord=map(xh,286,429,100,999);ycord=map(yh,282,427,100,800);Serial.print(xcord);Serial.print(ycord);if (lstate == LOW)Serial.print(1);else Serial.print(0);if (rstate == LOW)Serial.print(1);else Serial.print(0);bluetooth.print(xcord);bluetooth.print(ycord);if (lstate == LOW)bluetooth.print(1);else bluetooth.print(0);if (rstate == LOW)bluetooth.print(1);else bluetooth.print(0);delay(4000);}
}
Python driver script
import serial
import pyautogui
ser=serial.Serial('com3',9600)
while 1:k=ser.read(8)cursor=k[:6]click=k[6:]x=cursor[:3]y=cursor[3:]l=click[0]r=click[1]xcor=int(x.decode('utf-8'))ycor=int(y.decode('utf-8'))pyautogui.moveTo(xcor,ycor)if l==49:pyautogui.click(clicks=2)elif r==49:pyautogui.click(button='right', clicks=2)
使用加速度计进行DIY手势控制的基于Arduino的空中鼠标相关推荐
- 使用加速度计DIY自制基于Arduino手势控制的空中鼠标
曾经想知道我们的世界是如何走向沉浸式现实的.我们不断寻找与周围环境互动的新方式和方法,使用虚拟现实.混合现实.增强现实等.每天都有新设备通过这些快速技术推出,以通过他们的新互动技术给我们留下深刻印象. ...
- 如何基于Arduino开发板使用APDS9960 RGB和手势传感器
今天大多数手机都带有手势控制功能,可以打开或关闭任何应用程序.启动音乐.拨打电话等.这是一个非常方便的功能,可以节省时间,并且看起来很酷,可以用手势控制任何设备.我们以前使用加速度计来构建手势控制的机 ...
- 简易实现AI虚拟鼠标—手势控制鼠标
先看一下效果: 链接至抖音(这是我自己录的,用手势控制鼠标来刷抖音) 实现起来很简单,都是在调用人家的库~~.代码参考的是这个网站(原教程及代码网址)中的Project 4 - Al Virtual ...
- 基于 ADXL335 加速度计的手势控制机器人
该无线控制的机器人汽车使用手势:手的倾斜/方向来向前.向后.向左或向右行驶. 说到机器人,手势控制机器人是业余爱好者和学生在物理和实际项目中理解和实施微控制器知识的最常见的项目类型之一.其背后的概念很 ...
- 【STM32入门】这个项目绝了,用手势来产生波形,基于手势控制的波形发生器
大家好,我是张巧龙,之前有给实验室学生出了一道关于STM32的题:基于手势控制的波形产生题,题目简单,但综合性较强. 有些学生完成的还不错,个人觉得此题用来 入门 STM32再合适不过了. 展示视频: ...
- 玩转树莓派---详解树莓派的系统烧录,基础使用及基于树莓派制作手势控制的小车(附详细代码及演示效果)
目录 一.写在前面 二.系统实现: Author:qyan.li Date:2022.6.10 Topic:详解树莓派的使用及基于树莓派制作手势控制的小车 Reference:如何给树莓派安装操作系统 ...
- 【基于Arduino APDS9960 传感器的手势控制非接触式电梯】
基于Arduino APDS9960 传感器的手势控制非接触式电梯 前言 所需组件 APDS9960 RGB & 手势传感器 电路原理图 代码说明 测试手势控制的非接触式升降机 完整代码 前言 ...
- 毕业设计 —— 基于STM32手势控制显示系统的设计
目录 一.前言 二.项目背景及资源分享 三.项目简介 1.项目名称 2.系统框架 3.功能简介 4.控制核心 5.最小系统: 6.外围模块: 四.相关设计原理及框图 1.系统设计的原理 2.手势识别原 ...
- python基于yolov3实现的手势控制音乐播放器
python基于yolov3实现的手势控制音乐播放器 效果演示 总体框架 手势识别模块 音乐播放器模块 一个小总结吧 效果演示 话不多说,先上最后的成品展示. python基于yolov3实现的手势控 ...
最新文章
- echo -e 参数
- UGUI 锚点设置为四方扩充模式然后设置局部坐标为0将出现什么问题
- linux中各目录及详细介绍
- 【DP】【BFS】迷之阶梯
- Java向后不兼容历史的观察
- Python+Selenium学习笔记10 - send_keys上传文件
- ModuleNotFoundError No module named urllib2
- 稳妥圣诞节海报设计模板|节日怎可辜负美食
- 《C++ Primer》第五版课后习题解答_第六章(1)(01-07)
- 校园二手交易系统平台
- java生成条形码~~使用barcode4j在线生成条形码
- 为你的企业建立竞争情报系统
- 发送邮件被对方服务器退回是什么原因导致的?
- 众手游公司崛起:腾讯“主营收入”面临危机!
- 项目管理学习总结(20)——小团队管理与大团队管理
- c#开发条形码生成器
- mysql mdf ldf_mdf和ldf是什么文件
- (滁院20级计科专用)期末考试复习-操作系统
- 长安车机升级公版高德
- 测试用例的设计方法(全)