Descripteur HID à utiliser pour une manette Playstation 2

小 太郎

Descripteur HID à utiliser pour une manette Playstation 2


Je fais actuellement un convertisseur contrôleur / USB Playstaion 2 en utilisant un Arduino Uno, et ça marche très bien, mais je suis coincé sur un problème spécifique.

J’essaie de prendre en charge les boutons sensibles à la pression, mais je ne sais pas quel descripteur HID utiliser pour l’USB. J’ai actuellement ce qui suit, mais mon ordinateur ne semble pas enregistrer correctement les états des boutons, avec jstest montrant que les boutons semblent « coller » dans un état activé. De plus, je ne suis pas très sûr si l’utilisation de Rx et Ry pour le deuxième stick analogique est correcte.

Quelles zones du descripteur dois-je modifier pour que tout fonctionne correctement?

Voici mon descripteur actuel:

const PROGMEM USB_Descriptor_HIDReport_Datatype_t hidDescriptor[] =
{
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x05,                    // USAGE (Game Pad)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x09, 0x01,                    //   USAGE (Pointer)
    0xa1, 0x00,                    //   COLLECTION (Physical)
                                   //     ; Right stick
    0x09, 0x33,                    //     USAGE (Rx)
    0x09, 0x34,                    //     USAGE (Ry)
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //     LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x02,                    //     REPORT_COUNT (2)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)

                                   //     ; Left stick
    0x09, 0x30,                    //     USAGE (X)
    0x09, 0x31,                    //     USAGE (Y)
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //     LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x02,                    //     REPORT_COUNT (2)
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)
    0xc0,                          //   END_COLLECTION

    0x05, 0x09,                    //   USAGE_PAGE (Button)
                                   //   ; Pressure sensitive buttons
    0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
    0x29, 0x0c,                    //   USAGE_MAXIMUM (Button 12)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x0c,                    //   REPORT_COUNT (12)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)

                                   //   ; Other buttons (L3, R3, Select, Start)
    0x19, 0x0d,                    //   USAGE_MINIMUM (Button 13)
    0x29, 0x10,                    //   USAGE_MAXIMUM (Button 16)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x04,                    //   REPORT_COUNT (4)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0xc0                           // END_COLLECTION
};

PS. J’utilise LUFA et flashe le firmware du contrôleur USB d’Uno

Réponses


 Connor Wolf

Vous ne pouvez pas avoir de boutons sensibles à la pression. Vous devez les spécifier comme axes supplémentaires.

De plus, le contrôleur a vraiment 12 boutons sensibles à la pression? Dans ce cas, vous n’avez pas de chance, car je n’ai pas encore trouvé de logiciel fonctionnant avec plus de 8 axes (y compris Windows!).

De plus, vous pouvez consolider certains de vos contrôles d’axes:

const PROGMEM USB_Descriptor_HIDReport_Datatype_t hidDescriptor[] =
{
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x05,                    // USAGE (Game Pad)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x09, 0x01,                    //   USAGE (Pointer)
    0xa1, 0x00,                    //   COLLECTION (Physical)

 // ----- Consolidated
                                   //     ; Right stick
    0x09, 0x33,                    //     USAGE (Rx)
    0x09, 0x34,                    //     USAGE (Ry)
                                   //     ; Left stick
    0x09, 0x30,                    //     USAGE (X)
    0x09, 0x31,                    //     USAGE (Y)
    0x15, 0x00,                    //     LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //     LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //     REPORT_SIZE (8)
    0x95, 0x02,                    //     REPORT_COUNT (4)    //changed
    0x81, 0x02,                    //     INPUT (Data,Var,Abs)

    0xc0,                          //   END_COLLECTION


    0x05, 0x09,                    //   USAGE_PAGE (Button)
// this section isn't going to work...
                                   //   ; Pressure sensitive buttons
    0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
    0x29, 0x0c,                    //   USAGE_MAXIMUM (Button 12)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x0c,                    //   REPORT_COUNT (12)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
// this section will, though the previous section will likely break something, and the whole descriptor will likely be rejected.
                                   //   ; Other buttons (L3, R3, Select, Start)
    0x19, 0x0d,                    //   USAGE_MINIMUM (Button 13)
    0x29, 0x10,                    //   USAGE_MAXIMUM (Button 16)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x04,                    //   REPORT_COUNT (4)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0xc0                           // END_COLLECTION
};

