DIY 一个汽车方向盘游戏外设(MMOS OSW DIY)
OSW-MMOS直驱方向盘DIY过程记录 - 简书 (jianshu.com)
1、电机准备
选择支持外部模拟转矩模式的伺服电机+配套伺服驱动器,注意看外部模拟转矩模式下是否支持指令换向
a.亿丰驱动器、时代超群等支持自定义IO输入控制换向的电机,力反馈使用PWM+DIR模式
b.华大、伊莱斯等转矩模式下只支持-10~+10v模拟信号输入控制,力回馈使用100%-50%-0PWM模式,需要使用运放添加减法电路控制
a类咸鱼较少,淘宝全新成套1200-1400左右,b类咸鱼二手较多,价格更低
交流伺服电机是目前性能最好的方案,普遍使用130电机,但130电机单电机就有11kg,家里小需要经常换地的话就很痛苦,于是选了110 6N电机,方便搬动的同时,转动惯量也更小,理论上响应速度也应该更快,伺服电机最高可以达到额定扭矩的3倍,18N应该可以稳稳的满足原G29选手,早期不了解具体特性,咸鱼选了一个伊莱斯电机,价格合适,成色漂亮,到手测了以后才发现不支持换向,来回折腾一个月,终于调试成功
伺服驱动
伺服电机是模拟方向盘最主要的部件,伺服电机要具有模拟量控制的转矩模式。推荐使用伺服电机驱动器:亿丰AASD,台达ASDA-AB,日鼎DCS。
1. 亿丰AASD接线及驱动器设置

主控板上的电机信号控制线为DB9母头
恢复默认设置:
设置Pn000=2后可使用Fn004恢复出厂设置,具体方法请查看驱动器说明书。
参数设置:
Pn002=0 转矩模式。
Pn003=0 外部使能。
Pn018=0或1 当方向盘转向与游戏中相反时改动此参数。
Pn052=1 SigIn1设置为伺服使能。
Pn053=18 SigIn2设置为指令取反。
Pn188=5 设置值越大模拟量响应越慢,干扰噪声越小。
Pn189=30 模拟量与转矩的比例。
Pn191=0或1 反馈力方向不对时改动此参数。
Pn270=300 电机最大转速。
所有设置完成后重新上电。
自动校准模拟量(尽可能不要用自动校准):
断开电机使能,MMOS FFB中进行方向盘对中,进入Fn007,长按SET后显示donE,完成模拟转矩指令校正。如方向盘还会自行转动,可用Pn190进行微调。
使用亿丰伺服电机的设置

2. 台达ASDA-AB接线及驱动器设置
接线如下图

主控板上的电机信号控制线为DB9母头


恢复默认设置:

P2-08=10 恢复出厂配置,完成后重新上电。
参数设置:
P0-02=09 可以在伺服驱动器上看到模拟量电压的大小。
P1-01=03 设定伺服扭矩模式。
P1-46=12500 编码器一圈输出的脉冲数为2500。
P1-55=200 最大转速,根据实际使用情况设置。
P2-10=01 DI1-设置为使能接口。
P2-13=06 DI4-设置为命令输入反向控制。
所有设置完成后重新上电。
自动校准模拟量(尽可能不要用自动校准):
断开电机使能,MMOS FFB中进行方向盘对中,P2-08=20,P4-10=2
如果有报警:
ALE14(逆向极限异常)解除方法P2-16参数值设为0。
ALE15(正向极限异常)解除方法P2-17参数值设为0。
使用台达伺服电机的设置


3. 日鼎DCS接线及驱动器设置

主控板上的电机信号控制线为DB9母头
恢复默认设置:
按MOED/ESC到Fn-01,按向上键到Fn-06,长按SHIFT/ENT出现LoAD后放开,出现donE,初始化成功,重新上电。
参数设置:
Pn-09=2 转矩模式。按MOED/ESC到Pn-01,按向上键到Pn-09,长按SHIFT/ENT数值闪动后放开,按向上/向下键调数值为2(转矩模式),长按SHIFT/ENT出现Pn-09,设置完成。
Pn-10=1 COUNT1设置为使能。
Pn-11=2 COUNT2设置为复位。
Pn-19=2500 编码器单圈脉冲数。
Pn-34=300 最大转速,根据实际使用情况设置。
Pn-54=0.01 VREF电压滤波。
Pn-70=1到1.5 扭矩倍数。
Pn-74=15 15:正向力反馈,14或16:反向力反馈。
所有设置完成后重新上电。
模拟量调零(尽可能不要用自动校准):
断开电机使能,MMOS FFB中进行方向盘对中,运行Fn07,查看ON-10是否为0+/-0.02V,打开电机使能,查看方向盘是否转上一边,Pn-71可进行微调。

作者:fred_wu_xs https://www.bilibili.com/read/cv10344806/ 出处:bilibili
2、STM32控制板
MMOS方案使用stm32f4作为主控板,淘宝上STM32F407普遍50左右,512K的版本就可以,mini的版本体积更小,引脚也够,就选用了这个
使用usb转TTL串口烧录固件后,通过usb连接电脑,启动MMOS软件,可以识别并进行设置
3、扩展输入输出电路
MMOS固件是读取电机编码器数据作为方向盘角度输入,游戏里力回馈数据转换为PWM+方向输出控制电机转动实现力回馈,伺服电机转矩模式支持模拟输入,用pwm当做模拟信号直接输入,电机会有震动,体验并不好,所以需要添加外围电路转换为模拟信号,
编码器信号输入:
便宜的电机都是增量式编码器,ABZ三路信号,每路差分输出,A+A-B+B-Z+Z-,总共6路信号,差分信号可使用单路直接输入,但容易受到干扰,因此使用AM26LS32或sn75175对差分信号进行采集,转换为单路ABZ方波信号,输入至STM32,波形更稳定,方向识别也更精准
力回馈pwm输出:
a.支持指令换向的电机,使用pwm转0-10v模块转换为模拟量后输入,dir作为单独指令输入
b.只支持-10v~+10v的电机,使用pwm转0-10v转换为模拟量,再使用运放减法电路,得到-5v~+5v的模拟输出(https://www.jianshu.com/p/9f9480f7aaca)
-5~+5V的信号可以直接输入至伺服驱动器,驱动器中模拟信号增益可调,将原增益参数调大即可达到300%的转矩控制
pwm转电压目前有两种方案,LTC2644芯片-延迟低速度快价格高,GP8108芯片-价格低速度一般,引脚简单够用
运放减法使用OP07芯片
驱动器使能信号:
驱动器可以设置为通电使能,或IO引脚控制使能,使用控制使能,可以单独外接紧急切断按钮更加安全
无方向控制的-10v~+10v方案中,使用GP8101 pwm转模拟信号模块输出需要10ms左右稳定,未稳定前模块输出为0,通过减法电路后,输入到模拟引脚为-5v,此时如果先伺服电机已经通电,会有一下大幅度反转,比较危险,因此需要添加RC延时导通电路,控制使能信号延时200ms发送(https://www.jianshu.com/p/98396fd67af3)
4、方向盘部分电路连接
电机编码器 —— 驱动器编码器接口CN1(伺服电机成套匹配)
电机动力 —— 驱动器动力接口U V W PE(伺服电机成套匹配)
220V交流电—— 电源滤波器 —— 驱动器rst输入,地线 —— 驱动器外壳或单独接地引脚(地线十分重要,必须接,电机对电网有干扰,会影响踏板的模拟量的输入,可以使用电源录波器来进行隔离,效果显著)
驱动器控制接口CN2 —— STM32控制及板外围电路 (编码器ABZ、驱动器模拟输入、模拟地、方向指令,驱动器使能)
伊莱斯电机编码器为2500线,mmos转数设置10000,勾选反向编码器,PWM设置100.50.0,频率8.2KHz
5、方向盘机械部分组装
电机轴去掉定位梢后,使用张紧套连接方向盘或快拆,张紧套与快拆见需要一个转接法兰连接固定,可3D打印或淘宝CNC定制,竞技方向盘孔距一般为70mm,快拆分70mm和75mm两种
电机本身需要对应尺寸的基座,固定至方向盘支架,淘宝有成品伺服电机支架,孔距需要和游戏支架匹配

DIY 一个汽车方向盘游戏外设(MMOS OSW DIY) | MR (mr-cn.net)
MMOS软件界面

控制方案
所谓的力反馈其实就是扭矩控制。游戏将相应的力反馈信号发送给外设的驱动程序,驱动程序通过USB传输给主控后,主控产生一个PWM信号,其占空比对应游戏的力反馈力度;PWM信号再传输给PAC(PWM-Analog Converter)芯片,PAC芯片按其占空比产生对应幅度的模拟量给伺服驱动器,驱动器将控制电机产生对应扭矩的力。

具体如何设置为扭矩模式需要阅读伺服的说明书。以我的台达为例,扭矩模式下扭矩值通过T_REF的电位控制,所以我们需要PAC芯片根据占空比产生-10~10V的电压信号。要产生正的的模拟量简单,但是负的会麻烦许多,但我们又肯定是需要不同方向的扭矩的。

所以阅读说明书,发现我们可以通过输入一个开关量,控制扭矩的方向。也就是所谓的指令取反功能。这下就简单了,我们将DI4设置为方向取反,之后只需要管扭矩的绝对值,方向通过设置一根单独的方向信号线就可以解决。这也就是所谓的PWM+DIR模式。

不同的伺服有着不同的控制功能和要求,比如日鼎用的是H桥模式,那么我们就需要产生两组PWM信号,用以控制H桥等等。具体的情况需要具体分析,也需要仔细阅读说明书。相对来讲,PWM+DIR是比较简单的一种。

我们使用的是MMOS这一闭源方案,作者提供的固件是没有源码的,因此我们的芯片型号、引脚定义都已经固定好了,我们直接套用即可。如果是日鼎的方案,PE11就是另外一个PWM,仿照PE9串接一个PAC芯片即可。


还需要注意的是,DI-默认是上拉使能的,接在COM-上才是失能。此外,在设计时应该按照说明书的要求,严格区分模拟电与数字电,不同的部分使用不同的电源。使用了差分驱动的信号线,应将差分信号双绞成对传送到光耦。PAC芯片前的光耦,因为传送的是PWM信号,我们需要使用高速光耦,在选型时应注意相关参数。
之后按照说明书,将信号线焊接在相应的引脚上。
参考资料
国内中文资料较多的是哔哩哔哩各个作者的专栏。
DIY伺服直驱方向盘试玩神力科莎 @pkintel DIY伺服直驱方向盘试玩神力科莎_哔哩哔哩_bilibili
这里要特别感谢 @pkintel 前辈,他在视频评论区分享了完整的资料,包括MMOS固件、驱动、设置指南、接线指南以及他设计的多种方案的控制板图纸。
(待完善)台达ASDA-AB伺服器DIY MMOs 直驱力回馈方向盘教程 @极速外卖 (待完善)台达ASDA-AB伺服器DIY MMOs 直驱力回馈方向盘教程 - 哔哩哔哩
该贴内有正确的台达伺服的连接以及设置方法。
MMOS FFB伺服直驱方向盘主控板DIY @fred_wu_xs MMOS FFB伺服直驱方向盘主控板DIY - 哔哩哔哩
该贴内有多种品牌的伺服的连接及设置方法。
【一张图】看懂台达ASDA-AB伺服驱动器diy osw ffb力反馈反向盘参数配置for mmos @辅助全关 【一张图】看懂台达ASDA-AB伺服驱动器diy osw ffb力反馈反向盘参数配置for mmos - 哔哩哔哩
该作者提供了详细的伺服设置方法以及接线方法(不止台达一种,同作者还分享了多种其他伺服的教程)。
DIY国产伺服方向盘完成,教程,MMOS汉化 (stmicroelectronics.cn)
DIY国产伺服方向盘完成,教程,MMOS汉化 (stmicroelectronics.cn)

这次DIY未用到12-24V电源,是直接去电STM32不知道对此有什么影响(后期看是否能慢慢调整)
具体参数设置:1丶驱动器设置Pn02设置为0 (转矩模式)
Pn03设置为0 (外部使能)
Pn53设置为58 (指令取反)用于接PWM&DIR中的DIR
Pn161自定义设置(这个是设置接收型号的区间:自己理解的undefined )
Pn162同上
Pn190模拟转矩指令偏移调整:自定义设置(受STM32影响)
输出的DAC电压值大小
Pn191模拟转矩指令方向:这个也要用到,当方向反转时伺服停止使能,设置本参数(1-2)具体看自己之前设置,然后
调转A.B相
驱动器参数设置到这里基本上就可以了,其他关于刚性等需设置Pn190往下的参数,详情请自己研究说明书
2丶接线:本次接线CN2公用了8根线算上外接使能那根一共10根 (抱歉接线错了,上班整的怕领导发现,现在更新下)
驱动器 连接线 STM32
6-----------红-----------使能
9-----------蓝-----------电源(12-24V这里我用了5Vundefined )
10-----------白-----------COM(应该是12-24V的地线)
13-----------黑-----------地AGND模拟量输入地线 接STM32地
15-----------黄-----------编码器Z+ 对应stm32的PA2
18-----------橙-----------编码器B+ 对应stm32的PA1
20-----------清-----------编码器A+ 对应stm32的PA0
25-----------紫-----------Vref模拟量输入 对应stm32的PE9
7 -----------绿-----------指令取反 对应stm32的PE11
链接线只做参考,具体颜色请自己区分
哔哩哔哩几个UP的视频参考
超详细低成本自制模拟器教学 教程向!_哔哩哔哩_bilibili
OSW MMOSFFB 多功能自制主控板调试_哔哩哔哩_bilibili
好用不贵,自制MMOS,国产伺服直驱方向盘,新手小白详尽流程_哔哩哔哩_bilibili
MMOS FFB伺服直驱方向盘主控板DIY - 哔哩哔哩 (bilibili.com)
好用不贵,自制MMOS,国产伺服直驱方向盘,新手小白详尽流程-硬件综合区-外设天下-电脑外设发烧友聚集地 (wstx.com)



【一张图】看懂台达ASDA-AB伺服驱动器diy osw ffb力反馈反向盘参数配置for mmos - 哔哩哔哩 (bilibili.com)

【一张图】配置台达伺服diy osw ffb mmos力反馈直驱台达方案_哔哩哔哩_bilibili
相关文章:
DIY 一个汽车方向盘游戏外设(MMOS OSW DIY)
OSW-MMOS直驱方向盘DIY过程记录 - 简书 (jianshu.com) DIY 一个汽车方向盘游戏外设(MMOS OSW DIY) 首先讲一下这个直驱系统大概的框架,首先是电脑,电脑里装MMOS的软件(这个软件国内高手把它汉化了的),电脑通过USB线&a…...
校园网络技术需求分析
路由技术: 路由协议工作在 OSI 参考模型的第 3 层,因此它的作用主要是在通信 子网间路由数据包。路由器具有在网络中传递数据时选择最佳路径的能力。 除了可以完成主要的路由任务,利用访问控制列表(Access Control List&#x…...
计算机网络(二):TCP篇
文章目录 1. TCP头部包含哪些内容?2. 为什么需要 TCP 协议? TCP 工作在哪一层?3. 什么是 TCP ?4. 什么是 TCP 连接?5. 如何唯一确定一个 TCP 连接呢?6. UDP头部大小是多少?包含哪些内容…...
测试登录界面:Python
import unittest from selenium import webdriver class LoginTest(unittest.TestCase): def setUp(self): self.driver webdriver.Chrome() def test_login(self): # 打开登录页面 self.driver.get("http://example.com/login") # 输入用户名和密码 user…...
Rust踩雷笔记(7)——两个链表题例子初识裸指针
目录 leetcode 234leetcode 19 leetcode 234 题目在这https://leetcode.cn/problems/palindrome-linked-list/,leetcode 234的回文链表,思路很简单,就是fast和slow两个指针,fast一次移动两个、slow一次一个,最后slow指…...
用什么命令看Linux系统的体系架构
要查看Linux系统的体系架构,可以使用uname命令。在终端中运行以下命令: uname -m该命令将返回系统的体系架构,例如x86_64表示64位系统,i686表示32位系统。 uname 使用方法 uname命令用于获取操作系统的相关信息。它可以用于显示…...
消息中间件大揭秘:选择之前你必须知道的关键信息
Hello大家好!我是小米,很高兴再次和大家见面!今天的话题非常精彩,我们将深入探讨消息中间件,并了解一些常见的消息队列:RabbitMQ、RocketMQ、Kafka以及Redis。如果你正在准备面试,或者只是对这些…...
【Unity基础】4.动画Animation
【Unity基础】4.动画Animation 大家好,我是Lampard~~ 欢迎来到Unity基础系列博客,所学知识来自B站阿发老师~感谢 (一)Unity动画编辑器 (1)Animation组件 这一张我们要学习如何在unity编辑器中&…...
FreeRTOS移植以及核心功能
文章目录 freertos和ucos区别,优缺点比较移植步骤核心功能内存管理(5种内存管理策略)FreeRTOS任务调度算法有三种时间管理通信管理 栈管理 freertos和ucos区别,优缺点比较 FreeRTOS(Free Real-Time Operating System&…...
重装系统(配置环境)
这里写目录标题 0.重装系统1.python1.1 anaconda1.2 pycharm1.3 深度学习环境配置 2.java2.1.安装JDK2.2.配置JDK环境变量2.3IDEA2.4 Maven 3.大数据3.1 虚拟机3.2 Hadoop平台3.3 存储3.4 采集3.5 计算3.6 查询3.7 可视化 0.重装系统 // An highlighted block var foo bar;1.…...
docker系列-报错以及解决指南
1. windows运行docker报错Windows Hypervisor is not presentDocker Desktop is unable to detect a Hypervisor.Hardware assisted virtualization and data execution protection must be enabled in the BIOS. Docker Desktop - Windows Hypervisor is not presentDocker D…...
Vue3快速上手
1.Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址:Release v3.0.0 One Piece vuejs/core GitHub 2.Vue3带…...
二叉搜索树(BST,Binary Search Tree)
文章目录 1. 二叉搜索树1.1 二叉搜索树概念1.2 二叉搜索树的查找1.3 二叉搜索树的插入1.4 二叉搜索树的删除 2 二叉搜索树的实现3 二叉搜索树的应用3.1二叉搜索树的性能分析 1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树,它或者是一棵空树…...
分析key原理
总结: key是虚拟dom对象的标识,当数据发生变化时,vue会根据新数据生成新的虚拟dom,随后vue进行新虚拟dom与旧虚拟dom的差异比较 比较规则: ①旧虚拟dom中找到了与新虚拟dom相同的key 若虚拟dom中的内容没变,…...
[CISCN2019 华东南赛区]Web11 SSTI
这道SSTI 差点给我渗透的感觉了 全是API 我还想去访问API看看 发现这里读取了我们的ip 我们抓包看看是如何做到的 没有东西 我们看看还有什么提示 欸 那我们可不可以直接修改参数呢 我们传递看看 发现成功了 是受控的 这里我就开始没有思路了 于是看了wp 说是ssti 那我们看…...
百度春招C++后端面经总结
这次的面经,主要都是问操作系统、网络编程、C++ 这三大方向。 能明显感觉到,C++面试和Java或者Go面试重点,Java/Go主要是问MySQL、Redis。 一、介绍一下webserver项目 服务器开始运行,创建(初始化)线程池(IO密集型,线程数n+1); 创建 epoll 对连接进行监听 监听到连…...
小程序开发一个多少钱啊
在今天的数字化时代,小程序已经成为一种非常流行的应用程序形式。由于它们的便捷性、易用性和多功能性,小程序吸引了越来越多的用户和企业。但是,很多人在考虑开发一个小程序时,都会遇到同一个问题:开发一个小程序需要…...
C# 随机数生成 Mersenne Twister 马特赛特旋转演算法 梅森旋转算法
NuGet安装MathNet.Numerics 引用: using MathNet.Numerics.Random; /// <summary>/// 包括lower,不包括upper/// </summary>/// <param name"lower"></param>/// <param name"upper"></param>/// <para…...
C++进阶(二)
目录 1、Vector2D 默认构造、重载 2、char 深度理解 3、深度理解简单的类操作 1、Vector2D 默认构造、重载 #include <iostream> #include <cmath>class Vector2D { private:double x; // X坐标double y; // Y坐标public:// 默认构造函数,将向量初…...
zoneinfo
在Linux系统中,zoneinfo是一个包含了世界各地时区信息的目录,通常位于/usr/share/zoneinfo。这个目录下的子目录和文件名对应了各个时区的名称。例如,/usr/share/zoneinfo/America/Los_Angeles文件就包含了美国洛杉矶的时区信息。 你可以通过…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...
