实现一个BLE HID鼠标

  • 这个程序将 ESP32 或类似设备变成了一个简单的蓝牙鼠标,通过 4 个 GPIO 引脚来控制鼠标的上下左右移动。
  • 连接到蓝牙后,按下相应的按键会发送 HID 鼠标移动事件。
  • 包含了一个简单的测试函数,用于验证鼠标的移动和点击功能。
# MicroPython Human Interface Device library
# Copyright (C) 2021 H. Groefsema
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <https://www.gnu.org/licenses/>.
import time
from machine import SoftSPI, Pin
from hid_services import Mouseclass Device:def __init__(self):# 定义初始坐标self.x = 0 # 用于存储鼠标的 X 轴和 Y 轴移动量。self.y = 0self.prev_x = 0self.prev_y = 0# 定义按键引脚(GPIO)# 对应于鼠标的上、下、右、左移动,分别连接到 GPIO 引脚 5、23、19 和 18self.pin_forward = Pin(5, Pin.IN)self.pin_reverse = Pin(23, Pin.IN)self.pin_right = Pin(19, Pin.IN)self.pin_left = Pin(18, Pin.IN)# 创建鼠标设备实例self.mouse = Mouse("Mouse")# 设置状态变化回调函数 mouse_state_callbackself.mouse.set_state_change_callback(self.mouse_state_callback)# 启动鼠标设备self.mouse.start()# Function that catches device status events# 鼠标状态回调函数,用于处理鼠标设备状态变化。可能会根据设备状态执行不同的操作。def mouse_state_callback(self):if self.mouse.get_state() is Mouse.DEVICE_IDLE: # 设备处于空闲状态returnelif self.mouse.get_state() is Mouse.DEVICE_ADVERTISING: # 设备正在广播蓝牙信号,等待连接return elif self.mouse.get_state() is Mouse.DEVICE_CONNECTED: # 设备已连接returnelse:returndef advertise(self): #启动蓝牙广播,使设备可以被发现和连接self.mouse.start_advertising()def stop_advertise(self): #停止蓝牙广播self.mouse.stop_advertising()# Main loopdef start(self):while True:# 根据按键状态计算 x 和 y 的变化量# 右键按下 (pin_right.value() == 1) 时,x = 127,表示向右移动最大速度self.x = self.pin_right.value() * 127 - self.pin_left.value() * 127self.y = self.pin_forward.value() * 127 - self.pin_reverse.value() * 127# 如果检测到坐标发生变化且鼠标设备已连接,则发送 HID 报告,通知移动更新。# 检查是否发生变化if (self.x != self.prev_x) or (self.y != self.prev_y):# 更新上一次的坐标值self.prev_x = self.xself.prev_y = self.y# 如果鼠标已连接,更新坐标并通知# If idle start advertising for 30s or until connectedif self.mouse.get_state() is Mouse.DEVICE_CONNECTED:self.mouse.set_axes(self.x, self.y)self.mouse.notify_hid_report()# 如果设备处于空闲状态,则开始广播elif self.mouse.get_state() is Mouse.DEVICE_IDLE:self.mouse.start_advertising()i = 10while i > 0 and self.mouse.get_state() is Mouse.DEVICE_ADVERTISING:time.sleep(3)i -= 1if self.mouse.get_state() is Mouse.DEVICE_ADVERTISING:self.mouse.stop_advertising()# 如果鼠标已连接,休眠 20ms 后退出循环,进行测试if self.mouse.get_state() is Mouse.DEVICE_CONNECTED:time.sleep_ms(20)breakelse:time.sleep(2)self.test()# 停止设备def stop(self):self.mouse.stop()# Test routinedef test(self):self.mouse.set_battery_level(50)self.mouse.notify_battery_level()for i in range(30):self.mouse.set_axes(100,100) # 向右上移动 (100, 100) 并按下左键self.mouse.set_buttons(1)self.mouse.notify_hid_report()time.sleep_ms(500)self.mouse.set_axes(100,-100) # 向右下移动 (100, -100) 释放按键self.mouse.set_buttons()self.mouse.notify_hid_report()time.sleep_ms(500)self.mouse.set_axes(-100,-100) # 向左下移动 (-100, -100) 并按下右键self.mouse.set_buttons(b2=1)self.mouse.notify_hid_report()time.sleep_ms(500)self.mouse.set_axes(-100,100) # 向左上移动 (-100, 100) 释放按键self.mouse.set_buttons()self.mouse.notify_hid_report()time.sleep_ms(500)self.mouse.set_axes(0,0) # 最后将鼠标位置重置为 (0, 0),并模拟将电池电量更新为 100%self.mouse.set_buttons()self.mouse.notify_hid_report()self.mouse.set_battery_level(100) # 设置电池电量(模拟电池状态self.mouse.notify_battery_level()if __name__ == "__main__":# 创建 Device 实例并启动主循环,等待蓝牙连接和处理按键输入。d = Device()d.start()

