3GO模拟飞行网|3GO Cyber Air Force

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 18853|回复: 69

我的DIY——USB 光电5轴游戏控制器-写在圣诞节(已上图)

[复制链接]
发表于 2010-12-26 00:52:47 | 显示全部楼层 |阅读模式
本帖最后由 hbk0401 于 2010-12-26 12:19 编辑

我是个电工,一直想搞清楚USB协议到底是怎么样的一种协议却又找不到合适的机会、一直想搞一套游戏方向盘来结束用键盘玩漂移的日子又不想太破费、一直想DIY一个属于自己的方向盘但又不知从何下手。

近日又迷上了模拟飞行,发现原来还有飞行脚跎这种东西,而且方向盘的踏板还可以当脚跎使用!

2010 09 11 从淘宝的一位卖家那里找到了Saitek R220的散件http://trade.taobao.com/trade/detail/trade_snap.htm?trade_id=47223560298560卖家说“电脑不识别,喜欢DIY的或者收藏爱好者的超值选择!外观良好!先捡最新的发!”

这是多好的机会,我造不出商家那么好的塑料模制件,但是如果只是电脑不识别,不就是修一下吗,大不了制造一个全新的USB控制器。我还是信心满满的,于是我拍下了这堆废料和X52。

2010 09 12 如果这个盘子只是断线了或者是外围元件损坏了,我都可以轻松修复,就怕主控芯片坏了,那就要花不少功夫了。因此只能作最坏的打算。在网上找到了Mindaugas Milasauskas的基于AVR的单片机的USB飞行摇杆控制器电路及源代码:

;* AUTHOR:Mindaugas Milasauskas

;*Lithuania

;*[url=mailto:*mindaug@mindaugas.com]mindaug@mindaugas.com[/url]

;*http://www.mindaugas.com

;* Based on code of:

;*Ing. Igor Cesko

;* Slovakia

;* cesko@internet.sk

;* http://www.cesko.host.sk


2010 09 13
我对51单片机可以说烂熟,但是对AVR此前从未接触过。为了读懂、理解源代码流程框架,开始查找AVR的教程。有两个教程感觉比较不错,《AVR高速嵌入式单片机原理与应用》、《AVR单片机嵌入式系统原理与应用实践》。然后,打印了一份AVR单片机指令系统速查表,开始对代码进行逐条解读。

从众多定义到上电初始化程序,再看到main结构以后,就再也看不下去了。每条指令的意思能看懂,但是整段代码的功能、意图根本无法理解。于是,开始查找USB中文协议1.1版,进行学习。

2010 09 16
Altium Designer 7.0 中把Mindaugas Milasauskas的电路原理图重新画出来,对着源代码进行理解。

2010 09 17 东西到了,看来是被用坏的,盘子上的按钮几乎全木了,按下没有任何反映(手感上的)。右档拔片已经掉下来了,脚踏延长板也没有,油门踏板内部 挂弹簧的槽有点裂。不过卖家人不错,很爽快的就给我补发了两套拔片和脚踏延长板。微动开关可以换新的,油门踏板内部用DG-3胶加固,这都是小事。

重要的是,真的是控制器坏了,而且是以COB封装在PCB上的,不知道用的什么。终于,借助造方向盘USB控制器来学习使用AVR单片机和USB协议的机会来了。

2010 09 22 USB协议真的是很复杂,协议内容很繁琐,看了几段,感觉还是理解不了。无奈之下,开始查找专门讲USB开发类的教程书籍。于是找到了《USB大全》,这是一本很棒的书,我想要知道的基本全在里面了。

2010 10 13 我用周立功的TKScope K8上的逻辑分析仪功能尝试对鼠标插入USB口过程的通讯信号进行捕捉,但是由于捕捉深度有限,仅看到了前面开始的几段。对于之后主机和设备是怎么互相通讯的,整个过程还是无法理解。

2010 10 14 我开始找遍网络,试用各种USB分析调试软件。不过基本也只能从协议层分析。对用AVR进行USBNRZI码信号进行底层模拟,还是不得要领。

2010 10 23 我以Mindaugas Milasauskas的电路原理图为基础,结合Saitek R220的外围电路,设计了“基于AVRUSB光电轴方向盘控制器电路”。

2010 11 13 我继续如饥似渴的读完了这本《USB大全》的大部分内容,应该是明白了很多东西。但是对于单片机如何模拟USB接口协议的整个信号变化过程,还是没有直观的认识。不知道硬件层面的信号到底是以怎样的时序进行了。

