USB-Wii Classic Controller (6 / 18 steg)

Steg 5: USB-HID-rapporter och rapport beskrivare



När du gör en HID-enhet, enheten skickar kort rapporter regelbundet till datorn. Dessa rapporter innehåller information om vilka knappar trycks och hur mycket joysticks har flyttat. Dock för värden att förstå dataformatet, måste enheten "beskriva" rapporterna till värden. Det är därför vi skriver en USB-HID-rapport deskriptor.

Ta en titt på din Wii Classic Controller. Den har 15 knappar (runda upp till 16 för enkelhet) och två joysticks. Detta innebär att vi måste skicka 15 bitar data för knapparna och 4 siffror, en för varje axel av joystick data. Vi definierar våra dataformat se ut så här:

Bit 7Bit 6Bit 5Bit 4Bit 3Bit 2Bit 1Bit 0
Byte 0KnappenKnappenKnappenKnappenKnappenKnappenKnappenKnappen
Byte 1KnappenKnappenKnappenKnappenKnappenKnappenKnappenKnappen
Byte 2Vänster styrspak X Axis som signerade Char heltal
Byte 3Vänster styrspak Y axeln som signerade Char heltal
Byte 4Rätt pinne X Axis som signerade Char heltal
Byte 5Rätt pinne Y axeln som signerade Char heltal

Och vi kan sedan definiera en datastruktur i C/C++

struct gamepad_report_t
{
uint16_t knappar.
int8_t left_x;
int8_t left_y;
int8_t right_x;
int8_t right_y;
}

Skriva en rapport deskriptor innebär som beskriver ett användning sammanhang först, och sedan beskriva innebörden av data i förhållande till ramen för användning, och sedan beskriva data i form av dess utbredning och storlek.

Se först datorn förstår att enheten är en gamepad

USAGE_PAGE (generiska skrivbordet)
ANVÄNDNING (spelkontroll)
SAMLING (ansökan)
SAMLING (fysiska)

...

SLUTET SAMLING
SLUTET SAMLING

Sedan Beskriv knappen data (16 bitar)

USAGE_PAGE (knapp)
USAGE_MINIMUM (knappen 1)
USAGE_MAXIMUM (knappen 16)
LOGICAL_MINIMUM (0)
LOGICAL_MAXIMUM (1)
REPORT_COUNT (16)
REPORT_SIZE (1)
INPUT (Data, Varians, Abs)

Sedan Beskriv 4 axel data som signerad 8-bitars heltal

USAGE_PAGE (generiska skrivbordet)
ANVÄNDNING (X)
ANVÄNDNING (Y)
ANVÄNDNING (Z)
ANVÄNDNING (Rx)
LOGICAL_MINIMUM (-127)
LOGICAL_MAXIMUM (127)
REPORT_SIZE (8)
REPORT_COUNT (4)
INPUT (Data, Varians, Abs)

  • Obs: Z används för att representera den rätt pinnen X-axeln, Rx används för att representera den rätt pinne Y-axeln. Detta är obegripligt men detta är hur de flesta befintliga USB-spel kuddar fungerar. Jag har testat detta med Battlefield Bad Company 2, det fungerar.
  • Obs: Använd "absoluta" för något som joysticks, men "relativa" för saker som mus.

Slutligen, rapport deskriptorn ser ut:

USAGE_PAGE (generiska skrivbordet)
ANVÄNDNING (spelkontroll)
SAMLING (ansökan)
SAMLING (fysiska)
USAGE_PAGE (knapp)
USAGE_MINIMUM (knappen 1)
USAGE_MAXIMUM (knappen 16)
LOGICAL_MINIMUM (0)
LOGICAL_MAXIMUM (1)
REPORT_COUNT (16)
REPORT_SIZE (1)
INPUT (Data, Varians, Abs)
USAGE_PAGE (generiska skrivbordet)
ANVÄNDNING (X)
ANVÄNDNING (Y)
ANVÄNDNING (Z)
ANVÄNDNING (Rx)
LOGICAL_MINIMUM (-127)
LOGICAL_MAXIMUM (127)
REPORT_SIZE (8)
REPORT_COUNT (4)
INPUT (Data, Varians, Abs)
SLUTET SAMLING
SLUTET SAMLING

Nu när vi har en rapport deskriptor, hur gör vi våra AVR berätta det här till datorn? Gå Hämta officiella "gömde deskriptor Tool" från http://www.usb.org/developers/hidpage/ . Använda den för att sätta det här i och verktyget kommer att generera korrekt binära matrisen för dig.


