曾经想知道我们的世界如何走向沉浸式现实。我们一直在寻找使用虚拟现实,混合现实,增强现实等与周围环境进行交互的新方法和方法。每天,随着这些快速起步技术的出现,新设备不断涌现,它们的新型交互技术给我们留下了深刻的印象。
这些身临其境的技术被用于游戏,互动活动,娱乐和许多其他应用中。在本教程中,我们将了解这种交互式方法,该方法为您提供了一种与系统进行交互的新方法,而无需使用无聊的鼠标。我们的游戏极客必须知道,任天堂在几年前就出售了一种3D交互式方法的想法,该方法是借助称为Wii控制器的手持控制器与游戏机进行交互的。它使用加速度计来定位您的游戏手势并将其无线发送到系统。如果您想进一步了解这项技术,可以查看其专利EP1854518B1,这将使您对这项技术的工作原理有一个完整的了解。
受到这个想法的启发,我们将制作一个“空中鼠标”,仅通过在空中移动控制台即可与系统进行交互,但是我们将仅使用二维坐标引用,而不是使用3维坐标引用,因此我们可以模仿计算机鼠标的动作,因为鼠标在X和Y二维上起作用。
这种无线3D空中鼠标的概念非常简单,我们将使用加速度计来获取“空中鼠标”沿x和y轴的动作和运动的加速度值,然后基于加速度计,我们将在计算机上运行的python软件驱动程序的控制下,控制鼠标光标并执行某些操作。
先决条件
- 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和加速度计进行乒乓游戏
- 使用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的引脚。
#包括
无效设置()
在 设置 功能中,我们将设置变量以告诉程序它们将充当输入还是输出。触发按钮将设置为输入上拉,并且将左右单击声明为输入,并将其单击设置为高,以使其充当输入上拉。
还将串行和蓝牙通信的波特率设置为9600。
void setup() { pinMode(x,INPUT); pinMode(y,INPUT); pinMode(触发,输入_上拉) pinMode(lclick,输入); pinMode(rclick,INPUT); pinMode(led,OUTPUT); digitalWrite(lclick,HIGH); digitalWrite(rclick,HIGH); Serial.begin(9600); bluetooth.begin(9600); }
空循环()
由于我们需要 触发器按钮 来告知何时需要向系统发送数据流,因此我们在 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 函数,可以打印串行和蓝牙上的坐标值和单击状态,它们有助于通过蓝牙在串行监视器和系统上获取这些值。
最后,由于按钮的弹跳,可能会重复单个值,这将导致鼠标光标在单个位置上徘徊,因此,要消除这种情况,我们必须添加此延迟。
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); 如果(lstate == LOW) Serial.print(1); 否则 Serial.print(0); 如果(rstate == LOW) Serial.print(1); 否则 Serial.print(0); bluetooth.print(xcord); bluetooth.print(ycord); 如果(lstate == LOW) bluetooth.print(1); 其他 bluetooth.print(0); 如果(rstate == LOW) bluetooth.print(1); 否则 bluetooth.print(0); 延迟(4000); }}
Python驱动程序脚本
到目前为止,我们已经完成了硬件及其固件部分,现在要使空中鼠标正常工作,我们需要一个驱动程序脚本,该脚本可以将来自空中鼠标的信号解码为光标移动,因此,我们选择了蟒蛇。Python是一种脚本语言,这里所说的脚本是指它可以帮助我们控制其他程序,因为这里我们要控制鼠标光标。
因此,打开您的python shell并使用以下命令安装以下库:
pip install串行 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的点击函数来完成此操作,其默认点击次数为一次,但是我们可以通过将按钮值声明为right来将其设置为right,我们也可以定义点击次数通过将clicks参数设置为2,将其设置为双击。
以下是要在计算机上运行的完整Python代码:
导入序列 导入pyautogui ser = serial.Serial('com3',9600) 而1:1: k = ser.read(8) 光标= k click = k x =光标 y =光标 l = click r = click xcor = int(x.decode('utf-8')) ycor = int(y.decode('utf-8')) pyautogui.moveTo(xcor,ycor) 如果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驱动程序脚本。在脚本运行时,您会在蓝牙闪烁中看到一个时滞,这意味着它已连接到您的系统。然后,对其进行操作,单击“触发”按钮,您将看到坐标的位置会发生变化;如果要单击左键或右键,则首先同时按左或右按钮和触发按钮,您会在以下位置看到单击的动作:更改光标的位置。
查看下面的详细工作视频。