迷茫中,我在网上发现了这个宝贝——《图解USB枚举过程》。这张图完整再现了整个通信是按照什么时序进行的,以及信息包通信的原理,数据包通讯的过程以及双的握手确认过程。

2010 11 19 USB光电轴方向盘控制器PCB板送厂家加工。

2010 11 20 开始从USB开发者论坛上查阅HID类规范、HID usage等大量官方文档,为着手进USB光电轴方向盘控制器源代码的设计作准备。

2010 11 25 看懂了USB 相关协议后,开始对Mindaugas Milasauskas的代码流程进行解读,并在26日完成全部程序流程图的还原绘制。

2010 11 26 启动对Mindaugas Milasauskas的源代码进行改编。从此开始了长达一个月的艰难痛苦的设计和调试过程。

说艰难和痛苦是因为,第一我以前从来没有接触过AVRUSB的相关知识,只能边写代码边熟悉;第二是,我学Mindaugas Milasauskas买的也是ATmega8芯片,后来看过PDF文档才知道,它是最低端的芯片,只要稍比它高级一点的芯片都带JTAG接口(可以在系统调试的)。也就是说ATmega8芯片不能进行在系统调试,简直就是个黑盒子。

后悔也晚了,只能写几行代码就要烧一下,看看电脑及调试工具的反应。不停的做备份,出了问题,就从前一次的备份和本次修改的代码间进行软件流程推理,判断可能出现问题的位置,然后进行修改,再烧进去验证是否正确。如此反复进行,真的是非常的痛苦。但,痛并快乐着,因为每天都在进步。

2010 12 3 按最初设想的算法编制完成,但经过长期试验和理论分析,问题较多,并不是个好算法。光电轴的数据变化是根据信号相位差进行实时记数的,并不像AD采集那样只以主机查询时读一下就可以。因此,必须寻找一种新的算法。

2010 12 18 在散步时,灵感突然来了,想到了一种更好、轮询更高效的算法。

2010 12 19 试验成功了光电三轴控制器,在控制面板——游戏控制器里测试并校准,功能完全正常。但是用极品飞车测试,却只能认出方向盘(Steering)轴,对油门和刹车两轴根本不认。

2010 12 20 经测试,在极品飞车的油门轴和刹车轴,可以设置成方向盘轴。而方向盘轴是有0位的正负双向增加数值的轴。所以我判断,极品的油门和刹车应该分别用的是一个双向轴的正方向和负方向。经过更改算法,果然成功实现了对极品油门和刹车的控制。

至此,USB光电轴方向盘控制器源代码初步成形。然后,又将转向器轴改编成了2048个数值分辨力,为以后改造方向盘为900度做好准备。油门和刹车设为256个数值分辨能力,基本是够用了。

2010 12 21 下了一个LFS模拟赛车游戏,在设置过程中发现,原来油门和刹车不一定要用一个组合轴,也可以用分离的两个轴,而且更好控制。那个极品设置功能也太逊了点吧。因此,开发出了两轴和三轴都可以用的双模式,不过在插入USB口时要先按好固定的几个按键,以确认控制器启动到哪个模式下。

2010 12 22随后,发现这样很不方便,在换玩另一种游戏时就要重新插拔一下,麻烦还容易磨损。经过改编,设计成功了5轴(转向器轴,加速器轴(含油门和刹车),独立油门轴,独立刹车轴)源代码。并且,可以在不插拔USB的情况下,仅靠按下56个键就可以实时实现两种模式的转换(含复位)

2010 12 23 经过试运行,修正了一些Bug,并确定了终极源代码。我的 DIY 自制
USB 5
轴光电方向盘控制器正式诞生了!

2010 12 25 经过两天试玩,没有发现什么问题。回顾这三个月来的开发经历,决定将这段寓学于乐的体验记录下来,与大家分享!



最后,感谢有3GO这么好的论坛,感谢铁鸟37带我进入了3GO的世界。

BTW:注意:我这个方向盘的脚踏,是可以当脚舵用的哦!不过我也有一个多月没有碰过X52了。

评分

2

查看全部评分

发表于 2010-12-26 01:21:25 | 显示全部楼层
厉害的人啊………………
 楼主| 发表于 2010-12-26 01:29:54 | 显示全部楼层
