数码之家

 找回密码
 立即注册
搜索
查看: 15402|回复: 78

[外设] 拆个xbox360无线游戏手柄接收模块改到电脑上用

[复制链接]
发表于 2020-4-24 09:18:36 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
书接上回,https://www.mydigit.cn/forum.php?mod=viewthread&tid=145749

上回说到把5Y10C的小主板塞进xbox360的身体里,顺便使用xbox360自带的无线手柄模块也利用上。这次专题说说这个模块的使用过程。

总的来说,如果你的手柄已经和无线接收模块同步过,就不需要单片机;如果你需要和无线手柄同步,就需要一个单片机。


无线接收模块的电压是3.3V

我这里说的是需要单片机的那种。主要参考了国外的一个帖子 http://www.appliedcarbon.org/xboxrf.html

他这里使用了attiny的avr,我没有,趁着手头有stc15f104w,改改用吧。后面附上代码。

直接利用模块上带的开关键当做同步按钮使用,短按关闭所有手柄亮红灯,长按2秒开始同步。


硬件篇:
这个是接收模块的管脚定义:
xbox360rfmodulepinout.png

这是制作好的小板子,放在接收模块背面的:
微信截图_20200424084841.png

原理图:
Schematic_xbox360rf_2020-04-24_08-23-45.png

PCB模型
pcb1.png pcb2.png pcb3.png


焊接好,把电容放在中间。
01678135cf16f95135755ea19a7463b.jpg

放进一个交换机的小盒子里
ae61bb46000d23c606886fe6cd9535a.jpg

接上usb线,插电脑上
5bfaf37563051587632dac48147c046.jpg


插电,开机~
这里有一个开机动画的,跟xbox360上是一样一样的,没拍下来。
dc7526485bfe3bd1009fb02711d473a.jpg

小盒还没做好,打算开个孔,漏出灯泡。
3d6fd0fd65a6372f3ecf05554193b7f.jpg



驱动篇:
微软现在还在提供驱动程序。win7、win10通用。下载地址:
https://www.microsoft.com/access ... troller-for-windows
drivers.png

下载以后需要修改驱动程序。如果是win10,需要关闭驱动签名验证,否则无法安装


打开C:\Program Files\Microsoft Xbox 360 Accessories\Xusb21.inf
将[MSFT.NTx86.6.0], [MSFT.NTamd64.6.0], [MSFT.NTx86], [MSFT.NTamd64]段中的
  1. %XUSB21.DeviceName.Wired%=CC_Install, USB\Vid_045E&Pid_028E
  2. %XUSB21.DeviceName%=CC_Install, USB\Vid_045E&Pid_0719
  3. %XUSB21.DeviceName.Wired%=CC_Install, USB\MS_COMP_XUSB10
  4. %XUSB21.DeviceName%=CC_Install, USB\MS_COMP_XUSB20
  5. %XUSB21.DeviceName.Jump%=CC_Install, USB\Vid_045E&Pid_028F
复制代码
改为
  1. %XUSB21.DeviceName.Wired%=CC_Install, USB\Vid_045E&Pid_0291
  2. %XUSB21.DeviceName%=CC_Install, USB\Vid_045E&Pid_0291
  3. %XUSB21.DeviceName.Wired%=CC_Install, USB\UNKNOWN
  4. %XUSB21.DeviceName%=CC_Install, USB\UNKNOWN
复制代码


保存。

插电,开机~

在设备管理器中发现一个无法识别的设备,
1.更新驱动,
2.浏览我的计算机以查找驱动程序软件
3.让我从计算机上可用驱动程序列表中选取
4.从磁盘安装
5.浏览C:\Program Files\Microsoft Xbox 360 Accessories\Xusb21.inf
6.选择Xbox 360 Wireless Receiver for Windows

如图:
driver1.png

驱动就装好了。

配对:
长按模块上的开机键,开始旋转
长按手柄上的同步键
ok


