基于BLE HID与旋转编码器打造双模式无线遥控器

news2026/5/17 5:37:42
1. 项目概述你有没有过这样的时刻窝在沙发里看剧想调个音量或者暂停一下却不得不伸手去够茶几上的键盘或鼠标打断那份沉浸的惬意或者在电脑上回味一些经典老游戏时觉得用键盘移动、鼠标射击的操控方式少了点“味道”这个项目就是为了解决这些小小的不便而生的。我将带你从零开始打造一个完全属于你自己的、基于蓝牙低功耗BLEHID协议和旋转编码器的无线遥控器。它小巧得可以挂在胸前当个装饰品却能让你在几米开外轻松控制电脑的媒体播放甚至能用来玩《毁灭战士》Doom这样的经典游戏。这个遥控器的核心是一个集成了方向键和滚轮的ANO旋转导航编码器它提供了非常直观且符合人体工学的五向操作。大脑则是一块Adafruit的Feather nRF52840开发板它内置了蓝牙5.0并且能通过CircuitPython这种对新手极其友好的编程语言来控制。整个项目融合了硬件焊接、3D打印外壳组装和简单的Python编程最终你会得到一个功能实用、外观也相当酷的双模式无线控制器。无论你是想深入学习BLE HID设备的工作原理还是单纯想做一个好玩又实用的桌面小工具这个项目都能给你带来满满的成就感。2. 核心硬件选型与原理剖析2.1 主控板为什么是Adafruit Feather nRF52840在众多支持蓝牙的开发板中我选择了Adafruit Feather nRF52840 Express这并非随意之举。首先Feather生态系统的设计哲学就是“即插即用”其标准化的外形尺寸和引脚排列使得扩展和集成其他Feather翅膀板变得异常简单为未来功能升级留足了空间。其次也是最重要的nRF52840这颗芯片是Nordic Semiconductor的旗舰级蓝牙低功耗SoC它原生支持蓝牙5.0拥有充足的闪存1MB和RAM256KB足以流畅运行CircuitPython以及我们需要的各种库。最关键的一点在于它对CircuitPython的完美支持。CircuitPython是Adafruit主导开发的一个微控制器编程语言分支它极大降低了嵌入式开发的门槛。你不需要复杂的IDE和编译环境只需像操作U盘一样把.py代码文件拖到开发板上就能运行。对于实现HID设备来说Adafruit提供了现成的adafruit_hid库让我们用几行代码就能模拟键盘按键这比用C语言去实现蓝牙HID配置文件要简单太多了。这块板子还自带了一个锂电池充电管理芯片可以直接连接3.7V的LiPo电池实现真正的无线便携这是很多其他开发板需要额外模块才能实现的功能。2.2 输入设备ANO旋转导航编码器解析这个项目的“手感”和交互核心全部来自于ANO旋转导航编码器。它不是一个简单的旋转编码器而是一个高度集成的输入模块。从原理上看它内部包含了两大部分增量式旋转编码器其核心是两个相位差90度的机械触点对应ENCA和ENCB引脚。当你旋转旋钮时两个引脚会输出一系列方波脉冲。通过检测两个波形的相位差A领先于B还是B领先于A我们可以判断旋转的方向通过统计脉冲数量可以知道旋转的幅度。在我们的代码中rotaryio库帮我们完成了所有这些底层计数和方向判断我们直接读取encoder.position这个变化值即可。五向导航开关在旋钮的周围和中心集成了五个独立的轻触开关分别对应上、下、左、右、中按下五个方向。这本质上就是五个普通的按钮通过内部电路连接到独立的引脚SW1-SW5。在硬件连接上我们将其公共端COMA COMB接地每个按钮引脚通过上拉电阻接到高电平。当按钮按下时对应引脚被拉低到地产生一个低电平信号单片机通过检测这个电平变化来获知按键动作。这种将多种输入方式集成在一个紧凑模块里的设计不仅节省了空间和布线复杂度更重要的是提供了极其流畅和一致的用户体验。拇指可以在很小的移动范围内完成滚动、选择和确认等一系列操作这正是它作为遥控器输入设备的精髓所在。2.3 电路设计思路与电源管理整个项目的电路连接思路非常清晰目标是尽量减少飞线提高可靠性。旋转编码器模块通过一个9针的排母直接插在Feather nRF52840的特定引脚上这是一种“板对板”的连接方式既稳固又整洁。你需要仔细对照引脚定义图进行焊接确保ENCA、ENCB和各SW信号线连接到正确的GPIO口。两个滑动开关模式开关和电源开关的处理是另一个重点。它们都需要一个接地GND引脚和一个信号引脚。这里采用了一个小技巧将两根导线拧在一起共同焊接在板子的GND焊盘上然后再分别引到两个开关的引脚1。这样做比从板子上引出两根独立的GND线更规整。模式开关的信号线连接到模拟引脚A1我们将其用作数字输入电源开关的信号线则连接到板子的EN使能引脚。注意将电源开关连接到EN引脚是一个巧妙且安全的做法。EN引脚是芯片的使能引脚拉低时会强制芯片进入复位或关机状态。通过开关将其与GND断开或连接可以实现完全的物理断电比在电池供电线上加开关更安全也能彻底杜绝待机功耗。3. 软件环境搭建与代码深度解读3.1 CircuitPython固件刷写与库管理第一步是让Feather nRF52840“学会”CircuitPython语言。这个过程简单得令人惊讶。你只需要访问CircuitPython官网找到对应Feather nRF52840的最新版.uf2固件文件并下载。然后用USB数据线连接开发板和电脑快速双击板载的复位按钮此时板载的NeoPixel LED会变成绿色电脑上会出现一个名为FTHR840BOOT的U盘。最后把刚才下载的.uf2文件拖进去等待几秒钟U盘名称会自动变为CIRCUITPY刷机就完成了。整个过程无需安装任何驱动或软件真正实现了“开箱即用”。接下来是库文件的准备。我们的项目依赖几个重要的库adafruit_hid用于模拟键盘adafruit_debouncer用于处理按键抖动rotaryio用于读取编码器。最方便的方法是直接下载项目提供的“项目包”Project Bundle这是一个压缩文件解压后里面会有一个lib文件夹和主程序code.py。你只需要将整个lib文件夹和code.py文件复制到CIRCUITPY磁盘的根目录即可。CircuitPython会在启动时自动加载lib目录下的所有库文件。3.2 核心代码逻辑逐行解析让我们深入看看code.py理解它是如何让硬件“活”起来的。初始化与引脚定义代码开头首先导入了所有必需的库然后清晰地定义了每个硬件连接的引脚。例如ENCA board.SDA,ENCB board.SCL这里巧妙地利用了I2C引脚它们也是普通的GPIO来连接编码器。五个按钮引脚和两个公共端COMA COMB也被逐一指定。这种集中定义的方式让后续的硬件修改和维护变得非常容易。# 关键引脚定义建议对照原理图核对 ENCA board.SDA # 编码器A相 ENCB board.SCL # 编码器B相 COMA board.D5 # 按钮公共端A CENTER board.D6 # 中心按钮 # ... 其他按钮定义 SWITCH board.A1 # 模式切换开关按键消抖与状态管理机械按钮在按下和弹起的瞬间由于触点抖动会产生一系列不稳定的电平信号。如果直接读取单片机可能会误判为多次按键。adafruit_debouncer库的Button类就是用来解决这个问题的。它内部包含了一个状态机通过延时采样来过滤掉抖动并提供清晰的pressed、released和long_press事件。我们将五个按钮封装成Button对象并存入数组在主循环中统一调用update()方法来更新它们的状态这样代码既简洁又健壮。双模式键值映射项目的精髓在于双模式切换。我们定义了两个元组CHILL_CODES和DOOM_CODES分别存储了流媒体模式和游戏模式下五个按钮对应的键盘键值。这两个元组的顺序必须与inputs按钮数组的顺序严格对应。例如inputs[0]是中心按钮那么CHILL_CODES[0]空格键和DOOM_CODES[0]Ctrl键就是它在这两种模式下分别触发的按键。# 流媒体模式键值空格(播放/暂停)F(全屏)左箭头(后退)M(静音)右箭头(快进) CHILL_CODES (Keycode.SPACE, Keycode.F, Keycode.LEFT_ARROW, Keycode.M, Keycode.RIGHT_ARROW) # 毁灭战士模式键值Ctrl(开火)上箭头(前进)左箭头(左转)下箭头(后退)右箭头(右转) DOOM_CODES (Keycode.CONTROL, Keycode.UP_ARROW, Keycode.LEFT_ARROW, Keycode.DOWN_ARROW, Keycode.RIGHT_ARROW)蓝牙HID连接建立代码使用adafruit_ble库来建立蓝牙连接。HIDService()创建了一个HID设备服务ProvideServicesAdvertisement(hid)则对外广播这个服务。设置appearance961是告诉蓝牙主机你的电脑或手机“我是一个键盘设备”。当电脑搜索并配对这个名为“CircuitPython HID”的设备后连接就建立了我们的开发板在系统中就会被识别为一个标准的蓝牙键盘。主循环的工作流主循环是程序的心脏它不断执行以下任务检查模式开关读取A1引脚的电平决定当前是chill流媒体模式还是doom游戏模式。处理旋转编码器比较编码器当前位置与上一次位置判断是左转还是右转。根据当前模式发送音量增减上下箭头或左右平移逗号、句号的按键信号。处理按钮事件遍历五个按钮检查其状态。如果中心按钮被长按发送空格键在Doom中用于“使用/开门”。对于其他按钮的普通按下和释放事件则根据当前模式从对应的键值元组中取出键码执行kbd.press()或kbd.release()操作。这里使用“按下”和“释放”是为了模拟真实的键盘行为对于需要长按的操作如游戏中的持续移动是必要的。4. 硬件制作与组装全流程4.1 焊接工艺与要点焊接是连接硬件灵魂的步骤质量直接决定了设备的可靠性。首先处理ANO编码器与其分线板。给编码器的九个引脚和分线板对应的焊盘上好锡然后将编码器对准焊盘用烙铁头同时接触引脚和焊盘待焊锡熔化流动后移开。务必确保编码器与分线板垂直否则后续无法平整地安装到外壳中。接下来是Feather nRF52840上的排母焊接。你需要将一排长排母剪裁成9针。一个实用技巧是先用剪刀在需要剪断的位置刻一道深痕然后轻轻掰断这样断面会比直接用剪子剪更平整。焊接时先将排母插入面包板或夹具中固定然后将Feather板子对准插上去再从背面焊接。重点注意要避开Bat、EN和USB这三个引脚的位置确保它们空出来以便后续连接电源开关和供电。对于电源线和信号线的焊接我强烈建议使用不同颜色的硅胶线如黑、红、蓝、黄并在焊接前先套上热缩管。焊接GND共线时先将两根黑色线拧在一起镀锡后作为一个整体焊接到板子的GND焊盘上这样比分开焊更牢固。焊接完成后用热风枪或打火机小心地加热热缩管使其收缩并包裹住焊点这是防止短路最有效的方法。4.2 3D打印外壳的处理与组装项目提供的STL文件包含了底座、上盖和安装支架三个部分。打印时建议使用PLA材料层高0.2mm填充率20%即可无需支撑。打印完成后仔细检查并清理底座侧边和底部的开关开孔如果有毛刺或不够光滑可以用小锉刀或砂纸轻轻打磨确保两个滑动开关能严丝合缝地卡进去。组装顺序是关键固定主控板使用三组M2.5的铜柱和螺丝将Feather nRF52840固定在安装支架上。注意避开靠近排针的那个安装孔为编码器模块留出空间。集成编码器将已焊好排母的编码器分线板直接插入Feather板上的9针排母。此时分线板上的安装孔应该与安装支架上剩余的孔位对齐。连接上盖将上盖对准安装支架和编码器分线板用四颗M2.5螺丝从上方穿过上盖、分线板安装孔最终拧紧在安装支架的螺纹孔或螺母上。这一步将整个核心组件固定成了一个整体。安装开关与合盖将模式开关和电源开关从外壳内部推向对应的侧边和底部开孔使其卡紧。把电池插到Feather板的JST插座上整理好线束最后将组装好的“核心模块”扣到底座上听到“咔哒”一声即表示卡扣锁紧。实操心得在最终合盖前务必先进行一次“裸板”功能测试。即不安装外壳接通电源用电脑蓝牙搜索并连接设备测试各个按钮和旋钮功能是否正常。这能避免在组装完成后才发现焊接或代码问题导致又得拆开的麻烦。5. 功能使用、问题排查与扩展思路5.1 双模式功能详解与使用技巧设备组装完成后拨动底部的电源开关启动。电脑的蓝牙设置中会出现一个名为“CircuitPython HID”的设备点击配对通常无需输入密码。连接成功后你就可以开始使用了。流媒体模式默认此模式下遥控器化身为一个强大的媒体控制器。旋钮顺时针旋转增加音量逆时针旋转减小音量。这种模拟物理旋钮控制音量的感觉比按键盘快捷键要直观得多。中心按钮短按实现播放/暂停。这是最常用的功能。方向键上键全屏、下键静音、左键后退10秒、右键快进10秒。这套组合键几乎适配了所有主流流媒体网站Netflix YouTube Bilibili等。游戏模式将侧面的模式开关拨到另一侧遥控器瞬间变为一个怀旧游戏手柄。旋钮在《毁灭战士》中左右旋转分别对应“左平移”和“右平移”默认按键逗号和句号这是FPS游戏中非常重要的战术动作。中心按钮短按是开火Ctrl长按是使用/开门空格。这个长按功能的实现完全得益于我们使用了adafruit_debouncer库的long_press属性它让一个按键拥有了两种功能。方向键上、下、左、右分别对应游戏中的前进、后退、左转、右转。5.2 常见问题排查速查表在制作和使用过程中你可能会遇到以下问题。别担心大部分都有简单的解决办法。问题现象可能原因排查步骤与解决方案电脑蓝牙搜索不到设备1. 电源未打开2. BLE代码未运行3. 电池电量耗尽1. 检查底部电源开关是否拨到“ON”。2. 通过USB连接电脑检查CIRCUITPY磁盘中的code.py文件是否存在且名称正确。3. 连接USB充电或更换电池。蓝牙已连接但按键无反应1. 代码未正确发送HID报告2. 引脚定义错误3. 按钮焊接虚焊或短路1. 打开一个记事本测试按键。检查串口输出如果代码有print语句。2. 仔细核对code.py中的引脚定义与实物焊接是否完全一致。3. 用万用表通断档检查按钮引脚与主板连接按下按钮时是否导通。旋钮控制相反或失灵1. 编码器A、B相线序接反2. 公共端COMA COMB未接地1. 交换ENCA和ENCB两根线的连接。2. 检查COMA和COMB是否都通过代码设置为低电平输出com_a.value False。某个按钮一直处于“按下”状态该按钮引脚对地短路或上拉失效1. 检查该按钮引脚与GND是否有焊锡短路。2. 检查代码中该按钮是否被正确设置为Pull.UP上拉输入。设备频繁断开蓝牙连接1. 电池电压不足2. 超出蓝牙有效范围或有强干扰1. 为电池充电。2. 确保使用环境在无障碍物10米范围内远离微波炉、无绳电话等2.4GHz干扰源。5.3 项目扩展与个性化改造这个项目的框架具有很强的可扩展性你完全可以把它打造成一个专属的万能遥控器。自定义键位这是最简单的改造。只需修改CHILL_CODES和DOOM_CODES这两个元组里的Keycode值。Adafruit HID库支持几乎所有标准键盘键值包括功能键、多媒体键如Keycode.VOLUME_UP等。例如你可以把流媒体模式的下键改成Keycode.B用来在浏览器中打开书签。增加更多模式目前只有两个模式通过一个两位开关切换。你可以换用一个多位旋转开关或者在代码中实现“模式循环切换”例如连续按两次中心按钮切换模式从而容纳第三、第四种配置比如一个专门用于PPT演示的模式左/右翻页 黑屏或者一个Photoshop的简易编辑模式。添加更多输入Feather nRF52840还有很多空闲的GPIO引脚。你可以焊接一个振动电机在按键时提供触觉反馈或者增加一个电容触摸传感器实现滑动音量调节等更酷的交互。改变外壳与佩戴方式3D打印外壳的设计文件是开源的你可以使用Tinkercad或Fusion 360等工具对其进行修改。比如做一个更圆润的造型或者增加一个钥匙扣环把它挂在背包上。你甚至可以用激光切割亚克力板来制作外壳获得不同的质感。这个项目的乐趣一半在于制作另一半在于改造。它不仅仅是一个遥控器更是一个理解BLE HID协议、嵌入式编程和硬件交互的绝佳平台。当你用自己的代码让它执行一个全新任务时那种感觉是无与伦比的。希望这篇详细的指南能帮你顺利走完从零件到成品的每一步并点燃你进一步探索的兴趣。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…