USB-Wii Classic Controller (6 / 18 stap)

Stap 5: USB-HID verslagen en verslag Descriptors


Wanneer u een HID-apparaat, het apparaat stuurt korte verslagen op gezette tijden naar de computer. Deze verslagen bevatten informatie over welke knoppen worden ingedrukt en hoeveel de joysticks hebt verplaatst. Echter, om de host te begrijpen van de gegevensindeling, het apparaat moet "Beschrijving" de verslagen naar de host. Dit is de reden waarom we een verslag USB-HID descriptor schrijven.

Neem een kijkje op uw Wii Classic Controller. Het heeft 15 knoppen (ronde tot 16 voor de eenvoud) en twee joysticks. Dit betekent dat we moeten afgeven 15 stukjes van de gegevens voor de knoppen, en 4 nummers, één voor elk zwaartepunt van joystick gegevens. Definiëren we onze gegevensindeling om er als volgt uitzien:

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
0 byteKnopKnopKnopKnopKnopKnopKnopKnop
Byte 1KnopKnopKnopKnopKnopKnopKnopKnop
Byte 2Linker Stick X as als ondertekende Char Integer
Byte 3Linker Stick Y as als ondertekende Char Integer
Byte 4Juiste Stick X as als ondertekende Char Integer
Byte 5Juiste Stick Y as als ondertekende Char Integer

En dan kunnen we definiëren een gegevensstructuur in C/C++

 struct gamepad_report_t { uint16_t buttons; int8_t left_x; int8_t left_y; int8_t right_x; int8_t right_y; } 

Het schrijven van een verslag-descriptor gaat beschrijven een context gebruik eerst, en dan met een beschrijving van de betekenis van de gegevens ten opzichte van de context gebruik en vervolgens met een beschrijving van de gegevens qua bereik en grootte.

Controleer eerst de computer begrijpen dat het apparaat een gamepad is

 USAGE_PAGE (Generic Desktop) USAGE (Game Pad) COLLECTION (Application) COLLECTION (Physical) ... END COLLECTION END COLLECTION 

Vervolgens beschrijven de knop gegevens (16 bits)

 USAGE_PAGE (Button) USAGE_MINIMUM (Button 1) USAGE_MAXIMUM (Button 16) LOGICAL_MINIMUM (0) LOGICAL_MAXIMUM (1) REPORT_COUNT (16) REPORT_SIZE (1) INPUT (Data,Var,Abs) 

Vervolgens beschrijven de gegevens 4 as als ondertekende 8-bits gehele getallen

 USAGE_PAGE (Generic Desktop) USAGE (X) USAGE (Y) USAGE (Z) USAGE (Rx) LOGICAL_MINIMUM (-127) LOGICAL_MAXIMUM (127) REPORT_SIZE (8) REPORT_COUNT (4) INPUT (Data,Var,Abs) 
  • Opmerking: Z wordt gebruikt voor de X-as de juiste stick, Rx wordt gebruikt ter aanduiding van de juiste stick Y-as. Dit houdt geen steek, maar dit is hoe de meeste bestaande USB-Gamepads werken. Ik heb dit getest met behulp van Battlefield Bad Company 2, het werkt.
  • Opmerking: Gebruik "absolute" voor iets zoals joysticks, maar "relatieve" voor dingen zoals muis.

Tot slot, het verslag-descriptor eruit:

USAGE_PAGE (generieke Desktop) gebruik (gamepad) collectie (toepassing) collectie (fysiek) USAGE_PAGE (Generic Desktop) USAGE (Game Pad) COLLECTION (Application) COLLECTION (Physical) USAGE_PAGE (Button) USAGE_MINIMUM (Button 1) USAGE_MAXIMUM (Button 16) LOGICAL_MINIMUM (0) LOGICAL_MAXIMUM (1) REPORT_COUNT (16) REPORT_SIZE (1) INPUT (Data,Var,Abs) USAGE_PAGE (Generic Desktop) USAGE (X) USAGE (Y) USAGE (Z) USAGE (Rx) LOGICAL_MINIMUM (-127) LOGICAL_MAXIMUM (127) REPORT_SIZE (8) REPORT_COUNT (4) INPUT (Data,Var,Abs) END COLLECTION END COLLECTION 

