2007年10月17日 星期三

自製USB HID搖桿

HID裝置

上次實做USB鍵盤之後,今天我們繼續來改寫程式變成USB HID搖桿



這種複雜度的電路之前看到很多談到wii改機的部落格都說就算不是讀電子相關科系的人都可以做。

技能檢定不會過啦



今天我們還是一樣使用Atmel的AVR Tiny45配上EasyLogger的範例來改。不過我更簡化了一點電路,整個做好的成品就只有上面的照片那樣而已。詳細電路圖和相關開發工具請參考上一次的介紹



usb using attiny45



跟現實生活一樣位處越高層的長官要懂的東西越少以免大腦爆炸,我們如果只是要實做出一個USB搖桿就不用管太多細節。以後我們慢慢往下層走時會講到越來越多的細節。今天要修改的部份還是如第一次所說,使用HID descriptor tool建立如下的表格。

joystick HID descriptor

工具自動產生的程式碼就像下面那樣。有一點要特別注意:所有REPORT_SIZE乘上REPORT_COUNT的總和一定要是8的倍數,不然會因為組不成完整的Byte而讓PC端發生錯誤。




PROGMEM char usbHidReportDescriptor[USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH] = {

0x05, 0x01, // USAGE_PAGE (Generic Desktop)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x09, 0x04, // USAGE (Joystick)
0xa1, 0x01, // COLLECTION (Application)
0x05, 0x09, // USAGE_PAGE (Button)
0x19, 0x01, // USAGE_MINIMUM (Button 1)
0x29, 0x08, // USAGE_MAXIMUM (Button 8)
0x15, 0x00, // LOGICAL_MINIMUM (0)
0x25, 0x01, // LOGICAL_MAXIMUM (1)
0x75, 0x01, // REPORT_SIZE (1)
0x95, 0x08, // REPORT_COUNT (8)
0x55, 0x00, // UNIT_EXPONENT (0)
0x65, 0x00, // UNIT (None)
0x81, 0x02, // INPUT (Data,Var,Abs)
0xc0 // END_COLLECTION
};
//
//




下面的影片是從windows控制台截取來的





今天的完整程式在這

4 則留言:

匿名 提到...

您好
請問一下我編譯LOGGER程式都沒有問題的情況下,換邊一您的程式都出現
usbdrvasm12.S的錯誤,我應該注意什麼地方?


詳細如下

rm -rf main.o oddebug.o usbdrv.o usbdrvasm.o usbdrvasm12.o usbdrvasm16.o usbdrvasm165.o smouse.elf dep/* smouse.hex smouse.eep smouse.lss smouse.map
Build succeeded with 0 Warnings...
avr-gcc -I"D:\_language\_AVR_WS\smouse\usbdrv" -mmcu=attiny45 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=12000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT main.o -MF dep/main.o.d -c ../main.c
avr-gcc -I"D:\_language\_AVR_WS\smouse\usbdrv" -mmcu=attiny45 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=12000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT oddebug.o -MF dep/oddebug.o.d -c ../usbdrv/oddebug.c
avr-gcc -I"D:\_language\_AVR_WS\smouse\usbdrv" -mmcu=attiny45 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=12000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT usbdrv.o -MF dep/usbdrv.o.d -c ../usbdrv/usbdrv.c
avr-gcc -I"D:\_language\_AVR_WS\smouse\usbdrv" -mmcu=attiny45 -mmcu=attiny45 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=12000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT usbdrvasm.o -MF dep/usbdrvasm.o.d -x assembler-wit
h-cpp -Wa,-gdwarf2 -c ../usbdrv/usbdrvasm.S

avr-gcc -I"D:\_language\_AVR_WS\smouse\usbdrv" -mmcu=attiny45 -mmcu=attiny45 -Wall -gdwarf-2 -std=gnu99 -DF_CPU=12000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT usbdrvasm12.o -MF dep/usbdrvasm12.o.d -x assembler
-with-cpp -Wa,-gdwarf2 -c ../usbdrv/usbdrvasm12.S

../usbdrv/usbdrvasm12.S: Assembler messages:
../usbdrv/usbdrvasm12.S:43: Error: constant value required
../usbdrv/usbdrvasm12.S:44: Error: constant value required



一堆../usbdrv/usbdrvasm12.S 錯誤

Ching Johnny 提到...

請問我想做一個兩軸四按鍵的USB介面裝置該怎麼著手,我會焊接但是不會燒錄程式,怎麼做會比較快?感謝指教

棒棒 提到...

您好,
簡單地說一共有四個層面要完成
1.先用HID descriptor tool 把您的二軸四鍵遙桿描述表格建出來
2.去淘寶或露天買一塊 arduino 或 LPC11U14 或 C8051F340 或 V-USB 或其它USB MCU 套件, 看您會用哪一塊都可以
3.把按鍵銲到 2 買來的開發板
4.把1產生的描述表貼進2附的樣板程式, 並且配合3所銲的I/O位置去修改樣板程式. 詳細步驟可以用google 搜尋 "USB joystick" + 2提到的零件型號

Ching Johnny 提到...

雖然不太懂但是感謝你

張貼留言