拓冰建站拓冰建站
首页 / 资讯中心 / 正文

SG90 360°连续旋转舵机控制方法:用writeMicroseconds实现方向与转速

很多人第一次买 SG90 舵机时会看到两个版本在货架上并排出现标准 180° 舵机和 360° 连续旋转舵机。如果你买的是后者又习惯性地用write(90)想让它转到一个固定角度很快就会发现问题舵机要么上电就朝一个方向猛转要么转起来根本停不到指定位置甚至有人怀疑自己买到了坏件。其实问题不在硬件而在控制逻辑。这次我们来看 SG90 360 度连续旋转舵机在 Arduino UNO 上的控制方法重点聚焦writeMicroseconds()这个函数、开环控制的基本概念以及一套从接线到验证的实测流程。文章会覆盖接线方式、Arduino IDE 配置、控制代码示例、方向与转速测试、故障排查还有供电和资源占用层面的注意事项。如果你想搞清楚“为什么 360° 舵机不能直接转到指定角度”以及“用脉宽控制旋转到底该怎么写”这篇文章可以直接收藏。要特别说明的是SG90 360° 连续旋转舵机并不是把标准舵机的角度范围扩大到 360°而是改变了反馈结构。它内部不再通过电位器检测角度所以脉冲宽度不控制角度而是控制“方向和速度”。这意味着它是一个典型的开环系统你只能发出“正转全速”“反转半速”“停止”之类的指令却无法读取当前转到哪个位置。所有关于“转了多远”的判断只能靠外部传感器或程序里的计时来补充。1. SG90 360° 舵机核心认知速览项目说明模块类型微型连续旋转舵机常见 9g 级别控制方式PWM 脉宽控制通常周期 20ms50Hz标准角度舵机脉宽映射角度例如 500us~2500us 对应 0°~180°360° 连续旋转舵机脉宽映射方向和转速通常在 1500us 附近停止常见脉宽范围以舵机规格为准常见约为 1000us 全速正转、1500us 停止、2000us 全速反转控制函数Arduino Servo 库的writeMicroseconds()是否能精确转角度不能。无位置反馈属于开环控制停止方式连续输出约 1500us 的停止脉宽推荐开发板Arduino UNO、Nano 等 AVR 开发板引脚兼容Servo 库通过普通数字引脚输出信号电源需求单个舵机建议独立 5V 供电避免直接吃开发板稳压适合场景云台持续旋转、小型小车驱动、简单传动、实验中需要连续转动的机构这张表里最需要记住的是不要用角度思维写代码要用方向和速度思维写代码。市面上标“SG90 360°”的模块不同批次的中位脉宽和全速脉宽可能不一样有些舵机的停止点在 1480us 或 1520us甚至左右死区不对称。所以拿到新舵机后第一步不是跑你的项目代码而是先校准中位。2. 适用场景与使用边界先泼一盆冷水SG90 360° 连续旋转舵机不适合做精确位置控制。因为普通版内部没有输出轴角度传感器你无法得知轴当前处于什么状态如果负载发生变化同一段脉宽下的实际转速也会变化严格意义上连“精确调速”都做不到。它能保证的是“方向和占空比之间的定性关系”脉宽偏向一边就正转偏向另一边就反转越偏离中位通常转速越快。它适合这几类场景小型机器人小车直接驱动轮子实现前进、后退和调速。云台转盘需要持续或受控旋转而不要求停在精确刻度。简单门闸、卷帘、传送演示机构配合外部限位开关闭环。学习 PWM 脉宽控制原理观察不同脉宽对电机转速的影响。配合编码器、霍尔传感器或光电开关把开环运动改造成带反馈的运动系统。不适合的场景包括多关节机械臂的角度控制如果没有编码器或外部传感器定位误差会积累。需要实时感知负载碰撞的应用舵机内部没有电流反馈堵转后只能靠外部检测判断。长时间堵转运行9g 舵机内部电机和齿轮都很小长时间堵转发热严重容易损坏。对噪音和寿命要求高的商业项目这种微型舵机的齿轮强度和电机寿命都有限。合规提醒同样值得放前面。这类旋转机构如果装配到任何可能接触人体的设备上必须增加机械限位、防护罩和安全切断逻辑。不要用普通舵机改造的装置直接用于载人、医疗或高可靠工业场景。教学和原型验证用途下也要注意供电安全、防止短路以及不要让线材卡进齿轮。关于编码器或反馈有经验的玩家会拆开舵机加装磁编码器但普通使用者不建议这么折腾。更好的方式是选用自带反馈的“连续旋转舵机升级版”或带编码器的直流减速电机。开环适合验证运动逻辑闭环才适合做有精度要求的落地产物。3. 硬件准备与接线说明3.1 硬件清单针对一套最基础的验证环境建议准备这些器材硬件数量用途Arduino UNO 板1 块主控产生 PWM 信号SG90 360° 连续旋转舵机1 个被控对象USB 数据线1 根下载程序和供电外部 5V 电源可选给舵机供电避免 USB 供电不足面包板及跳线若干完成信号连接和电源连接万用表可选检查供电电压和接线是否短路如果只用 USB 给 Arduino UNO 供电并带一个空载的 9g 舵机多数情况下能转但一旦堵转或接了两个以上舵机很容易出现电压跌落、复位、异常抖动。更稳妥的做法是给舵机单独接 5V 电源并和 Arduino 共地。3.2 接线表SG90 系列常见是三根线颜色一般为橙信号、红电源、棕地但不同厂家会有差异。接线前先看舵机标签或卖家图纸舵机线颜色常见引脚名接到哪里橙 / 黄Signal / PWMArduino 数字引脚 D9红 / 中间VCC / 5V外部 5V 正极或 UNO 的 5V 引脚棕 / 黑GND / -外部 5V 负极或 UNO GND并共地如果按照 Arduino 和外部电源共地的接法典型连线如下舵机信号线 → Arduino D9。舵机电源线 → 外部 5V 电源正极。舵机地线 → 外部电源负极同时外部电源负极用跳线接到 Arduino GND。共地这一步很容易漏。Arduino 发出的是参考自身 GND 的 PWM 信号舵机如果只接外部电源、不共地信号电平没有公共参考点可能出现不转或乱转。3.3 供电设计建议SG90 连续旋转舵机正常工作电压一般是 4.8V~6V。采用外部 5V 电源时还要注意电源电流能力至少要几百毫安如果驱动多个舵机电流能力要按舵机数量放大。电源纹波要控制好。劣质 USB 供电或手机充电头空载电压偏高可能导致舵机转速异常。舵机启动瞬间电流较大可以在舵机电源两端并联一个 100uF~470uF 的电解电容减少电压跌落。电容极性不能接反。如果你用的就是 Arduino UNO 的 5V 引脚供电可以把它看作“实验可行但不够稳健”的方案尤其当程序里让舵机频繁启停时建议直接改成外置电源。4. Arduino IDE 环境准备与驱动确认写代码之前先把 Arduino IDE 装好并把板卡识别出来。4.1 安装 IDE 并选择开发板在 Arduino 官网下载对应操作系统的 IDE安装后打开按以下步骤操作用 USB 线连接 Arduino UNO 和电脑。在“工具 - 开发板 - 开发板管理器”里确认安装了Arduino AVR Boards包。选择开发板为Arduino Uno。在“工具 - 端口”里选择正确串口。Windows 下如果设备管理器里看不到串口通常是 CH340 或 CP210x 驱动问题。UNO 原厂板多使用 ATmega16U2 芯片不需要额外驱动国产兼容板可能使用 CH340需要安装 CH340 驱动。在 Linux 下如果出现权限不足需要把当前用户加入dialout组。4.2 编译烧录前的最小检查可以先烧一个最简单的 Blink 例程确认下载链路没问题。如果 Blink 能亮说明开发板、端口、驱动都正常后面可以聚焦舵机控制问题。常见情况是开发板选错、端口选错、IDE 版本缓存异常。切换端口后如果下载失败可以先重新插拔 USB并确认没有多个串口工具占用同一 COM 口。5. writeMicroseconds 核心控制代码5.1 包含头文件与创建舵机对象Arduino 的 Servo 库自带writeMicroseconds()函数它直接指定输出到舵机信号线上的脉宽单位是微秒。#include Servo.h Servo myServo; void setup() { myServo.attach(9); // 信号线接 D9 myServo.writeMicroseconds(1500); // 先给停止脉宽 } void loop() { }注意attach()之后最好立刻调用一次writeMicroseconds(1500)。如果不调用有些舵机可能停留在上一次的脉宽状态。对 360° 连续旋转舵机来说上电瞬间如果输出脉宽偏了就会转动所以先给停止脉宽是一个比较安全的初始化习惯。5.2 为什么用 writeMicroseconds 而不是 write对标准 180° 舵机write(90)表示转到 90°write(180)表示转到 180°Servo 库内部会把它换算成合适的脉宽。这个函数对 360° 连续旋转舵机没有意义因为舵机内部没有“角度”概念。writeMicroseconds()是直接写脉宽例如myServo.writeMicroseconds(1500); // 常见停止脉宽这里 1500us 只是一个常见的停止中点参考值。不同舵机可能略有差异需要通过实测校准。而标准舵机的 0° 和 180° 对应的脉宽范围在 360° 连续旋转舵机上也不一定适用所以“照抄 180° 舵机代码”是很多新手翻车的原因。5.3 正转、反转、停止的完整示例下面这个示例演示了一个循环动作停止 2 秒正转 2 秒停止 1 秒反转 2 秒。#include Servo.h Servo myServo; int servoPin 9; void setup() { Serial.begin(9600); myServo.attach(servoPin); myServo.writeMicroseconds(1500); // 停止 } void loop() { // 正转 Serial.println(Forward); myServo.writeMicroseconds(1700); delay(2000); // 停止 Serial.println(Stop); myServo.writeMicroseconds(1500); delay(1000); // 反转 Serial.println(Reverse); myServo.writeMicroseconds(1300); delay(2000); // 停止 Serial.println(Stop); myServo.writeMicroseconds(1500); delay(2000); }这里 1700us 和 1300us 是示例值并不代表你的舵机正好是“半速”。实际舵机可能 1600us 就转动明显也可能 1700us 才动需要通过测试确定。5.4 用 millis() 实现非阻塞旋转控制delay()的写法简单但在多传感器项目里会阻塞主循环不适合做需要同时检测按键、串口或传感器的逻辑。更合理的方式是用millis()记录时间。下面做一个简单的非阻塞状态机舵机前 2 秒正转后 2 秒停止再进入反转。#include Servo.h Servo myServo; unsigned long previousMillis 0; int state 0; void setup() { myServo.attach(9); myServo.writeMicroseconds(1500); } void loop() { unsigned long currentMillis millis(); switch (state) { case 0: // 正转 myServo.writeMicroseconds(1700); if (currentMillis - previousMillis 2000) { previousMillis currentMillis; state 1; } break; case 1: // 停止 myServo.writeMicroseconds(1500); if (currentMillis - previousMillis 2000) { previousMillis currentMillis; state 2; } break; case 2: // 反转 myServo.writeMicroseconds(1300); if (currentMillis - previousMillis 2000) { previousMillis currentMillis; state 0; } break; } }millis()方案不会阻塞主循环之后要接入超声波传感器、串口调试或按键中断都更方便。写这种状态机时要注意currentMillis - previousMillis的写法用无符号长整型减法可以避免millis()溢出带来的大部分问题这是 Arduino 常见的节拍写法。6. 功能测试与效果验证新舵机到手后建议按下面的顺序逐步测试。不要直接把自己的项目代码烧进去因为如果硬件或舵机中位有问题你很难判断是接线问题还是逻辑问题。6.1 测试一不上电检查是否短路先不要给 Arduino 上电用万用表电阻档检查电源线和地线之间是否有短路。信号线接错一般不会烧电源线正负接反或短路风险更大。确认接线正确后再插入 USB。6.2 测试二确认停止脉宽先写入下面的测试代码#include Servo.h Servo myServo; void setup() { myServo.attach(9); myServo.writeMicroseconds(1500); } void loop() { }烧录后观察舵机轴如果不转或者转动很微弱说明 1500us 接近中位。如果明显持续旋转可以微调脉宽值例如从 1450us 到 1550us 找一个停止点。推荐在串口里边观察边调试#include Servo.h Servo myServo; int pulseWidth 1500; void setup() { Serial.begin(9600); myServo.attach(9); myServo.writeMicroseconds(pulseWidth); Serial.println(Input pulse width in microseconds.); } void loop() { if (Serial.available() 0) { pulseWidth Serial.parseInt(); if (pulseWidth 800 pulseWidth 2200) { myServo.writeMicroseconds(pulseWidth); Serial.print(Set pulse: ); Serial.println(pulseWidth); } else { Serial.println(Out of range.); } } }打开串口监视器输入1500观察舵机停不停止。再把1500改成1480、1520对比。这样能很快找到实际停止点。6.3 测试三方向与转速在中位确认没问题后测试两个方向的响应输入1600观察舵机是否向一个方向旋转。输入1400观察舵机是否向另一个方向旋转。逐渐增大差值例如 1550、1600、1700、1800观察转速是否大致增大。如果发现某一边不转或者脉宽只在中位附近抖动却不持续旋转可以考虑两个原因一是舵机不同轴的启动电流需求大但供电不足二是你的舵机定义的中位和全速点不对称。把结果整理成测试记录表测试条件预期结果实际结果脉宽 1500轴静止按实测记录脉宽 1600一侧旋转按实测记录脉宽 1400另一侧旋转按实测记录脉宽 1800转速提高按实测记录脉宽 1200反向转速提高按实测记录不同舵机的脉宽范围不宜盲目加大超出规格容易导致舵机内部电路异常发热。常见的 180° 舵机 500us~2500us 范围对 360° 连续旋转版本不一定适用所以测试时应当先保守地从 1300us~1700us 区间开始再逐步扩大。这个习惯可以避免舵机堵转。6.4 测试四用时间近似判断旋转量如果需要粗略估计“让舵机转半圈”只能通过控制旋转时间来实现。例如你先测出某一脉宽下舵机每分钟转速然后据此计算需要转多少毫秒。这个方案没有反馈意味着负载变化、电池电压降低都会影响结果。测试方法是在舵机输出轴上贴一个明显标记例如用黑色胶带贴一条线然后让舵机旋转固定时间#include Servo.h Servo myServo; void rotateTime(int pulseWidth, unsigned long durationMs) { myServo.writeMicroseconds(pulseWidth); delay(durationMs); myServo.writeMicroseconds(1500); } void setup() { myServo.attach(9); myServo.writeMicroseconds(1500); delay(500); rotateTime(1700, 1000); // 假设正转1秒 } void loop() { }烧录后观察输出轴转过的角度如果和你预期的半圈或一圈不一致就去调整时间参数。实际项目中这个时长还会受电源电压、温度、负载和齿轮磨损影响不要把它当作精确参数长期沿用。6.5 判断是否成功一套完整的入门验证至少应该满足下面几条舵机在某个中位脉宽下能稳定静止。偏离中位后能朝指定方向旋转。脉宽偏离越远转速有明显提升或至少能区分低高速。程序下载后上电不会无规律猛转。停止脉宽连续输出时舵机没有明显抖动。如果以上都能满足说明你的 SG90 360° 连续旋转舵机已经能按开环方式工作了。7. 开环控制原理与常见误区7.1 为什么脉宽控制转速而不是角度标准角度舵机内部有控制电路和电位器。控制电路读取外部脉宽读取电位器反馈的当前位置然后驱动电机让两者一致构成一个闭环。而 360° 连续旋转舵机通常不再使用位置反馈或者把反馈限位移除控制电路只能根据脉宽决定电机的通电方向和 PWM 占空比。没有电位器告诉你“位置在哪”CPU 也没有角度信息所以它是一个开环速度系统。如果从控制理论的角度理解你可以这样看输入量脉宽值。控制量内部电机的电压方向和等效占空比。被控量输出轴的旋转速度。反馈量无。没有反馈的直接结果就是不能进行“增量式角度控制”。就算你用机械限位让舵机每次转固定角度长期运行后也会因为启动和停止延迟累积误差。7.2 标准舵机和连续旋转舵机的代码差异很多教程里的舵机云台程序使用的是myservo.write(angle);。这种代码对角度舵机有效对连续旋转舵机无效。Servo 库在write()内部会把角度换算为脉宽但连续旋转舵机并不关心角度映射它只看最终脉宽。你可以写myservo.write(90);让标准舵机去中位对连续旋转舵机write(90)通常对应一个接近停止的脉宽但绝不是所有舵机都刚好如此。所以最实用的建议是直接放弃write()改用writeMicroseconds()。这样代码意图明确也方便后期调整脉宽。7.3 常见误区误区一1500us 一定代表停止。实际上不同舵机的停止点可能有偏差需要实测。误区二加大脉宽一定等比提高转速。舵机内部有控制离散化脉宽从小偏离中位到较大偏离转速不会严格线性变化而且接近上下限时会饱和。误区三360° 舵机转过的“角度”可以由程序稳定复现。没有外部反馈时这种经验参数只能用于对精度没有要求的演示。误区四烧录程序前舵机不会转。很多舵机在没有收到有效信号时会有自己的默认状态而 Arduino 复位瞬间引脚为高阻或未初始化状态也可能让舵机抖动。程序里要尽快attach()并给出中位脉宽。8. 多舵机、资源占用与供电观察8.1 Servo 库的资源占用Arduino UNO 使用 ATmega328PServo 库默认使用定时器 Timer1 来维护最多 12 个舵机的脉冲生成。这就会带来两个直接结果如果你用的是标准 Servo 库Servo库和依赖 Timer1 的其他库不能同时使用。12 路只是“库上限”不是“硬件供电上限”。真正限制因素是电源能够提供多少电流。一个 9g 舵机在空载时电流小但启动和堵转时的电流可以明显高于稳定运行电流。多个舵机同时启动时峰值电流叠加USB 口很难扛住。更合理的做法是给舵机单独供电并且不要把所有舵机的地线或电源线共用太细的杜邦线。8.2 多舵机接线参考下面是一个简化的双舵机接线表舵机信号引脚电源地线舵机 1D9外部 5V外部 GND舵机 2D10外部 5V外部 GND代码里创建两个 Servo 对象并分别attach()#include Servo.h Servo servo1; Servo servo2; void setup() { servo1.attach(9); servo2.attach(10); servo1.writeMicroseconds(1500); servo2.writeMicroseconds(1500); } void loop() { servo1.writeMicroseconds(1600); servo2.writeMicroseconds(1400); delay(2000); servo1.writeMicroseconds(1500); servo2.writeMicroseconds(1500); delay(2000); }外部电源的地线必须和 Arduino 的 GND 相连这个共地不能被省略。否则两个舵机虽然能分别收到高电平脉冲但信号参考地不一致很容易出现随机抖动。8.3 如何观察系统是否“供电不足”供电不足的典型表现包括舵机原地抖动但输出轴没有力气。程序运行到一半 Arduino 自动复位。舵机只能朝一个方向转反向后没有反应。USB 连接不稳定串口监视器频繁断开。如果出现这些现象不要在代码里浪费太多时间先给舵机接上独立电源再加入滤波电容问题往往能解决。也可以用万用表在舵机启动瞬间测量电源电压如果电压跌落明显说明电源内阻或者线材压降过大。9. 常见问题与排查方法问题现象可能原因排查方式解决方案上电后舵机一直转代码里写了 1500 也没用1500us 不是该舵机中位或 attach 后未立即给脉宽串口在线输入 1450~1550 脉宽测试校准实际停止脉宽舵机完全不动信号线接错、供电不足或舵机损坏检查接线、换 D9 引脚、测电源输出重新接线使用独立 5V 电源舵机抖动供电电压跌落、信号线接触不良或脉宽处于临界点检查电源电流、检查杜邦线、调节脉宽加电容、换粗短线、错开临界脉宽程序烧录成功但舵机响应串口输入异常串口被占用或波特率不一致确认串口监视器波特率统一波特率为 9600 或按代码设置只能向一个方向转左右脉宽范围不对称或中位校准偏了测试 1400/1600 两个方向找到真正中位重新校准舵机发热明显持续堵转、VCC 电压过高或负载太大测电源电压观察输出轴是否卡住降低电压、卸载负载、减少堵转时间舵机转动速度不稳定电源电压波动、开环控制固有现象用独立电源供电测电压纹波加强滤波避免过大负载变化使用 Servo 后其他库冲突Timer1 被占用查看库文档确认定时器冲突换支持其他定时器的库或换主控Arduino 频繁复位舵机启动电流把板载电压拉低观察 USB 是否重连外接电源USB 只做通信这个排查表不用按顺序从头看到尾而是出现现象时对号入座。大部分问题和代码没关系先查供电和接线再看程序逻辑效率最高。10. 最佳实践与使用建议10.1 用限幅函数保护舵机舵机支持的脉宽范围不是越大越好。写一个简单的限幅函数能避免调试时意外输入过宽的脉宽#include Servo.h Servo myServo; void safeWrite(Servo servo, int pulse) { if (pulse 700 pulse 2300) { servo.writeMicroseconds(pulse); } } void setup() { myServo.attach(9); safeWrite(myServo, 1500); } void loop() { safeWrite(myServo, 1700); delay(2000); safeWrite(myServo, 1500); delay(2000); }实际使用中你需要根据舵机规格书把700和2300替换成更保守的上下限。不要猜一个“听起来差不多”的值要尊重硬件手册。10.2 第一次上电先用手扶住舵机每次修改程序烧录前最好把舵机输出轴握住或者让旋转部位远离手和线束。因为复位瞬间Arduino 引脚和 Servo 库的初始化顺序可能导致很短时间内的脉冲输出不为中位舵机突然快速转一下。虽然不是每次都发生但安全习惯值得养成。10.3 给舵机做一组中位标定每个舵机都不一样甚至同一盒里的两个也会有差异。建议专门写一个小工具固件通过串口输入脉宽来控制舵机用来标定每个舵机的中位和最大最小脉宽。标定结果记录下来项目代码里用常量统一管理。const int SERVO_A_STOP 1500; const int SERVO_A_MAX_FWD 1700; const int SERVO_A_MAX_REV 1300;用常量的好处是换舵机或调参数时只改顶部定义即可不用搜代码里的魔法数字。10.4 把串口打印当作调试工具如果你的程序是自动运行的可以在每次切换状态时打印当前时间和脉宽方便判断舵机到底有没有收到新的指令。myServo.writeMicroseconds(1600); Serial.print(Time: ); Serial.print(millis()); Serial.println( ms, Pulse: 1600);串口输出只占很少执行时间对舵机控制影响很小。但在最终产品里如果不需要调试信息可以关掉它减少串口处理带来的那一点时序波动。10.5 把开环升级成半闭环如果项目确实需要知道舵机转了多少圈可以考虑加一个外部光电开关或霍尔传感器。比如在转盘的某个位置贴上反光标记每次转到那里就触发一次计数。这样可以用中断记录圈数和舵机旋转方向组成一个“半闭环”系统。用传感器做位置矫正远比靠脉宽和时间估算可靠。这也把 360° 连续旋转舵机从开环玩法带入了更可控的范围。这种改造不需要换主控Arduino UNO 就能实现信号输出引脚用一个 GPIO。传感器计数引脚接在支持中断的 D2 或 D3 上。每次计数后修正旋转圈数并决定是否停止。需要强调的是外部传感器只能提供“经过某个位置”的信息无法提供“当前绝对角度”。如果要求绝对角度应选用带编码器反馈的舵机或电机组件而不是在普通 9g 舵机上强行改造。10.6 不同负载下的参数不是通用的你在空载时标定的时间和转速关系加了负载后会变化。搬运式小车、带齿轮箱的云台都会拉低实际速度。所以凡是涉及时间和距离换算的项目都要做带载测试。换电池、换电源适配器以后也需要重新验证一遍参数。10.7 关于批量“同型号”舵机有些项目会买十几个同型号的 360° 舵机。这里要提醒同一型号不同个体的中位脉宽差异明显。批量使用时不要指望所有舵机都停在 1500us务必给每个舵机单独标定并把参数烧录到各自的 EEPROM或者使用统一的控制板做在线校准。10.8 关于 RoboMaster、竞赛和复杂应用如果你是在机器人竞赛里使用连续旋转舵机通常需要自己设计运动控制。开环舵机更适合作为学习载体不太适合作为精确运动系统的核心执行机构。真正比赛用的底盘驱动一般会选择带编码器或霍尔传感器的直流减速电机或使用带反馈的舵机。竞赛场景里建议在项目初期就确认所需传感器和控制精度避免机械搭完以后再换执行器。11. 实测流程回顾与下一步玩法到这里一套完整的 SG90 360° 连续旋转舵机入门验证流程已经跑完拿到舵机后先确认是角度版还是连续旋转版。接好信号线和独立电源记得共地。用writeMicroseconds(1500)找停止点。用不同脉宽测方向。测试时间与旋转量的关系。根据项目需求决定继续用开环还是加外部传感器闭环。最容易踩的坑有三处第一个是把 360° 舵机当 180° 舵机写角度代码第二个是忽略外部电源和共地第三个是盲目相信 1500us 就是停止点。只要把这三个问题想清楚后面的玩法就顺畅很多。下一步可以尝试的方向很多。如果你做小车可以把两个这种舵机装在底盘上用刚才的脉宽控制实现前进后退和差速转向。如果你想做云台可以搭配 Hall 传感器做归零和圈数累计。如果你感兴趣的是控制理论可以在此基础上加编码器、PID 调速比较一下有反馈和没有反馈的巨大差异。也可以尝试自己写 PWM 信号不用 Servo 库而是用analogWrite()配置频率和占空比或者用定时器中断模拟舵机信号进一步理解 50Hz 和脉宽本身的含义。最后再强调一条建议把这篇验证流程里的标定方法固化下来每次拿到新舵机都先跑一遍。开环系统不可怕可怕的是没有标定就盲目上项目。你花在标定中位上的十分钟会在后面省掉大量排查问题的时间。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门