
一直想在树莓派上把机器人控制相关的外设统一起来电机驱动、编码器反馈、舵机信号、各种传感器接口各拉一摊线桌面上乱成一团。直到我拿到这块定位在 Robot Control 的 Raspberry Pi HAT才意识到原来一个 HAT 可以把“控制这件事”做得这么齐全。板子名字里 “Smorgasbord” 这个词用得挺贴切它就像一顿机器人控制的自助餐常见功能几乎都给你码在桌面上了。今天这篇就围绕这块 HAT 展开从选型判断、硬件设计、接线调试到实际测试中踩过的坑完整记录一遍给正在做轮式小车、机械臂或者其他树莓派机器人项目的朋友一个真实参考。1. 为什么机器人控制需要一块“自助餐”式扩展板1.1 从“线缆地狱”说起机器人控制的真实痛点做过机器人项目的朋友应该都有这种经历树莓派本身是一台不错的迷你电脑但直接拿它去控制电机、读取编码器、驱动舵机几乎寸步难行。原因很简单树莓派的 GPIO 输出的是 3.3V 逻辑电平电流能力非常有限直接驱动直流电机基本不可能驱动大扭矩舵机也不现实。于是大家习惯性往面包板上堆模块TB6612 电机驱动、PCA9685 舵机驱动板、DC-DC 降压模块、逻辑电平转换模块再用杜邦线一路飞线。刚开始还能凑合模块一多问题就全来了。我上一台四轮小车就是这么干的电机驱动板放在底层舵机驱动板放在上层传感器单独供电光是把这些模块之间的电源线和信号线理顺就花了一整个晚上。而且飞到一定数量之后接触不良、信号串扰、供电不足这些问题一个接一个冒出来。最崩溃的是排查故障的时候你根本分不清是驱动板坏了、杜邦线松了、还是电源被拉垮了。正是这些痛点让我开始认真考虑用一块集成度更高的 Raspberry Pi HAT 来统一整个控制链路。1.2 HAT 标准到底解决了什么树莓派 HAT 的全称是 Hardware Attached on Top它不只是“一块插上去的扩展板”这么简单。HAT 标准规定了几件关键事情板子必须按照特定的物理尺寸设计通过 40-pin GPIO 排针与树莓派连接并且板载一颗 EEPROM 芯片用来存储板卡信息。树莓派开机时如果检测到这颗 EEPROM就能自动识别板卡型号、厂商、设备树叠加层配置甚至自动加载对应的驱动。这意味着什么意味着你不再需要手动去记“这个板子占用了哪些 GPIO、需要加载什么内核模块”。HAT 的 EEPROM 会自动告诉树莓派我应该怎么配置自己。对于机器人控制这种涉及多个外设、多个引脚的场景这个特性非常省心。更重要的是HAT 物理上直接叠在树莓派上不需要一堆杜邦线在板子之间来回飞整个系统的稳定性和整洁度立刻提升一个档次。1.3 这块板子的定位不是单一功能板而是控制中台回到这块板子本身它和市面上常见的“单功能 HAT”最大的区别在于定位。很多 HAT 只做一件事要么只是电机驱动要么只是舵机控制要么只是扩展 GPIO。而这块 HAT 的 Smorgasbord 思路是要把机器人控制里最常用的几类功能都集成到一块板子上多路直流电机驱动、编码器接口、舵机电源与信号、I2C 传感器总线、串口调试接口、以及统一的电源管理。这种“控制中台”思路和我在嵌入式开发里常说的“背板概念”很像。你没有必要为每一个功能单独拉一个子系统而是通过一个统一的中枢把电源、信号、逻辑电平都管理好。对于中小型机器人项目比如两轮差速小车、四驱底盘、轻型机械臂这种集成方案能大幅缩短开发时间也降低了新人入门的门槛。2. 功能全家桶逐项拆解哪些配置是刚需哪些是加分项2.1 电机驱动通道先算电流再谈路数这块 HAT 板载了多路直流电机驱动具体通道数和电流参数在选型时要重点关注。一般小型机器人常用的直流减速电机额定电流在几百毫安到一两安培之间堵转电流会翻好几倍。如果板子标称每通道持续电流只有 1A那驱动 370 电机或者大一点的 520 电机时就比较危险。我用的这款是双通道 H 桥驱动标称持续电流 3A峰值可以去到 5A实测驱动两个 12V 的 370 电机做差速转向温升还能接受。通道数量也直接决定你的底盘构型。两轮差速小车需要两路电机四驱底盘需要四路但这里有一个判断技巧如果是四驱底盘尽量选带“独立四通道”而不是“双通道并联”的板子因为并联驱动意味着左右两侧电机永远同速转弯只能靠滑移灵活性差很多。另外如果板子的驱动芯片支持 PWM 频率调节那最好因为不同电机的电感特性不一样合适的 PWM 频率能明显减少啸叫和发热。2.2 编码器接口闭环控制的地基很多入门级的电机驱动 HAT 是不带编码器接口的顶多给你引出几根 GPIO 让你自己接。但这块板子直接板载了编码器接口而且是带硬件正交解码的。这一点特别关键。编码器输出的正交信号A 相和 B 相频率可能很高尤其当电机转速快、编码器线数又多的时候。用树莓派 GPIO 中断做软件解码转速高了就容易丢脉冲导致测速不准。板载硬件解码器则完全不吃 CPU 资源直接输出计数结果供主控读取测速的精度和实时性都好很多。如果你打算做 PID 闭环速度控制或者位置控制编码器接口是刚需中的刚需。没有编码器你只能靠电压开环控制负载一变化转速就飘做不了精确的直线行驶或定距停止。2.3 GPIO 与 I2C/串口扩展传感器挂载的便利性机器人不是只有电机还需要超声波、红外、IMU、激光雷达这些传感器。这块 HAT 把一部分树莓派 GPIO 单独引出来同时板载了 I2C 总线的扩展接口和串口接口方便挂载各种外设。这个设计我实际用下来非常顺手因为传感器直接插在板子的排针或者端子上不需要再去面包板上找地线、找 3.3V、找 SDA 和 SCL。值得一提是板子上通常会把 I2C 地址拨码开关或者跳线帽留出来。因为同一个 I2C 总线上挂多个传感器地址冲突是最常见的问题如果每个传感器模块都有地址选择引脚配合板子上的预留跳线调试起来会从容很多。串口接口也一样很多激光雷达和 GPS 模块用的就是串口协议板载串口端子直接对接比 USB 转 TTL 模块省事得多。2.4 电源管理模块最容易被忽略却最重要的模块这块 HAT 的电源管理部分是我认为它最有价值的设计。板载了输入防反接保护、保险丝、以及多路稳压输出。常规接法是一块锂电池或者航模电池接入 HAT 的电源端子然后板子同时给树莓派和电机驱动供电。这个方案比“树莓派单独用一个充电宝、电机单独用一组电池”强太多了因为多个电源之间的地电位如果不一致轻则信号乱跳重则损坏硬件。另外板载稳压输出的电压和电流能力也值得关注。比如有的板子会单独引出一路 5V/3A 给树莓派供电一路 6V/3A 给舵机供电这样舵机堵转时拉掉的电流不会直接落在树莓派 5V 上有效避免树莓派因为电压跌落而重启。这个设计看似不起眼实际项目中救了我好几次后面我会专门讲这个坑。3. 从一堆板子里选中它我的选型判断逻辑3.1 先做功率预算一切选择的起点我不太建议直接看宣传页上的“支持XXXX”就开始下单。我的做法是先做一轮功率预算把所有用电器件的峰值电流加起来看看系统的需求和板子的供电能力是否匹配。拿我手头的项目举例两个 12V 370 电机额定电流约 0.8A堵转电流约 3A一个舵机峰值电流约 1A树莓派 4B 满载电流约 1.2A5V加上传感器和风扇总共大概 0.5A。系统峰值电流大概在 8A 左右持续电流在 4A 到 5A 之间。这样我就知道这块 HAT 的电源输入必须能承受至少 8A 的瞬时电流电机驱动的每通道持续电流至少 2A 起步。如果板子的电源端子、走线宽度、电容容量跟不上这个需求再便宜也不能选。3.2 板载接口和实际电机的匹配度接口匹配度是一个很容易被忽略的点。我遇到过买回来的驱动板用的是 JST-PH 端子而我手里的电机线是 XT60 接头只能再转接十分狼狈。这块板子的电机端子和电源端子都比较常规能直接适配我手里的线材。还有电机额定电压和板载驱动电压范围也需要确认。很多 HAT 的驱动部分最大支持到 12V超过就会烧。如果用的是 2S 锂电池满电电压 8.4V没问题如果用 3S 电池满电 12.6V就踩线了。所以选板子时要特意看一下电机电源输入范围留出冗余不要卡在临界值上。3.3 软件生态与文档成熟度硬件再强软件适配跟不上也是白搭。我评判一块 HAT 值不值得买会先看三样东西官方有没有提供完整的 Python 库、有没有设备树叠加层Device Tree Overlay、有没有可参考的示例代码。这三点决定了你拿到板子后是“半小时跑通 Demo”还是“自己啃数据手册啃两天”。我选这块板子时先翻了它的 GitHub 仓库确认了库文件更新时间还算活跃且提供了针对树莓派官方系统的预编译内核模块。它甚至把设备树叠加层的安装脚本都写好了一路git clone、sudo bash install.sh就能搞定省去了很多底层配置的麻烦。对于大多数应用场景这种“官方替你踩好坑”的成熟度比纸面参数重要得多。3.4 我为什么放弃“单功能板堆叠”方案在选这块 HAT 之前我也认真考虑过用两块单功能 HAT 叠起来比如一块电机驱动 HAT 加一块舵机驱动 HAT。后来放弃了原因有三第一双 HAT 叠加受限于树莓派 GPIO 排针的物理空间很多板子叠上去之后散热片没地方放树莓派 CPU 温度直接飙升第二多个 HAT 之间的电源域和逻辑电平需要自己协调如果两块板子的电源设计理念不一致很容易出现弱电互相干扰的问题第三软件配置上多个 HAT 的设备树叠加层同时加载时GPIO 冲突的概率会显著上升。单功能板堆叠方案的“灵活性”在实际项目中很多时候是伪需求。真正推动项目落地的是整体方案的简洁度和可维护性。一块高度集成的 HAT 虽然牺牲了个别模块的“极致性能”但它换来的是整体系统的稳定和开发效率的提升这笔账怎么算都不亏。4. 从上电到动起来完整接线与调试记录4.1 供电链路设计电池、板载降压、逻辑电平的关系拿到板子后我第一件事不是接电机而是先理清供电链路。这块 HAT 的电源拓扑大致如下外部电源比如 12V 电池接入板子的供电端子板子内部先经过防反接和保险丝然后兵分两路——一路直接给电机驱动部分供电另一路经过 DC-DC 降压到 5V 给树莓派供电。舵机电源则是从主电源取电后再经一路独立稳压输出避免和树莓派抢电流。这样做的好处很明显树莓派的 5V 电源不直接取自主电源的高压而是由板载稳压器二次转换所以即便电机堵转把输入电压瞬间拉低树莓派也不会立刻重启。同时板载稳压器的输出能力和纹波指标直接决定了树莓派的稳定性最好选择标称输出 5V/3A 以上的板子。上电前我用万用表测了三路输出板载 5V 输出稳定在 5.02V舵机电源输出稳定在 6.0V这才放心往下接线。4.2 接线顺序和共地细节接线顺序看似简单其实有讲究。我习惯先把主电源线接好再逐一连接电机和传感器。信号线我会用颜色区分红色接电源、黑色接地、白色接信号传感器则统一遵循“先接电源、后接信号”的原则。尤其要注意的是共地问题所有传感器和外部模块的地线必须和 HAT 的主地连在一起否则信号线上容易出现莫名其妙的跳变。这块板子的端子设计在这点上做得比较好它把电源端子和信号端子分区域排列并且丝印标得很清楚。我第一次接的时候特意对照了说明书上的丝印图和树莓派的 GPIO 引脚图确认每一根信号线对应的 GPIO 编号。这里建议所有朋友养成一个习惯不管板子丝印多清晰接线前都打开树莓派 40-pin GPIO 引脚图核对一遍尤其是在使用 GPIO 复用功能的时候防止误接。4.3 设备树叠加层与 Python 库的启用过程软件配置这块我按照仓库里的 README 一步步操作。先把仓库克隆到树莓派上然后运行安装脚本。脚本会做几件事下载编译设备树叠加层文件、把叠加层文件拷贝到/boot/overlays/目录、在/boot/config.txt里追加dtoverlayxxx配置、安装 Python 库的依赖包。我在/boot/config.txt里看到的配置大概是这样的dtoverlaypwm-robot-hat一行配置就搞定了底层引脚映射剩下的都是应用层的事了。安装完成后重启树莓派用命令检查叠加层是否加载成功dmesg | grep -i robot如果看到类似robot-hat: overlay loaded的日志说明驱动已经生效。这一步比想象中顺利充分说明了板子软件生态成熟度的重要性。如果设备树叠加层没生效后续所有 Python 库的操作都会报错而且报错信息五花八门别问我怎么知道的。4.4 一个最简单的双电机闭环测试驱动加载完成后我写了一个最简单的测试脚本让左右两个电机以 30% 的占空比正转 2 秒、反转 2 秒、停止。脚本逻辑大致如下import time from robot_hat import RobotHat hat RobotHat() motor_left hat.get_motor(M1) motor_right hat.get_motor(M2) for _ in range(3): motor_left.set_speed(30) motor_right.set_speed(30) time.sleep(2) motor_left.set_speed(-30) motor_right.set_speed(-30) time.sleep(2) motor_left.stop() motor_right.stop()跑通这个脚本的意义在于验证整个链路树莓派 - I2C/GPIO - HAT 主控 - 电机驱动 - 电机。然后我继续验证编码器读数enc_left hat.read_encoder(M1) enc_right hat.read_encoder(M2) print(fLeft: {enc_left}, Right: {enc_right})手动转动电机轴观察读数是否变化。能读到正负计数且方向和转向一致说明编码器接口也没问题。到这里整块板子最核心的功能就算全部验收通过了。5. 实测中的三个坑电流塌陷、I2C 冲突、GPIO 复用5.1 坑一电机启动瞬间电压塌陷导致树莓派重启第一次实车测试时我踩了一个非常经典的坑。两个电机同时从零加速到全速的瞬间树莓派突然重启了。用万用表观察输入电压发现电机启动瞬间电压从 12V 掉到了 9V 左右而树莓派 5V 稳压输出也同步出现了明显的跌落低于 4.6V触发了树莓派的欠压保护。问题根源在于输入电源的内阻和线材压降。我用的 12V 电源适配器本身没有问题但连接线太细太长大电流通过时压降太大。解决方式是换用更粗的硅胶线并且把电源适配器的输出电流余量提高。板载大容量电解电容也起了作用它能缓冲电机启动瞬间的电流尖峰但如果输入侧的压降过大再大的电容也撑不住。所以如果你的机器人一启动就重启优先检查整条供电链路的线径和接插件而不是怀疑驱动板。5.2 坑二多个传感器 I2C 地址撞车第二个坑是我同时挂了一个 IMU 和一个距离传感器结果两个模块的默认 I2C 地址是一样的总线上的设备探测时根本分不清谁是谁。单独接任何一个都能正常读数两个一起挂就只能读到其中一个。排查方式是通过i2cdetect -y 1扫描总线上的设备地址发现两个模块都落在同一个地址上。解决思路有两个如果模块上有地址跳线直接改地址如果没有地址跳线就需要用到板子上预留的 I2C 多路复用器接口把两个传感器挂到不同的 I2C 总线上。这块 HAT 恰好板载了一路额外的 I2C 通道我通过它的硬件多路复用功能把两个传感器分开问题就解决了。这个教训也提醒我选传感器的时候尽量选带地址配置功能的型号别给自己挖坑。5.3 坑三GPIO 复用——没看引脚图的下场第三个坑是关于 GPIO 复用的。我在给机械臂的一个关节舵机接线时随手把信号线插到了 HAT 上标着“GPIO18”的排针上结果舵机完全没反应但同一个舵机插到“GPIO13”就能正常工作。查了引脚图才发现GPIO18 在这块板子上被配置成了 PWM0 通道以外的功能具体来说它被用于 I2S 音频接口的时钟信号和舵机控制 PWM 功能冲突了。树莓派本身很多 GPIO 引脚是“一引脚多功能的”同一根引脚可以复用为 UART、I2C、SPI、PWM 等不同功能。HAT 板的设备树叠加层在加载时会固定一些引脚的复用功能如果你在未确认的情况下接了一个引脚的“默认功能”就很容易踩空。所以无论你用的是什么扩展板接线前都打开引脚图确认这个引脚在当前配置下到底被用作什么功能这个习惯能帮你省去大量排查时间。现在的引脚图网上很好找搜“树莓派 GPIO 引脚图”就能找到对照表建议打印出来放在工作台上。6. 关于这个板子的后续扩展和一些心里话6.1 还能往上加什么ROS2、视觉模块、IMU 融合有了这块 HAT 作为控制中台后续扩展空间还是比较大的。目前我已经在板子上挂了一个 IMU通过 I2C 读取姿态数据后续打算接一个摄像头做视觉识别用树莓派的 CSI 接口直接输入图像数据。如果想把整个小车做成一个 ROS2 机器人HAT 底层的电机驱动和编码器接口也可以很方便地封装成 ROS2 节点把速度控制指令转成 PWM 输出再把编码器计数转成里程计数据发布出去。电源方面如果后续加入机械臂或者更多舵机可以考虑在 HAT 的基础上再接一块独立的舵机电源板把大电流负载和主控电源彻底隔离。这块 HAT 的冗余设计也还算够用输入测最大支持到 24V具体看型号和版本接 3S 或 4S 电池都能扛住只是要注意板载稳压器的散热高负载连续运行后摸摸电容和电感的位置温度太高就要加强散热或者降载运行。6.2 我个人的整体评价和建议用了一段时间下来这块“机器人控制自助餐”式的 Raspberry Pi HAT让我对树莓派机器人开发的态度从“能跑就行”变成了“愿意把更多时间花在算法和应用上”。它没有把某一样功能做得极致豪华但把机器人控制最常用的功能用合理的方式整合在了一起而且软件层面的适配做得足够顺手这一点在我用过的各种扩展板里是比较难得的。如果说要给后来者什么建议我想说不要被花哨的“支持多少路电机、多少路舵机”迷惑拿到板子先踏踏实实做功率预算、理清供电链路、核对 GPIO 引脚图把这些基本功打牢比什么都重要。毕竟 HAT 再强大也只是把“连接”做好了真正让机器人动起来、跑得稳、走得准的还是你对着引脚图一根线一根线接出来的那份细心。