本帖最后由 12qwwe 于 2025-4-3 16:36 编辑

这是一个完全开源的DIY游戏鼠标项目,包括代码、原理图、PCB布局和3D模型,所有这些都围绕Pixart PMW3360传感器进行设计。

这款鼠标的固件采用了一种特殊的去抖动算法,能够在不增加任何延迟的情况下彻底消除鼠标抖动,其效果甚至比市面上的商用鼠标在消除弹跳方面表现得更为出色,随机双击的问题也因此不复存在。

通常情况下,生产游戏鼠标传感器的公司,包括Pixart在内,并不会将这些传感器直接出售给消费者,因此需要通过回收传感器,或者从黄牛或专门从事此类产品转售的小企业那里来获取它们。

(外壳还有一个顶部,但在图中它是关闭的,因此您可以看到PCB。)

特性

  • 真正的零延迟按钮去抖动,无故障。
  • 按钮在仅几个月后不会出现双击问题。
  • 低延迟运动跟踪(无平滑)。
  • 完全开源(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.hsrom_3360_0x04.hsrom_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 文件:

    [pre]#defineSROM_LENGTH[/pre][p] (4094)[/p]constuint8_tPROGMEMsrom[SROM_LENGTH] =
  • [p]{[/p]0x01[p],[/p]0x<versionnumber>[p],[/p]// ...// etc
  • [p]};[/p]
  • 复制代码

    无法分发 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 版获得许可。