« SE3 PSE Binome2023-3 » : différence entre les versions
Aller à la navigation
Aller à la recherche
Ligne 100 : | Ligne 100 : | ||
} | } | ||
return 0; | return 0; | ||
} | |||
/* la fonction Led_control permet d'allumer ou d'eteindre les LEDs : | |||
0x00 est le message pour éteindre les LEDs. | |||
0x01 est le message pour allumer la LED gauche. | |||
0x02 est le message pour allumer la LED droite. | |||
0x03 est le message pour allumer les 2 LEDs.*/ | |||
int Led_control(int message) { | |||
libusb_context *context = NULL; | |||
int status = libusb_init(&context); | |||
if (status != 0) { | |||
perror("libusb_init"); | |||
exit(-1); | |||
} | |||
libusb_device *manette = NULL; | |||
libusb_device_handle *handle = NULL; | |||
struct libusb_config_descriptor *configdesc; | |||
FindDevice(&manette, &handle, configdesc, context); | |||
//cette fonction permet de trouver la manette à qui il faut envoyer le message. | |||
ConfigDevice(manette, handle, &configdesc); | |||
//cette fonction permet de récupérer la configuration de la manette. | |||
Send_message(message, manette, handle, configdesc); | |||
libusb_close(handle); | |||
libusb_exit(context); | |||
return 0; | |||
} | |||
void Send_message(unsigned char message, libusb_device *manette, libusb_device_handle *handle, struct libusb_config_descriptor *configdesc) | |||
{ | |||
int indint=1; | |||
int indalt=0; | |||
int interface=configdesc->interface[indint].altsetting[indalt].bInterfaceNumber; | |||
int status=libusb_claim_interface(handle,interface); | |||
if(status!=0) | |||
{ | |||
printf("bij\n"); | |||
perror("libusb_claim_interface"); | |||
exit(-1); | |||
} | |||
int transferred; | |||
status = libusb_interrupt_transfer(handle, ENDPOINT_OUT, &message, sizeof(message), &transferred, 0); | |||
if (status == 0) { | |||
} else { | |||
fprintf(stderr, "Erreur lors de l'envoi de données au périphérique USB: %s\n", libusb_error_name(status)); | |||
} | |||
status=libusb_release_interface(handle,interface); | |||
if(status!=0) | |||
{ | |||
perror("libusb_release_interface"); | |||
exit(-1); | |||
} | |||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> |
Version du 7 juin 2024 à 08:17
TO DO
- implémenter minimal dans joystick
- Recevoir l'info "bouton appuyé"
- Fonction d'envoi/réception d'un message via USBSend
- gcc la libusb*
CONCEPTION
Schématique
Routage
PINOUT
NOM | PIN |
---|---|
BP_L | PD2 |
BP_A | PC7 |
BP_B | PC6 |
BP_D | PD7 |
BP_U | PD5 |
BP_R | PD6 |
LED2 | PB4 |
LED3 | PB5 |
RÉALISATION
Brasage des composants sur le PCB
Brasage atmega32u4 sur le PCB:
PCB avec atmega32u4, bouton reset et HWB:
PCB terminé:
Correction de conception du PCB:
Suite à une mécompréhension du fonctionnement des boutons, ceux-ci sont reliés nativement au +5v et non à la masse.
Nous avons donc coupé le cuivre entre J3 et J4 (empreintes de servomoteur que nous n'utilisons pas) puis nous avons relié le cuivre à la masse de J3 afin de corriger notre erreur.
À la suite de cette modification la carte fonctionne parfaitement.
Programmation de l'atmega32u4
Installation du bootloader via ISP:
Intégration de la manette dans le jeu
/*Ce code est purement à titre démonstratif pour ajouter la manette dans le jeu, il ne s'agit pas du jeu fonctionnel*/
int game()
{
SDL_Joystick* Joystick = NULL; //On définit une manette.
Joystick = SDL_JoystickOpen(0); //On choisit sa manette, 0 étant la première manette sur le PC.
while(1)
{
int b_tir = SDL_JoystickGetButton(Joystick, 1);
/*Cette fonction prend en paramètre la manette ainsi que le bouton et renvoie 1 si le bouton est appuyé, 0 sinon.*/
int b_quit = SDL_JoystickGetButton(Joystick, 0); //idem
int b_x = SDL_JoystickGetAxis(Joystick, 0);
/*Cette fonction prend en paramètre la manette ainsi que l'axe et retourne 32768 si l'axe est totalement à droite (haut pour Y)
et -32768 à gauche (bas pour Y). Au point mort, l'axe retourne 0.*/
if(b_quit == 1) quitter_le_jeu();
if(b_x > 0) deplacement_monstres_droite();
if(b_x < 0) deplacement_monstres_gauche();
if(b_tir == 1) tir_missile();
}
return 0;
}
/* la fonction Led_control permet d'allumer ou d'eteindre les LEDs :
0x00 est le message pour éteindre les LEDs.
0x01 est le message pour allumer la LED gauche.
0x02 est le message pour allumer la LED droite.
0x03 est le message pour allumer les 2 LEDs.*/
int Led_control(int message) {
libusb_context *context = NULL;
int status = libusb_init(&context);
if (status != 0) {
perror("libusb_init");
exit(-1);
}
libusb_device *manette = NULL;
libusb_device_handle *handle = NULL;
struct libusb_config_descriptor *configdesc;
FindDevice(&manette, &handle, configdesc, context);
//cette fonction permet de trouver la manette à qui il faut envoyer le message.
ConfigDevice(manette, handle, &configdesc);
//cette fonction permet de récupérer la configuration de la manette.
Send_message(message, manette, handle, configdesc);
libusb_close(handle);
libusb_exit(context);
return 0;
}
void Send_message(unsigned char message, libusb_device *manette, libusb_device_handle *handle, struct libusb_config_descriptor *configdesc)
{
int indint=1;
int indalt=0;
int interface=configdesc->interface[indint].altsetting[indalt].bInterfaceNumber;
int status=libusb_claim_interface(handle,interface);
if(status!=0)
{
printf("bij\n");
perror("libusb_claim_interface");
exit(-1);
}
int transferred;
status = libusb_interrupt_transfer(handle, ENDPOINT_OUT, &message, sizeof(message), &transferred, 0);
if (status == 0) {
} else {
fprintf(stderr, "Erreur lors de l'envoi de données au périphérique USB: %s\n", libusb_error_name(status));
}
status=libusb_release_interface(handle,interface);
if(status!=0)
{
perror("libusb_release_interface");
exit(-1);
}
}
TEST
Vidéo de test du clignotement des LEDs de vie:
Vidéo de test d'allumage d'une LED avec un bouton:
Vidéo de test du Space Invaders avec la manette sans LEDs:
Vidéo de test du Space Invaders avec la manette avec LEDs:
À PROPOS DE LA MANETTE
Informations générales:
idVendor : 0x057e
idProduct : 0x0306
Mode d'emploi:
Bouton A : Quitter le jeu
Bouton B: Tirer un missile
Bouton R : Aller vers la droite
Bouton L : Aller vers la gauche
ARCHIVE
Archive KiCad Manette : Fichier:CARTDETREZ.zip
Archive programmation USB : https://archives.plil.fr/vdetrez/PSE_Manette_CART_DETREZ.git
Tuto : https://rex.plil.fr/Enseignement/Systeme/Systeme.PSE/systeme033.html