各位准备参加工训赛的同学,或者正在为比赛搭硬件方案的队友们,这篇内容可以帮你省下一部分“反复焊板子、反复烧芯片”的弯路。每年到了工训赛备赛阶段,常见的问题并不是算法有多难,而是电路方案拖累了进度:传感器信号不稳定、电机驱动发热、电源纹波干扰摄像头、板子改一版又要重新打样。这些问题的根子,大多出在最初做开源电路方案设计时没有把需求拆透。
这篇文章以工训赛中常见的“智能物流搬运小车”为贯穿案例,完整拆解一套基于开源电路的硬件方案设计流程,覆盖主控选型、传感器接口、电机驱动、电源设计、PCB 打样、焊接调试和常见排障。无论你最终用的是 STM32、ESP32 还是 Arduino,方案设计的思路都是通用的。学完这套流程,你应该能自己完成一块从原理图到 PCB 的工训赛主控板,并且具备把网上开源电路改造成自家方案的工程能力。
1. 开源电路是什么,工训赛为什么需要它
1.1 开源电路的概念与组成
很多人一听“开源电路”,第一反应是“是不是就是抄别人的电路图”。这个理解不完整。开源电路不只是原理图,它通常包含四部分:
- 原理图(Schematic):描述元件之间的电气连接关系。
- PCB Layout:描述元件在板子上的实际摆放位置和走线。
- 物料清单(BOM):列出每个元件的型号、封装、数量、参考购买渠道。
- 固件与驱动代码:让板子真正跑起来的软件代码。
除此之外,一份完整的开源电路还应该包含 README 说明文档、设计注意事项、版本更新记录,以及作者对某些设计决策的解释。一个真正可复用的开源项目,你看完文档之后,应该能在短时间内重新打样、焊接、烧录并跑通。
传统硬件开发中,工程师倾向于把电路资料捂在手里;而开源电路把整套设计资料对外公开,允许他人学习、修改、复用。这里需要特别说明的是,开源电路和“免费”不能画等号,看的重点是“授权”。开源不等于无条件随便用,硬件开源通常采用 CERN OHL、GPL、MIT、Apache 等许可证,不同许可证对商用、修改、再分发有不同约束。
对参赛学生来说,理解这一点尤其重要。工训赛的用途以学习和竞赛为主,大部分许可证允许这种非商业用途;但如果后续要参加商业转化类项目,就需要回头检查一遍每个开源模块的许可证条款。这是一种基本的工程素养。
1.2 开源电路在工训赛中的价值
工训赛的备赛周期通常只有几个月,期间还要兼顾机械设计、程序算法、文档报告和现场调试。如果从零开始设计一套完整电路,风险非常高。开源电路方案在这个场景里的价值非常直接:
时间上,一个经过验证的开源主控板原理图,拿到手改一版通常只需要几天;从空白画起可能要两三周。可靠性上,社区验证过的电路往往已经解决了常见的电源噪声、驱动发热、上拉电阻缺配等问题,出问题的概率远低于新手第一次画板。学习上,阅读高质量开源工程的原理图,比翻教材更快理解“为什么电源要接 0.1μF 去耦电容”“为什么电机驱动要单独铺地”。
当然,也不能无脑照抄。开源方案的意义是给你一个经过验证的起点,而不是让你放弃思考。你需要理解每一个模块电路为什么存在,才能根据工训赛的具体任务做取舍。
1.3 本文主线:开源智能物流搬运小车
后面所有章节都以“智能物流搬运小车”作为案例对象。这类题目在工训赛里很常见,大致需要完成:按路线行驶、识别物料颜色或二维码、抓取物料并搬运到指定区域、途中可能需要避障或上下坡。
对应到电路方案,系统需要具备以下基本能力:
- 电机驱动与测速:两路直流减速电机,差速转向。
- 巡线与定位:若干路灰度传感器或摄像头视觉。
- 测距避障:超声波或激光雷达。
- 人机交互与调试:OLED 显示状态、串口输出日志。
- 可靠供电:满足电机瞬时大电流和主控稳定供电两方面需求。
这套需求基本覆盖了开源电路方案设计的常见模块。下面从平台选型开始,逐步完成一份可以拿去打样制作的硬件方案。
2. 环境准备与开源硬件平台选型
2.1 常用开源硬件平台对比
工训赛中选择主控芯片,本质上是在“性能、生态、成本、功耗”之间做权衡。下面列出目前比较常见的几类平台,并以表格形式对比。
| 平台 | 核心配置 | 生态成熟度 | 典型成本 | 适合任务 |
|---|---|---|---|---|
| Arduino Mega2560 | AVR 8 位,16MHz | 极高,适合快速验证 | 低 | 简单巡线小车、逻辑简单的控制任务 |
| STM32F103C8T6 | ARM Cortex-M3,72MHz,64KB Flash | 高,资料多,外设丰富 | 低 | 大多数工训赛小车控制任务 |
| ESP32 | 双核 240MHz,带 WiFi/蓝牙 | 高,性价比很高 | 低 | 需要无线调试、远程监控的项目 |
| 树莓派 Pico | RP2040 双核 133MHz | 较高,MicroPython 方便 | 低 | 快速原型验证,偏教育场景 |
| K210 视觉模组 | 双核 RISC-V,内置 KPU NPU | 中,适合视觉识别 | 中等 | 颜色识别、二维码识别、简单目标检测 |
如果你的工训赛题目以运动控制和逻辑判断为主,STM32F103C8T6 是一个比较均衡的选择:价格便宜、外设资源足够、网上参考资料极多,很多开源小车方案也基于这个芯片。如果比赛任务包含大量视觉处理,比如颜色识别、形状识别、二维码识别,那么可以在 STM32 的基础上外挂一个 K210 视觉模组,或者直接用 OpenMV 作为视觉协处理单元。
无论选哪一款,我都建议遵循一个原则:能用成熟方案解决的,不要自己重新发明。工训赛的评分重点在于整机功能和稳定性,而不是“你是不是自己从晶振开始设计了主控”。
2.2 软件与开发环境
本文代码以常见的 STM32 + Arduino/STM32 HAL 环境为例,但不会绑定某一个 IDE 不放。读者可以按自己的情况选择:
- 代码开发:Arduino IDE、PlatformIO、Keil MDK、STM32CubeIDE 都可以。
- 电路设计:立创EDA 专业版(免费,国内常用,打样方便)、KiCad(开源免费)、Altium Designer(专业收费)。
- 版本管理:Git + Gitee/GitHub,用于保存代码和电路工程版本。
关于版本,这里要特别说明:工训赛里很多同学会照着网上的旧教程装环境,结果编译报错,大多是因为工具链版本差异。比如 STM32 的 HAL 库版本不同,部分 API 会有调整;Arduino 的 ESP32 支持包也需要和 Arduino IDE 版本匹配。如果你的项目编译报错,先看工具链版本,再怀疑代码,顺序不要反。
2.3 小车系统的整体架构
把智能物流搬运小车从电路角度拆开,可以分成五层结构。
电源层:7.4V锂电池 -> DC-DC 降压到 5V -> LDO 降到 3.3V 主控层:STM32/ESP32 最小系统电路 传感器层:灰度巡线、编码器、超声波、视觉模组 驱动层:TB6612/DRV8833 电机驱动电路 执行层:直流减速电机、舵机/气泵机械爪理解这个分层很关键。很多硬件不稳定问题,都是因为“一层管得太宽”。例如,让电机驱动直接从主控的 3.3V LDO 取电,电机一转,主控电压被拉低,摄像头画面开始闪,程序跑飞。这就是典型的电源分层没做好。
关于架构设计,这里提出一个通用原则:强电和弱电分区、功率电路和逻辑电路分区、模拟信号和数字信号分区。后面在 PCB 设计章节还会具体展开。
3. 开源电路方案设计的关键拆解
3.1 从任务清单到硬件需求
很多队伍拿到工训赛题目后,第一件事是打开淘宝搜“小车 套餐”。这个顺序并不建议。正确的做法是先做需求分析,把比赛任务翻译成硬件需求,再做选型。
我们以智能物流搬运小车的常见任务为例,做一个简单的需求推导。
任务一:小车按标记线行驶。对应硬件需求是:至少 4 路灰度传感器,或者 1 个具备巡线功能的摄像头。如果赛道有坡道、强烈光照变化,灰度传感器可能要加高亮度 LED 补光,或者在传感器电路里加可调电位器调节阈值。
任务二:识别物料的颜色,搬运到指定区域。对应硬件需求是:视觉模组 1 个,负责识别颜色/二维码;主控与视觉模组之间需要一个 UART 或 SPI 通信接口。
任务三:抓取机构动作。对应硬件需求是:舵机 1-2 路,或者小型气泵 + 电磁阀。舵机需要独立的 5V 供电,气泵则需要一个 MOSFET 或继电器做开关控制。
任务四:记录搬运过程时间。这个通过主控的定时器和编码器即可完成,不需要额外硬件。
做完这些推导之后,把每个任务的功耗估算一下,就能确认电源的容量和路数。比如舵机堵转时可能拉掉 1A 以上电流,如果和主控共用同一个 LDO,主控必死。
3.2 主控选型的核心指标
主控选型时,比起只看“主频多少、Flash 多大”,更重要的是看外设资源和具体任务的匹配度。就拿 STM32F103C8T6 来说,它公开的基本参数是 72MHz 主频、64KB Flash、20KB RAM,这在工训赛小车上足够用。真正要确认的是这几点:
先看引脚数和引脚复用冲突。比如你要用 2 路定时器 PWM 输出驱动电机,又想把编码器接在同一个定时器上,这时要做好引脚规划,避免外设冲突。再看通信接口数量,如果同时用到灰度传感器(GPIO+ADC)、视觉模组(UART)、OLED(I2C 或 SPI)、超声波(GPIO+定时器),就可以数一数芯片上几个 UART、几个 I2C。
还要考虑视觉得到的数据量。如果视觉模组通过串口发送识别结果,普通 UART 足够;如果要传输高分辨率图像到主控做算法处理,则建议直接用 OpenMV/K210 独立完成识别,只把结果发给主控。
最后是调试便利性。STM32 有 SWD 调试接口,配合串口日志,能省很多排查时间。ESP32 还支持无线串口,设备固定在车上之后不需要插线就能看日志。这个特性在比赛现场很实用,车上线束越少,故障率越低。
3.3 传感器方案对比
传感器是工训赛小车感知环境的核心,不同传感器对应不同的电路设计思路。
灰度传感器是比较常用的巡线方案。它的工作原理是红外发射管照射地面,红外接收管检测反射光强度,通过比较器把模拟信号转成数字信号。开源电路里通常会用 LM393 比较器做阈值判断,板上带一个可调电位器,适应不同赛道颜色和环境光。接线通常是 VCC、GND、数字 OUT 三根线,主控只需要读 GPIO 即可。
编码器用于速度测量。直流减速电机的带编码器版本,输出两路正交信号 A、B。主控通过定时器的编码器模式,或者外部中断,统计单位时间内的脉冲数,换算成电机实际转速。编码器电路需要注意上拉电阻。很多开源方案里编码器输出是开漏结构,必须在主控板上接上拉电阻,否则计数会跳变。
超声波测距模块主要以 HC-SR04 这类为常见代表。它需要 5V 供电,Trig 输入触发信号,Echo 输出高电平时间代表距离。需要注意的是,Echo 输出电平可能是 5V,而 STM32 的 GPIO 容忍度虽然通常支持 5V,但为了稳妥,建议在电路里加分压电阻,将 Echo 信号降到 3.3V 再进入主控。这是很多开源方案容易忽略的细节。
视觉模组方面,OpenMV 和 K210 两种都比较常见。OpenMV 的 Python 环境上手容易,但价格相对偏高;K210 性价比高,内置 NPU,适合做颜色识别、二维码识别、关键点检测。视觉模组和主控之间一般用串口通信,属于最容易接通的接口。
3.4 电机驱动与电源方案
电机驱动芯片的选择直接决定小车动力是否稳定。工训赛小车以直流减速电机为主,工作电流通常在几百毫安到 1A 左右。常见的驱动芯片有 TB6612FNG、DRV8833 和 L298N。
TB6612FNG 是比较平衡的选择,单路持续输出 1.2A 左右,逻辑电压 2.7V-5.5V,引脚兼容性好,体积小,很多开源小车方案都用它。DRV8833 峰值 2.5A,适合稍大功率的电机,也更容易买到。L298N 是很多教材里的经典芯片,输出能力更强,但压降大、发热明显、效率低,如今在小车上已经不是首选。
电机驱动电路的关键设计,第一个是防反接。工训赛小车常使用锂电池或航模电池,接反就会烧板子。在电源入口串联一个肖特基二极管做防反接保护,或者使用 MOS 管做理想二极管电路,是开源方案中很常见的做法。第二个是续流二极管。电机是感性负载,PWM 开关瞬间会产生反向电动势,必须通过续流二极管或驱动芯片内部的续流结构泄放,否则容易击穿驱动芯片。
供电方面,常见的做法是:用 7.4V 两节锂电池作为总电源,主电源经过一个 DC-DC 降压模块降到 5V,给舵机、显示屏、超声波模块供电;5V 再经过 LDO(例如 AMS1117-3.3)得到 3.3V,给主控芯片供电。电机驱动直接吃电池电压,或者另走 DC-DC。这里的原则是:功率级和逻辑级不要共用同一条小电流路径。
4. 完整实战案例:开源智能搬运小车主控板设计
下面进入实操环节。我们从需求定义开始,完成一个“基于开源电路思路的智能搬运小车主控板”的方案设计。这个方案不直接照搬任何一块成品板,而是把常见开源方案的优点整合起来,适合工训赛二次开发。涉及具体型号的,都给出选型理由;不绑死某一款,你可以按自己已有的库存调整。
4.1 功能定义与设计目标
这块主控板需要实现以下功能:
- 双路直流减速电机驱动,PWM 调速,支持正反转。
- 双路编码器接口,读取电机转速。
- 4 路灰度巡线传感器接口,直接读取数字信号。
- 1 路超声波接口,预留分压电路兼容 5V Echo。
- 1 路视觉模组串口接口(UART),用于连接 OpenMV/K210。
- 1 路 OLED 显示屏接口(I2C)。
- 2 路舵机供电和控制引脚,用于机械爪。
- 1 个电源指示灯和 1 个用户按键。
- 所有接口通过排针引出,方便现成模块连接。
设计约束:板子面积控制在 8cm × 6cm 以内,方便安装在小车底盘;电源接口采用防反接设计;所有 GPIO 引出到双排排针,方便示波器测量和飞线调试。
4.2 引脚分配表
引脚分配的优先级顺序是:先满足电机 PWM、编码器定时器、串口等硬性外设需求,再分配普通 GPIO。下面是一份适用于 STM32F103C8T6 的示例分配表。
| 功能模块 | 引脚 | 说明 |
|---|---|---|
| 左电机 PWM | PA0 | TIM2_CH1 |
| 左电机方向 1 | PB0 | 普通 GPIO |
| 左电机方向 2 | PB1 | 普通 GPIO |
| 右电机 PWM | PA1 | TIM2_CH2 |
| 右电机方向 1 | PB10 | 普通 GPIO |
| 右电机方向 2 | PB11 | 普通 GPIO |
| 左编码器 A/B | PA8/PA9 | 定时器编码器模式,示例按外部中断处理 |
| 右编码器 A/B | PB6/PB7 | 同左 |
| 灰度传感器 x4 | PC13-PC16 | 数字输入,示例命名 L1-L4 |
| 超声波 Trig | PA4 | 数字输出 |
| 超声波 Echo | PA5 | 数字输入,前置分压 5V->3.3V |
| 视觉模组 UART | PA2/PA3 | USART2 TX/RX |
| OLED I2C | PB8/PB9 | I2C1 SCL/SDA |
| 舵机 1 | PA7 | 定时器 PWM 输出 |
注意,这份表格只是设计示例。STM32 某些引脚存在复用冲突,比如 PB3/PB4 默认是 JTAG 引脚,需要提前确认。实际画板之前,建议打开芯片数据手册的引脚定义表,或者直接用 STM32CubeMX 做一次引脚冲突检查。
4.3 原理图设计步骤
我们用立创EDA专业版做演示,KiCad 的操作逻辑也类似。流程分四步走:先画电源,再画主控最小系统,然后画电机驱动和传感器接口,最后整理排针连接器。
第一步是电源电路。采用两级降压结构:
电池入口处加防反接二极管,典型选型为 SS34 肖特基二极管,压降低、电流能力强。然后接到 DC-DC 降压模块的位置。如果你用的是现成的 MP1584 降压模块,板上只需要预留电源输入输出排针即可;如果你要自己把 MP1584 电路画到 PCB 上,则需要注意电感的选型和续流二极管布局。5V 之后接一颗 AMS1117-3.3 LDO,输出侧加 10μF 和 0.1μF 去耦电容,3.3V 给主控供电。
第二步是主控最小系统。以 STM32F103C8T6 为例,最小系统包含:
- 8MHz 外部晶振,两个 20pF 负载电容。
- BOOT0 引脚通过 10K 电阻下拉到 GND,确保从 Flash 启动。
- NRST 引脚接 100nF 电容和复位按键。
- 每个电源引脚旁边放 0.1μF 去耦电容,位置尽量靠近芯片引脚。
- VDDA 引脚通过磁珠或小电阻连接到 3.3V,并接 1μF 电容,降低模拟电源噪声。
第三步是电机驱动和传感器接口。以 TB6612FNG 为例,在驱动芯片电源引脚附近加大容量电解电容(如 100μF/16V),吸收电机启动瞬间的大电流。芯片的 VM 接电池电压,VCC 接 3.3V 或 5V 逻辑电压,STBY 引脚必须拉高,否则芯片不工作。这是一处经典错误点位,很多人画完板子发现电机不转,查了半天发现 STBY 悬空。
第四步是传感器接口设计。每个 2.54mm 排针接口旁边,建议预留一个 0.1μF 电容位,给传感器模块就近供电滤波。超声波 Echo 输入端用两个电阻分压,比如 1K 和 2K 电阻把 5V 分到 3.3V 左右,再进 GPIO。
4.4 核心代码示例
硬件设计完成之后,需要有固件把电路跑起来。下面提供几个与前面硬件方案对应的核心代码示例,都是工程片段,需要放入你自己的工程中。
先看灰度传感器的读取。假设 4 路灰度传感器输出接到 PC13-PC16,数字输出为高表示检测到深色线或浅色地,具体取决于是黑线还是白线。实际使用前需要先采集标定值。
// 文件路径:src/sensor/line_sensor.cpp // 说明:读取 4 路灰度数字信号,组装成一个 4bit 数值 #define LINE_SENSOR_COUNT 4 const int lineSensorPins[LINE_SENSOR_COUNT] = {PC13, PC14, PC15, PC16}; int readLineSensor() { int value = 0; for (int i = 0; i < LINE_SENSOR_COUNT; i++) { value = (value << 1) | digitalRead(lineSensorPins[i]); } return value; }这个函数的作用很好理解:循环读取每一路灰度传感器的电平,按顺序合成一个整数。例如 0b1010 表示中间两路检测到线,左右两侧没有,程序可以根据这个值决定直行、左转还是右转。
再看编码器测速。这里以 Arduino 风格的外部中断为例,也可以迁移到 STM32 的定时器编码器模式。
// 文件路径:src/motor/encoder.cpp // 说明:使用外部中断统计左右编码器脉冲数 volatile long leftEncoderCount = 0; volatile long rightEncoderCount = 0; const int LEFT_ENC_A = PA8; const int LEFT_ENC_B = PA9; const int RIGHT_ENC_A = PB6; const int RIGHT_ENC_B = PB7; void leftEncoderISR() { if (digitalRead(LEFT_ENC_B) == HIGH) { leftEncoderCount++; } else { leftEncoderCount--; } } void rightEncoderISR() { if (digitalRead(RIGHT_ENC_B) == HIGH) { rightEncoderCount++; } else { rightEncoderCount--; } } void encoderInit() { pinMode(LEFT_ENC_A, INPUT_PULLUP); pinMode(LEFT_ENC_B, INPUT_PULLUP); pinMode(RIGHT_ENC_A, INPUT_PULLUP); pinMode(RIGHT_ENC_B, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(LEFT_ENC_A), leftEncoderISR, CHANGE); attachInterrupt(digitalPinToInterrupt(RIGHT_ENC_A), rightEncoderISR, CHANGE); }这段代码背后的原理是:编码器 A、B 两相输出脉冲,相位差 90 度。当 A 相发生跳变时,读取 B 相电平,如果 B 为高,说明电机正转,计数加一;否则反转,计数减一。这样就能得到带方向的脉冲计数值,用于后续 PID 速度闭环。
接着是电机 PWM 控制。以 STM32 HAL 库为例,设置定时器 PWM 比较值即可调速。
// 文件路径:Core/Src/motor_control.c // 说明:设置左右电机速度,compare 范围 0-999,对应 0%-99% 占空比 void Motor_SetSpeed(TIM_HandleTypeDef *htim_left, TIM_HandleTypeDef *htim_right, uint16_t compare) { __HAL_TIM_SET_COMPARE(htim_left, TIM_CHANNEL_1, compare); __HAL_TIM_SET_COMPARE(htim_right, TIM_CHANNEL_2, compare); }如果你用的是现成 Arduino 电机驱动库,也可以直接用analogWrite()函数。不同主控的 PWM 频率和分辨率不一样,示例中以 STM32 定时器的 16 位自动重载值为参考,请按实际工程调整。
最后是一个简单的任务状态机框架,负责把巡线、识别、抓取等行为串起来。
// 文件路径:src/task/task_manager.cpp // 说明:工训赛小车整体任务状态机 enum TaskState { STATE_INIT, STATE_FOLLOW_LINE, STATE_DETECT_TARGET, STATE_GRAB, STATE_CARRY, STATE_PLACE, STATE_DONE }; TaskState currentState = STATE_INIT; void updateTask() { switch (currentState) { case STATE_INIT: // 初始化所有外设,等待 500ms 让传感器稳定 encoderInit(); delay(500); currentState = STATE_FOLLOW_LINE; break; case STATE_FOLLOW_LINE: // 在这里调用巡线函数,驱动电机沿赛道行驶 // 如果视觉模组识别到目标物料,切换到 DETECT_TARGET // currentState = STATE_DETECT_TARGET; break; case STATE_GRAB: // 舵机收起机械爪或启动气泵 // 延时确认抓取完成 currentState = STATE_CARRY; break; case STATE_CARRY: // 载着物料转向目标放置区 currentState = STATE_PLACE; break; case STATE_PLACE: // 舵机松开机械爪或关闭气泵 currentState = STATE_DONE; break; case STATE_DONE: // 电机停止,任务结束 break; } }状态机的好处是每个阶段职责清晰,比赛现场如果某个环节出错,通过串口打印当前状态,能快速定位问题出在哪个流程。
4.5 PCB 设计与打样检查
原理图完成之后,进入 PCB Layout。工训赛小车对 PCB 面积和稳定性都有要求,布局走线时注意几个点。
电源走线加宽。电池输入到电机驱动芯片的走线,至少要 1mm 以上,有条件可以铺铜到 2mm。因为电机启动电流瞬间可能到 1A 甚至更高,细走线会造成电压跌落。3.3V 和 5V 主干走线建议 0.5mm-1mm。
电机驱动电路和主控逻辑电路分区。驱动部分放在板子一角,传感器接口和显示接口放在另一边,避免电机大电流回流的噪声干扰主控晶振和 ADC 参考电压。底层铺地铜时,主控区域地平面尽量完整,不要在 MCU 正下方把地铜切成几块。
晶振靠近芯片放置,走线尽量短,两侧地铜包裹。去耦电容的摆放位置往往比参数更影响效果,0.1μF 电容要尽量靠近芯片电源引脚,而不是随意放在电源输入端。
连接器的标注也很重要。每个排针接口附近最好标注丝印,比如 5V、GND、SDA、SCL。比赛现场经常需要快速插拔模块,清晰的丝印能减少误接风险。
打样之前,做一轮 Checklist 检查:
- 所有电源网络是否有短路。
- DC-DC 的电感和二极管封装是否正确。
- 电解电容极性是否接反。
- 防反接二极管方向是否正确。
- 芯片所有电源引脚是否都有去耦电容。
- 排针间距能否插接对应的现成模块。
- 板子固定孔位置是否与底盘匹配。
如果是第一次打样,建议先只打 5 块以内,采用 1.6mm 板厚,FR-4 板材即可,成本低,验证效率高。
4.6 焊接与硬件调试顺序
板子拿到手,不要一次性把所有元件全焊上去。推荐的焊接调试顺序如下。
第一步,只焊电源部分,包括电池入口、DC-DC、LDO 和去耦电容。焊好后接电池,用万用表确认 5V 和 3.3V 输出正常,并且没有异常发热。这一步是最重要的,电源如果不正常,后面所有电路都是白做。
第二步,焊主控最小系统,包括 MCU、晶振、复位电路、BOOT 下拉电阻。插上 ST-Link,尝试下载一个 LED 闪烁程序。如果下载失败,检查 BOOT0 是否接地、SWD 接口是否接反、芯片供电是否正常。
第三步,焊电机驱动芯片和电机接口。先用代码手动设置 PWM 占空比和方向引脚,确认两个电机能正转、反转。此时不要接灰度传感器和视觉模组,缩小排查范围。
第四步,焊传感器接口和显示接口,逐个模块验证。每一个模块验证通过之后,再进入联调阶段。这样即使出现故障,也可以快速定位到是硬件问题还是软件配置问题。
5. 常见问题与排查思路
工训赛硬件调试中,很多问题的原因高度相似。下面整理一份高频问题排查表,遇到问题时按表格顺序检查,通常能快速定位。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 上电后板子无任何反应 | 电源短路、防反接二极管焊反、锂电池电压不足 | 万用表二极管档测电源入口是否短路;确认电池电压;检查 LDO 输出脚电压 |
| 3.3V 电压只有 1V 左右 | 3.3V 网络短路,或 LDO 后级电流过大 | 断开 3.3V 后级负载,逐路排查哪一个器件短路 |
| 电机不转 | TB6612 STBY 引脚悬空、PWM 通道配置错误、方向引脚同时为高 | 检查 STBY 是否拉高;确认定时器 PWM 初始化;方向引脚一高一低组合 |
| 电机只能一个方向转 | 驱动芯片某一路桥臂损坏,或方向 GPIO 初始化错误 | 交换驱动芯片输入引脚,确认是芯片还是主控 GPIO 的问题 |
| 编码器数值乱跳 | A/B 相缺少上拉电阻、中断里做过多运算、电源纹波干扰 | 开启 GPIO 内部上拉或外部上拉 10K;中断中只做计数;编码器线远离电机电源线 |
| 超声波测距异常 | 5V Echo 信号损坏主控引脚、Trig 没有输出脉冲 | 检查 Echo 是否加分压电阻;用示波器或万用表量 Trig 波形 |
| 灰度传感器读数不稳定 | 阈值电位器没调好、环境光变化、供电电压偏低 | 在暗光和强光下分别测试,折中调阈值;确认传感器供电稳定 |
| 程序下载失败 | BOOT0 配置错误、ST-Link 驱动问题、SWD 引脚被复用 | BOOT0 接地;重新安装驱动;检查 SWD 引脚是否被代码占用 |
| OLED 无显示 | I2C 地址错误、SDA/SCL 接反、缺少上拉电阻 | 用 I2C 扫描程序确认地址;检查排线接线;开启内部上拉 |
这里面最常被忽视的是“编码器线远离电机电源线”。编码器信号本质是高频脉冲,一旦和电机电源线平行走线,电机的电磁干扰会通过耦合进入信号线,导致计数不准。在 PCB 布线和车体线束整理时都要注意。
另外,硬件调试要养成“先电源,后信号;先局部,后整体”的习惯。不要一上来就全板联调,出了问题很难定位。每焊完一个模块,就做一次对应的软件测试,记录在调试日志里,这样到比赛现场出现任何问题,你手上会有一份完整的基线数据。
6. 最佳实践与工程建议
6.1 基于开源方案做二次开发的原则
完全从零画板,和完全照抄开源板,都不是理想状态。更合理的做法是“抄改结合”。先找到一块和你需求最接近的开源主控板,比如某个成熟的小车开源项目,跑通官方固件,确认这块板的硬件功能和稳定性,然后逐步裁剪或添加模块。
复制方案时,能整块复制的模块不要重新画。比如 MP1584 降压电路,很多开源工程里都是成熟电路,你只需要复刻布局和参数;如果要改成自锁开关、增加浪涌保护,再单独改那部分电路。这样既能避免大量重复劳动,又能在关键设计上保留自己的思路,遇到问题时也更容易找到原因。
对每一次修改要有记录。例如“V2 版本:增加超声波 Echo 分压电阻”这种简单的修改日志,对后续排错和写比赛技术报告都很有用。
6.2 比赛现场的可靠性细节
工训赛的本质是现场赛,现场环境的复杂性远高于实验室。实验室跑得好的板子,到了赛场可能因为震动、线束松动、电池电压下降而失灵。基于开源电路做方案设计时,必须把现场可靠性作为一个显性需求。
每个接插件都要有防松措施。排针加热熔胶、杜邦线用扎带固定、电机线焊接处套热缩管。赛场上最常出问题的地方不是芯片,而是插接件松脱。
电池电压要留足余量。小车高速运转时,电池电压会明显下降,如果 DC-DC 模块最低工作压差不够,5V 输出会跟着跌落,主控就可能复位。建议用示波器实测电机急停瞬间的电源波形,确认最低电压没有低于系统要求。
备用策略比备用零件更重要。建议带至少一块完全烧录好测试通过的备用主控板,而不是现场带电换芯片。在比赛规则允许的情况下,接口全部使用快插设计,这样即使主板损坏,也能在几分钟内整板更换。
6.3 开源许可证与引用规范
在工训赛这个场景下,学习和个人竞赛用途基本可以放心使用大多数开源电路方案。但如果你的项目进入商业孵化、科研成果转化,或者要在技术报告中提交“原创性声明”,就需要认真检查开源许可证条款。
不同的硬件开源许可证,约束力度不同。CERN OHL 是专门为硬件设计的开源许可证,要求分发时保留原作者的版权和许可证声明;GPL 强调衍生作品也要开源;MIT/Apache 相对宽松。建议在工程文件里新建一个 THIRD_PARTY_NOTICE 文件,记录你参考了哪些开源项目、对应的许可证是什么、你修改了哪些部分。这个习惯在工训赛技术评审中也是加分项。
7. 从开源电路开始的学习路线
最后给正在备赛的同学一条相对清晰的学习路线,按照这个顺序走,投入产出比会比较高。
第一步,跑通一个开源成品方案。选一个资料完善的开源小车项目,购买对应的模块套装或直接打样官方 PCB,先把硬件和代码完整跑起来。这个阶段的目的是建立“原理图-代码-现象”三者之间的映射关系。
第二步,在开源方案上做一处小改动。比如把原来的两路灰度传感器改成四路,或者把串口接口改成排针方式。改动虽然小,但你会经历“读原理图-改原理图-改 PCB-重新打样-调代码-验证”的完整闭环,这会让你真正理解开源电路各个模块之间的关系。
第三步,按自己的需求独立设计一块底板。不需要从芯片级别开始设计,可以沿用成熟的最小系统和电源电路,重点是自己设计传感器接口和电机接口的布局。这样风险可控,又能把核心精力放在自己的方案亮点上。
第四步,再把设计文件开源出去。当你把工程托管到开源硬件社区,写下 README,整理好 BOM,就意味着你已经完成了从“使用开源方案”到“输出开源方案”的转变。这一过程对工程能力、文档能力和比赛答辩的表达能力都有明显提升。
工训赛只是一个起点。真正可贵的,是你在备赛过程中建立的这套“从需求到方案、从方案到电路、从电路到联调”的工程思维。带着这套思维去处理比赛硬件问题,你会发现开源电路并不是遥不可及的黑箱,而是一套可以反复拆解、验证、改进的工程素材。只要能跑通一次完整的“开源方案-二次设计-打样测试”循环,后续遇到任何新题目、新功能,都会比第一次从容很多。