单片机程序:
main.c
  1. #include "config.h"
  2. #include "delay.h"


  3. /*************        功能说明        **************
  4. * xbox360 无线手柄接收模块的单片机驱动
  5. * p3.5作为按钮输入,低电平时开始sync,长按2秒同步,短按关闭手柄
  6. * p3.2作为clock
  7. * p3.3作为data
  8. *
  9. ******************************************/
  10. /*************        本地常量声明        **************/

  11. #define uchar        unsigned char
  12. #define uint        unsigned int

  13. sbit        key                = P3 ^ 5;                               /* power button repurposed for sync button (pin 5 on the module) */
  14. sbit        data_pin        = P3 ^ 3;                               /* data line (pin 6 on the module) */
  15. sbit        clock_pin        = P3 ^ 2;                               /* clock line (pin 7 on module) */
  16. uchar        A;                                                      /* 1短按,2长按 */
  17. uint        t3;                                                     /*按键去抖动延时计数器 */
  18. bit        bz1, bz2, bz3, bz4, bz5, bz6, bz7;


  19. /*************        本地变量声明        **************/
  20. u8        led_cmd[10] = { 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 };         /* Activates/initialises the LEDs, leaving the center LED lit. */
  21. u8        anim_cmd[10] = { 0, 0, 1, 0, 0, 0, 0, 1, 0, 1 };        /* Makes the startup animation on the ring of light. */
  22. u8        sync_cmd[10] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 };        /* Initiates the sync process. */
  23. u8        off_cmd[10] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1 };         /* Turns off all controllers */
  24. u8 FAST_BLINK_ALL[10] = { 0, 0, 1, 1, 0, 1, 0, 0, 0, 1 };  /* Blinks all four red LEDs */
  25. u8 CLEAR_ERROR [10] = { 0,0, 1,1,0,0, 0,0,0,0 }; // Clears any error display (blinking red leds or orange solid)
  26. /*************        本地函数声明        **************/


  27. /*************  外部函数和变量声明 *****************/
  28. void sendData( u8 cmd_do[] )
  29. {
  30.         u8 prev, i;
  31.         prev        = 1;
  32.         i        = 0;
  33.         /* start sending data. */
  34.         data_pin = 0;

  35.         while ( i < 10 )
  36.         {
  37.                 while ( prev == clock_pin )
  38.                 {
  39.                         ;
  40.                 }               /* detects change in clock */
  41.                 prev = clock_pin;
  42.                 /* should be after downward edge of clock, so send bit of data now */
  43.                 data_pin = cmd_do[i];
  44.                 while ( prev == clock_pin )
  45.                 {
  46.                         ;
  47.                 }               /* detects upward edge of clock */
  48.                 prev = clock_pin;
  49.                 i++;
  50.         }
  51.         data_pin = 1;
  52. }


  53. void initLEDs()
  54. {
  55.         sendData( led_cmd );
  56.         delay_ms( 50 );
  57.         sendData( anim_cmd );
  58.         delay_ms( 50 );
  59. }


  60. void key_sm()                           /*按键扫描函数 放在定时中断里 */
  61. {
  62.         if ( key != 0 )                 /* IO是高电平, */
  63.         {
  64.                 bz2        = 0;            /*按键清零 */
  65.                 t3        = 0;
  66.                 if ( bz3 == 1 )         /* 短按触发标志 */
  67.                 {
  68.                         bz3        = 0;
  69.                         A        = 1;    /* 触发一号键的短按 */
  70.                 }
  71.         }else
  72.         if ( bz2 == 0 )                 /*按键按下 */
  73.         {
  74.                 if ( ++t3 > 40 )
  75.                 {
  76.                         bz3 = 1;        /*有效标志 */
  77.                 }
  78.                 if ( ++t3 > 600 )
  79.                 {
  80.                         if ( bz7 == 0 )
  81.                         {
  82.                                 bz5        = 0;
  83.                                 bz7        = 1;
  84.                         }
  85.                         bz3        = 0;    /*有效标志 */
  86.                         t3        = 0;
  87.                         bz2        = 1;    /*按键置位 */
  88.                         A        = 2;
  89.                 }
  90.         }
  91. }


  92. void key_zx()                           /*按键执行程序 */
  93. {
  94.         switch ( A )
  95.         {
  96.         case 1:                         /* 短按键执行程序 */
  97.                 A        = 0;
  98.                 sendData(off_cmd);        //关闭
  99.                 delay_ms(100);
  100.                 sendData(FAST_BLINK_ALL);
  101.                 delay_1000ms();
  102. delay_1000ms();
  103.                 sendData(CLEAR_ERROR);
  104.                 delay_ms(100);
  105.                 break;
  106.         case 2:                         /*按键长按程序 */
  107.                 A        = 0;
  108.                 sendData(sync_cmd);        //同步
  109.                 delay_ms(100);
  110.                 break;
  111.         }
  112. }


  113. void Timer0Init( void )         /* 1微秒@11.0592MHz */
  114. {
  115.         AUXR        |= 0x80;        /* 定时器时钟1T模式 */
  116.         TMOD        &= 0xF0;        /* 设置定时器模式 */
  117.         TL0        = 0xF5;         /* 设置定时初值 */
  118.         TH0        = 0xFF;         /* 设置定时初值 */
  119.         TF0        = 0;            /* 清除TF0标志 */
  120.         TR0        = 1;            /* 定时器0开始计时 */
  121. }


  122. /******************** IO配置函数 **************************/


  123. void Timer0_ISR() interrupt 1
  124. {
  125.         TH0        = (65536 - 3000) / 256; /* 1ms定时初值 */
  126.         TL0        = (65536 - 3000) % 256;
  127.         key_sm();
  128. }


  129. /******************** 主函数 **************************/
  130. void main( void )
  131. {

  132.    delay_ms(100);
  133.    delay_ms(100);
  134.    delay_ms(100);

  135.    initLEDs();

  136.    delay_ms(100);
  137.    delay_ms(100);
  138.    delay_ms(100);

  139.         TMOD        = 0x01;                 /* 启用定时1 */
  140.         ET0        = 1;
  141.         TR0        = 1;
  142.         TH0        = (65536 - 3000) / 256; /* 1ms定时初值 */
  143.         TL0        = (65536 - 3000) % 256;
  144.         EA        = 1;                    /* 开中断 */
  145.         bz1        = 1;
  146.         while ( 1 )
  147.         {
  148.                 key_zx();
  149.         }

  150. }