När du sparar ditt resultat, gå till "File" -> "Spara som" och sedan se till att du väljer "Header-fil (* .h)" Spara i dialogrutan. Öppna sedan filen, det ska se ut

char ReportDescriptor [vissa nummer här (storlek array)] {
en hel del byte här
};

Stor, storleken på matrisen måste kopieras in i V-USB "usbconfig.h" där det står "USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH", och "char ReportDescriptor" måste döpas om till "PROGMEM char usbHidReportDescriptor" så att den lagras i AVR: s blixt minne. Du sluta med något liknande:

PROGMEM char usbHidReportDescriptor [46] = {
0x05, 0x01, / / USAGE_PAGE (generiska skrivbordet)
0x09, 0x05, / / användning (spelkontroll)
0xa1, 0x01, / / samling (ansökan)
0xa1, 0x00, / / samling (fysiska)
0x05, 0x09, / / USAGE_PAGE (knapp)
0x19, 0x01, / / USAGE_MINIMUM (knappen 1)
0x29, 0x10, / / USAGE_MAXIMUM (knappen 16)
0X15, 0X00, / / LOGICAL_MINIMUM (0)
0X25, 0X01, / / LOGICAL_MAXIMUM (1)
0X95, 0X10, / / REPORT_COUNT (16)
0X75, 0X01, / / REPORT_SIZE (1)
0x81, 0x02, / / ingång (Data, Var, Abs)
0x05, 0x01, / / USAGE_PAGE (generiska skrivbordet)
0X09, 0X30, / / ANVÄNDNING (X)
0X09, 0X31, / / ANVÄNDNING (Y)
0X09, 0X32, / / ANVÄNDNING (Z)
0x09, 0x33, / / användning (Rx)
0X15, 0X81, / / LOGICAL_MINIMUM (-127)
0X25, 0X7F, / / LOGICAL_MAXIMUM (127)
0X75, 0X08, / / REPORT_SIZE (8)
0X95, 0X04, / / REPORT_COUNT (4)
0x81, 0x02, / / ingång (Data, Var, Abs)
0XC0, / / END_COLLECTION
0XC0 / / END_COLLECTION
};

Denna del av koden, plus struct typedef vi gjorde tidigare, ingår i vår projekt källkod (se hela källkoden) senare.

Mer läsning:

Se Steg
Relaterade Ämnen

Teensy USB Wii Classic Controller

Jag är ett fan av Wii Classic Controller, men jag har aldrig brytt mig för att hålla trådlösa handkontroller som ansvarar för en tillfällig släng av nostalgi. Vore det inte bra om jag kunde använda min Wii Classic Controller via USB? Detta är hur jag...

Arduino lins Controller - synkroniseras Zoom/fokus med Wii Classic Controller

min Lumix GH2 Micro Four Thirds kamera skjuter inte bara fantastiskt hög definitionen video, men med billiga adaptrar kan jag använda den med äldre manuella objektiv som är billig och ofta mycket hög kvalitet. Jag skjuter en hel del prestanda videor...

USB-Wii Gamepad med Arduino Leonardo

Förra helgen jag provat den nya RetroPie på min härliga nya Raspberry Pi 3, men bara spelenheten jag har är oldie Wii Classic Controller; så hur kan jag konvertera den till en vanlig USB-spelenhet?Efter lite forskning fick jag reda det är ganska lätt...

USB: - DC Motor Controller med PIC18F4550 (keyboard)

USB: - DC Motor Controller med PIC18f4550 (keyboard)Hej vänner,KravUSB-DEMO gränssnitt styrelseL293D motor controller chipDetta ett litet projekt på att kontrollera DC motor med USB pic18f4550 gränssnittskortet med L293D motor Driver.Ett litet progra...

USB-Biofeedback Game Controller

bygger på våra senaste tutorial, som lärt dig hur man bygger en muskel sensor, har vi beslutat att ge dig ett projekt som verkligen visar upp kraften i våra muskler (EMG) sensorer. Advancer Technologies "USB-Biofeedback Game Controller" utnyttja...

Wii Nunchuk Controller

Denna tutorial lär dig hur man styr VEX motorer med en Wii Nunchuk.Det kan vara mycket bekvämt när du vill styra din robot med en Arduino och inte en VEX cortex och controller.Steg 1: material Arduino UNOWii NunchukLaptop/datorTrådlösa mikrokontrolle...

