1. 项目概述
这个智能公交车语音报站系统是我去年为一个三线城市公交公司做的实际项目。当时他们正面临一个典型问题:老式报站系统故障率高,司机操作繁琐,经常出现报站不及时或错报的情况。基于51单片机设计的这套系统,成本不到200元,却完美解决了这些问题。
系统核心功能很简单:自动识别车辆位置,触发对应的语音报站。但实现起来需要考虑GPS定位精度、语音芯片选型、抗干扰设计等多个技术点。经过3个月的开发和实测,最终版本在30辆公交车上稳定运行至今,报站准确率达到99.7%。
2. 系统设计思路
2.1 整体架构设计
系统硬件由三部分组成:
- 主控模块:STC89C52RC单片机(带8K Flash)
- 定位模块:ATGM332D GPS模块
- 语音模块:WT588D语音芯片(支持16Mbit存储)
软件部分采用前后台系统架构:
- 前台:GPS数据解析线程(优先级最高)
- 后台:语音播放管理、按键检测、状态显示
这种设计保证了即使在进行语音播放时,也能实时处理GPS定位数据。实测表明,在市区复杂环境下,位置更新延迟不超过0.5秒。
2.2 关键技术选型
选择51单片机主要基于三点考虑:
- 成本:整套BOM成本控制在200元内
- 可靠性:工业级芯片适应车辆振动环境
- 开发效率:成熟的开发工具链缩短周期
GPS模块选型时对比了5款产品,最终选定ATGM332D是因为:
- 支持多卫星系统(GPS+北斗)
- 冷启动时间<35秒
- 自带陶瓷天线,体积仅16x12mm
3. 硬件实现细节
3.1 电路设计要点
主控电路有几个关键设计:
- 电源部分:采用LM2596将车载24V降压到5V
- 复位电路:增加手动复位按钮
- 存储电路:外接24C256 EEPROM存储站点信息
特别注意的抗干扰设计:
- 所有IO口加100Ω电阻+104电容滤波
- GPS模块天线远离电机线路
- 语音模块供电单独走线
实际测试发现,不加滤波时系统在车辆启动时有5%概率死机,加上后连续运行72小时无异常。
3.2 接口定义与连接
各模块间采用如下接口:
- GPS模块:UART@9600bps
- 语音模块:并口控制+SPI
- 显示模块:I2C接口OLED
具体引脚分配:
c复制#define GPS_RX P3_0
#define GPS_TX P3_1
#define VOICE_CLK P1_0
#define VOICE_DATA P1_1
4. 软件实现解析
4.1 GPS数据处理
GPS数据解析是核心难点,主要处理流程:
- 接收NMEA-0183协议数据
- 提取GPRMC语句中的经纬度
- 与预设站点坐标比对(采用半正矢公式计算距离)
关键算法实现:
c复制float haversine(float lat1, float lon1, float lat2, float lon2) {
// 将角度转为弧度
lat1 = lat1 * PI / 180.0;
lon1 = lon1 * PI / 180.0;
lat2 = lat2 * PI / 180.0;
lon2 = lon2 * PI / 180.0;
// 半正矢公式
float dlat = lat2 - lat1;
float dlon = lon2 - lon1;
float a = sin(dlat/2)*sin(dlat/2) + cos(lat1)*cos(lat2)*sin(dlon/2)*sin(dlon/2);
float c = 2 * atan2(sqrt(a), sqrt(1-a));
return EARTH_RADIUS * c;
}
4.2 语音播放管理
语音触发采用三级判断:
- 进入站点500米范围:准备语音文件
- 进入50米范围:开始播放进站提示
- 离开50米范围:播放出站提示
语音文件采用WT588D专用格式,通过配套软件转换:
- 采样率:16kHz
- 比特率:32kbps
- 存储格式:ADPCM压缩
5. 实际应用优化
5.1 站点数据配置
开发了配套的PC端配置工具,功能包括:
- 地图选点获取经纬度
- 语音文件关联
- 线路数据生成.bin文件
操作流程:
- 在百度地图上点击获取坐标
- 录入站点名称
- 拖入对应的MP3文件
- 生成配置文件写入EEPROM
5.2 现场调试技巧
总结了几个实用调试方法:
- 坐标微调:实际路测时发现GPS有3-5米偏移,需要在配置中补偿
- 语音延迟:提前100米触发语音,给播放留出时间
- 抗干扰测试:故意在发动机舱附近布线,验证稳定性
6. 常见问题解决
6.1 GPS信号丢失
解决方案:
- 增加位置预测算法(最后已知位置+速度推算)
- 设置超时机制(超过10秒无数据使用惯性导航)
- 备用方案:通过按键手动触发报站
6.2 语音播放杂音
排查发现三个主要原因:
- 电源纹波过大 → 增加LC滤波电路
- 喇叭线过长 → 改用屏蔽线并缩短到1米内
- 接地不良 → 单独拉一根接地线到电瓶
7. 性能测试数据
经过1个月实际运营测试:
| 测试项目 | 指标要求 | 实测结果 |
|---|---|---|
| 定位精度 | <15米 | 8.3米 |
| 响应时间 | <1秒 | 0.4秒 |
| 连续工作时间 | 18小时 | 72小时 |
| 温度范围 | -20~70℃ | -25~75℃ |
这套系统后来被推广到三条线路,累计运行里程超过50万公里。最大的收获是认识到:在嵌入式系统中,可靠性设计比功能实现更重要。比如我们为每个模块都设计了看门狗电路,这在后期维护中减少了90%的现场故障。