Ce que je soupçonne, c’est que l’ordinateur interprète un 0pour la valeur sur les boutons comme « non pressé », et toute autre chose comme « pressé ». En tant que tel, à moins que le bouton ne revienne complètement à l’état non pressé, le bouton semblera « coller ».

Quoi qu’il en soit, la generic desktoppage d’utilisation du tableau d’utilisation HID ne définit en fait qu’un total de 9 axes analogiques dans son intégralité, donc vous n’avez pas de chance. Même le diagnostic du contrôleur Windows ne prend en charge qu’un maximum de 8 axes, et la plupart des bibliothèques qui accèdent aux manettes de jeu en prennent encore moins en charge.

DirectX, par exemple, vous permet uniquement d’accéder à 6 axes analogiques.

Quoi qu’il en soit, jetez un œil aux tableaux d’utilisation USB HID ici .

J’ai également passé un certain temps à jouer avec des tables HID dans le processus de conversion d’un arduino leonardo en joystick. Regardez ça ici .

Soit dit en passant, si vous le pouvez, je recommande un Arduino Leonardo pour ce genre de bricolage. C’est beaucoup plus facile à gérer que d’essayer de re-flasher l’ATmega8U2 dans un Arduino Uno.

小 太郎

Le contrôleur Playstation a certainement 12 boutons sensibles à la pression! ( en.wikipedia.org/wiki/DualShock#DualShock_2 ) Par ailleurs, heureusement, le système d’exploitation que j’utilise est Linux, et en utilisant jstest, il semble signaler tout l’axe correctement. Le logiciel cible pour lequel j’allais utiliser le contrôleur est PCSX2, et il semble également prendre en charge tous les axes

Connor Wolf

Sans blague. C’est un peu ridicule. Quoi qu’il en soit, si le système d’exploitation sur lequel vous êtes peut gérer de nombreux axes, signalez simplement tous les boutons comme des axes analogiques distincts, et vous devriez être bon.


 小 太郎

Après que Fake Name m’ait dit que je devais utiliser l’axe pour les boutons, j’ai décidé d’utiliser ce descripteur à la place, et cela fonctionne! (Je n’ai testé que sous Linux cependant)

J’ai dû répéter les
Usage (Z)12 fois, mais cela ne semble pas poser de problème.

const PROGMEM USB_Descriptor_HIDReport_Datatype_t hidDescriptor[] =
{
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x05,                    // USAGE (Game Pad)
    0xa1, 0x01,                    // COLLECTION (Application)

                                   //   ; Right stick
    0x09, 0x33,                    //   USAGE (Rx)
    0x09, 0x34,                    //   USAGE (Ry)
                                   //   ; Left stick
    0x09, 0x30,                    //   USAGE (X)
    0x09, 0x31,                    //   USAGE (Y)
                                   //   ; Pressure sensitive buttons
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x32,                    //   USAGE (Z)
    0x09, 0x32,                    //   USAGE (Z)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x26, 0xff, 0x00,              //   LOGICAL_MAXIMUM (255)
    0x75, 0x08,                    //   REPORT_SIZE (8)
    0x95, 0x10,                    //   REPORT_COUNT (16)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)

    0x05, 0x09,                    //   USAGE_PAGE (Button)
                                   //   ; Other buttons (L3, R3, Select, Start)
    0x19, 0x01,                    //   USAGE_MINIMUM (Button 1)
    0x29, 0x04,                    //   USAGE_MAXIMUM (Button 4)
    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)
    0x25, 0x01,                    //   LOGICAL_MAXIMUM (1)
    0x75, 0x01,                    //   REPORT_SIZE (1)
    0x95, 0x04,                    //   REPORT_COUNT (4)
    0x81, 0x02,                    //   INPUT (Data,Var,Abs)
    0xc0                           // END_COLLECTION
};

 

#(une, #à, #pour, 2, descripteur, HID, manette, PlayStation, utiliser

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *