# 关于本项目
写在最前面:毕业之后一直在忙着各种事情,楼主已经参加工作,平时工作比较饱和故暂时没有精力继续完善本项目的内容。趁着十一假期将自己毕业论文中的内容开源到了github(由于论文内容过多,整理起来难度较大,没有同步更新到JLC开源平台,还请审核担待~~),更多资料大家可以移步**github仓库:https://github.com/Nolimy/steeringWheel_MeterBox_STM32_FreeRTOS**
另外对本项目感兴趣的可以加Q群:**811038451**,欢迎交流!
- - -
本人的本科毕业设计,一款基于STM32F407的大学生方程式赛车方向盘。在2022年九月份有了这个想法,目前该项目已经完成了基本功能的开发。因为我在本科期间参与了大学生方程式赛事,对大学生方程式赛车的电控系统有一定了解,在赛车的仪表系统和数据采集方案上,国内大多数车队的解决方案是选择购买使用Motec的CDL3或者C125仪表,这些仪表普遍价格偏高,自行DIY设计的仪表大多数功能不够完善,因此萌生了制作一款低成本的集成在方向盘内的数据采集及仪表系统。具体实现功能如下:
1. 采集整车跑动数据(实车模式)以及模拟器数据(模拟器数据),并在仪表上进行实时显示。
2. 通过4G网络,对实车的跑动数据进行实时上传,实现无线数据传输功能。
3. 能够对实车的跑动数据进行采集和保存,方便技术人员对跑动数据进行复盘和分析。
4. 实现控制器功能,能够控制如神力科莎(Assetto Corsa)、神力科莎:争锋(Assetto Corsa Competizione)、F1系列等模拟类赛车游戏。
5. 为了保证实车的可用性,需要具备高亮度的屏幕保证仪表在阳光下的可视效果。
6. 具备可编程按键,实时调整车辆状态。
本项目适用于[大学生方程式赛事](http://www.formulastudent.com.cn/)(👈戳我了解),因此方向盘外形是依照大学生方程式赛事规则进行设计的。功能上,实车模式开发基于[河北工程大学凌云车队](https://mp.weixin.qq.com/s/ZAOASNooHUo55yaDqNu9HA)(👈戳我了解)凌云Ⅸ号电动方程式赛车。模拟器功能基于[神力科莎](https://store.steampowered.com/app/244210/Assetto_Corsa/)(👈戳我了解)进行测试。
- - -
本项目是开源项目:你可以再分发之和/或依照由自由软件基金会发布的 GNU 通用公共许可证修改之,无论是版本 3 许可证,还是(按你的决定)任何以后版都可以。
发布该项目是希望它能有用,但是并无保障;甚至连可销售和符合某个特定的目的都不保证。请参看 GNU 通用公共许可证,了解详情。
你应该随程序获得一份 GNU 通用公共许可证的复本。如果没有,请看 <https://www.gnu.org/licenses/>。
![gplv3-with-text-136x68.png](//image.lceda.cn/pullimage/OrsZJibtoynD1VSqsoGtDDsfEpGPIVBjKca3q3tB.png)
- - -
# 关于结构设计
方向盘的外形和结构依照大学生方程式赛事规则进行设计:
![steeringWheel_2023_Release_v2_back_up.png](//image.lceda.cn/pullimage/6UU1noZ62i6hFoX4FEW6rP2NC6p36UxQuMkaBDZs.png)
![steeringWheel_2023_Release_v2_back.png](//image.lceda.cn/pullimage/KRLUKJrP8LTwQU8oxdZm26F5HwmR0EsTjgGguXTC.png)
![20230214153308.png](//image.lceda.cn/pullimage/8P7I6ZNs57CXSxtybFbyDNAVDuzZJOIG7RxRTOA5.png)
![steeringWheel_2023_Release_front.png](//image.lceda.cn/pullimage/JNwi7bqKJ8Dt6SrJHWYHF0GMpJMiYuG73Xf51YKk.png)
- - -
方向盘盘体宽度为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%20v13.step)
(模拟器):👉[我](https://github.com/Nolimy/steeringWheel_MeterBox_STM32_FreeRTOS/blob/main/Model/steeringWheel_2023_Simulator_For_G27%20v3.step)
3D打印服务推荐嘉立创旗下三维猴:[https://www.sanweihou.com/](https://www.sanweihou.com/), 三维猴提供在线报价,CNC加工,3D打印等一站式服务。
- - -
# 如何使用
方向盘分为三种模式:待机模式、实车模式和模拟器模式。方向盘上电后,默认为待机模式。当方向盘收到CAN报文,则为实车模式;当方向盘收到串口报文,则为模拟器模式。在待机模式下,电脑可以识别出方向盘为USB设备,但是手柄按键无响应,此时需要使用Simhub的自定义串口设备功能给方向盘发送串口报文,方可进入模拟器模式,模拟器模式手柄按键有响应。因此,使用模拟器模式需要同时使用simhub的自定义串口设备功能。
待机模式下,SLM(换挡LED模块)12颗LED灯珠全部为蓝色。
## 大学生方程式实车使用
方向盘默认使用的是125kbps的波特率,波特率可以使用CubeMX对波特率进行配置和修改,具体CAN协议请根据自家车队的实际情况,修改BSP/CAN中的代码。
## 模拟器使用
### 方向盘连接
模拟器使用需要配合[Simhub](https://www.simhubdash.com/)进行使用。将方向盘使用USB接口连接电脑后,电脑会识别出一个虚拟串口设备和控制器设备:
![在“设置”中的“蓝牙和其他设备”中可以查看到方向盘的LY_Wheel_Controller外设。](//image.lceda.cn/pullimage/ROVQlrFS3HaavlfHbsHIzw3FhJClZ3MuuOi0fGu0.png)
在“设置”中的“蓝牙和其他设备”中可以查看到方向盘的LY_Wheel_Controller外设。
![USB_Serial.png](//image.lceda.cn/pullimage/Umlo1r3BiurxNqzY1juTs0P89PbWsLuDJLhnTSmL.png)
在“设备管理器”中可以查看到方向盘的虚拟串口设备及其端口号。
方向盘控制器的校准,点击“蓝牙和其他设备”右侧的“设备和打印机”:
![controller_config.png](//image.lceda.cn/pullimage/nu8C7FhW7EGOTIdUhsVGzwR9zGmqN0NaZZxNKOKN.png)
找到”LY_Wheel_Controller”,右键,点击 “游戏控制器设置”,然后点击“属性”.
![controller.png](//image.lceda.cn/pullimage/VxFPiHRbidL8abXNAIGgUQOt1xozjs0IBu4ZeqJg.png)
在测试页中,可以对方向盘的按键进行测试。(默认待机模式下按下方向盘按钮是没有任何反应的)
![controller_.png](//image.lceda.cn/pullimage/tFFeTuYrmiK30uuzvzniRZA4aA5qi3RJ032vAHNi.png)
### Simhub配置
方向盘的显示功能需要simhub配合使用,可以访问[https://www.simhubdash.com/](https://www.simhubdash.com/)下载simhub软件。这是一个非常强大的软件,支持多种模拟器游戏的数据采集,支持包括汽车仪表、arduino、G力座椅等多种外设。
安装好simhub后,打开设置界面:
![simhub1.png](//image.lceda.cn/pullimage/oNCv4x5DUQqj5Vrckvvs4hKYo6spO9JYA98iwoVY.png)
点击插件功能:
![simhub2.png](//image.lceda.cn/pullimage/Ktkah4XNisNX8TOTY3OmFdqlFBmkL8UWsUdRkygL.png)
打开”Custom serial devices“插件:
![simhub3.png](//image.lceda.cn/pullimage/jIK7ugK2f3him0wZvnxnYnjwhZKO7lOMILEajdwV.png)
重新打开simhub后,左侧菜单中会出现”Custom Serial Devices”按钮:
![simhub4.png](//image.lceda.cn/pullimage/usJqqjim0Osxi1TXQj3SmXxGTHhF4XgibreFuX2A.png)
![simhub5.png](//image.lceda.cn/pullimage/uGypxj3aM7Vl4F4DhlVJcgSheeGEyXrH6lq9wcrA.png)
根据设备管理器中显示的方向盘的串口端口,选择serial port,我这里使用的是COM15。
![simhub6.png](//image.lceda.cn/pullimage/u9zV2JDRtdYeuEqKTIlj99R8atIR6swHiBiFz9SP.png)
添加游戏数据打包json脚本,将以下javaScript代码粘贴到”Uptate messages“中:
```jsx
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”:
![simhub7.png](//image.lceda.cn/pullimage/lPtjrkPn6Pv39xB1zgFyDlOLWybl5CJ1SAcRlen8.png)
点击”Computed value“:
![simhub8.png](//image.lceda.cn/pullimage/9LlgDQzztzw7LxiwxO6G8HHTBLJfQKhw6Dh50OOA.png)
勾选”Use JavaScript”:
![simhub9.png](//image.lceda.cn/pullimage/y2FdP7mdGgvxs2InRYQsu3Usq1m5zhhPGVYPB8Iw.png)
将上述的javaScript代码粘贴到文本框中:
![simhub10.png](//image.lceda.cn/pullimage/JRZDAmSIEu58P3tmtjQtqrVwdBxxYYVawL0fhK5J.png)
正常情况下Raw result中可以生成完整的json字符串。最后点击连接按钮,稍等片刻,就可以看到方向盘的SLM的全部蓝灯熄灭,此时进入模拟器模式。这时进行手柄按键测试,可以看到按钮可以被正常检测到。
![steeringWheel.jpg](//image.lceda.cn/pullimage/qExzTShkZIFMw7HhplLgnd4Ljl5hdDyJPvpioiKJ.jpeg)
### 游戏内配置
以”Assetto Corsa“为例,在保证simhub后台运行的条件下,启动游戏。进入控制设置,将模拟器键位改成识别到的控制器按键键位,如下图:
![asseto_Corsa1.png](//image.lceda.cn/pullimage/X9NEsQKkip2GdzfEJJfT6CqOR1zY79MsV1ZbZ3k9.png)
接下来启动游戏,就可以拥有和实车方向盘一样的体验了。
![R2-20230304_173839869.jpg](//image.lceda.cn/pullimage/VueYo9EhCg1LLoib0HUHyJYYxFWjAm3TKM2saesw.jpeg)
---
# 系统框架
![QQ截图20230304213039.png](//image.lceda.cn/pullimage/ZCwfbes0MQVU65qEpfw4HWFwBu42s24I1W7n0WKw.png)
# 关于电路设计
主控使用STM32F407ZET6(裆燃也可以使用ROM更大的STM32F407ZGT6),鉴于STM32系列芯片的价格偏高,大家也可以选择其他的如GD32等国产芯片进行替代(目前我还没有测试过)。
![STM32F407.png](//image.lceda.cn/pullimage/FdFrx5O938Kh5vAkSPt9uTuQig2wIIrdX6Tth4RY.png)
无线数传功能上,使用4G模块,采用移远的BC260Y,使用串口与STM32主控进行通信,将主控采集到的数据通过MQTT发送给服务器。
![BC260Y.png](//image.lceda.cn/pullimage/FKXU4Meg7BKJEYwjvZf6ORAIB5fCRnPYS4940F6t.png)
屏幕使用了柯达科的KD035HVFMD145-01([datasheet](https://github.com/Nolimy/steeringWheel_MeterBox_STM32_FreeRTOS/blob/main/Hardware/Datasheet/LCD/1707022343KD035HVFMD145-01%20SPEC%20V1.0.pdf)),屏幕使用ST7796s控制器,MCU通过8080时序对屏幕进行控制。该屏幕的亮度最高为950尼特,基本满足了阳光下的可视需求。
![LCD.png](//image.lceda.cn/pullimage/U6z2H2MtRGxEl6kpp29Im1wTZcaRPUMgVZ8jTfzb.png)
换挡提示灯条使用WS2812B LED,通过STM32的TIM定时器 DMA对LED进行控制。
![WS2812B.png](//image.lceda.cn/pullimage/GFULrhkeDkBrjZHqfH0xg5covbjGYun98c9axi34.png)
使用NXP的TJA1050收发器,对实车跑动数据使用CAN进行采集。
![CAN原理图.png](//image.lceda.cn/pullimage/FkFATsDyNG1GuLoX3YXqL2s92m8AQos6XsBwLAYe.png)
方向盘为USB复合设备,通过USB虚拟串口,对模拟器的跑动数据进行采集。此功能依赖于Simhub软件。同时,还包括一路joystick控制器功能,能够对游戏中的车辆进行控制,如换挡,DRS等功能。
# 实物展示
![R2-20230224_172748182.jpg](//image.lceda.cn/pullimage/X0Qe3AcA3TrxPoIxCWJZUmURgxQLdCHqQ0WzldNb.jpeg)
![R2-20230224_173118793.jpg](//image.lceda.cn/pullimage/kjl9Tx0Y7v58MxMa7WdxUV4qzlSCmBbzN9VifDwp.jpeg)
![R2-20230224_172813488.jpg](//image.lceda.cn/pullimage/aHcwrs5aebJMDPXBOjuqxJheK28NwHWG63EWdV9r.jpeg)
![R2-20230224_173240145.jpg](//image.lceda.cn/pullimage/RThptxWZYceroEVbghlNzw1XSqCVx4NjbrFdZBzj.jpeg)
![R2-20230214_223244177.jpg](//image.lceda.cn/pullimage/JTo6dyiCPJVuVHSrW1nRmwbMOsdNp9HDIsKJ0eaR.jpeg)
# 视频演示
视频演示请参考[【毕设】做了一款超帅的方向盘!兼容实车和模拟器](https://www.bilibili.com/video/BV1q24y1T7iM/?spm_id_from=333.1007.top_right_bar_window_default_collection.content.click&vd_source=7398d178fb2550fd69abea7185ad3c5f)
# 其它附件上传
更多请访问github项目仓库:[https://github.com/Nolimy/steeringWheel_MeterBox_STM32_FreeRTOS](https://github.com/Nolimy/steeringWheel_MeterBox_STM32_FreeRTOS)
126
170
收藏到专辑