这是一个完全开源的DIY游戏鼠标项目,包括代码、原理图、PCB布局和3D模型,所有这些都围绕Pixart PMW3360传感器进行设计。
这款鼠标的固件采用了一种特殊的去抖动算法,能够在不增加任何延迟的情况下彻底消除鼠标抖动,其效果甚至比市面上的商用鼠标在消除弹跳方面表现得更为出色,随机双击的问题也因此不复存在。
通常情况下,生产游戏鼠标传感器的公司,包括Pixart在内,并不会将这些传感器直接出售给消费者,因此需要通过回收传感器,或者从黄牛或专门从事此类产品转售的小企业那里来获取它们。
特性
- 真正的零延迟按钮去抖动,无故障。
- 按钮在仅几个月后不会出现双击问题。
- 低延迟运动跟踪(无平滑)。
- 完全开源(Apache 2.0许可证)。
- 硬件也是开源的!(处理器和传感器除外)
- 超轻外壳和组件(总重55克)。
- 指尖握把壳形状。
- 额外的鼠标中键。
- 通常在其他鼠标上用于控制DPI的按钮被映射到M3。
- PCB将RP2040中额外未使用的引脚作为测试板,用于硬件/固件修改的乐趣;可以安装您自己的传感器!或者LED!随您所想!
- 完整的1000Hz跟踪。
待办事项
- 可配置的DPI(当前硬编码为1200)。
- 要在固件代码中更改它,请编辑该行,将11替换为您的DPI除以100减1,例如7表示800DPI,3表示400DPI,15表示1600DPI,依此类推。
- 重新绑定、宏等。
- 如果您擅长编程,已经可以硬编码。
- “有趣”的可选功能,如WMO风格的对角线锯齿去除或可选的固件内加速、反平滑(预测)、角度捕捉、电影平滑等。
所需技能
您需要熟悉或能够快速学习:- 3D打印
- 如何使用“切片器”(例如Cura)将STL模型转换为GCODE(您的3D打印机使用)。
- 重复制作测试打印。
- 如何清理3D打印件并从易碎打印件中去除支撑材料。
- 基本的固件代码调试技能。
- 读取嵌入式C/C++代码的能力。
- Arduino IDE(我使用2.x,而不是1.x)。
- 拆焊(带热风返修台)。
- 焊接(使用烙铁)。
- 将bodge线焊接到现有硬件上,而无需创建焊桥(用于SROM提取)。
- 舒适使用热风返修台软化和修复3D打印物体上打印不当的畸形部件。
- 能够在不浪费大量金钱或烧毁房屋的情况下完成上述所有操作。
- 熟悉PCB印刷公司和PCB组装制造商(JLCPCB、PCBWay等)。
- 耐心。
您还需要:
- 使用3D打印机,您可以在上面重复打印测试打印件,直到它们正确打印出来。
- 具有温度和空气流量控制的热风返修台。
- 带温度控制的烙铁。
- 热胶设备(用于固定USB数据线,仅此而已)。
- 各种小工具,如螺丝刀、镊子、清洁刀片/去毛刺工具等,用于制作过程的各个环节。
原理图 & PCB
想学习的小伙伴可以先看下视频:
详细DIY 过程说明
3D 打印部分:假设您使用的是灯丝打印机。树脂打印机也可能适用,但我个人从未尝试过。我使用的是PLA耗材进行打印。
请按照“Case Model”文件夹中每个STL文件的自然(非默认)方向进行打印。请注意,部分模型需要进行旋转,以确保它们按照鼠标中的实际方向保存,而非3D打印机构建板上所需的方向。
您需要自行将STL文件转换为GCODE,并进行各种测试打印,因为不同的3D打印机和耗材对层厚、支撑截止角度、打印速度、Z轴对齐位置等参数有着不同的要求。Cura软件可能会提示某些作品(例如外壳底部)不“防水”,但这是误报;水密性检查无法正确处理多个重叠的实体。模型仍然可以正确切片且不会出现问题。
拇指部件必须旋转到无需任何支撑的方向。这意味着拇指片的一小部分朝上,而开关夹的长部分位于底部。滚轮必须旋转,使厚圆柱部分位于底部,薄销部分位于顶部。它必须带支撑进行打印;任何类型的支撑都可以。在打印引脚部分时,您必须将打印速度降低到可以接受的低水平。在我的Sovol SV06打印机上,我不得不将其速度调低到25%。如果您的打印机不允许您在打印过程中更改速度,则必须在整个打印过程中以低速打印。这一步非常重要;您必须缓慢打印,否则引脚可能会与自身错位,导致滚轮失去平衡,并根据其在旋转周期中的位置以不同的压力按下鼠标中键开关。
滚轮大括号应按原样打印。
外壳底部也应按原样打印。但是,如果您使用的是加热打印床或加热腔室,则需要等待它完全冷却后再将其移除。如果在打印件仍处于温热状态时将其取下,底部可能会弯曲,导致鼠标无法平稳放置。即使使用鼠标脚,如果底部弯曲,传感器也可能处于错误的高度。
打印外壳顶部时,应使用树状支撑,并将支撑截止角度设置在60到70度之间。不要使用“标准”/传统/网格支撑;它们很难去除,您可能会在尝试去除它们时损坏打印件。在我的Sovol SV06打印机上,67度效果很好。如果您的打印质量不佳,您可能需要将截止角度降低到像50度这样的较低值。如果您必须将截止角度设置得低于50度,建议您购买更好的打印机,或者确保在合适的温度下使用正确的耗材等。
打印完外壳顶部后,您需要使用去毛刺工具(或其他坚硬、锋利的金属工具),沿着外壳底部与外壳底部接缝处的某个弯曲边缘,从外壳右侧去除少量材料(按钮片远离您,“对接”部分朝向您)。如果不从外壳顶部的这一部分去除少量材料,外壳将无法正确组装,可能会错位约四分之一毫米,导致右键点击无法正常工作。这种材料必须去除,因为在打印过程中它会下垂,而由于支撑桥接的工作原理,它在打印过程中会下垂;3D模型本身是正确的。
您应该逐个打印每个部分,并在每次打印后检查是否有错误。
最终结果可能会有些粗糙和坚固,但它是一个功能性的鼠标外壳。
SROM制备:
注意:SROM是可选的,但强烈建议使用,因为它包含传感器固件的错误修复。如果无法获取,请注释掉对in的调用,然后将文件包含重命名为#include "srom_dummy_blank.h",但请注意,您的鼠标可能会出现诸如“spinout”之类的故障行为或跟踪性能较差。例如,在编写此内容并在没有SROM的情况下测试固件时,我点击并拖动窗口上的标题栏,然后鼠标光标无缘无故地向右传送了300~400像素。
需要从现有鼠标中捕获SROM,因为它受版权保护。将其命名为srom_3360_0x03.h、srom_3360_0x04.h或srom_3360_0x05.h,具体取决于它的版本。我浏览了GitHub并找到了其他使用3360 SROM的项目,这似乎是他们决定命名SROM头文件的方式,因此我从中复制了文件名。
获得SROM后,编辑3360_Mouse_pico.ino中的#include "srom_3360_0x05.h"行以指向SROM的文件。以下是有关如何从商用鼠标捕获SROM的说明。
使用以下代码从商用3360鼠标和独立的Raspberry Pi Pico(不是此鼠标的自定义PCB)捕获SROM:
https://gist.github.com/wareya/0dc3498bd80be93c47b6f79aa9164321
注意:上述SROM捕获代码要求您在Arduino IDE中使用“arduino-pico”板类型。但本repository中的固件要求您使用“mbed OS” rp2040板类型。
使用面包板制作与下图中描述的等效的ripping设置:在操作过程中,请务必格外小心,避免在3360的任何引脚之间形成焊桥。
接下来,重新连接鼠标,使其重新启动,然后再次将SROM发送到传感器。
输出的长度应为4094字节,其中第二个字节应为0x03、0x04或0x05(具体取决于不同版本)。
为了确保SROM的正确捕获,需要多次重复捕获过程,直到连续获得相同的SROM。若要重新捕获SROM,需重新启动鼠标,这可以通过将其重新插入计算机、断开并重新连接USB电源线,或采用其他您认为安全的方法来实现。
我所知的SROM版本的MD5校验和如下:
0x03 - C64F2BDA742DD1623D6A5DC869FC5E60复制代码
0x04 - 0BCB410858FF21D091DDC497D19BC943
0x05 - 337254C54AD82C689D4B9A58D06A3CF6
如果您使用的 SROM 版本号不同,则可能无法与此固件配合使用。
捕获 SROM 数据后,将其保存为格式化的 .h 文件:
无法分发 SROM
由于 SROM 是受版权保护的专有代码,因此我无法在本存储库中分享它。
免责声明
上述步骤不会绕过任何复制保护,不会破坏加密,也不会通过制作传感器 SROM 的备份副本并在您自己的设备上使用它来违反版权法。在合理的国家中,这是完全合法的。
PMW 3360 传感器回收
Pixart PMW3360 传感器不向业余爱好者或小型维修店进行商业销售。要获得一个,您必须购买昂贵的分线板,从全球速卖通(或类似平台)上的黄牛那里购买,或者从现有的商用鼠标中回收它。此项目假定您在从现有商用鼠标捕获 SROM 后,从该鼠标中回收。
您需要一个热风返修台,而不是烙铁,来安全地拆焊和回收 3360。如果您尝试使用烙铁,即使带有脱焊芯和/或脱焊泵,您也很可能无法成功回收它,可能会在过程中损坏引脚或传感器内部。3360 对高温有些敏感,因此您只能将其加热相当短的时间。用烙铁拆焊接地引脚会使传感器足够热,以至于它可能会开始损坏。
3360 传感器的镜头通常通过将其透明的安装引脚熔化到传感器 IC 封装的顶部来直接安装到传感器上。
拿起商用鼠标的 PCB,刮掉(不要折断)镜头安装柱的顶部熔化部分。然后,小心不要损坏任何东西,从传感器和 PCB 上取下镜头并将其放在安全的地方。
现在,将商用鼠标的 PCB 倒置在没有任何易燃材料的工作空间中,放在不易燃的表面上。如果您在不安全的工作场所纵火,我不承担任何责任。您已经被警告了!
在继续之前,您可能需要用纸和/或胶带覆盖传感器底部,以防止任何物品进入传感器内部。如果您这样做,请以不会造成火灾危险的方式进行。
找到传感器引脚的底部。对于这些引脚中的每一个,涂上少量含铅焊料(如果这是您所拥有的全部)或低温无铅焊膏/凝胶/等(首选)(与助焊剂不同!)。您希望将焊料混合到引脚上的现有焊料中,因为这会降低现有焊料的熔化温度并更容易拆焊芯片。使用 600°F/300°C 左右的烙铁或热风工具将两种类型的焊料混合在一起。请勿使用热风工具物理接触 PCB 或引脚;仅依靠空气本身。
将每个引脚的焊料混合在一起后,将热风工具以圆周运动穿过每部分引脚,直到传感器最终松动。此时,使用任何金属工具(如金属镊子或螺丝刀)确保传感器完全从 PCB 中伸出。
现在,使用烙铁清除引脚上多余的剩余焊料。如果烙铁上有太多焊料,请用黄铜/青铜棉或类似材料将其清洁。请注意,在非常高的温度下,黄铜丝绒是易燃的。不要用钢丝绒作为替代品,因为它更易燃。
PCB 构建和组装
构建 gerber 文件和钻孔文件以及 PCB 制造商打印和组装 PCB 所需的所有其他必要文件(BOM、拾取和放置等)。PCB 上的一些组件非常脆弱,因此除非您是真正的专家,否则尝试手工焊接它们是注定要失败的。
我用来管理 JLCPCB 部分映射的插件是 https://github.com/Bouni/kicad-jlcpcb-tools。这是使用该文件的插件。然而,这个文件只是一个 sqlite 数据库,所以如果你想确保你用另一个制造商用正确的零件,你可以用任何 sqlite 数据库查看器打开它,获取 LCSC 零件号并单独查找,然后找到等效的零件你的 PCBA 制造商。然而,PCB 并非旨在要求您执行此操作;您可以单独查找部分(根据它们的值)。project.db
拥有 PCB 后,您需要将以下部件手动焊接到电路板上:
- 6 个 Omron D2F-01F 开关(或兼容开关,例如 D2FC)
- 11mm Alps兼容滚轮编码器
- 回收的 PMW 3360 传感器,未损坏,针脚未弯曲
- 3360 传感器的镜头,安装柱仍然完好无损
- 四个兼容杜邦的接头引脚,用于连接 USB 电缆(可选)
- 备用分立电阻器,以防您在像我一样订购 PCB 时弄乱了任何电阻器值
以及以下用于组装的附加零件:
- USB 电缆,最好带有兼容杜邦的连接器(您可以将它们压接在自己身上,您不必为此购买特殊电缆)
- 3D 打印外壳(2 部分)
- 3D 打印侧扣(2 部分)
- 3D 打印滚轮支架(1 份)
- 3D 打印滚轮或回收滚轮,用于 11 毫米Alps兼容滚轮编码器,具有正确的鼠标中键轴厚度
- 鼠标脚(回收或定制),厚度约为 0.6 毫米(即零点 6 毫米)
鼠标脚的厚度很重要,精度在四分之一毫米以内!使用任何其他厚度的鼠标脚可能会导致跟踪不佳、出现故障。PMW3360 对跟踪距离的非常小的变化非常敏感。
确保您有合适尺寸的螺丝来将所有部件固定在一起。我建议在进行任何其他操作之前,先用螺丝对外壳和普通 PCB 进行试配。小心不要将侧螺钉拧得过紧;这样做可能会导致它们的安装孔裂开。PCB 用两个螺钉固定,外壳用三个螺钉固定在一起。我使用了大直径(螺纹外缘)为 2 毫米、小直径约为 1.65~1.7 毫米的回收螺丝,外壳上的孔是围绕这些螺丝设计的,但略有不同的螺丝仍然可以使用。
将兼容杜邦的接头引脚焊接到PCB上,或者如果您有其他将PCB连接到USB的计划,请按照您的计划操作。然后,将其连接到您的计算机,并确保您可以使用Arduino IDE对其进行编程。如果无法正常工作,请尝试使用另一块PCB。在确认PCB及其rp2040处理器能够正常工作之前,请不要继续后续步骤。您还应该将PCB放入3D打印的外壳底部进行试装,以确保3D打印没有问题,并且PCB上的边缘切割和钻孔与设计文件中的规格完全一致。
将每个Omron开关焊接到电路板上,确保开关的柱塞与丝网印刷插图上的轮廓对齐。在焊接开关之前和焊接过程中,要仔细检查并确保开关与电路板完全齐平;在焊接第一个引脚后,再次仔细检查它们是否齐平。
将PCB试装到外壳底部,不要将任何部件拧入其他部件中,然后连接外壳的上半部分,确保按钮能够正常点击,而不是仅仅因为连接了外壳的上半部分就自动触发点击。如果按钮难以点击或者会自行点击,那么您的3D打印机的精度可能不够高,您可能需要使用热风工具对按钮片进行软化,并稍微弯曲它们,直到它们能够完美适配。完成这一步后,将PCB从外壳中取出。
将滚轮编码器焊接到PCB上的RotaryEncoder封装中。在焊接之前和焊接过程中,要确保编码器完全固定。您可能需要用尖嘴钳非常轻微地扭动引脚,以使它们能够适配其孔位;这些孔位非常狭窄,这是故意为之,以减少引脚之间形成焊桥的可能性。
示例照片展示了一个11毫米Alps兼容编码器。这里的11毫米指的是转子中心到PCB表面的距离,而不是整个编码器的上下高度。
将PMW3360传感器焊接到PCB的中心位置,确保在焊接前和焊接过程中传感器始终处于正确的位置。如果传感器没有完全贴合,PCB可能无法正确安装到外壳中,或者传感器可能无法正常工作。传感器需要相对于PCB的其他部分“倒置”安装,也就是说,与PCB顶部的文字相比,传感器上的文字应该是倒置的。如果传感器放置错误,看起来会偏移中心;而如果正确放置(倒置),则看起来会居中。如果放置错误,当打开鼠标时,传感器可能会烧毁,而且镜头可能无法与传感器正确贴合。
将镜头安装到PCB底部的传感器上。然后,将PCB插入外壳底部,确保其完全贴合。
如果此时再次将鼠标连接到USB,并在鼠标启动时检查Arduino IDE中的“串行监视器”,如果SROM的ID值既不是零也不是0xFF,则说明传感器工作正常。如果传感器工作正常但仍然无法正常跟踪,需要仔细检查LED电阻的值。这个电阻位于“U10”丝网印刷文本附近,靠近四个呈矩形排列的二极管(而不是排成一行)。电阻值应为39欧姆,或者非常接近40欧姆。如果电阻值不正确,需要将其拆焊,并安装总值为40欧姆的分立电阻器(例如,可以使用两个20欧姆的电阻器串联)。警告:如果电阻值过低,可能会永久损坏传感器的LED,导致传感器无法使用。
从PCB上拆下,并将侧面按钮的拇指件安装到其对应的开关上。这一步比较困难,需要小心翼翼,几乎感觉要折断拇指件,但又不能真的折断它们。开关支架的长部分应该包裹在开关的“内侧”(即朝向另一个侧按钮开关的方向),而不是“外侧”。要将拇指件安装到开关上,首先将“钩子”部分安装到PCB边缘的底部,稍微偏离开关,然后向下旋转拇指件,使其支架的远端接触到开关的顶部。将拇指件尽可能舒适地移离开关,这样它就不必弯曲太多就能滑过开关顶部并绕到开关的另一侧。一旦完成这一步,将拇指件滑向开关,使支架末端的小钩子完全包裹住开关的另一个角。对另一个开关的拇指件重复同样的操作。
上图展示的是安装拇指按钮件的步骤。即使在安装过程中拇指按钮件出现破裂或断裂,也无需担心;它们仍然可以适配并正常工作,只是舒适度可能会略低一些。
在鼠标中键周围(靠近鼠标右键的位置),安装滚轮支架,确保支架的尖刺朝向鼠标的“内侧”,远离鼠标中键。接着安装滚轮,并确保它紧密贴合且平衡适中。如果滚轮安装后不够紧贴或平衡不佳,可能需要重新打印滚轮部件。
将PCB重新安装到外壳底部,并确保其紧密贴合。将USB电缆沿着机箱背面的支撑柱(该处有一个螺丝孔)布线,然后绕过PCB的右侧(而不是左侧),紧贴鼠标右键的右侧,最后通过前面的插槽将电缆引出。使用热胶将USB电缆固定在前插槽处,确保在热胶固定时,电缆相对笔直地指向前方。
将鼠标连接到电脑,从Arduino IDE编译并上传固件,确保一切正常运行。如果一切顺利,那么您就完成了!只需将所有部件重新组装并拧紧螺丝。在拧紧侧螺丝时要小心,避免拧得过紧,以免导致安装孔裂开。
许可证
3360_Mouse_pico.ino 是本项目的主文件,在 Apache 许可证 2.0 版下发布。
relmouse_16.h 基于 mbed OS 中的文件,该作系统也根据 Apache 许可证 2.0 版获得许可。
https://github.com/arduino/ArduinoCore-mbed
硬件设计文件(在 “案例模型 ”和 “KiCad 原理图 + PCB” 下)根据 SolderpadLicense 2.1 版获得许可。