我是个电工,一直想搞清楚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进行USB的NRZI码信号进行底层模拟,还是不得要领。
2010 10 23 我以Mindaugas Milasauskas的电路原理图为基础,结合Saitek R220的外围电路,设计了“基于AVR的USB光电轴方向盘控制器电路”。
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的源代码进行改编。从此开始了长达一个月的艰难痛苦的设计和调试过程。
说艰难和痛苦是因为,第一我以前从来没有接触过AVR和USB的相关知识,只能边写代码边熟悉;第二是,我学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的情况下,仅靠按下5、6个键就可以实时实现两种模式的转换(含复位)
2010 12 23 经过试运行,修正了一些Bug,并确定了终极源代码。我的 DIY 自制
USB 5轴光电方向盘控制器正式诞生了!
2010 12 25 经过两天试玩,没有发现什么问题。回顾这三个月来的开发经历,决定将这段寓学于乐的体验记录下来,与大家分享!
最后,感谢有3GO这么好的论坛,感谢铁鸟37带我进入了3GO的世界。
BTW:注意:我这个方向盘的脚踏,是可以当脚舵用的哦!不过我也有一个多月没有碰过X52了。