尧图精选

三线直线舵机与Arduino PWM控制的DIY实现与发布全记录

🕒 发布时间:2026/9/4 4:36:02 📁 来源:尧图网络
最近在整理舵机控制相关的内容时我做了一个挺实用的小样品三线直线舵机成品演示模块配合一个小尺寸圆柱舵机用来演示推杆伸缩和辅助旋转动作。这个项目本身不难真正花时间的反而是选型、接线、固定结构、PWM参数调试和反复做稳定性测试。目前样机已经准备好发布到闲鱼后续如果有人咨询或提出新的使用需求再继续迭代改进。这篇文章会把从开发到发布前准备的完整过程记录下来包含三线直线舵机的原理、圆柱小舵机的接线方式、Arduino 控制舵机的 PWM 代码示例、常见问题排查以及二手平台发布样品前需要准备的参数表、拍摄素材和沟通流程。如果你正在做舵机 DIY、想快速实现直线推拉动作或者打算把自己做的小硬件样品放到闲鱼试水这篇文章都值得收藏。1. 三线直线舵机项目背景与核心概念1.1 直线舵机解决什么问题常见的舵机输出的是旋转运动。比如 SG90 这类微型舵机通过改变 PWM 脉宽可以让舵盘转到指定角度适合做云台、机械臂关节、小车转向这类动作。但在很多自动化演示项目里真正需要的往往是“伸缩、推拉、顶起、夹紧”这类直线运动。比如模拟气缸推动小车、用小推杆顶起一个开关、做一个简易的直线滑台这些动作如果只用普通旋转舵机就还要额外设计一套齿轮齿条或连杆机构制作成本高而且容易卡顿。三线直线舵机在输出端直接就是一根推杆外壳内部通过齿轮减速和丝杆结构把电机旋转转换成推杆的直线伸缩。这样外部只需要把它固定好不需要自己设计传动机构就能得到稳定的直线运动非常适合用在实验教具、小型自动化测试台、模型改装和舵机控制演示中。1.2 三线接口的直观理解我们经常听到“三线舵机”这个说法指的是舵机正面只有三根线电源正极通常是红色。电源负极/地线常见棕色或黑色。信号线常见橙色、黄色或白色。这三根线分别接到控制板的 5V、GND 和一个数字 IO 口即可。信号线上传输的是 PWM 方波通过高电平脉冲宽度来控制舵机位置。这里要注意三线舵机和总线舵机是两个不同的方向。三线舵机接线简单、兼容 Arduino 和各类舵机测试仪适合单舵机或少量舵机控制总线舵机则需要用串口或 RS485 等协议进行通信连线更复杂但优势是可以级联、回读角度常见于多自由度机械臂、仿生机器人。这个项目选择三线方案就是看中了它的易用性和低成本方便做成成品演示模块让别人也能快速上手。1.3 样品的功能定位这个样品把三线直线舵机和圆柱小舵机组合在同一个支架上。直线舵机负责做推杆伸缩动作圆柱小舵机负责辅助演示一个旋转或按压动作。两者之间通过控制代码联动可以演示出“先伸出推杆再旋转小舵机夹取/按压”的效果看起来更像一个自动化小工位。作为准备发布的样品我把它定位成一个“可直接运行的舵机控制演示模块”。买家拿到手后不需要自己搭电路只需要接上 5V 电源和 Arduino 控制信号就能看到直线舵机和小舵机按顺序动作。后续根据实际咨询我还会考虑调整尺寸、行程、驱动方式和接口类型。2. 硬件选型与接线说明2.1 物料清单与选型思路这个项目用到的物料不多核心部件是三线直线舵机和圆柱小舵机。下面是本次样品的主要物料清单物料规格说明作用三线直线舵机支持标准舵机 PWM 控制输出直线推杆完成伸缩、推拉动作圆柱小舵机小型三线舵机例如 SG90 等 9g 级别辅助演示旋转/按压动作Arduino 开发板Arduino Uno 或兼容板产生 PWM 控制信号电源模块5V/2A 及以上或根据舵机规格调整给舵机供电杜邦线母对母、公对母若干信号线与电源连接固定支架亚克力板、3D 打印件或铝合金型材固定舵机和保持结构稳定选型时要优先确认三件事工作电压是多少、推杆行程有多长、输出推力能否满足演示负载。样品演示通常负载很小普通小尺寸直线舵机就可以胜任。但如果后续有买家想用它推动较重物体就一定要先测量实际电流必要时换成更大推力的金属齿轮舵机并把供电方案一起改掉。2.2 三线接线与供电注意事项接线看起来很简单但供电和共地问题很容易被新手忽略。标准接线方式如下舵机线色对应接口说明红色5V 正极按舵机工作电压接电源正极棕色/黑色GND接电源负极同时与控制板 GND 共地橙色/黄色/白色数字 IO 引脚接 Arduino 的 PWM 引脚信号线我接在 Arduino Uno 的 9 脚。之所以强调共地是因为舵机返回的 PWM 信号需要统一参考地电位。如果舵机供电和控制板供电地线没有连在一起信号电平无法形成回路舵机可能乱动、抖动甚至不动作。关于供电有一个重要原则几乎不要直接用 Arduino 板载 5V 引脚给多舵机供电。Arduino 的稳压芯片输出电流有限而舵机启动和堵转瞬间电流会明显上升电压一旦跌落轻则舵机无力重则导致控制板复位。正确做法是使用外部 5V 电源给舵机供电再把外部电源负极和 Arduino 的 GND 相连。2.3 圆柱小舵机与直线舵机如何搭配圆柱小舵机在我这个样品里属于动作辅助角色。常见的圆柱小舵机和 SG90 这类九克舵机接口一致工作电压、信号标准也都兼容只是外形结构不同。设计时我会先确定小舵机要完成什么动作如果想让它带动一个夹爪就安装舵机臂如果想让它按压一个微动开关就在舵盘上固定一个凸轮或拨片。由于整机是一个演示样板圆柱小舵机直接通过舵机臂和直线舵机的推杆端保持一定配合关系。直线舵机向前伸出时圆柱小舵机旋转到某一角度直线舵机缩回时圆柱小舵机再回到初始位置。这个联动在代码里只是几个状态切换但结构设计上要提前留好舵机运动空间避免机械干涉造成堵转。3. 结构设计与装配要点3.1 推杆轴向受力与固定方式直线舵机最怕的不是推力不够而是推杆受到比较大的径向力。所谓径向力就是垂直于推杆运动方向的力。比如推杆伸出后如果顶部挂着一个偏重的物体就会产生一个弯矩作用在舵机内部丝杆和铜套上长期运行容易加速磨损甚至卡死。固定直线舵机时我优先考虑让推杆运动方向和负载推力方向完全重合。如果现场条件不允许一定要在推杆末端加装直线轴承或导向杆把径向力转移到外部导轨上。对于演示样品来说推杆末端接的小零件要尽量轻、尽量短减少侧向力矩。安装底座同样重要。直线舵机外壳上如果有螺丝孔建议用螺丝固定没有螺丝孔时可以用两块亚克力做成夹持结构把舵机夹在中间。演示样机不要只靠热熔胶固定因为热熔胶在持续往复运动下容易产生蠕变导致舵机位置偏移影响演示稳定性。3.2 微型圆柱舵机的固定方法圆柱小舵机外壳通常比较光滑直接胶粘后一旦线接错或者舵机损坏更换会很麻烦。我的做法是先制作一个简单卡座用 3mm 厚亚克力板切成 U 形件把小舵机卡进槽内再用螺丝或者扎带固定。如果手上没有亚克力加工条件也可以用 3D 打印做一个专用外壳尺寸用卡尺测量后留 0.2mm 左右间隙即可。小舵机在实时动作时扭矩不大卡座只要不松旷工作稳定就够用了。注意舵机臂安装要留出螺丝刀操作空间不要等装好了才发现无法调整舵机臂角度。3.3 行程、限位与整机装配顺序装配前先手动测试直线舵机的实际行程方向再确定演示程序里的“伸出”和“收回”脉宽。为了避免推杆顶到机械限位后长时间堵转程序中一定要设置足够的到位停顿时间而不是让舵机持续发力。稳妥的装配步骤如下先把直线舵机固定在底座上确认推杆运动方向没有被遮挡。安装圆柱小舵机卡座接好舵机臂预留动作空间。布置电源线和信号线尽量把线束固定在结构件上避免运动过程中勾缠。用独立稳压电源上电先用程序发送停止脉宽确认舵机没有异常抖动。再测试伸出、收回脉宽记录临界点和行程末端位置。最后做 10 次以上的连续往复动作观察连接螺丝是否松动。整机装配顺序直接影响排查效率。如果先接线把所有舵机都固定到位发现问题后再拆会浪费很多时间。建议每个部件固定后都做一次简单通电测试确认没问题再往下装。4. 舵机 PWM 控制原理与代码实现4.1 舵机 PWM 脉宽与位置映射大多数小型舵机通过信号线上的高电平脉冲宽度控制位置。这种 PWM 的标准周期约为 20ms也就是 50Hz其中高电平持续时间通常落在 500us 到 2500us 之间。脉冲宽度越宽舵机输出位置越靠近一侧脉冲宽度越窄越靠近另一侧。以 SG90 舵机来说不同厂家的脉宽范围标注并不完全一致有的舵机是 500us 到 2400us有的是 1000us 到 2000us。所以我更推荐在程序里使用writeMicroseconds()直接设置脉宽实测过程中观察舵机两端位置再固化成最终参数。对于三线直线舵机如果它内部支持标准舵机 PWM 协议那么控制思路和普通舵机基本一致只是输出的不再是角度而是推杆伸出量。有的直线舵机接收到不同的脉宽会直接对应到“伸、停、缩”三种状态有的则可以像标准舵机一样把脉宽映射到连续行程。拿到一个不确定的舵机时第一步是先把脉宽调到中间值然后再逐步微调两端不要一来就发满量程脉宽。在应用层面真正实用的舵机控制算法其实包含几部分生成 50Hz 基准脉冲、对目标脉宽做渐变插值、限制单位时间内的脉宽变化量以及避免舵机在行程末端持续堵转。演示程序只需要覆盖前三点就能实现比较平滑的直线往复运动。4.2 直线舵机往复伸缩测试程序下面先看一个最精简的直线舵机自动往复测试程序。这个程序无需串口烧录后接上电源直线舵机会自动按“伸出-停止-收回-停止”的顺序循环运行。/* * 文件路径line_servo_test/line_servo_test.ino * 功能三线直线舵机自动往复伸缩测试 */ #include Servo.h Servo linearServo; const int signalPin 9; // 以下三个脉宽需要根据实际舵机标定 const int extendPulse 1800; // 伸出位置 const int stopPulse 1500; // 停止/中位位置 const int retractPulse 1200; // 收回位置 const unsigned long holdTime 3000; // 每个动作保持 3 秒 void setup() { Serial.begin(9600); // attach 的第二个和第三个参数限定了脉宽范围 linearServo.attach(signalPin, 1000, 2000); // 上电先把舵机停在中间避免突然跳到极端位置 linearServo.writeMicroseconds(stopPulse); delay(1000); } void loop() { Serial.println(伸出); linearServo.writeMicroseconds(extendPulse); delay(holdTime); Serial.println(停止); linearServo.writeMicroseconds(stopPulse); delay(1000); Serial.println(收回); linearServo.writeMicroseconds(retractPulse); delay(holdTime); Serial.println(停止); linearServo.writeMicroseconds(stopPulse); delay(1000); }代码里使用attach(signalPin, 1000, 2000)限定了脉宽的最小值和最大值。这样即使程序里出现越界数值Servo库也能把输出限制在安全范围。实际运行时如果发现舵机没有动作或者运动方向反了只需要交换extendPulse和retractPulse的值或者根据舵机标注调整脉宽区间即可。4.3 直线舵机与圆柱小舵机联动示例接下来是本次样品使用的综合控制程序。我在里面加入了圆柱小舵机并设计了一个按键自动演示模式和串口手动控制模式。硬件接线如下Arduino 引脚外部模块连接说明D9直线舵机信号线PWM 信号D10圆柱小舵机信号线PWM 信号D8按键一端按键另一端接 GND5V舵机 VCC推荐外部电源小电流测试时可临时用板载 5VGND舵机 GND和控制板共地/* * 文件路径servo_demo_combined/servo_demo_combined.ino * 功能三线直线舵机 圆柱小舵机联动演示 * 串口指令e直线伸出 s直线停止 r直线收回 m全部回中 * 按键功能按一下进入自动演示再按一下退出 */ #include Servo.h Servo linearServo; // 三线直线舵机 Servo smallServo; // 圆柱小舵机 const int linearPin 9; const int smallPin 10; const int keyPin 8; const int minPulse 1000; const int maxPulse 2000; int currentPulse 1500; bool autoMode false; int autoDir 1; unsigned long lastMoveTime 0; int smallAngle 0; void setup() { Serial.begin(9600); pinMode(keyPin, INPUT_PULLUP); linearServo.attach(linearPin, minPulse, maxPulse); smallServo.attach(smallPin); // 上电保持中位 linearServo.writeMicroseconds(1500); smallServo.write(0); } void loop() { // 按键切换模式 if (digitalRead(keyPin) LOW) { autoMode !autoMode; delay(200); // 简单防抖 Serial.print(模式切换); Serial.println(autoMode ? 自动演示 : 串口控制); } if (autoMode) { // 自动演示模式脉宽每 30ms 增加 3us实现平滑伸缩 if (millis() - lastMoveTime 30) { currentPulse autoDir * 3; if (currentPulse maxPulse - 100) { currentPulse maxPulse - 100; autoDir -1; } else if (currentPulse minPulse 100) { currentPulse minPulse 100; autoDir 1; } linearServo.writeMicroseconds(currentPulse); // 圆柱小舵机随推杆位置联动实际角度需要根据结构调整 smallAngle map(currentPulse, minPulse 100, maxPulse - 100, 0, 90); smallServo.write(smallAngle); lastMoveTime millis(); } } else { // 串口手动控制模式 if (Serial.available() 0) { char cmd Serial.read(); switch (cmd) { case e: currentPulse maxPulse - 100; linearServo.writeMicroseconds(currentPulse); Serial.println(直线舵机伸出); break; case s: currentPulse 1500; linearServo.writeMicroseconds(currentPulse); Serial.println(直线舵机停止保持); break; case r: currentPulse minPulse 100; linearServo.writeMicroseconds(currentPulse); Serial.println(直线舵机收回); break; case m: linearServo.writeMicroseconds(1500); smallServo.write(90); Serial.println(全部舵机回到中位); break; default: break; } } } }这段代码把脉宽渐变过程写在了自动演示模式中。currentPulse每一步只改变 3us舵机运动会比较平滑不会出现直接从一端跳到另一端的冲击感。这种思路在舵机控制算法里属于最简单的速度规划实际机械臂或仿生机器人中还会加入加速度限制、梯形加减速、目标位置闭环等更多内容但基础逻辑是相同的。很多新手会直接把smallServo.write(90)看成固定的 90 度其实write的参数是角度还是脉宽取决于舵机库版本和使用方式。Servo库默认write(angle)是角度范围通常为 0 到 180。实际小舵机安装在样品上后0 度和 90 度对应什么姿态需要根据机械位置现场调整不能只凭直觉写死。4.4 串口调试与边界处理样品演示过程中我时刻关注两个边界条件。第一个是脉宽边界。不同的直线舵机对同一脉宽响应可能不同所以代码里minPulse和maxPulse并不是越大越好。脉宽设置超过舵机内部量程时舵机不会继续增加行程而是会进入堵转状态时间一长舵机发热明显齿轮磨损加快。稳妥做法是通过串口一步步微调脉宽观察推杆是否已经到位再决定是否继续增加。第二个是模式切换时机。按键控制的autoMode切换逻辑虽然简单但如果舵机正在自动运动过程中突然切换到串口控制当前脉宽和代码里的目标脉宽不一致舵机可能会出现一次明显跳动。严重情况下会造成推杆撞击限位。这个样品里我通过把currentPulse变量作为全局状态来维护让手动模式指定位置时也基于这个变量继续更新可以在一定程度上减少突变。串口调试时每次发送指令后观察舵机实际响应比一次烧录大量新代码更高效。先确认停止脉宽再确认两端安全位置最后再写入完整演示程序这个顺序能明显缩短调试时间。5. 成品演示与高频故障排查5.1 演示流程设计一个用于发布到闲鱼展示的样品演示过程不能太随意。我把流程设计成固定脚本方便录视频和拍照。整个演示脚本分为三步上电自检。接通电源后直线舵机先回到中位圆柱小舵机回零。串口指令演示。通过串口依次发送e、s、r逐个验证直线舵机的伸出、停止、收回。自动联动演示。按下按键进入自动模式直线舵机和圆柱小舵机连续往复运动约 30 秒展示稳定性和联动效果。演示时可以在推杆旁边放一把直尺拍摄特写镜头让买家直观看到行程长度。另外要拍一段侧面视角展示直线舵机安装方式和内部结构避免图片“美化过度”导致买家收货后有落差。5.2 稳定性观察项样品准备发布前我建议至少连续运行 20 次以上并在测试过程中
上一篇/下一篇内容由系统自动关联 返回资讯列表 →