Lägga till knappar i din X52-Pro Joystick med en Arduino mikro (6 / 12 steg)
Steg 6: Lägg till din Arduino miljön filer HID kod
Nu har du din deskriptor måste du lägga till din Arduino miljö så det kan programmera det vidare till din enhet. För att göra detta måste du ändra ett par filer. Navigera till dokument/Arduino/hårdvara/arduino/kärnor/arduino (Mac) eller C:\Program Files (x86) \Arduino\hardware\arduino\cores\arduino (Win) katalog. I det ta säkerhetskopior av filerna HID.cpp och USBAPI.h skull.
Öppna HID.cpp i din favorit texteditor (EditPlus 2 eller Notepad ++ är bra för Windows, Text Wrangler är användbart för Mac) och leta långt upp i följande avsnitt:
#if defined(USBCON)
#ifdef HID_ENABLED
#define RAWHID_ENABLED
Singletons för mus och tangentbord
Mouse_ mus;
Keyboard_ tangentbord;
Nu måste du lägga till en definition och en singleton variabel enligt följande:
#if defined(USBCON)
#ifdef HID_ENABLED
#define RAWHID_ENABLED
#define JOYHID_ENABLED
Singletons för mus och tangentbord
Mouse_ mus;
Keyboard_ tangentbord;
Och nu en joystick emot alltför
Joystick_ Joystick;
Leta längre ner för avsnittet RAWHID:
#if RAWHID_ENABLED
HID-RAW
0X06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), / / 30
0X0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE),
0xA1, 0x01, / / samling 0x01
0X85, 0X03, / / REPORT_ID (3)
0x75, 0x08, / / rapport storlek = 8 bitar
0x15, 0x00, / / logiska minsta = 0
0x26, 0xFF, 0x00, / / logiska maximala = 255
0x95, 64, / / rapport greve TX
0x09, 0x01, / / användning
0x81, 0x02, / / ingång (matris)
0x95, 64, / / rapport greve RX
0x09, 0x02, / / användning
0x91, 0x02, / / output (matris)
0xC0 / / slutet samling
#endif
};
Nu ändra detta om du vill ändra #if till #ifdef och infoga din nya HID deskriptor inuti sin egen #ifdef avsnitt
#ifdef RAWHID_ENABLED
HID-RAW
0X06, LSB(RAWHID_USAGE_PAGE), MSB(RAWHID_USAGE_PAGE), / / 30
0X0A, LSB(RAWHID_USAGE), MSB(RAWHID_USAGE),
0xA1, 0x01, / / samling 0x01
0X85, 0X03, / / REPORT_ID (3)
0x75, 0x08, / / rapport storlek = 8 bitar
0x15, 0x00, / / logiska minsta = 0
0x26, 0xFF, 0x00, / / logiska maximala = 255
0x95, 64, / / rapport greve TX
0x09, 0x01, / / användning
0x81, 0x02, / / ingång (matris)
0x95, 64, / / rapport greve RX
0x09, 0x02, / / användning
0x91, 0x02, / / output (matris)
0xC0 / / slutet samling
#endif
*** Här är där RAW_HID har omvandlats till en spelkontroll enhet
*** Inspirerad av helmpcb.com/electronics/usb-joystick
*** Kolla www.usb.org/developers/hidpage/ för mer än du någonsin behöver veta om USB-HID-
*** HID säkerhetsbeskrivningen skapas med verktyget HID deskriptor från www.usb.org/developers/hidpage/dt2_4.zip
#ifdef JOYHID_ENABLED
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)
1 riktningsknapp
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)
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 #endif
};
Nu är gjort, måste vi lägga till lite kod för att ta emot data från vår skiss som vi skapade tidigare och skicka rapporten. Titta längre ner för följande kod:
//=============================================================================
//=============================================================================
Mus
Mouse_::Mouse_(void): _buttons(0)
{
}
Lägga till en ny bit av kod för att hantera data som följer direkt ovanför detta
//=============================================================================
//=============================================================================
Joystick
Användning: Joystick.move (ingångar gå här)
//
Dataformatet rapport måste matcha definierats i deskriptorn exakt
antingen så fungerar det inte eller pc kommer att göra en röra av uppackning data
//
Joystick_::Joystick_()
{
}
#define joyBytes 4 / / bör motsvara sizeof(JoyState_t)
void Joystick_::setState(JoyState_t *joySt)
{
uint8_t data [joyBytes];
data [0] = joySt -> knappar & 0xFF;
data [1] = joySt -> hatSw1;
data [2] = joySt -> left_x;
data [3] = joySt -> left_y;
HID_SendReport (rapport nummer, matris med värden i samma ordning som HID deskriptor, längd)
Joysticken anges som med hjälp av rapporten 3 i deskriptorn. Det är där "3" kommer från
HID_SendReport (3, data, joyBytes).
}
Här definierar vi antalet byte som skickas. I detta fall 2-1 byte för knapparna och 1 byte för hatten, inklusive stoppning. Sedan har vi den enkla funktionen emot data som skickas från skissen, hacka det upp och sedan spotta ut med funktionen HID_SendReport. Här är mycket enkel, men du kan hitta mer komplicerat dem någon annanstans. Denna webbplats har ett bra exempel på en 8-axlig, 32-knapp, 1 hatt inställning. Detta har hjälpt mig mycket men var alldeles för komplicerat för vad jag ville så jag förenklat det så mycket som jag kunde.
När du har gjort allt detta, spara filen och öppna USBAPI.h. I den här filen skapar vi en struct och klass för objektet joystick. Hitta följande kod:
//==========================================================================
//==========================================================================
Mus
#define MOUSE_LEFT 1
#define MOUSE_RIGHT 2
Som tidigare, infoga denna kod direkt ovanför detta
//=============================================================================
//=============================================================================
Joystick
Genomföras i HID.cpp
Listan över parametrar här måste matcha genomförandet i HID.cpp
TypeDef struct JoyState / / ganska själv explanitory. Enkla tillstånd att lagra alla parametrar som joystick
{
uint8_t knappar;
uint8_t hatSw1;
int8_t left_x;
int8_t left_y;
} JoyState_t;
klass Joystick_
{
offentlig:
Joystick_();
void setState(JoyState_t *joySt);
};
extern Joystick_ Joystick;
Spara filen och du är klar. Återigen, om du har mer en krävande program helt enkelt lägga till kod för att hantera den extra maskinvaran. Den ovan nämnda webbplatsen kommer återigen att användbara.