Mach3 CNC手持盒(Pendant)DIY全攻略:从手轮选型到固件调试 📅 2026/8/26 23:19:14 先说个场景给Mach3的机器做对刀传统流程是站在机床边用手指按住面板上的方向键头却要扭到后头盯着电脑屏幕看坐标值手一抖就多走好几毫米气得想砸键盘。我在工作室里被这事恶心了大半年最后实在忍不了花了一个周末抽时间做了一台CNC手持盒从此对刀和微调全是单手操作另一只手还能拿着手机看球赛。这篇文章就把完整过程拆开揉碎讲清楚——从方案选型、硬件清单、Mach3端配置到固件逻辑、实际调试的坑一条龙拉通。1. 动手之前先想明白Pendant到底解决什么问题很多人第一次听到CNC Pendant手持操作盒时觉得“这不就是把键盘上的方向键挪到一个小盒子里嘛”这话对也不对。Pendant的核心价值不是“换个地方按按钮”而是把操作员从电脑屏幕和键盘的约束中解放出来。真正干过机加工的人都懂加工过程中真正花时间的不是切削而是装夹、对刀、试切、改刀补这些“重复性微调工作”。如果每调整一次坐标都要回到电脑前一来一回几十米路时间和力气全耗在路上了。1.1 站在机床前操作和坐在电脑前操作差距有多大Mach3虽然是目前DIY圈子里占有率最高的控制软件但它的交互界面一直是给“坐在电脑前的人”设计的——鼠标点X、Y-或者按键盘方向键。但现实场景里操作员必须站在机床旁边眼睛盯着刀具和工件手里的扳手、卡尺、废屑包还没放下。这时候让你回到电脑去按一下方向键你得先把工具放下、走过去、看清楚屏幕、点按钮、再走回来工作效率直接对半砍。Pendant解决的就是这个“人机位置矛盾”。一个手持盒挂在机床侧面右手握着摇杆或手轮拇指搭在按钮上眼睛只需盯着刀尖和工件表面就行。更关键的是手里握着手轮时对移动量的“手感直觉”是键盘给不了的——手轮转多少、工件走多少这种映射关系一旦建立起来对刀精度和对操作的信心都会明显提升。我做完这台Pendant之后明显感到同样的对刀流程用时基本减半。1.2 三个主流实现路线先对比做Pendant不是只有一条路我查过市面上主流方案大致可以分为下面三条各有各的适用场景实现路线核心原理优点缺点键盘模拟方案主控模拟USB键盘发送快捷键给Mach3不需要并口卡兼容性最好接线简单手轮手感有延迟倍率调节不够细腻MPG硬接并口方案直接连接Mach3的并行端口手轮接口手感好、响应快真正的MPG手轮体验需要并口卡接线复杂且受干扰风险高ModBus/串口方案通过串口或以太网发控制指令可以双向传输状态做急停更可靠配置复杂不同控制板协议不统一我的选择是“键盘模拟为主、MPG硬接通通给老机器”因为工作室里的主力机是用USB上位机控制MACH3没有并口卡而键盘模拟方案只要主控支持USB HID协议就能跑通不需要对Mach3做任何插件级别的改动。后文会详细讲两种方案各自的配置步骤大家可以根据自己的硬件情况选一条路走。1.3 这个项目适合谁做如果你同时满足下面几条这篇文章的参考价值最大第一你有一台Mach3控制的CNC且经常干对刀、分中、微调这类活儿第二你大概会用电烙铁和万用表至少能分清Arduino Nano和Pro Micro的引脚区别第三你对Mach3的配置界面不陌生进去过一次Config菜单。如果只是好奇看完也能了解原理但有动手意愿的话体验会完全不同。2. 硬件方案选型与核心原理从了解Mach3的输入机制开始做Pendant之前必须先搞明白Mach3是怎么接收外部输入的否则后面的配置就是盲人摸象。Mach3在输入层面主要提供了三种通道第一是键盘快捷键这就不用多解释了哪怕是什么都不设置的默认状态方向键和PageUp/PageDown也能模拟移动第二是并口或运动控制卡上的输入引脚这些引脚可以被指派为MPG信号、限位信号、探针信号等第三是ModBus通信接口通过外部控制器发送寄存器指令。我们做Pendant核心任务就是让自己的设备“伪装”成这三个通道中的某一个。键盘模拟路线最轻松本质上就是把Pendant当成一个额外的USB键盘把按键映射成Mach3热键MPG硬接路线则要把手轮的编码器A/B相接到并口的指定引脚上。理解了这层关系后面所有配置都是围绕它展开的。2.1 键盘模拟方案选主控的关键原则既然要走USB键盘路线主控必须有硬件级HID能力。Arduino Leonardo和Arduino Pro Micro是最常见的选择它们用ATmega32u4芯片原生支持USB HID不需要外加转换芯片而Arduino Uno/Nano用的ATmega328P就不太合适模拟键盘功能需要额外烧录固件才能实现稳定性也差一些。我最终选了Pro Micro理由是体积小、价格便宜十几块钱、引脚足够多——28个IO够把十几个按钮和一个手轮都接上。另一个需要考虑的因素是按键数量。一个基础版Pendant至少要有X/Y/Z三轴选择、正负方向六个方向键、倍率切换x1/x10/x100、急停、主轴启动/停止、循环开始/暂停。这就13-14个按键了。如果用I/O直读的方式14个按键就需要14个引脚除了I2C/SPI之外的引脚基本都要派上用场。如果后续想加对刀、冷却液开关等功能引脚就会很紧张所以我推荐用矩阵扫描的方式来扩展按键矩阵5行3列可以搞定15个键而且只占用8个引脚留出余量给手轮和状态灯。Pro Micro的供电也比较省心USB直连笔记本或者台式机就能供电输出5V/500mA可以给按键和编码器供电不需要单独搞电源。但要注意如果机床控制电脑的主机USB供电质量不好或者有变频器干扰可能偶尔会掉USB设备。我在车间实测过加一个带磁环的USB线有明显改善后续章节会详细讲调试经验。2.2 MPG手轮硬接方案并口脚位怎么分配如果你想用真正的MPG手轮就是那种带刻度的旋转编码器体验会更好但不一定非要走并口。Mach3传统上对并口MPG的支持很“原生”在Ports and Pins里找到Input Signals里面有关于MPG的配置项不同版本可能叫“MPG”或“Pendant”需要指定手轮A相和B相接在哪个输入端口。常见并口卡的输入脚位有P1-P17选择一个未被占用的端口就行比如P10、P11分别接A相和B相。不过这里有一个很多人不知道的细节Mach3的MPG输入不是随便接就能用的需要把倍率选择和“Pendant”功能开启并正确设置“Pulse per unit”和倍率对应比例否则手轮转起来没有任何反应。我把这部分放在第3章详细展开因为这是最容易劝退新手的地方。手轮的供电也很关键。常见的MPG手轮是5V或者12V供电内部是正交编码器输出A/B两相信号。如果用并口卡一定先确认并口卡是否能给手轮供电还是需要外接电源。很多DIY并口卡上的5V输出能力很弱带不动手轮容易造成电平不稳。建议直接用外部5V稳压电源给编码器供电A/B相输出通过光耦隔离再接并口卡输入口避免共地干扰。虽然麻烦点但实测下来确实不会丢脉冲。2.3 按钮、急停和外壳谁才是真正的坑硬件里最容易被低估的是按钮和急停。方向键按钮我建议选自复位型方形按钮16mm或19mm中按压手感偏硬一点的比较好太软容易误触。急停开关必须是自锁式的拧一下复位——Mach3默认支持急停引脚输入但键盘模拟方案里急停没法直接传硬信号给Mach3所以工程上建议“双保险”急停同时串联在伺服/主轴使能回路里物理上断开动力电源同时再映射一个键盘快捷键让Mach3紧急停止。外壳也是一个容易“翻车”的点。我一开始用亚克力做盒体切好孔装好件之后才发现键盘模拟方案的手轮突出一大截放在机床边上很容易被工件撞到。后来换了3D打印的斜立面盒子让手轮单独凸出一个倾斜面按钮环形布局手握住侧边时大拇指能覆盖所有按键握持感和防护性都好了很多。如果你有3D打印机建议先把手轮的直径和高度量准再设计外壳不给“撞机”留机会。2.4 接线规范与防干扰底线CNC机床车间是最恶劣的电磁环境之一——变频器、主轴电机、步进驱动器全都在这附近嗡嗡响。如果接线不规范Pendant可能表现为“按下没反应”“偶尔自动走一下”“坐标漂移”这些诡异现象。我的几条底线原则所有信号线用双绞线能屏蔽更好尽量减少信号回路面积。按键到主控之间做软件去抖延时采样并在每个按键上并联一个0.1uF电容。主控电源和机床动力电源严格隔离Pendant这端决不取机床开关电源的电除非经过光耦隔离。手轮编码器线要尽量短信号线远离步进电机线、变频器进线至少保持10cm以上距离。如果你决定走并口MPG硬接方案光耦隔离不是可选项而是必需品。CNC控制电脑的并口地面和机床动力地之间往往有很大的电位差直连轻则丢信号重则烧电脑主板。淘宝上几块钱一个的光耦隔离模块就能解决这个问题但要注意光耦的响应速度选PC817这类慢速光耦接编码器信号会衰减波形建议用6N137或者高速光耦。3. Mach3端配置详解参数逻辑和倍率计算硬件组装好只是第一步真正让Pendant“活过来”的是Mach3端的配置。不同的实现方案配置完全不同我分别把键盘模拟和MPG硬接两种方案的设置步骤写清楚并且把倍率计算的逻辑拆开让看到参数的都知道“这个数是怎么来”。3.1 键盘模拟方案的快捷键映射Mach3的快捷键映射在Config菜单下的System Hotkeys里可以指定各个功能的触发键。默认状态Mach3支持方向键、PageUp/PageDown、Insert/Delete等操作但这些键位在手持盒上不好按建议改成一个组合键或者功能键。比如我把X设为F1、X-设为F2、Y设为F3、Y-设为F4、Z设为F5、Z-设为F6倍率切换设为F7/F8/F9。设置步骤也很直观进入System Hotkeys后选中对应功能如“X Continuous”再按键盘上你指定的那个键软件会自动记录下来。需要注意的是Mach3有“连续移动”和“步进移动”两种模式连续模式下按住方向键不放会一直移动松手停止这正好对应手持盒上的方向键用法步进模式下按一下走一个固定量更适合微调。在做Pendant时建议两种都映射比如按钮短按是步进、长按是连续或者干脆做一个“步进/连续模式切换键”。设置完之后记得点击“OK”保存。Mach3会把这些快捷键配置写进配置文件里下次启动自动生效。但我建议再用一个独立的虚拟机或者备份目录保存一份配置备份不然某次重装Mach3时你就要重新点几十下鼠标特别痛苦。3.2 并口MPG硬接的引脚配置如果你手头有并行端口卡且愿意走MPG硬接路线配置过程会多一点但手感确实值回票价。首先要确认Mach3识别到的并口地址Port Setup and Axis Selection里一般为0x378或0x3BC这一步决定了后面所有引脚分配都作用于哪个并口。然后进Config Ports and Pins Input Signals找到“MPG”相关项部分版本里显示为“Pendant”。在“Enabled”打勾把Port设为1Pin Number设为并口卡实际接线对应的端口号。这里要特别注意Mach3的引脚编号是从1开始算的并且底层的引脚编号和并口卡丝印可能会差几位要看说明书或者用万用表量。A相接一个端口B相接另一个端口两个端口的口地址不能相同。如果找不到MPG配置项可以确认一下软件版本。Mach3 R3.043之前版本对MPG支持不全建议升级到最新R3.043.062版本。很多老玩家还在用2010年前后的版本这会导致新增的Pendant功能失效。另外如果你用的是国产运动控制卡如UC100等它们一般在控制卡驱动里内置了Pendant接口根本不用走并口配置直接在控制卡面板上找手轮接口就行这部分要看你购买的卡的具体说明书。3.3 倍率、脉冲与进给量的关系一份手算案例MPG手轮最核心的参数关系是手轮每格脉冲数 × 倍率 × 轴进给脉冲当量 实际移动距离。常见的手轮是100PPR每圈100个脉冲Mach3对其4倍频处理等效为每圈400步。如果轴配置的步进当量为每脉冲0.01mm那么手轮每格1/100转对应的移动距离就是1格脉冲数 100 / 100 1个脉冲4倍频后为4个实际计数但Mach3内部对MPG的处理是读取倍频后的脉冲所以1格对应4个内部脉冲标记乘以0.01mm/脉冲等于0.04mm这里其实很多人会算错。实际上Mach3在MPG读取时会直接按编码器原始的分辨率处理多数设置里1个“检测到的脉冲”对应Mach3中的“一个step”。换算公式需要结合你Mach3在Motor Tuning里设的“Steps per Unit”来计算。真正稳妥的做法是实际验证切到手轮模式倍率选x1手轮转一格看机械坐标移动了多少。如果移动量不是想要的调整“Steps per Unit”或者修改Mach3的“MPG倍率系数”。我在调试时常用百分表打实际移动量十分推荐这个方案比看屏幕坐标更真实。如果你的手轮是200PPR或者600PPR的也按这个思路去推算不要迷信网上别人的参数因为步进驱动细分和丝杆螺距都不一样。3.4 键盘模拟方案里的“软件倍率”怎么办既然键盘模拟方案里没有真正的MPG硬信号手轮要怎么实现“转一格走0.01mm”这样的体验呢我自己的做法是这样手轮依旧是正交编码器由Arduino读取但最终不是给Mach3脉冲信号而是根据手轮的转动方向和转动格数模拟发送N次“步进移动”快捷键。比如当前倍率为x10主轴坐标系为X轴手轮正向转动一格Arduino就向Mach3发送10次“X Step”如果有抖动就随机间隔几个毫秒发送避免按键触发速度太快导致Mach3误判。这种实现方式虽然没有硬接方案那么实时但胜在不用改Mach3任何底层配置而且因为每次发送的最小移动量就是一个步进当量精度并不输硬接。手轮的手感确实有一点“阶梯感”尤其是在快速旋转时按键发送速度跟不上手轮转速会有移动滞后。解决办法是把手轮改为“绝对位置相对位置变化”模式固件里累加变化量再按每10ms一个固定节拍发送这样快速旋转时不丢步反而更流畅。4. 固件逻辑与核心实现从按键扫描到HID模拟硬件和Mach3配置都搞定了核心就是主控固件的逻辑了。我用的Arduino Pro Micro开发环境是Arduino IDE整体代码量不大但有几个细节很关键直接影响使用体验和稳定性。4.1 按键扫描矩阵与去抖策略按键矩阵扫描的基本做法是将按钮排列成行和列的交叉点使用数字输出口逐行拉低电平数字输入口读取列电平。扫描周期比如5ms扫描一遍有按键变化时记录下来。这种矩阵扫描可以大幅度节省引脚而且本质上是天然的“逐个按钮扫描”不容易产生同时按下多个键导致的误判前提是软件里做了遮蔽处理。去抖是另一个基础但重要的环节。我见过很多人直接用延时去抖按下去延时50ms再判断表面看起来问题不大但如果你在三轴快速切换时猛按切换键延时会导致按键响应迟钝甚至会误触到下一个按键。我的做法是状态机去抖每次检测到电平变化后在10ms和50ms两个时间点各采样一次只有两次采样结果一致才认为是一次有效按键。这样既保证了实时性又过滤掉了大部分抖动干扰。4.2 正交编码器解码与手轮方向判断手轮的编码器输出是A相和B相两路占空比50%的方波信号相位差90度。判断方向的方法很简单每当A相出现一个上升沿或下降沿时检测B相的电平高低如果B为高则正转B为低则反转或者反过来取决于你的线序。具体实现上可以直接用Arduino的attachInterruptA相接中断引脚B相接普通IO口在A相中断回调里读B相电平。但这里有一个实际经验直接读B相的瞬时电平在大干扰环境下很容易误判。比如手轮在停止状态附近轻微抖动A相出现毛刺B相电平恰好不稳定就会导致“反向错误”。更稳妥的做法是读取A相和B相的“状态组合”来做方向判断——用“异或A相电平变化”的方式或者直接用Arduino自带的Encoder库它在内部用查表法处理边沿触发抗抖动能力明显更强。4.3 HID键盘事件发送的细节Arduino模拟HID键盘用Keyboard.h库发送按键事件很简单Keyboard.press(KEY_F1)和Keyboard.release(KEY_F1)。但要注意的是Mach3对按键消息的处理有时会“卡键”——也就是你发送了press但没收到releaseMach3就一直认为这个键被按住。这种情况尤其在无线键盘、蓝牙键盘上常见但在Arduino模拟的USB HID键盘上也是可能出现的。避险技巧是每次按下后一定要在10-30ms内补发release且不要在连续快速按键时重叠发press前一个没有release之前不发下一个。我在固件里做了一个小的键状态队列所有按键事件先排入队列由主循环统一处理发送节奏保证每个press必然跟一个release。这个方法看起来笨但稳定性确实好我连续工作几个月下来再没出现过Mach3卡键的情况。4.4 急停与“物理双保险”在固件里的体现前面提到急停要做双保险一路硬线物理断开主轴使能另一路给主控一个输入信号让主控通过HID向Mach3发送紧急停止Esc键或者F1如果有定义。在固件里急停响应必须放在最高优先级只要检测到急停引脚电平变化立即执行以下动作清空按键队列发送一次急停按键事件然后进入一个10秒的锁定状态期间忽略所有其他按键输入直到手动按下“解锁”按钮。锁定状态很容易被忽略但特别重要。如果没有这个设计急停按下后如果手恰好碰到了方向键Mach3可能刚完成急停又被误触发移动等于急停白按了。我设计成“急停之后必须按解锁键才能恢复控制”虽然多了一个手动动作但安全性大幅提升。5. 实际调试过程记录接错线、方向反、丢信号都碰一遍接下来这部分是我最想讲的——所有配置和固件都是纸上谈兵真正调通的过程中必定会踩坑。我把我的调试经历按时间线写出来当做一份“避雷指南”。5.1 第一次上电按钮矩阵乱码的教训硬件组装好第一次上电我按下X按钮Mach3竟然开始Y轴移动。排查了一圈发现是矩阵扫描的“行”和“列”在接线时有一个引脚定义搞反了。听起来很蠢但这种错误在矩阵接线中非常容易出现。如果你的按钮布局是一排排的而固件里又按“行优先”去扫描接线时很容易把某一行的两个按钮接到相邻引脚上导致映射错位。解决办法是做一个“引脚自检模式”固件里加一个测试模式上电后按住某个特定按钮串口打印出当前按下的按钮和对应的引脚读取值。调试时打开串口监视器逐个按按钮比对打印结果几分钟就能排查出来。这个模式我建议留到最终版本里下次换按钮接线时还能用得上。5.2 手轮方向反了逆时针转竟然让Z轴向上这里有两个层面的反转第一层是编码器A/B相接反了导致方向判断错误第二层是Mach3端倍率或轴方向配置导致的。键盘模拟方案里更容易遇到的是第二层因为Mach3的快捷键“X”和物理按钮“正方向”并没有绝对对应关系完全取决于你在Mach3里设置的正方向是什么。排查方法把主控直连电脑不接机床打开记事本手拧手轮看光标会不会往预期方向移动。如果记事本光标方向和手轮方向一致说明固件没问题问题在Mach3的轴方向配置或者快捷键映射如果记事本光标方向已经是反的那就是A/B相接反了把编码器的A/B两根线对调一下就好。不要直接在Mach3里改方向设置因为那会影响正常的软件手动操作方向容易留下隐患。5.3 USB不稳走着走着Mach3失联这个问题困扰了我两周。现象是Pendant前期工作正常但机床主轴一旦启动Pendant偶尔会卡顿、没反应甚至Windows提示“无法识别的USB设备”。我用万用表量了主控电源5V电压很稳但USB的信号线D/D-在主轴启动时会出现毛刺说明是电磁干扰耦合到了USB线上。解决方式是“多管齐下”换一条带磁环的USB线在Pro Micro的VCC和GND之间并一个220uF电解电容和0.1uF瓷片电容USB线尽量远离步进电机驱动器的主电源线把Pendant主控用金属箔包起来接地屏蔽效果明显。做完这些之后我再也没出现过失联问题。5.4 倍率切换失灵手轮转起来没有任何反应某个下午调试倍率切换功能发现F7/F8/F9按钮在Mach3里不管用。用串口监视器看固件按键事件有正常发出说明问题出在Mach3的快捷键映射上。后来发现是Mach3的System Hotkeys窗口里F7/F8/F9这三个按键已经被默认分配给别的功能了而我在映射时没注意到冲突导致控制无效。解决方案很直接换用其他键位比如数字小键盘的1、2、3或者字母键。这里提醒大家Mach3的快捷键映射一定不要选系统默认占用过的键位除非你有办法确认不冲突。调完快捷键后最好测试一下每一个功能是否真的生效别嫌麻烦。6. 常见问题速查表格为了直观我把调试过程中最常见的问题和排查方法整理成一个速查表遇到问题可以直接按这个表逐步排查。故障现象可能原因排查顺序建议解决方向按钮按下无反应接线接错、矩阵扫描行列定义错、Mach3快捷键未设置1.串口监视器看主控是否收到按键 2.检查Mach3快捷键映射接线重新对照引脚定义或在Mach3里重新映射按下A键却触发B功能矩阵行列映射错位、Mach3快捷键冲突1.测试模式打印引脚值 2.对照Mach3热键列表修正固件按键映射表或更换快捷键手轮转一圈走非常远倍率太大、Steps per Unit设置过大、编码器PPR不同1.逐步减小倍率 2.检查Mach3步进设置调低倍率重新校准Steps per Unit手轮方向反A/B相接反、Mach3轴方向配置反1.记事本测试方向 2.确认固件方向算法对调A/B线或修正固件方向判断USB不定时失联电磁干扰、USB线质量差、供电不足1.换带磁环短线 2.加滤波电容 3.远离动力线加屏蔽、换线、加电容或改用屏蔽外壳Mach3卡键一直走不停press未释放、发送节奏太快1.按住按钮后看任务管理器是否持续触发 2.检查固件释放逻辑确保每个press都有release使用键事件队列急停按下后坐标偶尔还动Mach3未设置急停快捷键、固件无锁定状态1.物理急停回路确认 2.查固件急停逻辑设置急停快捷键固件加锁定状态手轮在某一段无反应编码器磨损、接触不良、毛刺干扰1.检查手轮连接线 2.用示波器看A/B波形更换手轮或检查接线端子增加滤波电容倍率切换无效Mach3快捷键占用、倍率配置不对1.检查热键映射 2.检查MPG倍率配置更换快捷键或修改MPG倍率参数遇到问题先别急着拆硬件按“主控→软件配置→线路干扰”的顺序排查能省掉一大半冤枉时间。我发现很多人一遇到问题就怀疑固件或硬件结果发现只是Mach3热键没设置好白折腾一晚上。7. 经验总结与几个可以继续优化的方向我在做这个项目的过程中感受最深的一点是CNC Pendant是一个“看起来是小玩意做起来处处是细节”的项目。硬件接线、Mach3配置、固件逻辑三个模块单独看都不难但它们之间的配合关系才是真正的核心。比如倍率计算要同时考虑手轮PPR、Mach3的Steps per Unit、倍率档位这几个参数任何一个设错手感都会非常奇怪。如果后续还想继续升级有几条路可以走加一块OLED显示屏实时显示主轴转速、当前坐标、倍率档位这样操作员完全不用看电脑屏幕了。我用I2C接口的0.96寸OLED试过代码量不大显示效果很不错。加一个无线功能用2.4G模块或者蓝牙传输按键事件这样手持盒可以挣脱USB线的束缚。但需要解决电池供电和无线延迟的问题稳定性是主要考量。如果用的是Mach4或者LinuxCNC可以考虑用ModBus或者以太网协议直接把控制指令发给运动控制卡这样急停等功能可以实现得更彻底。我个人的最终建议是第一次做Pendant不要追求功能大而全可以先做一个只有方向键手轮倍率的极简版把“手感”调顺了再逐步加功能。手持盒最核心的价值是“让人舒服地站在机器旁边工作”如果手感不好功能再多也是摆设。