姚毅超,林智桂,付广
上汽通用五菱汽车股份有限公司,广西柳州 545007
目前主机厂对于实现遥控泊车的主要方法是将此功能做到整车的全自动泊车控制器当中,遥控功能是基于现有车钥匙或者手机进行开发,局限性较大。车钥匙可供开发的按键较少,手机开发成本较高,时延较大,影响遥控的实时性和使用体验。因此,本文介绍一款基于STM32和Arduino设计与开发的遥控泊车装置,用于解决上述问题。
该装置由遥控器、接收器和无线通信模块3个部分组成,可实现对遥控车辆的横纵向控制、行车灯控制和远程上下电控制。先通过控制器选型确定装置的硬件构成,再运用编程语言完成对所需功能的编写,最后在实车上对该装置进行测试验证,对行驶车速、主动距离、转向角度及速度等性能指标进行评估。使用时只需将遥控装置的接收器连接在整车OBD口上,手持遥控器即可实现对车辆的远程操控。
(1)基本功能[1]:遥控车辆行驶的基本需求,即通过遥控器上的按键控制车辆完成前、后、左、右及制动的操作,同时也可通过其上的摇杆实现同样功能,区别在于摇杆控制可实现车辆的横纵向同步控制。
(2)遥控按键[1]:遥控器按键示意如图1所示,可进行X、Y方向的移动,当被按下时为制动按键。
图1 遥控器按键示意
为满足使用者体验的同时保障操控安全,并能够对遥控系统进行量化分析,该遥控装置的目标参数设定见表1。
表1 遥控装置的目标参数设定
遥控系统分为硬件设计和软件设计,硬件设计包括遥控器控制器、接收器控制器和无线通信模块的选型,接收器选用普遍应用的STM32F107控制器,遥控器选用开发集成度高、成本低的Arduino控制器配合Joystick Shield扩展板,无线通信模块选用传输距离较远、稳定性强并具有基站功能的ZigBee模块[2]。遥控系统的硬件设计框图如图2所示。
图2 遥控系统的硬件设计框图
完成硬件选型、设计和组装后,根据遥控器控制器和无线通信模块的尺寸设计遥控器外壳,其外观设计效果如图3所示。
图3 遥控器外观设计效果
软件设计包括软件架构搭建和算法程序编写,软件架构是指控车逻辑、安全机制及底层配置等;算法程序则主要完成具体的控制指令编写及系统优化。STM32F107控制器根据实现的功能需要在程序中配置CAN、SCI、TIM、NVIC、RCC 6个模块[3],并编写相应的接口函数供主程序使用。接收器的软件设计框图如图4所示。
图4 接收器的软件设计框图
Arduino控制器根据要实现的功能通过调用Arduino提供的库函数完成串口配置及遥控指令的收发,遥控器的软件设计框图如图5所示。
图5 遥控器的软件设计框图
遥控泊车功能目前主要基于总线信号进行实现,对于车辆的转向、驱动、制动均通过CAN总线上的相关报文进行控制,所介绍的遥控装置以新宝骏某车型作为试验车辆对横纵向控制方法进行测试验证。
Arduino控制器配合Joystick Shield扩展板组成遥控器,根据扩展板上按键和摇杆的数据值解析关系编写遥控指令发送逻辑,按照上述遥控按键定义赋予实际的控制含义,遥控器上的方向键是车辆横纵向单独控制,摇杆是车辆横纵向同时控制,因此遥控器实现了横纵向分开及同时控制,其控制流程如图6所示。
图6 遥控器的控制流程
接收器控制器为STM32F107控制器,通过CAN模块配置相应的CAN通道,使其能够正常收发CAN报文标准帧;通过TIM模块配置相应的定时器,使其能够计算不同周期,接着编写可控制车速、挡位及制动的报文函数,对其中对应的字节进行赋值,报文函数形式为:
void can_0xID(unsigned int velocity,unsigned char gearreq,unsigned char pressure)
{
unsigned char i;
CanTxMsg TxMessage;
TxMessage.StdId=0xID;
TxMessage.ExtId=0x0000;
TxMessage.IDE = CAN_ID_STD;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.DLC = 8;
CAN1_DATA[0]=0x00;
CAN1_DATA[1]=0x00;
CAN1_DATA[2]=pressure;
CAN1_DATA[3]=velocity>>8;
CAN1_DATA[4]=velocity;
CAN1_DATA[5]=0x00;
CAN1_DATA[6]=gearreq+rc_ID;
CAN1_DATA[7]=CAN1_DATA[0]+CAN1_DATA[1]+CAN1_DATA[2]+CAN1_DATA[3]+CAN1_DATA[4]+CAN1_DATA[5]+CAN1_DATA[6];
for(i = 0;i < 8;i ++)
{
TxMessage.Data[i]= CAN1_DATA[i];
}
CAN_Transmit(CAN1,&TxMessage);
rc_ID=rc_ID+1;
if(rc_ID==16)
{
rc_ID=0;
}
}
其中CanTxMsg为CAN发送结构体,0xID为自定义的报文ID,CAN_ID_STD值为0,CAN_RTR_DATA值为0,pressure为制动压力请求,velocity为速度请求,gearreq为挡位请求,rc_ID为循环计数,CAN_Transmit为报文发送函数。
将纵向控制报文通过OBD口发送至整车CAN网络,ESC控制器可执行相应的速度、挡位和制动请求,将代码烧录进接收器控制器连接到整车上进行实车测试。车速、挡位和制动请求与响应的变化曲线如图7至图9所示。
图7 车速请求与响应的变化曲线
图8 挡位请求与响应的变化曲线
图9 制动请求与响应的变化曲线
基于纵向控制的报文函数形式编写横向控制的请求报文,主程序中需根据目标参数中的最大转角定义对方向盘角度变量值进行限制,实车测试过程中发现方向盘响应表现比较抖动,转角曲线呈锯齿状,针对此问题,通过低通滤波算法和幅值限值算法对转向控制进行优化,优化算法程序如下:
int limit(int angle,int angle_old){
if(angle> angle_old){
if((angle-angle_old)>ANGLE_THRESHOLD){
return angle_old+ANGLE_THRESHOLD;
}
else {
return angle;
}
}
else {
if((angle_old-angle)>ANGLE_THRESHOLD){
return angle_old-ANGLE_THRESHOLD;
}
else {
return angle;
}
}
}
其中angle_old为上一周期请求的方向盘角度值,angle为当前周期请求的方向盘角度值,ANGLE_THRESHOLD为方向盘角度阶跃的限值。
int filter(int value,int value_old){
return(1-WEIGHT)*value_old+WEIGHT*value;
}
其中WEIGHT为比重因子。
经过优化算法处理后,不断调试比重因子和阶跃限值后实现了方向盘的平滑控制,实车方向盘转动时无明显抖动,转角曲线较之前改善明显,优化前后方向盘响应的对比曲线如图10所示。
图10 优化前后方向盘响应的对比曲线
基于纵向控制的报文函数形式编写远程上下电控制的请求报文,当接收器控制器接收到来自遥控器控制器的指令0x05时,表示下电请求,向整车CAN总线发送下电请求报文的同时挂P挡,拉起手刹;当接收器控制器接收到来自遥控器控制器的指令0x06时,表示上电请求,向整车CAN总线发送上电请求报文的同时释放手刹。远程上下电控制逻辑如图11所示。
图11 远程上下电控制逻辑
遥控器和接收器通过ZigBee无线模块建立通信实现对车辆的操控过程中可能会因为断电、信号传输不稳定等原因导致通信中断,由此带来安全隐患和诸多风险,因此需要建立遥控器和接收器之间通信的安全机制,将安全交互协议分别编写进两控制器。
接收器控制器的定时器1每隔120 ms向遥控器发送指令0x11,如图12所示。
图12 安全交互逻辑1
接收器控制器接收到数据后判断值是否为0xff,如果是,则将标志位RC置1,如图13所示。
图13 安全交互逻辑2
接收器控制器的定时器2每隔1 s会判断标志位RC是否置1,如果置位,则清零;如果没有,Num计数10次后会将标志位flag置零,如图14所示。
图14 安全交互逻辑3
遥控器控制器接收到0x11后会向接收器控制器发送指令0xff,如图15所示。
图15 安全交互逻辑4
基于上述的安全交互逻辑,需要在主程序中编写因断电、接触不良导致通信中断时的处理函数,即当标志位flag置零时,接收器控制器要向整车发送报文实现无转向、无速度且制动的功能。
本文介绍的一款基于STM32和Arduino的遥控泊车装置经过实车测试验证后,完成预期设计的所有目标,从硬件选型制作到软件架构编写再到功能标定调试,一步步实现遥控装置对车辆横纵向的平稳控制和远程上下电控制。该装置的开发成功解决了现有车钥匙按键少、手机开发成本高的问题,提供了一种综合性价比较高的解决方案。