你可以通过修改 pin_forwardpin_reversepin_rightpin_left 引脚编号,来匹配你的硬件设置,并根据需要调整鼠标移动的速度(例如更改 127 的值)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/470533.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【VBA实战】用Excel制作排序算法动画续

为什么会产生用excel来制作排序算法动画的念头&#xff0c;参见【VBA实战】用Excel制作排序算法动画一文。这篇文章贴出我所制作的所有排序算法动画效果和源码&#xff0c;供大家参考。 冒泡排序&#xff1a; 插入排序&#xff1a; 选择排序&#xff1a; 快速排序&#xff1a;…

IPguard与Ping32全面对比——选择最适合企业的数据安全解决方案

在如今数据安全威胁日益加剧的时代&#xff0c;企业必须高度重视保护敏感数据与信息。因此&#xff0c;选择一款合适的数据安全软件&#xff0c;尤其是防泄密和信息保护软件&#xff0c;显得尤为重要。在市场上&#xff0c;有两款备受企业青睐的数据安全解决方案——IPguard和P…

《情商》提升:增强自我意识,学会与情绪共处

在当今社会&#xff0c;情商&#xff08;Emotional Intelligence&#xff0c;EQ&#xff09;的重要性越来越受到人们的关注。情商是指个体运用情绪、情感、认知和行为反应的能力&#xff0c;来理解、管理、表达和处理情感的一种综合素养。情商的高低对于个人的成长、人际关系、…

k8s集群安装(kubeadm)

k8s集群安装&#xff08;kubeadm&#xff09; 1、环境准备&#xff08;master和node节点都执行&#xff09;1.1、替换yum源1.2、关闭selinux1.3、永久关闭防火墙1.4、永久关闭swap1.5、修改主机名添加host1.6、时间同步1.7、将桥接的IPv4流量传递到iptables的链1.8、docker安装…

使用Matlab建立随机森林

综述 除了神经网络模型以外&#xff0c;树模型及基于树的集成学习模型是较为常用的效果较好的预测模型。我们以下构建一个随机森林模型。 随机森林是一种集成学习方法&#xff0c;通过构建多个决策树并结合其预测结果来提高模型的准确性和稳定性。在MATLAB中&#xff0c;可以…

Wireshark

目录 解题思路 题目设计原理 总结 解题思路 首先下载文件&#xff0c;用 wireshark 打开一头雾水。 但是看看题目的提示&#xff0c;说管理员的密码就是 flag 的内容&#xff0c;我们可以知道&#xff0c;关键词估计是密码&#xff0c;passwd、password、pwd之类的。 所以我…

FreeRTOS学习13——任务相关API函数

任务相关API函数 任务相关API函数任务相关API函数介绍任务相关 API 函数详解函数 uxTaskPriorityGet()函数 vTaskPrioritySet()函数 uxTaskGetSystemState()函数 vTaskGetInfo()函数 xTaskGetApplicationTaskTag()函数 xTaskGetCurrentHandle()函数 xTaskGetHandle()函数 xTask…

使用kalibr_calibration标定相机(realsense)和imu(h7min)

vslam-evaluation/VINS/Installation documentation/4.IMU和相机联合标定kalibr_calibration.md at master DroidAITech/vslam-evaluation GitHub 目录 1.kalibr安装 1.1安装依赖项 1.2创建工作空间 1.3下载kalibr并编译 1.4设置环境变量 2.准备标定板 3.配置驱动和打…