复制代码


delay.c
  1. void  delay_ms(unsigned char ms)
  2. {
  3.      unsigned int i;
  4.          do{
  5.               i = MAIN_Fosc / 13000;
  6.                   while(--i)        ;   //14T per loop
  7.      }while(--ms);
  8. }


  9. void  delay_1000ms(){//@11.0592MHz
  10.         unsigned char i, j, k;

  11.         _nop_();
  12.         _nop_();
  13.         i = 43;
  14.         j = 6;
  15.         k = 203;
  16.         do
  17.         {
  18.                 do
  19.                 {
  20.                         while (--k);
  21.                 } while (--j);
  22.         } while (--i);
  23. }
复制代码


附上hex程序
xbox360rf.zip (1.33 KB, 下载次数: 26)

除了小盒还没做好,其他的



打赏

参与人数 6家元 +110 收起 理由
有点不烧 + 20 謝謝分享
newnet1234 + 20 謝謝分享
ljlun + 20 優秀文章
xiaoxuanfeng + 20 謝謝分享
风间尘 + 20
暗黑狂龙 + 10 做得不错 支持

查看全部打赏

 楼主| 发表于 2020-4-24 17:07:58 来自手机浏览器 | 显示全部楼层
暗黑狂龙 发表于 2020-4-24 14:37
好帖子

纯属废物利用
回复 支持 反对

使用道具 举报

发表于 2020-4-30 12:05:20 来自手机浏览器 | 显示全部楼层
原装接收器30元包邮

--来自论坛助手 iPhone客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 12:47:11 | 显示全部楼层
colll1 发表于 2020-4-30 12:05
原装接收器30元包邮

--来自论坛助手 iPhone客户端

我没找到啊,我看的都是80的。所以我花了50买了一套,我觉得还行
回复 支持 反对

