十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

嵌入式的浪漫:RK3566驱动15电机,打造一只会摇摆的机械鸭

嵌入式的浪漫:RK3566驱动15电机,打造一只会摇摆的机械鸭 最近一段时间我在好几个硬件群里反复看到同一个小视频一只只有25厘米左右高的机械鸭子被放到桌面上摇摇晃晃地走了起来。步伐不快但重心左右摆动的样子特别自然翅膀偶尔抬一下尾巴跟着节奏上翘脖子还会往前探。评论区很快有人扒出来说这是GitHub上一个开源的嵌入式机器人项目整机重量不到800g主控用了瑞芯微RK3566小身板里塞了15个电机。我做了十几年嵌入式见过不少四足机器人、机械臂、开源小车但能把“小体积强算力多自由度”这三件事同时压到一只桌面鸭子身上的确实不多见。这篇不是搬运项目介绍而是想从嵌入式工程师的角度把这个项目拆开揉碎RK3566在这里到底负责什么、15个电机怎么分配才能走路不僵、800g以内的重量预算怎么卡出来的、软件栈该怎么搭。如果你正准备复刻这类机器人或者单纯好奇“一堆零件怎么变成一只会走路的鸭子”这篇值得看完。1. 一只爆火鸭子背后藏着嵌入式硬件的三个真相1.1 为什么不是遥控玩具而是开源硬件圈的“现象级”项目鸭子这种形态的机器人其实一直存在早年间玩具店里的电动鸭子也会走但那是偏心轮曲柄连杆的机械固定动作走不了两步就撞墙。这次火起来的项目本质上是把一台小型Linux计算机和一套多关节运动系统装进了宠物大小的壳子里而且整套代码、结构图纸、硬件设计文件都在GitHub上开源了。它能火我认为有三个直接原因。第一指标足够极端。RK3566这种原本用在智能门锁、广告屏、教育平板上的四核A55处理器被塞进一个不到800g的鸭子身体里这个组合本身就很有话题性。第二行为足够自然。视频里鸭子的摇摆步态不是电机硬转出来的而是有重心偏移、有摆动相和支撑相切换的说明步态控制是认真调过的。第三可玩性高。开源意味着任何人都可以改代码让鸭子识别人脸、做语音应答、甚至接上ROS2自己写控制逻辑。这类项目的价值不在于“鸭子本身多有用”而在于它用极小的体量展示了桌面级机器人走向消费级的可能性。你可以在它身上看到机械、电力、嵌入式软件、算法四条线怎么在有限空间里互相妥协。1.2 三个被这只鸭子验证的硬件趋势第一个趋势强算力主控已经开始“下沉”到小型机器人里。过去这类桌面机器人要么用STM32只能做简单舵机控制要么用树莓派体积和功耗都偏大。RK3566这类SoC的出现在中间打开了一个缺口——算力比MCU高一个量级体重和功耗又比主流开发板低适合做需要视觉、语音、联网的产品原型。第二个趋势电机数量不再是“堆料”的噱头而是工程密度的较量。15个电机意味着至少15个关节自由度从腿部到翅膀到尾巴每一路都要有对应的控制逻辑和功率预算。光把15个电机接上电不难难的是让它们按照同一套步态算法协同运动。第三个趋势开源协作让复刻门槛大幅降低。一个个人开发者很难独立搞定机械设计、硬件电路、Linux驱动、步态算法、App控制全部环节但通过GitHub上的分工协作项目可以快速迭代。对学习者来说这类仓库本身就是一份“完整嵌入式课程”。2. 25cm小身板的算力选型RK3566与非它不可的理由2.1 从STM32到RK3566算力需求的临界点有人会问一只鸭子走路而已STM32不够吗如果需求只是“舵机按预定角度转”STM32确实绰绰有余。但一旦你希望鸭子具备摄像头识别、语音交互、Wi-Fi联网、空中升级这些能力MCU就撑不住了。尤其现代AI机器人讲究“感知-决策-执行”感知部分的图像分类和人脸检测在STM32上做基本是折磨自己。RK3566是瑞芯微推出的一颗四核Cortex-A55处理器主频在1.8GHz上下内置0.8TOPS左右的NPU支持4K视频解码。这个算力对于鸭子这种桌面机器人来说刚好卡在一个甜点位能跑Linux能跑轻量级神经网络模型能处理摄像头画面功耗还压得住。相比动辄十几瓦的X86平台RK3566平均功耗只有个位数瓦特这对散热压力很小。我的判断是这个项目选RK3566而不是树莓派一个重要原因就是集成度和供货稳定性。RK3566核心板在消费类产品里大量出货价格便宜尺寸可以做得很小邮票孔核心板加自研底板的方式比直接插一块树莓派在结构和重量控制上灵活太多。2.2 核心板与底板的分工重量与扩展性的平衡25cm的鸭子内部留给主板的空间大概只有一个火柴盒那么大。这时候你不太可能自己去画RK3566的完整板——BGA的DDR走线、阻抗匹配、电源时序每一道都是硬门槛个人打样周期和成本都不划算。更合理的做法是买市售的RK3566邮票孔核心板自己画一块“底板”。底板负责把核心板的引脚引出来做电源转换、舵机接口、传感器接口。这个分工很有工程智慧核心板帮你消化了最难的DDR和SIP封装问题底板则完全服务于这个鸭子的具体形态想怎么布就怎么布。底板设计有几个容易忽略的点。舵机电源和主板电源一定要共地否则串行舵机总线信号会出现无法解析的电平漂移。IMU传感器最好放在远离电机和降压电感的位置不然磁场干扰会让姿态数据漂得离谱。另外串口和舵机总线的接口建议加ESD保护和防反插鸭子摔一下、线头碰一下接口很容易烧。2.3 供电与散热的“体重博弈”RK3566的功耗对800g级别的整机来说不算大头但供电方案依然决定成败。我的经验是小型机器人优先用2S锂电池7.4V舵机直接吃电池电压主控的5V和3.3V用DCDC降压出来。如果上3S11.1V所有舵机端都需要额外的降压模块一来增加重量二来多一层发热和损耗。15个电机同时启动时的瞬时电流相当可观。串行总线舵机单颗堵转电流可以到2A以上15颗全堵就是30A正常行走虽然不会这么极端但6到8A的瞬时电流很常见。电池必须能扛住这种脉冲放电我用过不少标称20C的小电池实际压降还是很大后来换成高倍率电芯才算稳定。导线也不能太细主板到电池段的线径至少在AWG20以上电机汇流排更是要粗。散热方面RK3566在密闭壳体内被动散热芯片底部贴一块铜片或均热垫外壳上留几个风道孔就够了。四核A55满载也就几瓦真正要盯的是DCDC电感和舵机驱动部分的发热别让热量堆在电池附近否则夏天玩五分钟电池就鼓包。3. 15个电机怎么分工才算把鸭子真正做活3.1 鸭子的生物运动拆解与自由度分配鸭子的“好玩”很大程度来自走路时那种刻进DNA的摇摆感。要做出这个效果先得把鸭子的运动拆解成关节动作。两只腿承担行走每边至少需要髋关节的前后摆动和侧向摆动膝关节用来抬脚和落腿翅膀不是时刻扑棱但必须能做小幅度开合脖子和尾巴负责姿态点缀和身体平衡微调。我推断这个项目大概率是按下面这种思路分配的15个自由度大家拿到手可以对照部位自由度数量承担的动态功能左腿髋关节2前后摆动、侧向重心控制左腿膝关节1抬脚、迈步左腿踝关节1调整脚掌着地角度右腿髋关节2前后摆动、侧向重心控制右腿膝关节1抬脚、迈步右腿踝关节1调整脚掌着地角度左翅膀1展开、收拢右翅膀1展开、收拢颈部2俯仰、左右转动尾部1上翘、下压头部/嘴巴2点头、张嘴加起来正好15个并不多一个闲着的。鸭子在真实行走时尾巴和翅膀也在不停做微调这些细节直接决定观感是“机器人套壳”还是“一只机械鸭子活过来了”。3.2 电机选型为什么盲选SG90会翻车很多新手做小机器人第一反应是买SG90便宜、小巧、到处都有。但SG90在这个项目里基本不能用。SG90的扭矩只有1.8kg·cm左右塑料齿轮位置精度差空载转起来还行一旦承受行走时的冲击载荷齿轮很快会扫齿。这里有笔账可以算。鸭子整机约800g以单腿支撑时髋关节承受的力臂大约在4到6cm。静态扭矩就是0.8kg×0.05m等于4kg·cm而这还只是静止状态。行走过程中地面冲击和重心转移会产生2到3倍动态载荷所以腿部关节舵机的峰值扭矩需求至少在8到10kg·cm以上。SG90只有1.8kg·cm完全不是一个量级。25cm高度下的鸭子腿长大概6到8cm要保证步幅和扭矩关节电机必须用金属齿轮、带轴承的型号。我建议优先考虑力矩在6到8kg·cm以上的金属齿轮舵机并且尽量选串行总线版本因为15个电机全部用PWM控制的话接线和IO资源都会爆炸。3.3 15个电机同时动控制信号怎么才能不打架15个电机如果全是普通PWM舵机那就需要15路PWM输出。RK3566本身有PWM控制器但引脚复用很紧张而且Linux系统下直接用PWM输出做舵机控制Jitter问题会让你怀疑人生。一般做法是外接PCA9685这类16路PWM驱动板用I2C控制但这又引出一个问题I2C总线挂15路舵机刷新率上不去而且PWM舵机的信号线很长时抗干扰能力差。我更倾向的方案是使用串行总线舵机。这种舵机内部有控制板所有舵机通过UART菊花链串联协议里自带ID地址支持同步指令。也就是说15个舵机只需要两根信号线正负极并联就可以实现“同时转动到指定角度”这种操作大幅减少布线。代价是单个舵机贵一些且对总线电气稳定性要求高。控制端还有一个细节总线舵机轮询刷新时每个舵机都要收发一帧指令15个舵机轮询一轮时间累加起来会拖慢控制周期。所以一定要看舵机是否支持“同步写”也就是一条广播指令一次更新所有舵机的目标位置。很多串行总线舵机协议里都有这类指令比如Hiwonder的LX-16A、Futaba的S.BUS协议用法各有不同但思路都是避免逐台轮询浪费带宽。4. 800g以内的结构魔法材料、重心与装配顺序4.1 给整机做一份“重量预算表”800g听起来不算重但当你把电池、15个电机、RK3566核心板、底板、外壳、线材统统堆上去数字会涨得飞快。我习惯在动手画图纸之前先做一张重量预算表每一类零件都标预估重量然后定期复称。按照这类项目的常见规格我大致估了一下15个电机单个按15到18g计算共240g左右RK3566核心板加底板约45g2S锂电池1200mAh约100g3D打印外壳和结构件约120g摄像头、麦克风、喇叭约30g线材、螺丝、铜柱、缓冲垫约70g合计大约605g距离800g还有接近200g的余量。这个余量看起来很宽裕但一旦你给外壳加厚、给关节加固、加一些装饰件最后很可能会超到850g以上。所以我的经验是预算表从一开始就要留出至少15%的“重量应急储备”设计过程中每次改动都要重新过秤。4.2 重心拉低鸭子才不会平地摔双足行走机器人的核心约束不是电机力矩而是重心位置。鸭子走路时单脚支撑的时间不短如果重心太高前进时略微一点扰动就会让它倒头栽。静态稳定性的判断标准是零力矩点ZMP落在支撑脚构成的支撑多边形内通俗讲就是“整体重心在脚掌范围内”。所以整机最重的几样东西——电池、核心板、底板都要尽可能放在胸腔的最底部。电池我习惯放在鸭子腹部贴近地面而不是背在背上。背上放东西确实方便拆装但会让整机重心上移好几厘米走路时需要额外消耗大量舵机力矩去维持平衡。核心板也尽量平放不要竖着插。鸭子的翅膀、尾巴、颈部电机虽然不承重但它们的位置也会影响重心的前后分布。如果电池和主板都在胸部整机重心会偏前鸭子走路时容易往前扑。一个常见的补救办法是在尾部加一点配重或者让鸭子的姿态设计上微微后仰观察它在桌面上站立时四条受力点是否均匀。4.3 一体化和装配公差图纸好看不算数装得上才算出活很多3D打印的结构件打印出来才发现舵机耳朵塞不进去、两边孔对不齐。原因是设计时没考虑打印机公差。FDM打印机的精度普遍在0.2到0.3mm设计的孔径最好比舵机耳朵凸台的直径多留0.2到0.4mm不然就要用锉刀一点点修。我建议装配时遵循一个顺序先预装腿部所有电机和关节再走线最后盖外壳。因为腿部结构最复杂如果先装外壳再塞腿部电机会非常痛苦。舵机摇臂和腿部连接的地方建议设计成花键对齐加螺丝锁紧防止行走过程中松脱。另一个容易翻车的地方是舵机零点校准。装配时每个舵机的输出轴角度都不可能完全一致如果直接按照理想角度给指令鸭子大概率站不直。先给所有舵机上电到90度位置再用标准件固定摇臂确保花键对正最后在软件里为每个舵机记录一个零点偏移量。这个偏移表是调试步态的第一份基础数据。5. 从Linux驱动到鸭式步态软件栈的分层设计5.1 系统层RK3566上装什么系统实时性怎么保证RK3566能跑Ubuntu、Buildroot、Debian还能跑Android和部分国产系统。对于这种鸭子项目我建议分两种场景选型。如果你只是想快速复刻跑Ubuntu加ROS2是最方便的生态齐全Debug工具多但启动时间长、镜像体积大对一张SD卡或eMMC的空间不太友好。如果你想追求开机秒级响应Buildroot裁剪的系统更合适按需打包内核和根文件系统可以做到3秒内启动。实时性是大家最关心的问题。Linux默认不是实时系统但鸭子的步态控制周期一般在20到50ms也就是20到50HzLinux内核调度抖动虽然存在通常还在可控范围。如果你后续要加更精细的平衡控制比如单腿站立、动态走跑切换建议内核编译时打开PREEMPT_RT补丁或者干脆外挂一颗STM32做底层舵机控制RK3566只做上层决策两边用UART通信。设备树层面要提前把串口、I2C、GPIO的引脚分配好。我踩过的坑是RK3566的某些串口和SDIO、HDMI引脚是复用冲突的做底板时没仔细核对后来才发现控制舵机的串口和SD卡读写冲突只能重新改板。5.2 控制层鸭式摇摆步态的轨迹规划鸭子的摇摆步态其实可以拆成两件事双腿交替迈步和身体重心的左右摆动。真实鸭子在走路时会把重心从一侧脚转移到另一侧脚同时身体绕竖直轴有个小扭转配合脖子的前探视觉上就成了“摇摆”。步态规划我用过一个很简单的模型把一只脚的完整运动拆成摆动相和支撑相。摆动相里脚抬离地面、向前迈支撑相里脚落回地面、向后蹬。整体往前走的速度由两条腿交替支撑的频率决定。下面这个伪代码演示了摆动相的位置插值逻辑import math def foot_trajectory(t, period, stride, lift_height): phase (t % period) / period if phase 0.5: # 摆动相先抬脚再向前落 x stride * (phase / 0.5) # 0 - stride z lift_height * math.sin(math.pi * phase / 0.5) else: # 支撑相脚贴地向后移 x stride * (1 - (phase - 0.5) / 0.5) z 0.0 return x, z上面的代码只是一个演示真实工程里还要做速度和加速度约束防止脚底砸地、防止电机急转导致机身抖。一个常用的技巧是给每个关节的角度轨迹加梯形速度规划让电机起步和停止都平滑过渡。为了做出“摇摆”观感还需要在腿部左右旋转关节上加一个与步态周期同步的正弦偏置。左腿支撑时骨盆向右偏移右腿支撑时骨盆向左偏移偏移幅度和频率都要和步幅联动。IMU反馈则是最后一道保险检测到机身倾斜超过阈值时立刻调整各关节角度防止摔倒。5.3 应用层交互能力是它“好玩”的另一半15个电机解决了“动起来”的问题但让鸭子从“会动的玩具”变成“能玩很久的宠物”还得靠应用层。RK3566的NPU算力虽然比不上手机旗舰但跑极轻量级的目标检测模型绰绰有余。比如用SSD-MobileNet识别人的手掌识别到之后让鸭子朝手掌方向转头或者用颜色追踪让鸭子跟着一只黄色小球走。语音交互通常采用“离线唤醒在线识别”的组合。RK3566上跑一个简单的唤醒词引擎听到“小鸭”之后点亮摄像头或启动录音把音频送到云端识别。不走云端的话也可以用预先录好的音频做本地命令词匹配但自由度低很多。遥控和对公网通信用MQTT或WebSocket都比较顺手。我习惯在鸭子上跑一个轻量的Web服务手机浏览器打开控制面板直接拖拽虚拟摇杆控制步态速度还能实时看到电池电压、IMU姿态和每个舵机的当前角度。这些数据也能以日志方式回传方便事后复盘步态参数。6. 复刻路上最容易翻车的六个现场及我的处理方法6.1 供电崩溃多电机一起启动时所有舵机抽搐现象很经典鸭子站立时一切正常一抬腿或者翅膀和腿同时动作所有舵机开始嗡嗡乱叫角度乱窜主控偶尔重启。原因是瞬间电流把电池电压拉到舵机最低工作电压以下舵机控制板复位电流又反弹形成振荡。我的处理方法是分三步先把舵机电源和主控电源彻底分开舵机直接用电池电压主控用单独的DCDC然后在地线和汇流排上加装大容量电解电容容量按每颗舵机几百微法到1000微法估算放在舵机供电入口最后在软件里限制同时动作的舵机数量不要所有关节在同一个控制周期内全速启动分配一个50到100ms的错峰窗口。6.2 舵机总线挂死一个电堵转打崩整条串口总线串行总线舵机最怕堵转。脚卡进桌缝、被电线绊住、被小朋友按住舵机内部电流飙升总线上的干扰信号瞬间增大。轻则这路舵机失去响应重则一整条菊花链上的舵机全部“罢工”甚至反向击穿主控串口引脚的ESD保护。解决这个问题我建议在RK3566的串口和舵机总线之间加一级信号隔离芯片哪怕只是简单的数字隔离也能把主控和舵机总线的电气风险切断。同时每个舵机的电源引脚前可以串一个自恢复保险丝单颗堵转时自动断开故障排除后又能恢复。软件层也要看门狗连续几个周期没收到某舵机应答就主动把它从控制列表里Temporary移除而不是让整条总线卡死。6.3 步态是歪的几何标定比PID更重要鸭子装好之后你第一步就发现它站不直。左边腿直着右边腿歪着走路画圈迈步高度还不同。很多新手会马上调PID实际这是机械和装配导致的几何误差不是控制参数问题。解决办法是给每个关节建立独立的零点偏移表。装配时把鸭子调到标准姿态逐个读取各舵机当前输出角度和理想姿态的角度相减得到每个舵机的偏移值。步态控制指令发出前在代码里把这组偏移量加上。至于“走路画圈”大概率是两条腿的髋关节前后摆动幅度不一致可以在步态参数里给左右腿分别配置最大步幅和抬腿高度。6.4 上电时序主控死机与舵机乱抖RK3566从按下电源开关到Linux启动完成需要几秒钟。如果舵机在Linux还没接管串口的时候就通了电有的总线舵机会进入默认自由转动状态鸭子四脚朝天乱摆或者直接保持上一个不合理的角度憋住电流。更麻烦的是主控意外重启控制程序还没来得及初始化舵机已经按照错误的角度输出。我的处理习惯是在主控板上加一个由MOS管控制的舵机电源开关Linux系统完全启动、控制程序初始化成功之后软件拉高GPIO再给舵机通电。断电顺序反过来。这样能保证每一颗舵机从出生就在正确指令的管控下。6.5 线缆绞杀关节处没有余量三天断一根线鸭子走路时腿部关节会反复旋转穿过关节的舵机线和电源线每走一步都在弯折。设计的走线槽如果拐弯太急线芯很快疲劳断裂如果留的余量不够舵机转到极限位置时会把线头拉脱。我在走线上的经验是所有穿过关节的线束必须留出比最大活动范围多20%的松弛量并在关节活动极限位置用硅胶或热缩管做缓冲。优先使用硅胶软线不要用普通的杜邦线。每根舵机线尽量从靠近转轴的位置走因为越靠近转轴活动时线缆的弯曲幅度越小。6.6 重量失控设计时按克扣成品按斤算很多人在设计阶段对重量无感觉得“这个支架多了2g无所谓”最后所有“无所谓”加在一起整机直接超重。鸭子超重之后的影响非常直接腿部舵机满负荷工作发热严重动作变缓电池续航缩短。我的办法是给每个零件编号组装前先称重记录到重量表里超重的零件立刻换方案。3D打印的外壳可以在不影响强度的前提下把填充率降到15%到20%壁厚从1.2mm减到1.0mm能省下不少。一些受力不大的装饰件直接去掉或者改用镂空设计。整体重量控制住之后鸭步的“轻盈感”才出得来。最后分享一点个人体会。做这类桌面机器人最反直觉的地方在于你以为最难的是电机选型或步态算法真正卡进度的地方全是线束怎么走、重心在哪、上电顺序怎么设计、螺丝用什么规格这种基础问题。那只鸭子能在一堆零件堆起来后还保持800g以内的轻盈不是某个单一零件的功劳而是整机在算力、动力、结构、软件四个维度上互相妥协的结果。复刻也好基于它二次开发也好建议你拿到手之后先别急着加新功能把供电、总线、装配标定这几件事做扎实鸭子自然就走得稳重了。
返回列表