本人的本科毕业设计,一款基于STM32F407的大学生方程式赛车方向盘,具体实现功能如下:
- 采集整车跑动数据(实车模式)以及模拟器数据(模拟器数据),并在仪表上进行实时显示。
- 通过4G网络,对实车的跑动数据进行实时上传,实现无线数据传输功能。
- 能够对实车的跑动数据进行采集和保存,方便技术人员对跑动数据进行复盘和分析。
- 实现控制器功能,能够控制如神力科莎(Assetto Corsa)、神力科莎:争锋(Assetto Corsa Competizione)、F1系列等模拟类赛车游戏。
- 为了保证实车的可用性,需要具备高亮度的屏幕保证仪表在阳光下的可视效果。
- 具备可编程按键,实时调整车辆状态。
本项目适用于大学生方程式赛事(👈戳我了解),因此方向盘外形是依照大学生方程式赛事规则进行设计的。功能上,实车模式开发基于河北工程大学凌云车队(👈戳我了解)凌云Ⅸ号电动方程式赛车。模拟器功能基于神力科莎(👈戳我了解)进行测试。
本项目是开源项目:你可以再分发之和/或依照由自由软件基金会发布的 GNU 通用公共许可证修改之,无论是版本 3 许可证,还是(按你的决定)任何以后版都可以。
发布该项目是希望它能有用,但是并无保障;甚至连可销售和符合某个特定的目的都不保证。请参看 GNU 通用公共许可证,了解详情。
你应该随程序获得一份 GNU 通用公共许可证的复本。如果没有,请看https://www.gnu.org/licenses/
方向盘的外形和结构依照大学生方程式赛事规则进行设计:
方向盘盘体宽度为250mm,高度170mm。屏幕尺寸为3.5英寸。盘体正面有8个可编程控制器按键。背面安装两个换挡拨片。方向盘上壳体和下壳体使用碳纤维板进行CNC加工,其余零部件如握把、屏幕安装罩、方向盘边缘外壳、换挡拨片连杆及换挡拨片壳体使用黑色树脂进行3D打印加工。
另外设计了一个兼容罗技G27基座的方向盘转接器,所以在我的github仓库中出现了两个3D模型,一个是使用了实车的快拆器(4滚珠),一个是使用了连接到G27的3D打印的方向盘转接器。
BOM配料单请戳👉我
https://github.com/Nolimy/steeringWheel_MeterBox_STM32_FreeRTOS/blob/main/Steering_Wheel_BOM.xlsx
完整装配模型请戳(实车)👉我https://github.com/Nolimy/steeringWheel_MeterBox_STM32_FreeRTOS/blob/main/Model/steeringWheel_2023_Release v13.step
3D打印服务推荐嘉立创旗下三维猴:https://www.sanweihou.com/, 三维猴提供在线报价,CNC加工,3D打印等一站式服务。
方向盘分为三种模式:待机模式、实车模式和模拟器模式。方向盘上电后,默认为待机模式。当方向盘收到CAN报文,则为实车模式;当方向盘收到串口报文,则为模拟器模式。在待机模式下,电脑可以识别出方向盘为USB设备,但是手柄按键无响应,此时需要使用Simhub的自定义串口设备功能给方向盘发送串口报文,方可进入模拟器模式,模拟器模式手柄按键有响应。因此,使用模拟器模式需要同时使用simhub的自定义串口设备功能。
待机模式下,SLM(换挡LED模块)12颗LED灯珠全部为蓝色。
方向盘默认使用的是125kbps的波特率,波特率可以使用CubeMX对波特率进行配置和修改,具体CAN协议请根据自家车队的实际情况,修改BSP/CAN中的代码。
模拟器使用需要配合Simhub进行使用。将方向盘使用USB接口连接电脑后,电脑会识别出一个虚拟串口设备和控制器设备:
在“设置”中的“蓝牙和其他设备”中可以查看到方向盘的LY_Wheel_Controller外设。
在“设备管理器”中可以查看到方向盘的虚拟串口设备及其端口号。
方向盘控制器的校准,点击“蓝牙和其他设备”右侧的“设备和打印机”:
找到”LY_Wheel_Controller”,右键,点击 “游戏控制器设置”,然后点击“属性”.
在测试页中,可以对方向盘的按键进行测试。(默认待机模式下按下方向盘按钮是没有任何反应的)
方向盘的显示功能需要simhub配合使用,可以访问https://www.simhubdash.com/下载simhub软件。这是一个非常强大的软件,支持多种模拟器游戏的数据采集,支持包括汽车仪表、arduino、G力座椅等多种外设。
安装好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;
点击”Edit”:
点击”Computed value“:
勾选”Use JavaScript”:
将代码粘贴到文本框中:
正常情况下Raw result中可以生成完整的json字符串。最后点击连接按钮,稍等片刻,就可以看到方向盘的SLM的全部蓝灯熄灭,此时进入模拟器模式。这时进行手柄按键测试,可以看到按钮可以被正常检测到。
以”Assetto Corsa“为例,在保证simhub后台运行的条件下,启动游戏。进入控制设置,将模拟器键位改成识别到的控制器按键键位,如下图:
接下来启动游戏,就可以拥有和实车方向盘一样的体验了。
主控使用STM32F407ZET6(裆燃也可以使用ROM更大的STM32F407ZGT6),鉴于STM32系列芯片的价格偏高,大家也可以选择其他的如GD32等国产芯片进行替代(目前我还没有测试过)。
无线数传功能上,使用4G模块,采用移远的BC260Y,使用串口与STM32主控进行通信,将主控采集到的数据通过MQTT发送给服务器。
屏幕使用了柯达科的KD035HVFMD145-01(datasheet),屏幕使用ST7796s控制器,MCU通过8080时序对屏幕进行控制。该屏幕的亮度最高为950尼特,基本满足了阳光下的可视需求。
换挡提示灯条使用WS2812B LED,通过STM32的TIM定时器 DMA对LED进行控制。
使用NXP的TJA1050收发器,对实车跑动数据使用CAN进行采集。
方向盘为USB复合设备,通过USB虚拟串口,对模拟器的跑动数据进行采集。此功能依赖于Simhub软件。同时,还包括一路joystick控制器功能,能够对游戏中的车辆进行控制,如换挡,DRS等功能。
完整的硬件工程已经开源在嘉立创开源广场平台,PCB使用四层板,尺寸在100mm*100mm以内,嘉立创平台可免费打样(JLC YYDS)。
PS:本项目硬件部分完全由嘉立创EDA专业版设计。
图形界面使用LVGL图形库,UI设计使用LVGL官方的SquareLine工具,SquareLine能直观的进行UI设计并将UI设计导出为C文件和H文件。
未完待续。。。