Arduino avec manette de commande (3 / 5 étapes)

Étape 3: Obtenir l’entrée de manette de jeu

Maintenant, que nous savons comment envoyer les informations à l’Arduino, nous avons seulement besoin d’apprendre à acquérir l’entrée de la manette de jeu XBOX.

Dans cette section nous apprendrons les rudiments du XInput et écrire un programme très simple qui affiche l’état actuel de manette de jeu à la sortie de la console. Nous apprendrons également certains aspects importants de prétraitement sur les valeurs d’entrée pour éviter les gammes d’entrée joystick problématique (« zones mortes »).

LES PRINCIPES DE BASE

XInput API fournit les moyens de se saisir de XBOX 360 contrôleurs et comprend une variété d’outils pour définir les effets de contrôleur (farce feedback), traiter les entrées/sorties audio pour casques gaming et faire d’autres choses cool.

XInput prend en charge jusqu'à 4 contrôleurs, mais dans notre situation seulement contrôleur #0 sera utilisé comme valeur par défaut.

Pour mettre à jour l’état actuel de la manette de jeu, nous allons utiliser XInputGetState() fonction. Elle prend 2 paramètres : l’ID de la manette de jeu (ce qui est de 0 dans la plupart des cas) et le pointeur vers la variable d’État XInput. La valeur de retour de XInputGetState peut être utilisée pour vérifier la disponibilité de la manette. La valeur de ERR_SUCCESS signifie que la manette est sur, et XInput État a maintenant son état actuel.

XINPUT_STATE se compose des éléments suivants :

 typedef struct _XINPUT_STATE { DWORD dwPacketNumber; XINPUT_GAMEPAD Gamepad; } XINPUT_STATE; 

dwPacketNumber indique si l’état de la manette de jeu a changé.

Manette de jeu est un type de données qui représente l’état actuel de manette de jeu, y compris le stick analogique des positions, valeurs de déclenchement, drapeaux D-pad et le bouton.

 typedef struct _XINPUT_GAMEPAD { WORD wButtons; BYTE bLeftTrigger; BYTE bRightTrigger; SHORT sThumbLX; SHORT sThumbLY; SHORT sThumbRX; SHORT sThumbRY; } XINPUT_GAMEPAD; 

sThumbLX, sThumbLY, sThumbRX et sThumbRY sont des entiers signés 16 bits, qui prennent des valeurs de −32, 768 à 32 767. Ils correspondent à des positions actuelles de joystick.

bLeftTrigger et bRightTrigger prennent des valeurs dans la plage 0.. 255.

wButtons représente l’état de tous les boutons d’une manette XBox, où chaque bit correspond à l’état actuel de chaque bouton individuel. Si nous voulons vérifier si le bouton de X a été enfoncé, il faut effectuer les opérations suivantes :

 XINPUT_STATE gpState; // Create state variable memset(&gpState,0,sizeof(XINPUT_STATE)); // Reset state DWORD res = XInputGetState(0,&gpState); // Get new state if(gpState.wButtons & 0x4000 ) { printf("Xplosive kick!\n"); } 

La liste suivante répertorie tous les boutons et leurs masques de bits correspondants :

 XINPUT_GAMEPAD_DPAD_UP 0x0001 XINPUT_GAMEPAD_DPAD_DOWN 0x0002 XINPUT_GAMEPAD_DPAD_LEFT 0x0004 XINPUT_GAMEPAD_DPAD_RIGHT 0x0008 XINPUT_GAMEPAD_START 0x0010 XINPUT_GAMEPAD_BACK 0x0020 XINPUT_GAMEPAD_LEFT_THUMB 0x0040 // These are thumbstick buttons XINPUT_GAMEPAD_RIGHT_THUMB 0x0080 XINPUT_GAMEPAD_LEFT_SHOULDER 0x0100 // Left bumper XINPUT_GAMEPAD_RIGHT_SHOULDER 0x0200 // Right bumper XINPUT_GAMEPAD_A 0x1000 XINPUT_GAMEPAD_B 0x2000 XINPUT_GAMEPAD_X 0x4000 XINPUT_GAMEPAD_Y 0x8000 


PRATIQUONS LE

