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 // 单位:米但实际应用中要考虑温度补偿,声速会随温度变化(v=331.4+0.6T)。
灰度传感器的逻辑处理是巡线的核心。我们定义了五种状态:
- 000:全白,可能脱线
- 001:偏右,需要右转
- 010:居中,直行
- 100:偏左,需要左转
- 101:岔路标志,触发转向
实际调试中发现杜邦线接触不良会导致误判,这个坑我们排查了整整三小时。建议直接用排针焊接,避免接触问题。
3. 运动控制逻辑:从基础巡线到多模式切换
题目要求的四种模式对应不同的速度策略:
- 双车同速跟随(0.3m/s)
- 跟随车从侧方汇入(0.5m/s)
- 内外圈交替超车
- 高速运行(1m/s)带中途停车
速度控制没有采用复杂的PID,而是直接用PWM占空比映射速度。通过实验测得:
- 30%占空比≈0.3m/s
- 50%占空比≈0.5m/s
- 75%占空比≈1m/s
模式切换逻辑通过板载按键实现:
if(KEY_isPressed(KEY2)) { DELAY_MS(100); // 消抖 key_statues++; // 模式切换 if(key_statues>4) key_statues=0; }每个模式对应独立的函数处理,例如模式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,"AT+CWMODE=2\n"); // 设置为AP模式 DELAY_MS(100); UART_Printf(UART1,"AT+CWSAP=\"FOLLOWER\",\"12345678\",1,4\n"); // 创建热点- 从车连接网络:
UART_Printf(UART1,"AT+CWMODE=1\n"); // STA模式 DELAY_MS(100); UART_Printf(UART1,"AT+CWJAP=\"FOLLOWER\",\"12345678\"\n");- 建立TCP连接:
UART_Printf(UART1,"AT+CIPSTART=0,\"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 i=0; i<100; 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速度控制,或者用光电编码器实现更精准的里程计算。不过对于电赛而言,稳定实现基础功能比追求完美更重要。