引言
本文介绍这样一种系统设计,目的在于将智能车行驶过程中的各种实时状态信息,通过无线串行的通信方式发送到上位机处理这些信息,于此同时,绘制出各部分状态值的关于时间的曲线。通过这些曲线,方便我们看出智能车在赛道上的各个位置的状态,方便控制各种参数。尤为重要的是对于电机控制PID参数的选取,通过速度—时间曲线可以很容易发现各套PID参数之间的差异。如果采用CCD传感器,该系统便成为了调试者的眼睛,可以见智能车之所见,而且还能对这些数据作进一步处理,以得到更多的信息,便于智能车的行驶。
1 硬件和软件设计
本文给出的设计方案主要分成三个部分:无线数据传输系统、车载数据采集系统和上位机数据处理系统。
系统基本构建如图1所示。
图1 智能实时监测系统结构框图与流程图
2 无线数据传输系统
下位机向上位机传输的是以每20ms传输一组,包含了光电编码器值、电池电压、舵机转角值、传感器当前状态的数据。如果是在理想状态下,上位机接收到的应是上述各值循环出现的周期性数据,此时上位机只需将这些数据按照顺序装入各自的数组并画图即可。然而,在实际的无线传输过程中可能会出现数据丢失的情况。因此适当的数据校验就显得十分有必要了,否则会出现数据装入错误,造成画图混乱。我们在实际过程中是在每组数据中加入0x00,0xff的帧头,当数据出现错误时,舍弃该帧数据。
3 车载数据采集系统
车载数据采集系统,加入了单片机的应用,全权负责采集赛车行驶过程中的速度、传感器状态、电池电压、舵机转角等信息。为了使监测系统不占用单片机的内部资源并且支持热插拔,我们将监测系统(除供电之外)与智能车控制系统相分离。在这里,选择艾特梅尔公司的ATMEGA16单片机作为该数据采集系统的核心处理器。二值型光电传感器信号的采集直接使用该单片机的I/O口进行采集,连续型光电传感器、电池电压及CCD摄像头信号则采用该单片机的A/D口进行采集,速度信息则通过光电编码器和该单片机的计数器来采集。采集到的数据每20ms向上位机发送一次。
4 上位机的数据接收及处理
上位机主要由以下四个模块构成:
4.1 数据接收模块
功能:上位机通过串口采集下位机发送的原始数据。
实现:VC++中实现串口通信一般有二种方式,分别是MSComm控件和Windows API函数。MSComm简洁易用,适用于比较简单的系统,Windows API函数应用较广但比较复杂繁琐,由于此模块的串口通信功能相对简单,本系统采用前者。在实际过程中使用的是事件驱动的方式,这种方法响应及时,可靠性高,并且比查询法占用更少的资源。
4.2 存储模块
功能:直接存储采集到的原始数据,为以后更多的分析处理作准备。
如何实现:在每个OnComm事件被触发后,将串口接收到的数据直接存入temp临时文件,并且可以在用户的要求下将temp临时文件里的值存储到指定文件。
4.3 数据分析和处理模块
功能:将采集到的原始数据进行用户选定的分析和处理,主要包括丢弃错误数据,以及去除帧头并进行数据装入任务,同时也可以对已保存的数据进行分析和处理。
如何实现:将temp临时文件或用户指定文件的数据读出并装入。
以下为主要程序代码:
void CChuankokjDlg::find_data(car_data c_data[], BYTE c_source[], int c_length)
{
int i=0;
while(i { if((c_source[i]==0x00)&&(c_source[i+1]==0 xff)&&(c_source[i+6]==0x0 0)&&(c_source[i+7]==0xff))//判断帧头并进行数据装入
{
c_data[length].speed_data=c_source[i+2];
c_data[length].battary_data=c_source[i+3];
c_data[length].direction_data=c_source[i+4];
c_data[length].sensor_data=c_source[i+5];
i=i+1;
}
else
i++;
}
}
4.4 图显模块
功能:以图形界面来显示处理后的数据,以便更直观更实时地观察智能车的运行情况。
如何实现:将上一模块中装入的各数组数据在用户的选择的模式下进行画图,可以只看一幅图,也可以将四幅图放在一起进行对比观看。实际的运行界面及效果如图2。
图2图形显示介面运行模块
5 结语
本文介绍了一个通过添加无线收发模块、将智能车的实时状态信息传到上位机的系统设计,通过VC++编程,用图象直观形象地将其表现出来,较好地达到了对智能车状态实时监测的目的,极大地方便了我们调节智能车的参数。