À ce stade, nous avons tous les outils que nécessaires pour écrire notre premier programme avec XInput. Il sera ridiculement simple, mais il vous aidera à comprendre comment ce processus fonctionne et quels éléments de XInput, nous avons besoin.

 #include "stdafx.h" #include <Windows.h> #include <XInput.h> #pragma comment(lib, "XInput.lib") // required for linker int _tmain(int argc, _TCHAR* argv[]) { XINPUT_STATE gpState; // Gamepad state int player = -1; // Gamepad ID // Polling all 4 gamepads to see who's alive for(int i=0;i<4;i++) { DWORD res = XInputGetState(i,&gpState); // Getting state if(res==ERROR_SUCCESS) // If alive - print message { printf("Controller #%d is ON!\n",i+1); player = i; // Assign last alive gamepad as active } } if(player<0) // If player==-1 in other words... { printf("Haven't found any gamepads...\n"); } else { while(true) { system("CLS"); // Clear screen memset(&gpState,0,sizeof(XINPUT_STATE)); // Reset state DWORD res = XInputGetState(0,&gpState); // Get new state printf("LX\tLY\tRX\tRY\tLTrig\tRTrig\tButtons\n"); // Print header // Thumbstick values are divided by 256 for better consistency printf("%d\t%d\t%d\t%d\t%d\t%d\t%d\n", gpState.Gamepad.sThumbLX/256, gpState.Gamepad.sThumbLY/256, gpState.Gamepad.sThumbRX/256, gpState.Gamepad.sThumbRY/256, gpState.Gamepad.bLeftTrigger, gpState.Gamepad.bRightTrigger, gpState.Gamepad.wButtons); } } system("PAUSE"); return 0; } 

Une fois que vous générez la solution et exécutez votre programme, vous verrez la sortie changer lorsque vous déplacez des Sticks, ou boutons de commande de votre manette. Nous vous enverrons ces données à la carte Arduino dans la section suivante de ce didacticiel.

En ce moment, je veux que vous faites attention à la sortie, lorsque vous ne font rien. Valeurs de LX, LY et RX, RY ne sont pas égales à 0, que nous attendons qu’ils. Dans ce cas pour un certain nombre de raisons, mais ce qui importe le plus, c’est que nous sommes conscients de ce phénomène !

Ces fluctuations et incohérences dans les valeurs sont appelées « zones mortes ». Pour se débarrasser de cette anomalie méchante, nous avons besoin de trouver la plus petite valeur marginale au cours de laquelle on peut considérer que le Stick est en fait poussé dans une direction.

Pour ce faire, nous devons définir un seuil de deadzone et comparez-la aux valeurs actuelles. Découvrez la référence MSDN pour plus d’informations.

Pendant ce temps, utilisez cet exemple de code pour corriger ces valeurs :

 float LX = gpState.Gamepad.sThumbLX; // Get LX float LY = gpState.Gamepad.sThumbLY; // Get LY magnitude = sqrt(LX*LX+LY*LY); // Calculate the radius of current position if(magnitude < XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE) // Inside dead zone? { // Set all to 0 LX=0.0; LY=0.0; } // Do the same for RX and RY 

Il y a aussi des valeurs prédéfinies de zone morte pour les sticks gauche et droite et les déclencheurs. Vous pouvez utiliser ces, ou définir vos propres seuils (dans mon cas ~ 6500 a travaillé pour le stick gauche et droit), mais n’oubliez pas que ces valeurs dépendent en grande partie comment beat-up votre manette est !

 #define XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE 7849 #define XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE 8689 #define XINPUT_GAMEPAD_TRIGGER_THRESHOLD 30 


LECTURES COMPLÉMENTAIRES

La ressource supplémentaire seulement je vais vous parler est celle-ci: API de contrôleur de jeu XInput

Il a tout ce que vous devez savoir sur XInput, y compris la référence complète et utile guide de programmation.

C’est tout pour cette partie. Maintenant, nous allons essayer de combiner nos compétences en programmation à distance des gamepads et connexions série à contrôle Arduino!!! ... dans le cas où vous avez oublié où nous avons commencé...

Articles Liés

Préampli passif Arduino avec télécommande, atténuateur et channel selector

Préampli passif Arduino avec télécommande, atténuateur et channel selector

Bonjour à tous,Puisque vous m'avez soutenu que beaucoup dans mon dernier instructable j'ai été encouragé à améliorer davantage et à partager avec vous.Dans la génération précédente, j'ai eu bon marché préampli avec potentiomètre motorisé, distant et
Lumières de télécommande Arduino avec télécommande universelle

Lumières de télécommande Arduino avec télécommande universelle

j'ai se sont penchés en domotique depuis un certain temps, mais n'ont pas commis à lui tout de suite, surtout à cause de l'étiquette de prix. L'année dernière (2010) j'ai acheté ces prise de commande à distance marche/arrêt interrupteurs donc je pour
Contrôle Arduino RoverBot avec télécommande TV

Contrôle Arduino RoverBot avec télécommande TV

