Lägga till knappar i din X52-Pro Joystick med en Arduino mikro (5 / 12 steg)
Steg 5: Skapa HID deskriptorn för din nya enhet
Nu har du testat din prototyp setup kan du börja att förvandla din Arduino till en HID-kompatibel enhet. Arduino-miljö har redan ställts in för att kunna fungera som ett tangentbord och en mus, men vi måste lägga till en annan enhetstyp i mixen.
HID specifikationerna är utformade för att tillåta någon att skapa en USB-klassenhet eller program utan att behöva skapa anpassade drivrutiner. Detta är mycket praktiskt, men betyder att specifikationen är ganska komplex som den försöker vara allting för alla människor. I huvudsak ange du vilken typ av enhet som du skapar - tangentbord, Joystick, mus, Gamepad, ratt, etc - och anger sedan en eller flera samlingar av insatser av olika slag. Dessa inställningar och typ och storlek av indata anges med en lång rad mystiska koder och gör inte för enkel avläsning. Lyckligtvis är de flesta beskrivningar jag har hittat simning med oformaterad text kommentarer som gör livet lite enklare. Det finns också några bra guider och användning tabeller på webben. De är lite torr men de hjälper dig att hitta vad du behöver. Här är ett par som jag hittade händig:
HID handledning: http://developer.mbed.org/media/uploads/wim/hid_usb_intro_an249.pdf
HID-användning tabell: http://www.freebsddiary.org/APC/usb_hid_usages.php
Du kan också hitta mer information och en (ganska clunky) HID deskriptor verktyg på http://www.usb.org/developers/hidpage#HID deskriptor verktyg
Här är HID deskriptorn jag använder för min setup:
0x05, 0x01, / / USAGE_PAGE (generiska skrivbordet)
0x09, 0x05, / / användning (spelkontroll)
0xa1, 0x01, / / samling (ansökan)
0x85, 0x03, / / REPORT_ID (3) (detta är viktigt när HID_SendReport() anropas)
0xA1, 0x00, / / samling (fysiska)
8 knappar
0x05, 0x09, / / USAGE_PAGE (knapp)
0x19, 0x01, / / USAGE_MINIMUM (knappen 1)
0x29, 0x08, / / USAGE_MAXIMUM (knappen 8)
0X15, 0X00, / / LOGICAL_MINIMUM (0)
0X25, 0X01, / / LOGICAL_MAXIMUM (1)
0X95, 0X08, / / REPORT_COUNT (8)
0X75, 0X01, / / REPORT_SIZE (1)
0x81, 0x02, / / ingång (Data, Var, Abs)
< Br > / / 1 hatt växla
0x05, 0x01, / / USAGE_PAGE (generiska skrivbordet)
0x09, 0x39, / / användning (Hat switch)
0X15, 0X00, / / LOGICAL_MINIMUM (0)
0X25, 0X07, / / LOGICAL_MAXIMUM (7)
0X35, 0X00, / / PHYSICAL_MINIMUM (0)
0X46, 0X3B, 0X01, / / PHYSICAL_MAXIMUM (315)
0x65, 0x14, / / enhet (Eng röta: kantiga Pos)
0X75, 0X04, / / REPORT_SIZE (4)
0X95, 0X01, / / REPORT_COUNT (1)
0x81, 0x02, / / ingång (Data, Var, Abs)
< Br > / / stoppning (4 byte)
0X75, 0X04, / / REPORT_SIZE (4)
0X95, 0X01, / / REPORT_COUNT (1)
0x81, 0x03, / / ingång (Cnst, Var, Abs)
1 D-pads - Dummy så Elite: farligt Europaparlamentet erkänner det
0x05, 0x01, / / USAGE_PAGE (generiska skrivbordet)
0X09, 0X30, / / ANVÄNDNING (X)
0X09, 0X31, / / ANVÄNDNING (Y)
0X15, 0X81, / / LOGICAL_MINIMUM (-127)
0X25, 0X7F, / / LOGICAL_MAXIMUM (127)
0X75, 0X08, / / REPORT_SIZE (8)
0X95, 0X02, / / REPORT_COUNT (2)
0x81, 0x02, / / ingång (Data, Var, Abs)
0XC0, //END SAMLING
0XC0, //END SAMLING
För att komma hit jag såg över de USAGE_PAGE och användning specifikationerna och beslutade att spelkontroll var den bästa beskrivningen att använda som en Joystick tekniskt har minst 2 analoga axlar plus minst två knappar. Spelkontrollen kan antingen ha analoga X / Y eller en digital 4-vägs switch plus minst två knappar, så jag kunde passa min förlängning in i denna kategori. Efter att vi ange en samling för programmet och ge det ett rapport-ID. Detta hjälper oss att identifiera data senare.
Nu ange vi en fysisk samling. Detta gäller våra knappar. Du kan ha fler samlingar, kapslade eller sida-vid-sida, men jag kände inte behovet. Inuti den fysiska samlingen ange du nu ingångarna. Till att börja med jag lista sidan knappen användning och ange sedan de lägsta och högsta värdena, i detta fall 1 och 8 som jag har 8 knappar. Jag sedan ange logiska minimum och maximum för var och en av dessa knappar. De är enkla switchar har jag bara 1 och 0 för tryckte och inte tryckt. Jag anger sedan antalet objekt i rapporten och antalet rapporter för denna användning sida. Slutligen ange jag Inmatningstyp för detta värde - Data, som är variabel och består av evig vaules, i stället för värden som är i förhållande till de senaste rapporterade värdena.
Växeln hat är något annorlunda. En riktningsknapp kräver ett värde från 0 till 7 som anger riktningen för hatten i steg om 45 grader - 0 = upp, 1 = upp/till höger, 2 = höger, 3 = ner/höger etc. Detta innebär att vi anger den logiska min/max som 0, 7 och fysiska min/max som 0 och 315. Vi behöver inte gå någon ytterligare som 360 grader är likvärdigt till 0 grader. Vi har också ange enheten som en vinkelvridningen ståndpunkt. 0-7 är kan vara i fyra bitar rapport storlek 4 denna gång.
Så, 8 knappar och en hatt, vi är klara? Inte riktigt. Du behöver överföra ett helt antal byte för varje rapport till USB värd så måste vi lägga till lite utfyllnad. Du kan göra detta genom att lägga till en annan fantom hatt som aldrig används, men det är renare helt enkelt lägga till en annan rapport av 4 bitar och ange informationstyp till konstant. När det är gjort kan du stänga av både fysiskt och ansökan samlingar och du är klar.
Tyvärr, medan Windows känner igen enheten bara bra hittar du att vissa spel inte som de förväntar sig att hitta en X / Y-axeln som du kan se från ovanstående fil jag har lagt till dummy X / Y-axlarna. Dessa kommer att visas i data som överförs, men som vi aldrig ändra värden från 0 sedan dummy pinnen visas aldrig att flytta.