SE3 PSE Binome2023-6
 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.
- Le design de la forme de la manette est inspiré d'une vieille manette de SNES
SCHÉMATIQUE KiCAD
PCB et BRASURE
 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 code Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0         8
  idVendor           0x03eb Atmel Corp.
  idProduct          0x2043 LUFA Joystick Demo Application
  bcdDevice            0.01
  iManufacturer           1 LUFA Library
  iProduct                2 LUFA Joystick Demo
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0032
    bNumInterfaces          2
    bConfigurationValue     1
		iConfiguration          0
    bmAttributes         0xc0
      Self Powered
    MaxPower              100mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0
      bInterfaceProtocol      0
      iInterface              0
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.11
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      52
         Report Descriptors:
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval               5
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol    255 Vendor Specific Protocol
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval               5 | 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;
	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;
	
	if ((~(PIND>>PIN5) & 1) & (~(PIND>>PIN1) & 1)) ReportData->Y = 0;
	if ((~(PIND>>PIN3) & 1) & (~(PIND>>PIN2) & 1)) ReportData->X = 0;
	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 | |
| 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 et PORTD, il n'y a pas de problème dessus. | |
VIDÉOS PRÉSENTATIONS
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.
On mettra de côté le fait que la luminosité des LED est très faible. (:
Jeu avec Manette sans les LEDs de vie (pour adapter le jeu on se base sur ce tutoriel: https://alexandre-laurent.developpez.com/tutoriels/sdl/joysticks/)
Jeu avec Manette complète. Sur la croix directionnelle, le bouton de gauche déplace à gauche le vaisseau, le droit déplace à droite. Les boutons haut et bas ne servent à rien pour notre projet. Les boutons sur la droite, celui en bas permet de tirer et celui du haut de quitter.
PROBLÈMES RENCONTRÉS
Lors de la fusion de notre Minimal.c et de Joystick.c, notre VENDOR_ID et PRODUCT_ID, ne faisait que changé. Étrangement, ils alternaient entre .VendorID = 0x4242 .ProductID = 0x0001 et .VendorID = 0x03EB
	.ProductID = 0x2043
 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 : https://archives.plil.fr/lgrevin/TPI_LUFA_LibUSB.git