使用道具 举报

发表于 2020-4-30 14:45:21 | 显示全部楼层
疫情期间折腾了一下,但是无法对码,于是手柄一张红票卖了。。
回复 支持 反对

使用道具 举报

发表于 2020-4-30 17:22:06 来自手机浏览器 | 显示全部楼层
digitking 发表于 2020-4-30 12:47
我没找到啊,我看的都是80的。所以我花了50买了一套,我觉得还行

额 可能行情变了,我之前买了好几个剪线的接收器,和360一起处理了,就剩一个手柄和一个接收器用着

--来自论坛助手 iPhone客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 18:45:43 来自手机浏览器 | 显示全部楼层
iceecream 发表于 2020-4-30 14:45
疫情期间折腾了一下,但是无法对码,于是手柄一张红票卖了。。

我的对码成功的,换了三个接收器都成功
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-4-30 18:46:24 来自手机浏览器 | 显示全部楼层
colll1 发表于 2020-4-30 17:22
额 可能行情变了,我之前买了好几个剪线的接收器,和360一起处理了,就剩一个手柄和一个接收器用着

--来 ...

那你赚了,羡慕
回复 支持 反对

使用道具 举报

发表于 2020-5-3 21:33:44 | 显示全部楼层
如果是在对过码的XBOX360上取的接收器,只要接上USB口连接电脑装好驱动就可以用。不过不能再换手柄了,楼主的单片机是用来对过码用的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-4 09:50:58 来自手机浏览器 | 显示全部楼层
875900 发表于 2020-4-30 23:07
手法精妙

最近又捡起来了单片机
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-4 09:51:43 来自手机浏览器 | 显示全部楼层
elfxie 发表于 2020-5-3 21:33
如果是在对过码的XBOX360上取的接收器,只要接上USB口连接电脑装好驱动就可以用。不过不能再换手柄了,楼主 ...

是的,总的来说,如果你的手柄已经和无线接收模块同步过,就不需要单片机;如果你需要和无线手柄同步,就需要一个单片机。单片机用了发出指令
回复 支持 反对

使用道具 举报

发表于 2020-5-4 15:44:51 | 显示全部楼层
谢谢分享,软硬兼施
回复 支持 反对

使用道具 举报

发表于 2020-5-5 06:51:53 来自手机浏览器 | 显示全部楼层
请教一下 楼主:handshake:

收藏有十几年前  声卡 的MIDI 并口15针  创新经典游戏手柄和 微软飞行摇杆,大概是 模拟变量和按键输入的,  但现在这接口早已淘汰了!
  在时下 如何能实现  USB  有线 转接 MIDI 游戏并口 ? 这是空白产品! 万能的X宝 也没有! 和实现 Win7+10的驱动?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 09:47:02 来自手机浏览器 | 显示全部楼层
qidao 发表于 2020-5-5 06:51
请教一下 楼主

收藏有十几年前  声卡 的MIDI 并口15针  创新经典游戏手柄和 微软飞行摇杆,大 ...

这我也不知道,我家最早的奔腾133上的声卡带这个,可是当时我没有这种手柄,所以也没用过。还是花钱买新的吧
回复 支持 反对

使用道具 举报

发表于 2020-5-5 11:04:49 来自手机浏览器 | 显示全部楼层
digitking 发表于 2020-5-5 09:47
这我也不知道,我家最早的奔腾133上的声卡带这个,可是当时我没有这种手柄,所以也没用过。还是花钱买新 ...

唉, 收藏级别的,    买新的就无所谓了。
回复 支持 反对

使用道具 举报

发表于 2020-5-7 20:40:02 | 显示全部楼层
真厉害!动手能力真棒!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-8 14:23:01 | 显示全部楼层
alhope 发表于 2020-5-7 20:40
真厉害!动手能力真棒!

感谢支持~
回复 支持 反对

使用道具 举报

发表于 2020-5-10 09:11:17 | 显示全部楼层
玩机高手啊,楼主那些图片啥子软件弄的啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-20 10:46 , Processed in 0.358801 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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