Nu dat we een verslag-descriptor hebben, hoe maken we onze AVR vertellen dit spul op de computer? Ga downloaden de officiële "HID Descriptor Tool" van http://www.usb.org/developers/hidpage/ . Gebruik het deze spullen in te zetten, en de tool zal het genereren van de juiste binaire matrix voor u.


Wanneer u uw resultaat, ga naar "File" -> "Save As" en zorg ervoor dat u kiest u "headerbestand (* .h)" opslaan in het dialoogvenster. Open vervolgens het bestand, het moet eruit

 char ReportDescriptor[ some number here (size of array)] { a lot of bytes here }; 

Geweldig, de grootte van de matrix moet worden gekopieerd in V-USB's "usbconfig.h" waar het zegt "USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH", en "char ReportDescriptor" moet worden omgedoopt tot "PROGMEM char usbHidReportDescriptor" zodat het wordt opgeslagen in het geheugen van de flits van van de AVR. U eindigen met iets als:

 PROGMEM char usbHidReportDescriptor[46] = { 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x05, // USAGE (Game Pad) 0xa1, 0x01, // COLLECTION (Application) 0xa1, 0x00, // COLLECTION (Physical) 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x10, // USAGE_MAXIMUM (Button 16) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x95, 0x10, // REPORT_COUNT (16) 0x75, 0x01, // REPORT_SIZE (1) 0x81, 0x02, // INPUT (Data,Var,Abs) 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x09, 0x32, // USAGE (Z) 0x09, 0x33, // USAGE (Rx) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7f, // LOGICAL_MAXIMUM (127) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x04, // REPORT_COUNT (4) 0x81, 0x02, // INPUT (Data,Var,Abs) 0xc0, // END_COLLECTION 0xc0 // END_COLLECTION }; 

Dat stuk van code, plus de struct typedef we eerder deden, deel uitmaakt van onze broncode project (Zie hele broncode) later.

Meer lezen:

Gerelateerde Artikelen

Teensy USB-Wii Classic Controller

Teensy USB-Wii Classic Controller

Ik ben een fan van de Wii Classic Controller, maar ik heb nooit verzorgd moetend draadloze controllers houden betalen voor een occasionele aanval van nostalgie. Zou het niet geweldig zijn als ik mijn Wii Classic Controller via USB kon gebruiken? Dit
Arduino Lens Controller - Zoom/Focus gesynchroniseerd met Wii Classic Controller

Arduino Lens Controller - Zoom/Focus gesynchroniseerd met Wii Classic Controller

mijn Lumix GH2 Micro Four Thirds camera schiet niet alleen fantastische high definition video's, maar met goedkope adapters kan ik gebruiken met oudere manuele lenzen die goedkoop en vaak erg hoge kwaliteit. Ik schiet veel prestaties video's voor mij
USB-Wii Gamepad met behulp van de Arduino Leonardo

USB-Wii Gamepad met behulp van de Arduino Leonardo

Afgelopen weekend heb ik geprobeerd de nieuwe RetroPie op mijn mooie nieuwe Raspberry Pi 3, maar de enige spel controller die ik heb is het oudje Wii Classic Controller; Dus hoe kan ik het converteren naar een normale USB-spelbesturing?Na wat onderzo
USB-Biofeedback Game Controller

USB-Biofeedback Game Controller

Voortbouwend op onze laatste tutorial, die u geleerd hoe te bouwen van een spier-sensor, hebben we besloten om u een project dat echt de vitrines van de kracht van onze spier (EMG) sensoren. Advancer Technologies "USB-Biofeedback Game Controller"
Wii Nunchuk Controller

Wii Nunchuk Controller

Deze tutorial leert u hoe u kunt besturen VEX motoren met een Wii Nunchuk.Het kan erg handig zijn als u wilt controleren uw robot met een Arduino en niet een VEX cortex en controller.Stap 1: materialen Arduino UNOWii NunchukLaptop/ComputerDraadloze M
24-kanaals USB-Connected LED Controller, upto 1A per kanaal

24-kanaals USB-Connected LED Controller, upto 1A per kanaal

Dit apparaat is ontworpen als een veelzijdig high-current LED controller, met de mogelijkheid om te zinken of / en source stromingen tot 1A per kanaal met dissipatie van maximaal 2.5W per kanaal. De verschillende truien en transistor plaatsing mogeli
Bouwen van een USB-6 servo controller

Bouwen van een USB-6 servo controller

Hallo, ik was op zoek naar een servo-controller en vond dit. Ik dacht dat anderen net als ik zou vinden het interessant zijn om te bouwen. Echter, zelfs niet proberen dit te doen indien u geen kennis in de bouw van circuitboards. Het is bassicly een
Arduino Wii Nunchuck controller

Arduino Wii Nunchuck controller

Hoe u kunt besturen 2 servo's dacht dat de wii nunchuck.Stap 1: onderdelen Wii nunchuckArduino2 servoBreadboardJumper dradenStap 2: verbinding maken Sluit de wii nunchuck zoals dit schema.Stap 3: De Code uploadenStap 4: gedaan!!! U kunt nu de 2 servo
Funtendo - een multistick retro controller voor uw PC

Funtendo - een multistick retro controller voor uw PC

Funtendo is een volledig zelfstandige retro gaming & controller systeem voor uw PC.Het is geschikt voor het gebruik van de originele Nintendo controller, de N64 -controller en de Wii Classic controller op hetzelfde moment!Funtendo is USB powered en b
Aan de slag met de Pocket Mini Computer

Aan de slag met de Pocket Mini Computer

Ongeveer een maand en een half geleden, ik creëerde een project genaamd de Pocket Mini Computer en een Instructable schreef over hoe om het te bouwen. Dit Instructable gaat het hele project een stapje verder door u aan de slag met uw Pocket Mini Comp
Het creëren van animatie en Games: hoofdstuk 1 aan de slag.

Het creëren van animatie en Games: hoofdstuk 1 aan de slag.

Welkom bij de eerste van een multi-delige serie:Maken van animatie en Games: hoofdstuk 1 aan de slagDeze serie zal duik in het gebruik van de Propeller microcontroller gebaseerde systemen voor het maken van uw eigen afbeeldingen, animaties en video g
Bouw uw eigen mini zakcomputer

Bouw uw eigen mini zakcomputer

ooit willen ervaren jaren 70 en 80 computergebruik zonder gehannes met krakende oude hardware en 5,25-inch diskettes?In dit Instructable, zal ik je leren hoe te bouwen en uw eigen mini pocket computer program.Verkennen micro computing met een machine
Het creëren van animatie en Games: hoofdstuk 2 Game Controllers

Het creëren van animatie en Games: hoofdstuk 2 Game Controllers

Welkom bij de tweede van een multi-delige serie:Maken van animatie en Games: Gamecontrollers hoofdstuk 2Deze serie zal duik in het gebruik van de Propeller microcontroller gebaseerde systemen voor het maken van uw eigen afbeeldingen, animaties en vid
Het gebruik van een Wiimote als muis van uw Computer

Het gebruik van een Wiimote als muis van uw Computer

ooit afgevraagd welke leuke dingen je met een Wiimote doen kunt? Zo ja, is dit zeker waar je start-gebruiken als een muis!Stap 1: Stap 1: materialen1. een Wiimote (natuurlijk)2. WiiMotionPlus (eigenlijk is ingebouwd in sommige nieuwe Wiimotes!)3. Blu