玩转X-CTR100 l STM32F4 l PS2无线手柄
我造輪子,你造車,創(chuàng)客一起造起來!塔克創(chuàng)新資訊【塔克社區(qū) www.xtark.cn 】【塔克博客 www.cnblogs.com/xtark/ 】
SONY的PS2無線手柄是索尼游戲機的遙控手柄,控制協(xié)議已被全球創(chuàng)客破解,可以方便用于機器人控制器,作為遙控輸入設(shè)備。
這款手柄價格便宜,性價比極高,本文使用X-CTR100控制器對PS2進行解碼,并顯示鍵值,方便用戶使用。
原理
PS2無線手柄按鍵比較多,例如在一款游戲中的設(shè)定:
PS手柄無線接收器,針腳輸出端(面對插頭)
-----------------------------------------
PIN 1->| o o o | o o o | o o o |
\___________________________________/
針腳 從左到右分別是 :
1-DATA:信號流向從手柄到主機。此信號是一個8 bit的串行數(shù)據(jù),同步傳送于時鐘下降沿(輸入輸出信號在時鐘信號由高????到低時變化,所有信號的讀取在時鐘前沿到電平變化之前完成。)
2-COMMAND :信號流向從主機到手柄。此信號和DATA相對,同樣是一個8 bit的串行數(shù)據(jù),同步傳送于時鐘下降沿。
3-N/C (9 Volts unused)
4-GND
5-VCC :電源電壓從5V到3V原裝的索尼手柄都可以工作。主機主板上裝有表面安裝的750mA 保險絲 ,用于防止外設(shè)過載????(750mA是包括左右手柄和記憶卡)。
6-ATT :用于提供手柄觸發(fā)信號。信號在通信期間處于低電平。又有人將此針腳叫做 Select, DTR 和 Command
7-CLOCK :信號流向從主機到手柄。用于保持?jǐn)?shù)據(jù)同步。
8-N/C
9-ACK :從手柄到主機的應(yīng)答信號。此信號在每個8 bits數(shù)據(jù)發(fā)送之后的最后一個時鐘周期變低,并且ATT 一直保低電平。如果ACK 信號不變低約60微秒PS主機會試另一個外設(shè)。
PS手柄信號,所有通訊都是8 bit串行數(shù)據(jù)最低有效位先行。在PS 手柄總線的所有時碼在時鐘下降沿都是同步的。傳送一個字節(jié)的情況如下所示。
數(shù)據(jù)線的邏輯電平在時鐘下降沿驅(qū)動下觸發(fā)改變。數(shù)據(jù)的接收讀取在時鐘的前沿(在記號*處)到電平變化之前完成。 在被選手柄接收每個COMMAND 信號之后,手柄需拉低ACK 電平在最后一個時鐘。如果被選手柄沒ACK 應(yīng)答主機將假定沒手柄接入。
當(dāng)PS主機想讀一個手柄的數(shù)據(jù)時,將會拉低ATT 線電平并發(fā)出一個開始命令 (0x01)。手柄將會回復(fù)它的ID (0x41=數(shù)字, 0x23=NegCon, 0x73=模擬紅燈, 0x53=模擬綠燈). 在手柄發(fā)送ID
字節(jié)的同時主機將傳送0x42 請求數(shù)據(jù)。隨后命令線將空閑和手柄送出 0x5A 意思說:"數(shù)據(jù)來了"。
本文只針對 "模擬手柄紅燈模式"進行破解,字節(jié)定義如下。
例程
X-CTR100控制器解碼PS2無線手柄,并通過串口輸出顯示鍵值。
硬件說明
硬件資源:
- 串口UART1
- LC擴展接口(非串口,作為普通IO口使用)
- PS2無線手柄(需自備)
連接關(guān)系如下,
DATA——LC接口-D6
COMM——LC接口-D5
GND——LC接口-GND
VCC——LC接口-3.3V
ATT——LC接口-D7
CLOCK——LC接口-D4
ACK——LC接口-D3
連接實物圖
軟件生態(tài)
X-SOFT軟件生態(tài),X-API擴展文件如下。
ax_ps2.c——PS2無線手柄操作源文件
ax_ps2.h——PS2無線手柄頭文件
接口函數(shù)
void AX_PS2_Init(void); //PS2初始化 void AX_PS2_ScanKey(JOYSTICK_TypeDef* JoystickStruct);//PS2獲取按鍵及搖桿數(shù)值 |
定義PS2鍵值結(jié)構(gòu)體JOYSTICK_TypeDef,通過結(jié)構(gòu)體進行鍵值和搖桿數(shù)據(jù)傳輸。
//手柄鍵值數(shù)據(jù)結(jié)構(gòu)體???? typedef struct???????????? ???????????????? { uint8_t mode;???????????????????????????? /* 手柄的工作模式 */ ? uint8_t btn1; /* Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 SLCT STRT UP R DOWN L */ ? uint8_t btn2; /* Bit0 Bit1 Bit2 Bit3 Bit4 Bit5 Bit6 Bit7 L2 R2 L1 R1 /\ O X 口 */ ? uint8_t RJoy_LR; /*右邊搖桿 0x00 = 左 0xff = 右 */ ? uint8_t RJoy_UD; /*右邊搖桿 0x00 = 上 0xff = 下 */ ? uint8_t LJoy_LR; /*右邊搖桿 0x00 = 左 0xff = 右 */ ? uint8_t LJoy_UD; /*右邊搖桿 0x00 = 上 0xff = 下 */ ???? }JOYSTICK_TypeDef; |
軟件說明
主程序通過鍵值掃描函數(shù),獲取按鍵狀態(tài),并通過串口顯示,主程序代碼如下。
int main(void) {???? ????//X-CTR100初始化 ????AX_Init(115200); ????printf("***X-CTR100 PS2無線手柄例程***\r\n\r\n");???? ???? ? //功能配置???? ????AX_PS2_Init();????//PS2初始化 ???? ? ? ????while (1) ????{ ????????AX_PS2_ScanKey(&my_joystick); ???????? ????????//打印手柄鍵值 ????????printf("MODE:%2x BTN1:%2x BTN2:%2x RJOY_LR:%2x RJOY_UD:%2x LJOY_LR:%2x LJOY_UD:%2x\r\n", ????????my_joystick.mode, my_joystick.btn1, my_joystick.btn2, ????????my_joystick.RJoy_LR, my_joystick.RJoy_UD, my_joystick.LJoy_LR, my_joystick.LJoy_UD);???? ? ????????AX_Delayms(30);???????? ????} } |
實現(xiàn)效果
BTN1、BTN2為按鍵值,后面為搖桿數(shù)據(jù),搖桿中位為0x7F或0x80。
轉(zhuǎn)載于:https://www.cnblogs.com/xtark/p/9261655.html
總結(jié)
以上是生活随笔為你收集整理的玩转X-CTR100 l STM32F4 l PS2无线手柄的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 北京雾霾越来越重的原因找到了!
- 下一篇: 计算机考研需要过英语六级吗,研究生毕业要