玩遊戲的小夥伴都知道,有的遊戲需要使用遊戲手柄體驗纔會更好,今天就我們來DIY一款自己專屬的手柄!
1.設計思路
電腦遊戲手柄和鼠標鍵盤一樣屬於USB HID設備,Window系統和Linux系統和各種遊戲機系統都會自帶此種設備的驅動,使用這種協議可以免裝裝驅動,即插即用。本次DIY使用單片機stm32f103c8t6,其自帶USB資源,通過移植USB功能,修改相關配置和描述符,使其識別爲USB-HID設備,再通過按鍵檢測,檢測到不用的按鍵就發送不同鍵值給電腦,以實現手柄不同的操作,實現原理同電腦鍵盤。
2.準備材料如下:
洞洞板5*7cm x2
按鍵12*12cm x10
按鍵帽 x8
按鍵6*6 x2
usb線micro轉A口 x1
連接線 若干根
螺絲M3*6 若干個
螺絲M3*8 若干個
3.硬件製作
使用一塊stm32f103c8t6的最小系統板,將其部分io口接入按鍵的一端,將按鍵的另外一端接地,設置stm32的這些io口內部上拉,這樣當按鍵按下後,單片機既可檢測到,並做出相關處理。
手柄的各個位置對應到stm32上面的引腳號如下:
4.軟件調試
移植stm32官方的usb擴展代碼,在此基礎上修改如下描述符,定義設備屬性和數據格式,在加上按鍵檢測功能,根據不同按鍵響應發送不同的數據以實現控制。
下面介紹主要的USB需要配置的幾個描述:
第1個:設備描述符DeviceDesciptor
第2個:配置描述符ConfigurationDescriptor
第3個:接口描述符InterfaceDescriptor
第4個:HID描述符HIDDescriptor
HID設備專有的描述符,用於配置HID設備的屬性和報告描述符的大小。
第5個:端點描述符EndpointDescriptor
端點描述符是用於配置端點號以及端點的輸入輸出。
第6個:報告描述符ReportDescriptor
報告描述符是HID設備專有的描述符,用於描述傳輸的數據的格式。
第7個:字符串描述符StringDescriptor
配置好描述符後,主要發送函數如下:
數據格式定義:
我們設定的一次發送的數據爲9個字節,第1個字節默認0x1,第2個字節定義如下
第3個字保留位,後面幾個字節爲普通按鍵碼。如發送01 02 00 04 05 00 00 00 00 表示同時按下Left_Shift + a + b 三個鍵。當然我們作爲手柄不需要這麼多按鍵功能,主要實現上下左右鍵,和A,B,X,Y鍵,ESC和Space鍵即可。需要什麼按鍵功能,根據下圖標準鍵值碼值來進行設定修改代碼。
5.外殼製作
使用proe5.0設計上下外殼如下:
外殼設計好之後,使用3D打印機打印外殼
將電路板裝配進外殼裏
全部安裝完成後如下
6.測試使用
將手柄插入電腦後,識別爲USB-HID設備
打開遊戲測試,操作流暢!
至此,我們的USB電腦遊戲手柄就完成啦