您的位置 首页 kreess

用STM32做瞭一個方向盤,比買的更合心意,電路代碼開源!適用於大學生方程式汽車大賽

我用STM32做瞭一個賽車方向盤,使用效果是這樣的:除瞭在真·賽車上使用,它還能用於賽車遊戲:自己做的就是好,比買的更合心意~4大功能說明跑動數據采集實時顯示數據屏幕亮度在

我用STM32做瞭一個賽車方向盤,使用效果是這樣的:

除瞭在真·賽車上使用,它還能用於賽車遊戲:

自己做的就是好,比買的更合心意~

4大功能說明

  • 跑動數據采集
  • 實時顯示數據
  • 屏幕亮度在陽光下可視
  • 具備可編程按鍵,實時調整車輛狀態

賽車過程中,最重要的就是車的跑動數據。

實時顯示是為瞭在賽程中瞭解車輛性能,及時調整狀態;保存與采集數據,是為瞭方便後續的復盤、分析、改進。

另外,這個方向盤還能控制各類模擬賽車遊戲,如——神力科莎(Assetto Corsa)、神力科莎:爭鋒(Assetto Corsa Competizione)、F1系列等。

電路設計圖

系統框架使用嘉立創EDA設計的原理圖使用嘉立創EDA設計的PCB圖PCB板實物

原理圖解說

1.無線傳輸

無線數傳功能使用4G模塊、BC260Y實現。

無線傳輸需使用串口與STM32主控進行通信,再將主控采集到的數據通過MQTT發送給服務器。

2.屏幕

屏幕使用柯達科的KD035HVFMD145-01。

ST7796s控制器的MCU通過8080時序對屏幕進行控制。

屏幕的亮度最高為950尼特,基本滿足瞭陽光下的可視需求。

3.燈條

換擋提示燈條使用WS2812B LED,通過STM32的TIM定時器DMA對LED進行控制。

4.收發器

使用NXP的TJA1050收發器,對實車跑動數據使用CAN進行采集。

5.主控

主控使用STM32F407ZET6。如果希望DIY成本再降低,可以改成GD32之類的芯片。

3D外殼設計

方向盤外殼尺寸:寬度250mm*高度170mm;屏幕尺寸:3.5英寸。

①盤體正面:有8個可編程控制器按鍵。

②盤體背面:有兩個換擋撥片。

③CNC加工部分:方向盤上殼體、下殼體使用碳纖維板加工。

④3D打印/黑色樹脂加工部分:方向盤握把、屏幕安裝罩、方向盤邊緣外殼、換擋撥片連桿、換擋撥片等零件,使用黑色樹脂進行加工。

⑤3D打印工具:推薦三維猴,上面說的CNC加工,3D打印都可以搞定。

⑥3D打印材料:可以考慮將握把的3D打印件更換為手膠,不但節省成本,而且比打印件更輕。

方向盤工作原理

方向盤分為三種模式:待機模式、實車模式、模擬器模式。

  • 方向盤上電後,默認為待機模式,方向盤不運行。
  • 方向盤收到CAN報文後,為實車模式,方向盤在賽車中運行;
  • 方向盤收到串口報文後,為模擬器模式,方向盤在遊戲中運行。

通俗一些講:

在待機模式下,12顆LED燈珠會全部為藍色。電腦可以識別出方向盤為USB設備,但是手柄按鍵無響應。

這時,你一鍵切換“模式”,Simhub的自定義串口就會給方向盤發送串口報文,方向盤就會自動進入模擬器模式。(下個章節有保姆級教程)

實車模式同理。

想參考著DIY的夥伴請註意:

  • 實車模式的CAN協議請根據自傢車隊的實際情況,修改BSP/CAN的代碼。
  • 方向盤默認使用的是125kbps的波特率,波特率可以使用CubeMX對波特率進行配置和修改。

模擬器模式_保姆級開發教程

本章節著重說明——如何在遊戲中,擁有真實賽車方向盤的體驗。

首先,我們要學會如何將方向盤連接至設備。

1.方向盤連接

模擬器需要配合Simhub進行使用。

①用USB將方向盤連接至電腦。

②電腦會識別出一個虛擬串口設備和控制器設備:

③在“設置”中的“藍牙和其他設備”中,查看方向盤的LY_Wheel_Controller外設。

④在“設備管理器”中查看方向盤的虛擬串口設備及其端口號。

⑤校準方向盤控制器:點擊“藍牙和其他設備”右側的“設備和打印機”:

⑥找到”LY_Wheel_Controller”,右鍵,點擊 “遊戲控制器設置”,然後點擊“屬性”。

⑦在測試頁中,對方向盤的按鍵進行測試。

默認待機模式下按下方向盤按鈕是沒有任何反應的。

然後,需要配置simhub,確保方向盤能正常使用。

2.Simhub配置

①訪問https://www.simhubdash.com/下載simhub軟件。

②安裝好simhub後,打開設置界面:

③點擊插件功能:

④打開”Custom serial devices“插件:

⑤重新打開simhub後,左側菜單中會出現”Custom Serial Devices”按鈕:

⑥根據設備管理器中顯示的方向盤的串口端口,選擇serial port,我這裡使用的是COM15。

⑦添加遊戲數據打包json腳本,將以下javaScript代碼粘貼到”Uptate messages“中:

function getCurrentLapTime(){
var lapTime = $prop('CurrentLapTime');
lapTime = lapTime.toString();
if(lapTime == "00:00:00")
{
return lapTime;
}
else
lapTime = lapTime.toString().slice(3,11);
return lapTime;
}
function getRPM(){
var rpm = $prop('DataCorePlugin.GameData.NewData.Rpms');
rpm = format(rpm,"0");
return rpm;
}
function getSpeed(){
var speed = $prop('SpeedKmh');
speed = format(speed, '0');
return speed;
}
function getGear(){
var gear = $prop('Gear');
return gear;
}
function getBestLapTime(){
var bestLapTime = $prop('BestLapTime');
bestLapTime = bestLapTime.toString();
if(bestLapTime == "00:00:00")
{
return bestLapTime;
}
else
bestLapTime = bestLapTime.toString().slice(3,11);
return bestLapTime;
}
function getFuel(){
var fuel = $prop('FuelPercent');
fuel = format(fuel, '0');
return fuel;
}
function getRedLine(){
var redLine = $prop('CarSettings_CurrentGearRedLineRPM');
return redLine;
}
function getBrake(){
var brake = $prop('Brake');
brake = format(brake, '0');
return brake;
}
function getThrottle(){
var throttle = $prop('Throttle');
throttle = format(throttle, '0');
return throttle;
}
function getLap()
{
lap = $prop('CurrentLap');
return lap;
}
var speed = getSpeed();
var carData = "{"speed":" + getSpeed() + ","rpm":" + getRPM() + ","cLapTime":" +""" + getCurrentLapTime() + ""," +""gear":" + """ +getGear() + """ + ","bLapTime":" +""" + getBestLapTime() + """+ ","fuel":"+ getFuel() + ","redLineRPM":"+ getRedLine()
+ ","brake":" + getBrake() + ","throttle":"+ getThrottle() + ","lap":"+ getLap() +"}";
return carData;

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部