从电赛C题到实战:MSP430与ESP32-C3构建智能跟随小车全解析

张开发
2026/4/20 7:24:44 15 分钟阅读

分享文章

从电赛C题到实战:MSP430与ESP32-C3构建智能跟随小车全解析
1. 从电赛题目到硬件选型如何搭建智能跟随小车的骨架第一次参加电子设计竞赛的选手往往会被琳琅满目的题目搞得眼花缭乱。去年我们团队选择了C题——智能跟随小车系统这个题目看似简单实则暗藏玄机。题目明确要求使用TI的MSP430系列作为主控这对习惯了STM32的我们来说是个不小的挑战。硬件选型上我们走了些弯路。最初考虑过用编码器实现精准测距但在MSP430F5529上调试时发现误差太大最终不得不放弃。主控板选择了MSP430F5529 LaunchPad这款板子自带两个按键和多个GPIO口正好满足我们的模式切换和启动需求。通信模块选了ESP32-C3看中的是其稳定的WiFi性能和低廉的价格。车体搭建是最基础却最容易忽视的环节。我们用了10×20cm的亚克力板作为底盘这个尺寸既符合题目要求不超过25×15cm又给后续的模块布局留足了空间。电机选型上建议使用带减速箱的直流电机转速控制在200RPM左右比较合适。我们最初用的万向轮虽然能丝滑漂移但实际巡线时稳定性堪忧。提示车体重量分布很关键电池尽量放在靠近驱动轮的位置避免前重后轻导致巡线时车头下压。2. 传感器系统设计让小车看得见路智能小车的眼睛由两部分组成5路灰度传感器用于巡线HC-SR04超声波模块负责车距检测。灰度传感器的布局很有讲究我们采用中间三个密集排列间距1.5cm两侧各一个的布局方式。这种排列能在保证巡线精度的同时兼顾岔路识别。超声波模块的调试是个坑。最初我们直接移植了STM32的代码结果发现MSP430的定时器配置完全不同。关键点在于触发信号要维持至少10μs的高电平回波检测要用外部中断配合定时器捕获。距离计算公式很简单distance pulse_width * 340 / 2 // 单位米但实际应用中要考虑温度补偿声速会随温度变化v331.40.6T。灰度传感器的逻辑处理是巡线的核心。我们定义了五种状态000全白可能脱线001偏右需要右转010居中直行100偏左需要左转101岔路标志触发转向实际调试中发现杜邦线接触不良会导致误判这个坑我们排查了整整三小时。建议直接用排针焊接避免接触问题。3. 运动控制逻辑从基础巡线到多模式切换题目要求的四种模式对应不同的速度策略双车同速跟随0.3m/s跟随车从侧方汇入0.5m/s内外圈交替超车高速运行1m/s带中途停车速度控制没有采用复杂的PID而是直接用PWM占空比映射速度。通过实验测得30%占空比≈0.3m/s50%占空比≈0.5m/s75%占空比≈1m/s模式切换逻辑通过板载按键实现if(KEY_isPressed(KEY2)) { DELAY_MS(100); // 消抖 key_statues; // 模式切换 if(key_statues4) key_statues0; }每个模式对应独立的函数处理例如模式1的核心逻辑void MODE_1() { read_sensor_values(); maintain_distance(20); // 保持20cm车距 switch(error) { case 0: forward(); break; case 1: turn_left(); break; case 2: turn_right(); break; case 3: stop(); break; } }转弯控制要注意差速调节我们的经验值是小角度修正左右轮速差20%90度转弯内侧轮反转外侧轮降速50%180度掉头一轮正转一轮反转4. 双车通信ESP32-C3的实战应用通信系统是整个项目最棘手的部分。我们采用主从架构主车创建WiFi热点从车连接主车热点 通信协议非常简单$[模式编号] // 如$1表示切换至模式1 $6 // 特殊指令表示停车ESP32-C3的配置流程主车初始化AP模式UART_Printf(UART1,ATCWMODE2\n); // 设置为AP模式 DELAY_MS(100); UART_Printf(UART1,ATCWSAP\FOLLOWER\,\12345678\,1,4\n); // 创建热点从车连接网络UART_Printf(UART1,ATCWMODE1\n); // STA模式 DELAY_MS(100); UART_Printf(UART1,ATCWJAP\FOLLOWER\,\12345678\\n);建立TCP连接UART_Printf(UART1,ATCIPSTART0,\TCP\,\192.168.4.1\,8080\n);实际调试中发现WiFi模块上电时序很关键。一定要先启动主车等热点建立后再启动从车否则会出现连接超时。通信间隔建议保持在100ms以上避免数据拥堵。5. 调试经验与性能优化三天三夜的调试让我们积累了不少血泪经验。几个关键建议电源管理电机启动瞬间会产生电压跌落最好给控制电路单独供电。我们用了两节18650电池并联供电电压监控必不可少float read_battery_voltage() { ADC_Enable(ADC12_BASE); float voltage ADC_Read(ADC12_BASE, ADC_INCH_11) * 3.3 / 4096 * 2; if(voltage 6.5) alert_low_battery(); return voltage; }轮子防滑普通橡胶轮在光滑地面容易打滑。我们最后给轮子缠了电工胶带摩擦力提升明显。更专业的做法是使用硅胶轮胎或增加配重。赛道适应性不同场地光线会影响灰度传感器读数。建议在初始化时做自动校准void calibrate_sensors() { for(int i0; i100; i) { black_level read_sensor_raw(); white_level read_white_raw(); DELAY_MS(10); } threshold (black_level white_level) / 2; }异常处理增加超时判断比如超声波超过2秒没返回数据就触发紧急停车巡线丢失超过1秒执行倒车找回等。最终我们的车实现了0.3m/s和1m/s两种速度下的稳定运行但在模式3的超车逻辑上还有优化空间。如果时间允许可以考虑加入PID速度控制或者用光电编码器实现更精准的里程计算。不过对于电赛而言稳定实现基础功能比追求完美更重要。

更多文章