je suis un Hacker pauvres d'Arduino âgé de 15 ans, qui a peu d'accès aux composants et matériaux pour construire un robot Hi-Tech.  Je suis sûr qu'il y a beaucoup d'autres là-bas qui sont dans ma situation.  Ce petit Instructable va expliquer et démo
Commande de porte de Garage Bluetooth Arduino avec capteurs et personnalisable Android App

Commande de porte de Garage Bluetooth Arduino avec capteurs et personnalisable Android App

Utilisez un arduino pour activer le relais pour l'ouverture des portes de garage et serrures électriques.Une application Android personnalisable, se connecte à l'arduino via mot de passe bluetooth appairage.Un module de hc-05 bluetooth reçoit des com
Domotique en utilisant arduino avec wifi, bluetooth et télécommande IR

Domotique en utilisant arduino avec wifi, bluetooth et télécommande IR

Il s'agit d'un tutoriel pour montrer comment construire un système de domotique avec arduino Wifi [ESP8266-01], bluetooth (HC-05) et télécommande IR. Domotique se traduit par un accueil plus intelligent et est utilisé pour fournir un niveau de vie pl
Contrôler l’Arduino avec un téléphone Android via Bluetooth

Contrôler l’Arduino avec un téléphone Android via Bluetooth

Bonjour les gens, ici vous pouvez apprendre comment contrôler Arduino avec un téléphone Android via Bluetooth. Vous pouvez utiliser votre smartphone comme télécommande pour vous système d'éclairage à la maison, ou vous pouvez utiliser comme un etc. d
Contrôler l’Arduino avec python basé web API (pas de php)

Contrôler l’Arduino avec python basé web API (pas de php)

Dans ce guide, je vais vous montrer comment contrôler votre appareil arduino d'une page Web ! Par la suite, je vais vous montrer comment contrôler votre arduino depuis votre appareil mobile et même créer une API basée sur le web pour contrôler votre
Comment programmer un AVR (arduino) avec un autre arduino

Comment programmer un AVR (arduino) avec un autre arduino

cette instructables est utile si :* vous avez votre arduino avec atmega168 et vous avez acheté un atmega328 à vous magasin d'électronique. Il n'est pas un bootloader arduino* vous voulez faire un projet qui n'utilise pas arduino - juste une puce AVR
Servos de contrôle sur l’Internet via Arduino avec Teleduino

Servos de contrôle sur l’Internet via Arduino avec Teleduino

Servos ont de nombreuses utilisations et peut être beaucoup de plaisir à jouer avec. Quelque chose qui peut être des tas de plaisir prend le contrôle de jusqu'à 6 servos sur internet ! Imaginez les possibilités.Ce processus est rendu vraiment simple
ANT + et l’intégration de la Arduino avec Cateye Ergociser exercice vélo

ANT + et l’intégration de la Arduino avec Cateye Ergociser exercice vélo

Cette instructable explique comment intégrer ANT + émetteur/récepteur avec Arduino contrôleur dans un vélo d'exercice vintage 1987 pour permettre basé sur PC ou Garmin sport watch/vélo ordinateur enregistrement des données d'exercice comme 1) Cadence
Simple filaire manette de commande du moteur 2

Simple filaire manette de commande du moteur 2

je voulais depuis longtemps d'avoir une manette de contrôle (coffret), qui peut facilement changer le sens de 2 moteurs. J'ai donc fait un. Il n'est pas difficile à construire et fonctionne parfaitement. les coûts varient entre 2 et 4 euros. n'hésite
Contrôler un Arduino avec votre téléphone.

Contrôler un Arduino avec votre téléphone.

Dans ce Instructable je vais montrer comment contrôler vos trucs avec votre téléphone et la carte arduino. J'ai commandé tout de machines à fumée trop légères christmas populaire avec ce programme.Vidéo :Désolé, que la vidéo est un peu étrange parce
Rétro-ingénierie : Ampoule de LED RVB avec télécommande IR

Rétro-ingénierie : Ampoule de LED RVB avec télécommande IR

nous avons acheté 20 de ces ampoules LED RVB pour un parti au travail, mais j'ai été un peu déçu avec les fonctions de décoloration de couleur ils ont fourni. J'ai donc décidé de prendre un ingénieur apart, inverse le protocole infrarouge et voir si
Show Laser Arduino avec un contrôle complet XY

Show Laser Arduino avec un contrôle complet XY

mise à jour ! Voir étape 32 pour savoir comment utiliser ce projet avec un laser vert! Aussi - commander l' Instructable LaserTweet pour rendre ces données d'affichage projet de Twitter :Ce projet utilise un Arduino et certains haut-parleurs bon marc