本帖最后由 hbk0401 于 2011-1-6 21:55 编辑

好快,先占楼


R220原装路板

R220原装路板

这是原坏盘子自带的电路板(为了看的清楚光圈给8,点测),怎么和网上发布的内部结构完全不一样呢?
做工也很简陋:USB线是直接焊在板子上的,仅用胶固定了一下,动了几下全断了。该固定的线基本都是胶粘的。方向中轴出来的线也不说装个热缩管保护一下,早晚得磨坏了。

我的DIY光电轴控制器

我的DIY光电轴控制器

USB 光电5轴游戏控制器电路(光圈8,点测),连接器有点太靠近板边了,导致后来不能竖着插到原槽中,好在220还有一组横槽可以用。
后来发现,那个光电复位检测根本没有用,我的盘子上电后就不会跑偏。

装配图

装配图

装配图(光圈10,点测),方向盘光栅检测模块的线太短了,又加长了一段。同时给方向中轴出来的线加装热缩管保护。

外观图

外观图

外观图(光圈8,点测),把编程线留着是用来随时修正BUG用的。
另外,我给踏板的塑料件加了些润滑脂,防止踩踏时与底座的磨损加剧。
controller.jpg
8键5轴测试界面
看网上原厂R220数值可以从15-255-496,刹车油门为0-59,每个数值以“二”点跳动。

实测,方向盘可以从-259 to 0 to 259,增量1。两个踏板可以从0到70,增量1
发表于 2010-12-26 01:30:09 | 显示全部楼层
痛并快乐着的DIY。。。

orz
发表于 2010-12-26 09:00:13 | 显示全部楼层
牛人啊
发表于 2010-12-26 10:36:47 | 显示全部楼层
当初看HID类协议的时候也是满眼杯具。才100多页的东西,看到头大。
现在看PID子类的协议又是如此。
发表于 2010-12-26 11:37:26 | 显示全部楼层
等图!
 楼主| 发表于 2010-12-26 12:09:35 | 显示全部楼层
回复 6# RCtech


    请教一下版主,如果要在控制器中加入力反馈的代码,应该到哪里找资料来看呢?
    我在电路板上预留了两个三极管驱动电路,打算装两个电机玩玩的,但是没有找到相关资料?
发表于 2010-12-26 14:02:22 | 显示全部楼层
回复 8# hbk0401


    比较麻烦。如果你看了HID Class specification,就会注意到Report Descriptor的邻近章节有Physical Descriptor的描述。顺藤摸瓜会找到一个PID类的白皮书,Physical Interface Device. 后面有描述符范例。但是demo篇幅非常庞大,不是一天两天就能看明白的。

另外你有必要看看DirectX帮助文档中对于力回馈的图解说明,几种不同的输出类型有函数图像说明,与白皮书交叉参考对于理解工作方式很有帮助。至于电机控制……本身就是一门独立学科,好在AVR的PWM输出还算够用。建议你从做方向盘练起,那个只有一个轴,难度已经够低了。但是实现起来也已经很不容易了。先搭个H桥再说。
 楼主| 发表于 2010-12-26 19:39:58 | 显示全部楼层
多谢版主指点!
就是因为AVR的PB3、4有PWM复用功能,我才设计为驱动信号源的。
下一阶段,有空好好研究一下!
发表于 2010-12-26 23:01:54 | 显示全部楼层
好,支持研究,支持探索
发表于 2010-12-27 00:06:14 | 显示全部楼层
坛子里真的是卧虎藏龙,人才倍出啊,虽然LZ所说的那些在我看来就是天书的专业文章偶看8懂,但还是顶一下
发表于 2010-12-27 02:21:19 | 显示全部楼层
多谢版主指点!
就是因为AVR的PB3、4有PWM复用功能,我才设计为驱动信号源的。
下一阶段,有空好好研究一 ...
hbk0401 发表于 2010-12-26 19:39



    先看看H桥的原理,电机必须能正反转才能工作。
发表于 2010-12-28 00:49:16 | 显示全部楼层
又是软封装集成电路啊,看来赛太克是决心不惜一切代价,把降低成本进行到底。
发表于 2010-12-28 22:51:21 | 显示全部楼层
人们常言的 “牛人”啊……偶是佩服到极致了……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|3GO模拟飞行网|3GO Cyber Air Force ( 沪ICP备08002287号|沪ICP备14050587号 )

GMT+8, 2024-5-2 12:38

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表