智能手机控制鼠标
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
应用和在线服务
| ||||
| ||||
|
关于这个项目
这个项目类似于我以前使用操纵杆控制 PC 光标的工作。主要区别在于我创建了一个智能手机应用程序,其中包含 2 个虚拟操纵杆来移动光标和滚动屏幕,还可以像常规触控板一样进行左右单击。
工作
该项目涉及一个智能手机应用程序,该应用程序使用蓝牙将操纵杆的 x 和 y 轴数据、滚动状态、左键和右键单击状态发送到连接到 HC-05 蓝牙模块的 Arduino Uno。这些接收到 Arduino 的数据被操纵以更改当前光标的位置以获得新位置。然后将结果数据以及滚动和按钮状态打印为 Python 草图识别为读取的输出。 Python 草图用于使用鼠标模块执行鼠标操作。
关于申请
智能手机应用程序是使用 MIT-App Inventor 创建的。创建应用程序很简单,因为您只需要添加所需的块来构建所需的应用程序。我已经参考了有关制作它们的桌面机器人教程。应用程序主画面如下-
在向HC-05模块发送主要信息之前,应用程序首先发送一个一字节的数字(255)来表示信息的开始。数据传输顺序如下-
1.发送'255'表示开始
2. 发送1个字节的摇杆x轴值
3.发送1字节摇杆y轴值
4.发送左键、右键、滚动状态(1字节)。
来自应用程序的数据每 20 毫秒发送一次到 Arduino UNO。
Arduino的一面
Arduino 在 HC-05 蓝牙模块的帮助下接收来自应用程序的数据字节。 Arduino 包含光标的当前坐标,其中 x 坐标范围从 0 到 1279,y 坐标范围从 0 到 799。我从 python 函数 mouse.get_position()
获得了这些极端坐标 移动光标时返回坐标(未在主草图中使用)。
根据移动操纵杆时接收到的数据,当前光标的位置(x 和 y 坐标)与应用程序接收到的数据相加/相减,以将光标移动到新的所需坐标。然后将最终数据按下面给出的顺序打印在串行监视器上。
下面的数据序列最终被python程序读取执行。为此,我们需要按照以下步骤下载额外的模块,即鼠标和 pyserial。
Python编程
用户必须在他们的笔记本电脑/计算机上安装 python 3。可以从这里下载。
(Windows)
安装完成后,复制python文件所在路径。
以下步骤将在命令提示符下执行。打开命令提示符并输入以下内容-
1. cd <粘贴python文件的路径>
2. py -m pip install --upgrade pip
3. py -m pip install mouse
4. py -m pip install pyserial
鼠标 模块用于执行鼠标操作和 pyserial 模块用于从 arduino 发送/接收数据。我已经安装了必要的模块,所以我得到了这个
图>
执行
在您的智能手机设备上安装蓝牙鼠标控制应用。
将 Arduino 草图上传到您的 Arduino UNO 并按照原理图中给出的电路进行操作。
Python 端 -
1.将python代码复制粘贴到记事本文件中。将 COM 端口更改为 Arduino UNO 的 COM 端口并将其保存为“.py”。
图>2.打开python IDLE并打开它的记事本文件。
图> 图>3. 运行草图。
然后您将被引导回图 2.2 中的屏幕。
打开手机应用,连接蓝牙模块,改变摇杆方向会发现光标移动。
代码
- Arduino 代码
- Python 代码
Arduino 代码Arduino
int datareceived[5] {0,0,0,0}; // 从 phoneint 中存储字节 in_byte =0;int array_index =0;int l_prev=0,r_prev=0; //鼠标左键和右键单击的先前状态 void setup() {Serial.begin (9600); // 启动串口监视器} int height=0,width=0;void loop() { int clicks=0;整数灵敏度=20; // 您可以调整灵敏度 int xpos=0,ypos=0;if (Serial.available()> 0) { //从手机接收字节 in_byte=Serial.read(); //将字节存储到变量中 if (in_byte ==(255)) { // 如果变量为 0,则将数组索引为 0。array_index =0; } datareceived[array_index] =in_byte; //将数字存入数组 array_index =array_index +1; if(datareceived[1]>=110)xpos=map(datareceived[1],110,172,0,敏感性); // 移动时 rightif(datareceived[1]<=70)xpos=map(datareceived[1],60,1,0,-sensitive); // 当向左移动时if(datareceived[2]>=110)ypos=map(datareceived[2],110,255,0,sensitive); // 向下移动时if(datareceived[2]<=60)ypos=map(datareceived[2],70,1,0,-sensitive); // 当移动时 upif(datareceived[3]==1 &&l_prev==0) // 要识别单个按钮,按下 clicks=1;else if(datareceived[3]==2 &&r_prev==0)clicks=2;else if(datareceived[3]==3 || datareceived[3]==4)clicks=datareceived[3]; // scrolll_prev=datareceived[3];r_prev=datareceived[3];if(xpos!=0 or ypos!=0 or clicks!=0) // 当操纵杆移动或按钮被按下或滚动时{ height=height+ypos;width=width+xpos;if(height>=799)height=799;if(height<=0)height=0;if(width>=1279)width=1279;if(width<=0)width=0;Serial.print(width);Serial.print(":");Serial.print(height);Serial.print(":");Serial.println(clicks);clicks=0;} }}
Python 代码Python
import mouse, sysimport time import serialmouse.FAILSAFE=FalseArduinoSerial=serial.Serial('com3',9600) #指定正确的COM端口time.sleep(1) #delay of 1 secondwhile 1:data=str(ArduinoSerial.readline) ().decode('ascii')) (x,y,z)=data.split(":") # 读取x轴和y轴数据 (x,y)=(int(x),int(y) ) # 转换为 int mouse.move(x,y) # 将光标移动到所需坐标 if '1' in z:mouse.click(button="left") #clicks mouse button elif '2' in z:mouse. click(button="right") elif '3' in z:mouse.wheel(delta=-1) # 向下滚动 elif '4' in z:mouse.wheel(delta=1) # 向上滚动
示意图
制造工艺