|
书接上回,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秒开始同步。
硬件篇:
这个是接收模块的管脚定义:
这是制作好的小板子,放在接收模块背面的:
原理图:
PCB模型
焊接好,把电容放在中间。
放进一个交换机的小盒子里
接上usb线,插电脑上
插电,开机~
这里有一个开机动画的,跟xbox360上是一样一样的,没拍下来。
小盒还没做好,打算开个孔,漏出灯泡。
驱动篇:
微软现在还在提供驱动程序。win7、win10通用。下载地址:
https://www.microsoft.com/access ... troller-for-windows
下载以后需要修改驱动程序。如果是win10,需要关闭驱动签名验证,否则无法安装
打开C:\Program Files\Microsoft Xbox 360 Accessories\Xusb21.inf
将[MSFT.NTx86.6.0], [MSFT.NTamd64.6.0], [MSFT.NTx86], [MSFT.NTamd64]段中的
- %XUSB21.DeviceName.Wired%=CC_Install, USB\Vid_045E&Pid_028E
- %XUSB21.DeviceName%=CC_Install, USB\Vid_045E&Pid_0719
- %XUSB21.DeviceName.Wired%=CC_Install, USB\MS_COMP_XUSB10
- %XUSB21.DeviceName%=CC_Install, USB\MS_COMP_XUSB20
- %XUSB21.DeviceName.Jump%=CC_Install, USB\Vid_045E&Pid_028F
复制代码 改为
- %XUSB21.DeviceName.Wired%=CC_Install, USB\Vid_045E&Pid_0291
- %XUSB21.DeviceName%=CC_Install, USB\Vid_045E&Pid_0291
- %XUSB21.DeviceName.Wired%=CC_Install, USB\UNKNOWN
- %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
如图:
驱动就装好了。
配对:
长按模块上的开机键,开始旋转
长按手柄上的同步键
ok
单片机程序:
main.c
- #include "config.h"
- #include "delay.h"
- /************* 功能说明 **************
- * xbox360 无线手柄接收模块的单片机驱动
- * p3.5作为按钮输入,低电平时开始sync,长按2秒同步,短按关闭手柄
- * p3.2作为clock
- * p3.3作为data
- *
- ******************************************/
- /************* 本地常量声明 **************/
- #define uchar unsigned char
- #define uint unsigned int
- sbit key = P3 ^ 5; /* power button repurposed for sync button (pin 5 on the module) */
- sbit data_pin = P3 ^ 3; /* data line (pin 6 on the module) */
- sbit clock_pin = P3 ^ 2; /* clock line (pin 7 on module) */
- uchar A; /* 1短按,2长按 */
- uint t3; /*按键去抖动延时计数器 */
- bit bz1, bz2, bz3, bz4, bz5, bz6, bz7;
- /************* 本地变量声明 **************/
- u8 led_cmd[10] = { 0, 0, 1, 0, 0, 0, 0, 1, 0, 0 }; /* Activates/initialises the LEDs, leaving the center LED lit. */
- u8 anim_cmd[10] = { 0, 0, 1, 0, 0, 0, 0, 1, 0, 1 }; /* Makes the startup animation on the ring of light. */
- u8 sync_cmd[10] = { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }; /* Initiates the sync process. */
- u8 off_cmd[10] = { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1 }; /* Turns off all controllers */
- u8 FAST_BLINK_ALL[10] = { 0, 0, 1, 1, 0, 1, 0, 0, 0, 1 }; /* Blinks all four red LEDs */
- u8 CLEAR_ERROR [10] = { 0,0, 1,1,0,0, 0,0,0,0 }; // Clears any error display (blinking red leds or orange solid)
- /************* 本地函数声明 **************/
- /************* 外部函数和变量声明 *****************/
- void sendData( u8 cmd_do[] )
- {
- u8 prev, i;
- prev = 1;
- i = 0;
- /* start sending data. */
- data_pin = 0;
- while ( i < 10 )
- {
- while ( prev == clock_pin )
- {
- ;
- } /* detects change in clock */
- prev = clock_pin;
- /* should be after downward edge of clock, so send bit of data now */
- data_pin = cmd_do[i];
- while ( prev == clock_pin )
- {
- ;
- } /* detects upward edge of clock */
- prev = clock_pin;
- i++;
- }
- data_pin = 1;
- }
- void initLEDs()
- {
- sendData( led_cmd );
- delay_ms( 50 );
- sendData( anim_cmd );
- delay_ms( 50 );
- }
- void key_sm() /*按键扫描函数 放在定时中断里 */
- {
- if ( key != 0 ) /* IO是高电平, */
- {
- bz2 = 0; /*按键清零 */
- t3 = 0;
- if ( bz3 == 1 ) /* 短按触发标志 */
- {
- bz3 = 0;
- A = 1; /* 触发一号键的短按 */
- }
- }else
- if ( bz2 == 0 ) /*按键按下 */
- {
- if ( ++t3 > 40 )
- {
- bz3 = 1; /*有效标志 */
- }
- if ( ++t3 > 600 )
- {
- if ( bz7 == 0 )
- {
- bz5 = 0;
- bz7 = 1;
- }
- bz3 = 0; /*有效标志 */
- t3 = 0;
- bz2 = 1; /*按键置位 */
- A = 2;
- }
- }
- }
- void key_zx() /*按键执行程序 */
- {
- switch ( A )
- {
- case 1: /* 短按键执行程序 */
- A = 0;
- sendData(off_cmd); //关闭
- delay_ms(100);
- sendData(FAST_BLINK_ALL);
- delay_1000ms();
- delay_1000ms();
- sendData(CLEAR_ERROR);
- delay_ms(100);
- break;
- case 2: /*按键长按程序 */
- A = 0;
- sendData(sync_cmd); //同步
- delay_ms(100);
- break;
- }
- }
- void Timer0Init( void ) /* 1微秒@11.0592MHz */
- {
- AUXR |= 0x80; /* 定时器时钟1T模式 */
- TMOD &= 0xF0; /* 设置定时器模式 */
- TL0 = 0xF5; /* 设置定时初值 */
- TH0 = 0xFF; /* 设置定时初值 */
- TF0 = 0; /* 清除TF0标志 */
- TR0 = 1; /* 定时器0开始计时 */
- }
- /******************** IO配置函数 **************************/
- void Timer0_ISR() interrupt 1
- {
- TH0 = (65536 - 3000) / 256; /* 1ms定时初值 */
- TL0 = (65536 - 3000) % 256;
- key_sm();
- }
- /******************** 主函数 **************************/
- void main( void )
- {
- delay_ms(100);
- delay_ms(100);
- delay_ms(100);
- initLEDs();
- delay_ms(100);
- delay_ms(100);
- delay_ms(100);
- TMOD = 0x01; /* 启用定时1 */
- ET0 = 1;
- TR0 = 1;
- TH0 = (65536 - 3000) / 256; /* 1ms定时初值 */
- TL0 = (65536 - 3000) % 256;
- EA = 1; /* 开中断 */
- bz1 = 1;
- while ( 1 )
- {
- key_zx();
- }
- }
复制代码
delay.c
- void delay_ms(unsigned char ms)
- {
- unsigned int i;
- do{
- i = MAIN_Fosc / 13000;
- while(--i) ; //14T per loop
- }while(--ms);
- }
- void delay_1000ms(){//@11.0592MHz
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 43;
- j = 6;
- k = 203;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
复制代码
附上hex程序
除了小盒还没做好,其他的
完
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|