24 kanal USB ansluten LED Controller, upp till 1A per kanal

Denna enhet är avsedd att vara en mångsidig hög-aktuell LED-controller, med förmåga att sjunka eller / och källa strömmar upp till 1A per kanal med försvinnande av upp till 2.5W per kanal. De olika tröjor och transistor placering tillåta att enheten...

Bygga en USB 6 servo controller

Hej, jag letade efter en servo controller och hittade detta. Jag trodde att andra som jag skulle finna det intressant att bygga. Dock inte ens försök göra detta om du inte har kunskapen att bygga circuitboards. Det är bassicly en hemlagad modell av A...

PC USB Media volym Controller baserat på Arduino

Hej alla och Välkommen till min tredje Instructable.En vän till mig har ett ljudsystem med en urtavla för volymkontroll, och den sitter på hans skrivbord ser riktigt snyggt. Jag ville ha något liknande men med extra funktioner och anpassningsbara. Ja...

Arduino Wii Nunchuck controller

Hur man styr 2 servon trodde wii nunchuck.Steg 1: delar Wii nunchuckArduinoen2 servoSkärbrädaHoppare ledningarSteg 2: Anslut Anslut wii nunchuck som detta schema.Steg 3: Ladda upp kodenSteg 4: gjort!!! Du kan nu kontrollera 2 servon trodde wii nunchu...

Funtendo - en multistick retro controller för din PC

Funtendo är ett helt fristående retro gaming & controller för din dator.Det är kan använda den ursprungliga Nintendo controller, N64 handkontrollen och Wii Classic controller på samma gång!Funtendo är USB powered och innehåller också en flash-enhet s...

Skapa animering och spel: kapitel 1 komma igång.

Välkommen till först av en multi-del serien:Att skapa animering och spel: kapitel 1 komma igångDenna serie kommer att dyka in med Propeller microcontroller baserat system för att skapa din egen grafik, animering och video spel. Jag antar att du bara...

Komma igång med Mini fickdatorer

Om en och en halv månad sedan, jag skapade ett projekt kallat Mini fickdator och skrev en Instructable på hur man bygger den. Detta Instructable tar hela projektet ett steg längre genom att hjälpa dig att komma igång med din fickdator Mini. Har inte...

Bygg din egen mini fickdator

någonsin vill uppleva 70- och 80-talet datoranvändning utan mixtra med knarrig gammal hårdvara och 5,25 disketter?I detta Instructable, ska jag lära dig hur man bygger och programmera din egen mini fickdator.Utforska mikro computing med en maskin som...

Skapa animering och spel: kapitel 2 spelenheter

Välkommen till andra av ett flerdelat series:Att skapa animering och spel: kapitel 2 spelenheterDenna serie kommer att dyka in med Propeller microcontroller baserat system för att skapa din egen grafik, animering och video spel. Jag antar att du bara...

Hur man använder en Wiimote som din datorns mus

någonsin undrat vad coola saker du kan göra med en Wiimote? Så detta är definitivt där du bör start-använder den som en mus!Steg 1: Steg 1: material1. en Wiimote (naturligtvis)2. WiiMotionPlus (faktiskt är inbyggd i vissa nya Wiimotes!)3. Bluetooth-a...

Trådlös Wii Nunchuk-till-Mouse USB-minne för PC, Mac, och Tablet PC-spel

Redo att känna sig som den legendariska "Bruce Lee" med trådlös Wii Nunchuks på en rolig stickman kung fu PC video fightingspel kallas En Finger Death Punch (OFDP). Vad sägs om att spela Jetpack Joyride på Facebook eller din Android Tablet? Kans...

USB-mus gjord av A Wii Nunchuck

detta instructable kommer att beskriva hur du omvandlar en Nintendo Wii Nunchuck controller till en USB 2-knappars mus med en Teensy USB. Teensy USB är en mycket användarvänlig utveckling styrelse som kan programmeras i en Arduino miljö. Teensy USB u...

NES Controller USB-minne

jag blev inspirerad av en konversation på sidan Lego USB Stick!Detta är inte svårt. Det tog 10 minuter! (Inte inklusive köpa saker)! Lätt, roligt och lite töntig!(Använd den här metoden om du vill spara elektroniken, annars... du kan göra detta eller...