姚毅超,林智桂,付廣
上汽通用五菱汽車(chē)股份有限公司,廣西柳州 545007
目前主機(jī)廠對(duì)于實(shí)現(xiàn)遙控泊車(chē)的主要方法是將此功能做到整車(chē)的全自動(dòng)泊車(chē)控制器當(dāng)中,遙控功能是基于現(xiàn)有車(chē)鑰匙或者手機(jī)進(jìn)行開(kāi)發(fā),局限性較大。車(chē)鑰匙可供開(kāi)發(fā)的按鍵較少,手機(jī)開(kāi)發(fā)成本較高,時(shí)延較大,影響遙控的實(shí)時(shí)性和使用體驗(yàn)。因此,本文介紹一款基于STM32和Arduino設(shè)計(jì)與開(kāi)發(fā)的遙控泊車(chē)裝置,用于解決上述問(wèn)題。
該裝置由遙控器、接收器和無(wú)線通信模塊3個(gè)部分組成,可實(shí)現(xiàn)對(duì)遙控車(chē)輛的橫縱向控制、行車(chē)燈控制和遠(yuǎn)程上下電控制。先通過(guò)控制器選型確定裝置的硬件構(gòu)成,再運(yùn)用編程語(yǔ)言完成對(duì)所需功能的編寫(xiě),最后在實(shí)車(chē)上對(duì)該裝置進(jìn)行測(cè)試驗(yàn)證,對(duì)行駛車(chē)速、主動(dòng)距離、轉(zhuǎn)向角度及速度等性能指標(biāo)進(jìn)行評(píng)估。使用時(shí)只需將遙控裝置的接收器連接在整車(chē)OBD口上,手持遙控器即可實(shí)現(xiàn)對(duì)車(chē)輛的遠(yuǎn)程操控。
(1)基本功能[1]:遙控車(chē)輛行駛的基本需求,即通過(guò)遙控器上的按鍵控制車(chē)輛完成前、后、左、右及制動(dòng)的操作,同時(shí)也可通過(guò)其上的搖桿實(shí)現(xiàn)同樣功能,區(qū)別在于搖桿控制可實(shí)現(xiàn)車(chē)輛的橫縱向同步控制。
(2)遙控按鍵[1]:遙控器按鍵示意如圖1所示,可進(jìn)行X、Y方向的移動(dòng),當(dāng)被按下時(shí)為制動(dòng)按鍵。
圖1 遙控器按鍵示意
為滿足使用者體驗(yàn)的同時(shí)保障操控安全,并能夠?qū)b控系統(tǒng)進(jìn)行量化分析,該遙控裝置的目標(biāo)參數(shù)設(shè)定見(jiàn)表1。
表1 遙控裝置的目標(biāo)參數(shù)設(shè)定
遙控系統(tǒng)分為硬件設(shè)計(jì)和軟件設(shè)計(jì),硬件設(shè)計(jì)包括遙控器控制器、接收器控制器和無(wú)線通信模塊的選型,接收器選用普遍應(yīng)用的STM32F107控制器,遙控器選用開(kāi)發(fā)集成度高、成本低的Arduino控制器配合Joystick Shield擴(kuò)展板,無(wú)線通信模塊選用傳輸距離較遠(yuǎn)、穩(wěn)定性強(qiáng)并具有基站功能的ZigBee模塊[2]。遙控系統(tǒng)的硬件設(shè)計(jì)框圖如圖2所示。
圖2 遙控系統(tǒng)的硬件設(shè)計(jì)框圖
完成硬件選型、設(shè)計(jì)和組裝后,根據(jù)遙控器控制器和無(wú)線通信模塊的尺寸設(shè)計(jì)遙控器外殼,其外觀設(shè)計(jì)效果如圖3所示。
圖3 遙控器外觀設(shè)計(jì)效果
軟件設(shè)計(jì)包括軟件架構(gòu)搭建和算法程序編寫(xiě),軟件架構(gòu)是指控車(chē)邏輯、安全機(jī)制及底層配置等;算法程序則主要完成具體的控制指令編寫(xiě)及系統(tǒng)優(yōu)化。STM32F107控制器根據(jù)實(shí)現(xiàn)的功能需要在程序中配置CAN、SCI、TIM、NVIC、RCC 6個(gè)模塊[3],并編寫(xiě)相應(yīng)的接口函數(shù)供主程序使用。接收器的軟件設(shè)計(jì)框圖如圖4所示。
圖4 接收器的軟件設(shè)計(jì)框圖
Arduino控制器根據(jù)要實(shí)現(xiàn)的功能通過(guò)調(diào)用Arduino提供的庫(kù)函數(shù)完成串口配置及遙控指令的收發(fā),遙控器的軟件設(shè)計(jì)框圖如圖5所示。
圖5 遙控器的軟件設(shè)計(jì)框圖
遙控泊車(chē)功能目前主要基于總線信號(hào)進(jìn)行實(shí)現(xiàn),對(duì)于車(chē)輛的轉(zhuǎn)向、驅(qū)動(dòng)、制動(dòng)均通過(guò)CAN總線上的相關(guān)報(bào)文進(jìn)行控制,所介紹的遙控裝置以新寶駿某車(chē)型作為試驗(yàn)車(chē)輛對(duì)橫縱向控制方法進(jìn)行測(cè)試驗(yàn)證。
Arduino控制器配合Joystick Shield擴(kuò)展板組成遙控器,根據(jù)擴(kuò)展板上按鍵和搖桿的數(shù)據(jù)值解析關(guān)系編寫(xiě)遙控指令發(fā)送邏輯,按照上述遙控按鍵定義賦予實(shí)際的控制含義,遙控器上的方向鍵是車(chē)輛橫縱向單獨(dú)控制,搖桿是車(chē)輛橫縱向同時(shí)控制,因此遙控器實(shí)現(xiàn)了橫縱向分開(kāi)及同時(shí)控制,其控制流程如圖6所示。
圖6 遙控器的控制流程
接收器控制器為STM32F107控制器,通過(guò)CAN模塊配置相應(yīng)的CAN通道,使其能夠正常收發(fā)CAN報(bào)文標(biāo)準(zhǔn)幀;通過(guò)TIM模塊配置相應(yīng)的定時(shí)器,使其能夠計(jì)算不同周期,接著編寫(xiě)可控制車(chē)速、擋位及制動(dòng)的報(bào)文函數(shù),對(duì)其中對(duì)應(yīng)的字節(jié)進(jìn)行賦值,報(bào)文函數(shù)形式為:
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發(fā)送結(jié)構(gòu)體,0xID為自定義的報(bào)文ID,CAN_ID_STD值為0,CAN_RTR_DATA值為0,pressure為制動(dòng)壓力請(qǐng)求,velocity為速度請(qǐng)求,gearreq為擋位請(qǐng)求,rc_ID為循環(huán)計(jì)數(shù),CAN_Transmit為報(bào)文發(fā)送函數(shù)。
將縱向控制報(bào)文通過(guò)OBD口發(fā)送至整車(chē)CAN網(wǎng)絡(luò),ESC控制器可執(zhí)行相應(yīng)的速度、擋位和制動(dòng)請(qǐng)求,將代碼燒錄進(jìn)接收器控制器連接到整車(chē)上進(jìn)行實(shí)車(chē)測(cè)試。車(chē)速、擋位和制動(dòng)請(qǐng)求與響應(yīng)的變化曲線如圖7至圖9所示。
圖7 車(chē)速請(qǐng)求與響應(yīng)的變化曲線
圖8 擋位請(qǐng)求與響應(yīng)的變化曲線
圖9 制動(dòng)請(qǐng)求與響應(yīng)的變化曲線
基于縱向控制的報(bào)文函數(shù)形式編寫(xiě)橫向控制的請(qǐng)求報(bào)文,主程序中需根據(jù)目標(biāo)參數(shù)中的最大轉(zhuǎn)角定義對(duì)方向盤(pán)角度變量值進(jìn)行限制,實(shí)車(chē)測(cè)試過(guò)程中發(fā)現(xiàn)方向盤(pán)響應(yīng)表現(xiàn)比較抖動(dòng),轉(zhuǎn)角曲線呈鋸齒狀,針對(duì)此問(wèn)題,通過(guò)低通濾波算法和幅值限值算法對(duì)轉(zhuǎn)向控制進(jìn)行優(yōu)化,優(yōu)化算法程序如下:
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為上一周期請(qǐng)求的方向盤(pán)角度值,angle為當(dāng)前周期請(qǐng)求的方向盤(pán)角度值,ANGLE_THRESHOLD為方向盤(pán)角度階躍的限值。
int filter(int value,int value_old){
return(1-WEIGHT)*value_old+WEIGHT*value;
}
其中WEIGHT為比重因子。
經(jīng)過(guò)優(yōu)化算法處理后,不斷調(diào)試比重因子和階躍限值后實(shí)現(xiàn)了方向盤(pán)的平滑控制,實(shí)車(chē)方向盤(pán)轉(zhuǎn)動(dòng)時(shí)無(wú)明顯抖動(dòng),轉(zhuǎn)角曲線較之前改善明顯,優(yōu)化前后方向盤(pán)響應(yīng)的對(duì)比曲線如圖10所示。
圖10 優(yōu)化前后方向盤(pán)響應(yīng)的對(duì)比曲線
基于縱向控制的報(bào)文函數(shù)形式編寫(xiě)遠(yuǎn)程上下電控制的請(qǐng)求報(bào)文,當(dāng)接收器控制器接收到來(lái)自遙控器控制器的指令0x05時(shí),表示下電請(qǐng)求,向整車(chē)CAN總線發(fā)送下電請(qǐng)求報(bào)文的同時(shí)掛P擋,拉起手剎;當(dāng)接收器控制器接收到來(lái)自遙控器控制器的指令0x06時(shí),表示上電請(qǐng)求,向整車(chē)CAN總線發(fā)送上電請(qǐng)求報(bào)文的同時(shí)釋放手剎。遠(yuǎn)程上下電控制邏輯如圖11所示。
圖11 遠(yuǎn)程上下電控制邏輯
遙控器和接收器通過(guò)ZigBee無(wú)線模塊建立通信實(shí)現(xiàn)對(duì)車(chē)輛的操控過(guò)程中可能會(huì)因?yàn)閿嚯?、信?hào)傳輸不穩(wěn)定等原因?qū)е峦ㄐ胖袛?,由此帶?lái)安全隱患和諸多風(fēng)險(xiǎn),因此需要建立遙控器和接收器之間通信的安全機(jī)制,將安全交互協(xié)議分別編寫(xiě)進(jìn)兩控制器。
接收器控制器的定時(shí)器1每隔120 ms向遙控器發(fā)送指令0x11,如圖12所示。
圖12 安全交互邏輯1
接收器控制器接收到數(shù)據(jù)后判斷值是否為0xff,如果是,則將標(biāo)志位RC置1,如圖13所示。
圖13 安全交互邏輯2
接收器控制器的定時(shí)器2每隔1 s會(huì)判斷標(biāo)志位RC是否置1,如果置位,則清零;如果沒(méi)有,Num計(jì)數(shù)10次后會(huì)將標(biāo)志位flag置零,如圖14所示。
圖14 安全交互邏輯3
遙控器控制器接收到0x11后會(huì)向接收器控制器發(fā)送指令0xff,如圖15所示。
圖15 安全交互邏輯4
基于上述的安全交互邏輯,需要在主程序中編寫(xiě)因斷電、接觸不良導(dǎo)致通信中斷時(shí)的處理函數(shù),即當(dāng)標(biāo)志位flag置零時(shí),接收器控制器要向整車(chē)發(fā)送報(bào)文實(shí)現(xiàn)無(wú)轉(zhuǎn)向、無(wú)速度且制動(dòng)的功能。
本文介紹的一款基于STM32和Arduino的遙控泊車(chē)裝置經(jīng)過(guò)實(shí)車(chē)測(cè)試驗(yàn)證后,完成預(yù)期設(shè)計(jì)的所有目標(biāo),從硬件選型制作到軟件架構(gòu)編寫(xiě)再到功能標(biāo)定調(diào)試,一步步實(shí)現(xiàn)遙控裝置對(duì)車(chē)輛橫縱向的平穩(wěn)控制和遠(yuǎn)程上下電控制。該裝置的開(kāi)發(fā)成功解決了現(xiàn)有車(chē)鑰匙按鍵少、手機(jī)開(kāi)發(fā)成本高的問(wèn)題,提供了一種綜合性價(jià)比較高的解決方案。