[Docker#8] 容器配置 | Mysql | Redis | C++ | 资源控制 | 命令对比

目录 一&#xff1a;Mysql 容器化安装 二&#xff1a;Redis 容器化安装 Redis 简介 Redis 容器创建 三&#xff1a;C容器制作 四&#xff1a;容器资源更新 常见问题 一&#xff1a;Mysql 容器化安装 进入 mysql 的镜像网站&#xff0c;查找 mysql 的镜像 mysql docker…

1小时构建Vue3知识体系之vue的生命周期函数

本文转载自&#xff1a;https://fangcaicoding.cn/course/12/63 大家好&#xff01;我是方才&#xff0c;目前是8人后端研发团队的负责人&#xff0c;拥有6年后端经验&3年团队管理经验。 系统学习践行者&#xff01;近期在系统化输出前端入门相关技术文章&#xff0c;期望能…

数据结构-集合

一.集合的表示 一个重要的操作是查某个元素属于哪个集合&#xff0c;另一个操作是合并操作 从这个树的节点去找树根也就是从下往上找,要把树并起来只需把两个根并在一起就可以了 不存在已知一个节点去找孩子节点&#xff0c;根重要的是已知一个节点找它的父亲节点,与之前的二…

unity基础,点乘叉乘。

简单记录下点乘叉乘&#xff0c;要不每次用完就忘&#xff0c;忘了又查。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class TestCrossDot : MonoBehaviour {/// <summary>/// 原点/// </summary>public Transform t…

springboot 之 整合springdoc2.6 (swagger 3)

版本 springboot 3.3.5 jdk 17 springdoc 2.6.0 依赖pom <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version> </dependency>注解对比…

数据结构与算法-前缀和数组

前缀和问题 什么是前缀和? 对于一个一般数组 nums,如果我们需要知道 S1 nums[0] nums[1]的结果&#xff0c; S2 nums[0] nums[1] nums[2] … 计算公式相当于: S2 S1 nums[2] … Sn Sn-1 nums[n]; 所谓前缀和&#xff1a;用来记录数组前项和的一个新数组&#xff0c;提…

R语言机器学习与临床预测模型77--机器学习预测常用R语言包

R小盐准备介绍R语言机器学习与预测模型的学习笔记 你想要的R语言学习资料都在这里&#xff0c; 快来收藏关注【科研私家菜】 01 预测模型常用R包 常见回归分析包: rpart 包含有分类回归树的方法; earth 包可以实现多元自适应样条回归; mgev包含广义加性模型回归; Rweka 包中的M…

Elasticsearch可视化工具Elasticvue插件用法

目录 1.打开浏览器扩展程序(示例Edge浏览器) ​2.搜索elasticvue并安装 3.打开elasticvue ​4.连接Es 5.有些浏览器无法下载安装扩展&#xff0c;例如谷歌。可以打包扩展给别的浏览器使用。 5.1打开浏览器扩展&#xff0c;打开开发人员模式&#xff0c;记住扩展程序id 5…

大数据技术之HBase中的HRegion

如果你正在学习大数据&#xff0c;你应该知道HBase是一个列式存储的NoSQL分布式数据库&#xff0c;可以配合Hadoop来使用。今天自己简单做了几页PPT&#xff0c;解释了一下HBase当中HRegion的基本概念&#xff0c;很多初学者在学习的时候对HRegion这个概念一直懵懵懂懂&#xf…

Spring Cloud Contract快速入门Demo

1.什么是Spring Cloud Contract &#xff1f; Spring Cloud Contract 是 Spring 提供的一套工具&#xff0c;用于帮助开发者通过契约&#xff08;Contract&#xff09;驱动的方式进行微服务的测试和集成。它主要解决微服务之间通信时&#xff0c;如何确保服务提供者和消费者之…

GISBox VS ArcGIS:分别适用于大型和小型项目的两款GIS软件

在现代地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;有许多大家耳熟能详的GIS软件。它们各自具有独特的优势&#xff0c;适用于不同的行业需求和使用场景。在众多企业和开发者面前&#xff0c;如何选择合适的 GIS 软件成为了一个值得深入思考的问题。今天&#xff…

Linux 进程线程间通信总结

线程 线程共享存储空间主要带来的问题是数据同步和互斥。由于线程在同一进程中运行&#xff0c;它们共享相同的内存空间&#xff0c;任何线程都可以访问共享数据。这样&#xff0c;多个线程并发执行时&#xff0c;可能会导致以下两种主要问题&#xff1a; 互斥问题&#xff0…