SE3 PSE Binome2023-6

De projets-se.plil.fr
Aller à la navigation Aller à la recherche

Conception de la manette

DESIGN, LIMITES, FONCTIONNALITÉS ET DESCRIPTION DE LA MANETTE

  • Taille de la carte : 10x10 cm maximum
  • Fonctionne en 5V
  • Utilisation de LEDs pour visualiser les vies restantes sur la manette
  • 6 boutons : 4 de déplacement mais que deux utilisables (gauche et droite) et les deux autres (haut et bas) pour d'autres jeux à l'avenir. Les deux boutons à droite de la carte, en bas pour tirer, en haut pour quitter.
  • Un design inspiré d'une vieille SNES
Une manette SNES tout à fait basique

SCHÉMATIQUE KiCAD

Schematic2 manette.png Screenshot de la schématique de l'ATMega Screenshot de la schématique des connecteurs LEDs, Boutons, ISP et USB.

J1 est l'ISP. J2 est le port USB communiquant avec l'hôte (l'ordinateur) SW1,SW2,SW3, SW4,SW5,SW6 sont les boutons sur lesquelles nous allons appuyer pour se déplacer, tirer, quitter,... D2,D3,D4,D5 sont les LEDs qui représenteront les vies en jeu

Schematic1 manette.png
PDF du schématique complet de la manette
PDF avec la schématique complète de la manette Vidéos montrant l'interaction entre les boutons de la manette et l'application Joystick de l'ordinateur
1ere itération de l'interaction entre manette et pad joystick. Il y a trois axes mais si on enlève un morceau de code on peut avoir seulement deux axes d'interactions (x et y)
Interaction entre Manette et pad joystick mais seulement avec deux axes et non 3

PCB et BRASURE

ManetteVierge.jpg Une photo de la manette PCB sans aucun composants Visualisation 3D de la carte
Screenshot 2024-03-11 17-48-28.png
Bootloader.jpg La manette en mode DFU, la petite LED en haut à droite allumée est dû au port connecté à cette LED. Les derniers ports PF (5,6,7) sont des PIN spéciaux qui allument les LED connectées
Screenshot 2024-03-11 17-47-48.png PCB final de la manette
ManetteObsolète.jpg Première itération de soudage de la manette. Un court-circuit c'est créer lors de nos premiers soudages. La manette est devenue inutilisable par la suite, nous ne pouvions plus mettre le bootloader avec un Arduino sur l'ATMega

Programmation

Code C

Pour pouvoir avoir nos boutons fonctionnel on s'est basé sur la démo du joystick pour créer "Manette", et ensuite on est partie d'un code minimal pour pouvoir rajouté la description de notre manette, et créer deux interfaces, une pour nos boutons, et une autre pour nos LEDs.


Descriptor de notre manette
Manette et minimal trouvable dans TPI_LUFA_LibUSB/manette_LUFA/Polytech/
Manette et minimal trouvable dans TPI_LUFA_LibUSB/manette_LUFA/Polytech/

Code définissant les conditions de nos boutons. Quels boutons fait quoi et à quel moment.

bool GetNextReport(USB_JoystickReport_Data_t* const ReportData)
{

	bool           InputChanged     = false;

	/* Clear the report contents */
	memset(ReportData, 0, sizeof(USB_JoystickReport_Data_t));

	if (~(PINF>>PIN7) & 1) ReportData->Button |= (1 << 1);
	if (~(PINF>>PIN6) & 1) ReportData->Button |= (1 << 0);
	if (~(PIND>>PIN1) & 1) ReportData->Y = 100;
	if (~(PIND>>PIN2) & 1) ReportData->X = 100;
	if (~(PIND>>PIN3) & 1) ReportData->X = -100;
	if (~(PIND>>PIN5) & 1) ReportData->Y = -100;


	InputChanged = 1;

	return InputChanged;
}
Les PIN6 et PIN7 contrôlent les deux boutons sur la droite de la manette. Vous pouvez voir sur la vidéo dans deux sections avant celle-ci quand nous appuyons dessus les cases "0" et "1" deviennent noires quand nous appuyons sur les boutons
Pad Joystick a deux axes et deux boutons d'interactions

Code définissant Les PORTx et DDRx de notre manette.

	/* Hardware Initialization */
	Joystick_Init();
	LEDs_Init();
	Buttons_Init();
	USB_Init();



	MCUCR |= (1<<JTD);
	MCUCR |= (1<<JTD);
	CLKSEL0 = 0b00010101;   // sélection de l'horloge externe
	CLKSEL1 = 0b00001111;   // minimum de 8Mhz
	CLKPR = 0b10000000;     // modification du diviseur d'horloge (CLKPCE=1)
	CLKPR = 0;              // 0 pour pas de diviseur (diviseur de 1)


	//Boutons A et B
	DDRF  &= 0b00111111;
	PORTF |= 0b11000000;
	
	//Boutons directionnels 
	DDRD  &= 0b11010001;
	PORTD |= 0b00101110;


	// Allumer les leds
	PORTF |= 0b00100011;
	PORTE |= 0b01000000;
En modifiant le code LUFA donné par le prof, on peut allumer les LEDs, pour celles sur les pins PF0, PF1 et PF5 il faut désactiver le JTAG en copiant deux fois cette ligne au niveau de la déclaration des pins : MCUCR |= (1<<JTD);

En ce qui concerne les LEDs sur PORTE, il n'y a pas de problème dessus.

Vidéos Présentation

Communication entre Ordinateur et les LEDs sur la manette. On rentre des chiffres dans le terminal et certaines LEDs D2, D3, D4 et D5 s'allument ou s'éteignent en fonction.

Vidéo montrant les LEDs allumés en fonction de ce que l'on fait sur l'ordinateur

Jeu avec Manette sans les LEDs de vie

Vidéo montrant l'interaction entre la manette et le Space Invaders sans les LEDs pour les vies

Jeu avec Manette complète

Archive

Fichiers

Fichiers: Fichier:ManetteUSBLilianPierre.zip

gerber: Fichiers: Fichier:SE3-pad-job.gbrjob.zip gerber: Fichiers: Fichier:SE3-pad-LGPC.zip

GIT

GiT SpaceInvaders : https://archives.plil.fr/pcasimir/SpaceInvaders.git

GiT Manette