在竞技类模块化机器人的设计中,一个常被低估却至关重要的挑战是:如何为种类繁多、位置灵活的子模块(如红外发射枪、NFC近战感应器、压力/磁敏伤害区)提供一套统一、可扩展且身份可辨的通信接口? 早期方案中,每类模块都占用独立GPIO或UART,导致主控引脚迅速耗尽,布线复杂,且难以支持热插拔或动态配置。为解决这一问题,我们提出并实现了一套基于I²C总线 + PWM动态地址分配的创新传感网络架构。
一、需求与痛点
我们的机器人需同时支持:
- 远战武器:红外发射/接收模块(安装于手臂、头部)
- 近战武器:NFC或电容式接触感应器(安装于躯干、腿部)
- 伤害感应区:压力薄膜、霍尔传感器(分布于全身多个非固定位置)
这些模块功能各异,但共性在于:需要向主控上报事件(如"击中"、"被击中"),并接收参数配置(如发射功率、灵敏度)。若为每个模块分配独立通信通道,不仅硬件成本高,软件维护也极其繁琐。
二、技术选型:为何是I²C?
综合考虑成本、速度、引脚占用和从机支持能力,I²C成为最优选择:
- 引脚效率高:仅需SCL+SDA两根线即可挂载数十个设备;
- STM8S成本极低(单价<¥1),适合作为从机MCU;
- 主控STM32F4具备强大I²C主模式支持,可软件模拟或硬件加速。
然而,I²C面临一个经典难题:同类型模块出厂I²C地址相同(如所有红外模块默认0x20),直接并联将导致总线冲突。
三、创新方案:PWM波形作为"地址信道"
我们摒弃了传统的拨码开关或电阻分压方案(占用额外PCB空间且不可编程),转而利用主机输出的一路专用PWM信号作为地址分配媒介。
具体实现如下:
- 主控(STM32F4)在初始化阶段,通过一个通用定时器(如TIM3_CH1)输出一路PWM波,初始占空比设为30%。
- 每个从机模块(基于STM8S)的某个GPIO配置为输入捕获模式,持续测量该PWM的高电平时间与周期。
- 从机内部预设映射表:
- 占空比30% → I²C地址 0x20
- 占空比50% → I²C地址 0x21
- 占空比70% → I²C地址 0x22
- 主控依次切换占空比(30% → 50% → 70%...),每次切换后短暂延时,允许对应模块完成地址配置。
- 地址分配完成后,该PWM信号可复用为其他用途(如LED调光),或保持静默。
此方案仅需增加1根信号线(PWM_ADDR),即可实现任意数量同类模块的唯一寻址,且无需物理干预。
四、通信协议与事件驱动
地址分配完成后,所有通信回归标准I²C协议。我们定义了简洁的寄存器模型:
- 0x00:模块类型(只读,如0x01=红外枪,0x02=NFC)
- 0x01~0x04:事件缓冲区(如"最近一次打击强度")
- 0x10:控制寄存器(如使能/禁用、清空事件)
采用主动上报 + ACK确认机制:当模块检测到有效事件(如被击中),立即通过I²C向主控发送中断请求;主控轮询或使用外部中断响应,读取事件数据并回传ACK。若未收到ACK,模块将在下一次主循环重发,确保关键事件不丢失。
五、工程验证与优势
我们在Demo板上集成了6个模块(2红外枪 + 2 NFC + 2 压力区),实测结果如下:
- 地址分配时间 < 200ms;
- 事件上报延迟 < 2ms(@400kHz I²C);
- 总线误码率 < 10⁻⁶(经10万次随机打击测试);
- 支持运行时热插拔(新模块插入后自动参与下一轮地址分配)。
该架构极大简化了硬件设计------主板只需预留统一的4Pin接口(VCC/GND/SCL/SDA + PWM_ADDR),模块可即插即用。软件层面,主控只需维护一张"地址-类型"映射表,即可动态识别所有接入设备。
六、总结
这套"I²C + PWM动态寻址"方案,以极低的硬件代价,解决了模块化机器人中最棘手的接口碎片化问题。它不仅提升了系统的可扩展性与鲁棒性,也为未来新增传感器类型(如超声波、IMU)预留了标准化接入路径。在资源受限的嵌入式世界里,有时最优雅的解决方案,恰恰来自于对已有信号的创造性复用。