1. 电赛小车硬件选型基础第一次参加电子设计竞赛的同学面对琳琅满目的硬件模块常常会陷入选择困难。我在指导过三十多支电赛队伍后发现合理的硬件选型往往能决定项目70%的成功率。对于智能小车这类经典赛题核心模块的选择需要同时考虑性能参数、系统兼容性和成本控制三个维度。以最基础的供电系统为例很多新手会直接选用现成的锂电池组但实际上需要考虑电机驱动模块的最大输入电压比如L298N的极限电压是35V、单片机工作电压通常3.3V或5V以及传感器供电需求如TCRT5000红外传感器需要3.3-5V。我建议采用12V航模电池配合LM2596降压模块的方案这样既能满足电机驱动需求又可以通过降压模块为其他部件供电。主控芯片的选择更是门学问。虽然Arduino开发简单但在需要精确控制编码器电机和复杂算法时STM32F103系列才是更专业的选择。去年我带的学生团队就因为在预赛使用了Arduino Nano在决赛时遇到了PWM输出通道不足的问题。STM32F103C8T6最小系统板虽然学习曲线陡峭但其丰富的定时器资源和多达37个GPIO口能为后续功能扩展留足余地。2. 蓝牙遥控模块深度解析2.1 HC-05与HC-06的实战对比在调试了市面上七种主流蓝牙模块后我发现HC-05和HC-06是最适合电赛小车的选择。这两个模块看似相似实则有着关键差异参数HC-05HC-06工作模式主从一体仅从机波特率范围4800-1382400bps固定9600bps配置方式AT指令出厂固定传输距离10米(实测8米)8米(实测6米)去年国赛中有支队伍使用HC-06时遇到了严重延迟问题就出在固定波特率上。当小车需要同时传输控制指令和传感器数据时9600bps的带宽会导致数据堵塞。我的建议是如果只需要单向控制手机→小车HC-06足够若需要双向通信如回传传感器数据务必选择HC-05。2.2 蓝牙模块的硬件连接技巧很多技术文档都没提到的关键点蓝牙模块的RX/TX引脚不能直接连接STM32因为大多数蓝牙模块的工作电压是3.3V而STM32的IO口默认是5V电平。我在早期项目中烧毁过三个蓝牙模块后才明白要加装电平转换电路最简单的方案是用1N4148二极管做电平钳位// STM32与HC-05连接示例 #define BT_TX_PIN GPIO_PIN_10 // USART1_TX #define BT_RX_PIN GPIO_PIN_9 // USART1_RX void BT_Init(void) { GPIO_InitTypeDef GPIO_InitStruct {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin BT_TX_PIN; GPIO_InitStruct.Mode GPIO_MODE_AF_PP; GPIO_InitStruct.Pull GPIO_NOPULL; GPIO_InitStruct.Speed GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); GPIO_InitStruct.Pin BT_RX_PIN; GPIO_InitStruct.Mode GPIO_MODE_INPUT; HAL_GPIO_Init(GPIOA, GPIO_InitStruct); }实际布线时还有个易错点蓝牙天线区域模块背面有铜箔的区域要避免被金属部件遮挡。去年有支队伍把蓝牙模块安装在电机驱动板下方结果控制距离从标称的10米降到了不到2米。3. 循迹模块的选型与优化3.1 红外与灰度传感器的抉择TCRT5000红外传感器和灰度传感器是循迹方案的两大主流选择它们的核心差异在于检测原理TCRT5000通过红外反射强度判断受环境光干扰大但成本低约3元/个灰度传感器使用可见光光谱分析抗干扰强但需要ADC采样约15元/个在区域赛中有个经典案例某队伍使用TCRT5000在室内测试完美到了室外赛场却频繁误判。这是因为阳光中的红外线干扰了传感器工作。我的解决方案是给每个传感器加装3D打印的遮光罩在软件中增加动态阈值校准算法将传感器安装高度从默认的1cm调整到0.8cm3.2 多传感器布局的黄金法则常规的五路循迹方案前3后2存在检测盲区经过多次实测验证我总结出更优的扇形布局法前部布置5个传感器呈110°扇形展开传感器间距赛道黑线宽度×1.2最外侧传感器倾斜15°安装这种布局在去年华东区赛的直角弯道赛段展现了明显优势。配合以下PID控制代码可以实现±1mm的循迹精度// 基于STM32的PID循迹算法核心代码 void PID_Tracking(void) { static float err_sum 0, last_err 0; float KP 0.8, KI 0.001, KD 0.3; int sensor_val Read_Sensors(); // 读取5路传感器状态 float current_err Calculate_Error(sensor_val); // 计算偏移量 err_sum current_err; float output KP*current_err KI*err_sum KD*(current_err-last_err); last_err current_err; Motor_Control(output); // 差速控制 }4. 系统集成与调试秘籍4.1 电源管理的致命细节90%的小车异常都源于电源问题。有个容易被忽视的现象当电机启动瞬间系统电压会骤降导致单片机复位。我的解决方案是在电机供电端并联4700μF电解电容单片机电源前加装LC滤波电路10μH电感100μF电容使用示波器捕获电机启停时的电压波动实测数据表明这套方案能将电压波动控制在±0.3V以内。电源布线还有个重要原则电机供电与逻辑供电要分开走线最后在降压模块处单点共地。4.2 蓝牙与循迹的协同策略当蓝牙遥控和自动循迹功能需要切换时传统的中断切换方案会存在300-500ms的延迟。我们团队开发的状态机方案将切换时间压缩到了50ms以内enum {MANUAL, AUTO, TRANSITION} state MANUAL; void Control_StateMachine(void) { switch(state) { case MANUAL: if(BT_GetCmd() START_AUTO) { state TRANSITION; Motor_Brake(200); // 刹车缓冲 } break; case AUTO: if(Check_SensorError()) { state TRANSITION; PID_Reset(); } break; case TRANSITION: if(transition_cnt 5) { state (state MANUAL) ? AUTO : MANUAL; transition_cnt 0; } break; } }这套方案的关键在于TRANSITION状态的引入让电机在模式切换时有缓冲时间避免了急停导致的陀螺效应。在去年全国总决赛的避障环节这个设计帮助我们实现了0碰撞的完美表现。