« SE3 PSE Binome2023-2 » : différence entre les versions

De projets-se.plil.fr
Aller à la navigation Aller à la recherche
Aucun résumé des modifications
m (modif type d atmega pour la partie dfu)
 
(142 versions intermédiaires par 2 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
= Sujet : Manette de jeu =
= Sujet : Manette de jeu =


== '''Cahier des charges''' ==
== '''Cahier des Charges''' ==
Concevoir une manette de jeu vidéo, afin de pouvoir jouer à Space Invader, codé en informatique.
Concevoir une manette de jeu vidéo, afin de pouvoir jouer à Space Invader, codé en informatique.
Utilisation d'au moins 3 boutons poussoirs pour aller à gauche, à droite, et tirer des missiles en haut sur les monstres.
 
Utilisation de LEDs afin de savoir le nombre de vies restant à l'utilisateur.
* Utilisation d'au moins 3 boutons poussoirs, 2 pour les déplacements à gauche, à droite, et 1 pour pouvoir tirer des missiles sur les monstres.
 
* Utilisation de LEDs afin de savoir le nombre de vies restantes à l'utilisateur.
 
== '''Lien GIT''' ==
https://archives.plil.fr/sdeparis/projet_manette_sd_ah.git


== '''Partie électronique''' ==
== '''Partie électronique''' ==


=== Kicad : schématique, routage et gerber ===
=== Kicad ===
[[Fichier:Schematique manette.pdf|vignette|left|1000px|Schématique manette]]
[[Fichier:Routage PCB.png|vignette|left|500px|Routage PCB]]
[[Fichier:Visualisation du PCB.png|vignette|right|500px|Visualisation du PCB]]


==== Schématique Kicad ====
Sur notre carte, nous avons :


[[Fichier:20240408 140701.mp4|vignette|Soudure]]
* Un microcontrôleur
[[Fichier:Soudure composants.jpg|alt=Principaux composants soudés sur la carte|vignette|Principaux composants soudés sur la carte ]]
* 4 LEDS et leurs résistances associées.
[[Fichier:Mode dfu détecté.jpg|vignette|mode dfu détecté]]
* 4 boutons poussoirs (seulement 3 sont utiles pour jouer).
[[Fichier:Projet manette carte electronique.zip|center|vignette|0x0px]]
* Le connecteur ISP afin de pouvoir relancer des programmes sur la carte ainsi que des boutons reset pour établir une liaison USB en mode DFU.
[[Fichier:Carte PCB.jpg|vignette|center|Carte PCB]]
[[Fichier:Utilisation arduino uno.jpg|alt=Utilisation arduino |vignette|Utilisation arduino pour détecter le mode dfu]]


[[Fichier:Schematique manette.pdf|vignette|left|800px|Schématique manette]]


{| class="wikitable"
|+ATMEGA16U4
!NOM
!PIN
|-
|LED2
|PF0
|-
|LED3
|PF1
|-
|LED4
|PF4
|-
|LED5
|PE6
|-
|SW1
|PD6
|-
|SW2
|PD7
|-
|SW3
|PB4
|-
|SW4
|PB5
|}
<p style="clear: both;" />
<p style="clear: both;" />


== '''Partie informatique''' ==
==== Routage ====
[[Fichier:Routage PCB.png|vignette|left|700px|Routage PCB]]
<p style="clear: both;" />Lors du routage, n'ayant jamais réalisé de carte auparavant, nous n'avions pas conscience des faibles dimensions de cette dernière. Par conséquent, les boutons sont très rapprochés, ce qui ne facilite pas leur utilisation. <p style="clear: both;" />
==== PCB vue 3D ====
[[Fichier:Visualisation du PCB.png|vignette|left|500px|Visualisation du PCB]]
<p style="clear: both;" />


=== Brasure ===


==='''Programme en C pour allumer les leds:'''===
==== PCB sans composants ====
[[Fichier:Carte PCB.jpg|vignette|left|300px|Carte PCB]]
<p style="clear: both;" />


Implémentation d'un programme pour allumer les LEDs d'un PCB.
==== Brasure des principaux composants ====
[[Fichier:Soudure composants.jpg|alt=Principaux composants brasés sur la carte|vignette|left|300px|Principaux composants brasés sur la carte ]]
[[Fichier:20240408 140701.mp4|vignette|center|1200px|Soudure]]
[[Fichier:Carte nettoyé avec les principaux composants .jpg|alt=Carte nettoyée avec les principaux composants|vignette|left|Carte avec les principaux composants et nettoyée du surplus de flux  ]]
<p style="clear: both;" />De plus, nous avons brasé les boutons poussoirs sur le dessus de la carte, sans tenir compte du fait qu'ils étaient traversants. Par conséquent les boutons poussoirs ne sont pas tous au même niveau.
== '''Partie programmation''' ==


=== Implémentation d'un programme en C pour allumer les LEDs d'un PCB ===
Dans cette partie, nous avons testé notre programme qui permet de faire clignoter les leds sur une carte des étudiants de l'année dernière.
  #include <avr/io.h>
  #include <avr/io.h>
  #include <stdio.h>
  #include <stdio.h>
Ligne 48 : Ligne 96 :
  }
  }


[[Fichier:Clignotement des leds.mp4|vignette|right|Clignotement des leds]]
[[Fichier:Clignotement des leds.mp4|vignette|left|800px|Clignotement des leds]]
<p style="clear: both;" />
 
=== Détection du mode DFU sur notre carte ===
 
==== Utilisation de la carte Arduino Uno afin de détecter le mode DFU ====
Le mode DFU de notre carte n'étant pas détecté, nous avons du utilisé un Arduino et implémenté les commandes suivantes :
 
* <code>avrdude -c stk500v1 -p atmega16u4 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xFF:m -U efuse:w:0xF7:m</code>
* <code>avrdude -c stk500v1 -p atmega16u4 -P /dev/ttyACM0 -b 19200 -U flash:w:ATMega16U4-usbdevice_dfu-1_0_0.hex</code>
 
<p style="clear: both;" />
[[Fichier:Utilisation arduino uno.jpg|alt=Utilisation arduino |vignette|left|300px|Utilisation arduino pour détecter le mode dfu]]
[[Fichier:Mode dfu détecté.jpg|vignette|left|500px|mode dfu détecté]]
<p style="clear: both;" />
 
=== Initialisation de notre carte ===
 
==== Programmation des leds ====
[[Fichier:Vérifications fonctionnement des leds.mp4|vignette|right|3000px|Vérifications fonctionnement des leds]]
[[Fichier:Programme pour les leds.png|alt=programme pour les leds|vignette|left|600px|programme pour les leds]]
<p style="clear: both;" />
 
==== Programmation des boutons ====
[[Fichier:Vérifications des BPs .mp4|vignette|right|2000px|Vérifications des BPs]]
[[Fichier:Programmation des boutons.png|alt=programmation des boutons|vignette|left|600px|programmation des boutons]]
<p style="clear: both;" />
 
=== LUFA ===
Modification de la LUFA téléchargée en version low level, qui est la bibliothèque USB permettant de communiquer entre le PC et la manette.
 
En premier lieu, nous avons modifié les fichiers minimal.c et descriptor.c afin que la manette soit détectée en mode DFU.
 
Pour tester les programmes sur notre carte, on vérifie d'abord que la carte est bien en mode DFU à l'aide de la commande <code>lsusb</code> puis on exécute ensuite le programme à l'aide de la commande <code>make</code>.
<p style="clear: both;" /><p style="clear: both;" />
 
==== Joystick ====
Afin de pouvoir déplacer notre vaisseau sur le jeu Space invaders, nous avons besoin des déplacements en x à gauche et à droite de l'écran. Pour se déplacer à gauche, on utilise le premier bouton SW1 et pour aller à droite, on utilise le dernier bouton SW4.
 
Pour tirer des missiles sur les monstres, nous avons besoin besoin d'appuyer sur le deuxième bouton poussoir SW2.
 
 
Nous avons modifié le fichier descriptor.c afin de permettre à la carte d'être détectée en tant que joystick. Afin que les boutons soient détectés comme étant des joysticks, on déclare les boutons en tant qu'entrées puis on attribue à chaque bouton sa fonction (déplacement ou tir).
 
[[Fichier:Touches Joystick.mp4|vignette|1600px|right|Vérification des touches pour le Joystick]]
[[Fichier:Screenshot 2024-06-03 09-22-39.png|alt=Déclaration boutons en sorties|vignette|900px|left|Déclaration boutons en sorties]]
[[Fichier:Screenshot 2024-06-03 09-25-51.png|alt=Fonctions des boutons|vignette|900px|left|Fonctions des boutons]]
 
 
<p style="clear: both;" />On teste notre joystick en utilisant la commande <code>jstest-gtk</code> sur le terminal.
 
==== Fusion de minimal et de descriptor ====
L'objectif de cette partie est de fusionner les fichiers pour pouvoir contrôler les leds et les boutons en même temps.
 
Pour cela, on fusionne le fichier descriptor du joystick et le fichier descriptor du minimal en un seul fichier descriptor. On aura donc deux interfaces, une pour le joystick et une pour les leds réunies au sein d'un même fichier.
<p style="clear: both;" />
 
[[Fichier:Descriptor.h.png|alt=Descriptor.h|vignette|700px|left|Descriptor.h]]
<p style="clear: both;" />On fusionne ensuite les deux decriptor.c en un seul.
 
Et enfin, on fusionne également le fichier minimal.c et le fichier joystick.c en un fichier nommé Fusion_Minimal_Joystick.c.
<p style="clear: both;" />
 
=== Utilisation de la manette pour le jeu ===
 
Afin d'utiliser le Joystick sur notre jeu Space Invaders, on programme le joystick à l'aide de la bibliothèque SDL.
<p style="clear: both;" />
 
[[Fichier:Equivalent boutons Joystick Touche clavier.png|alt=Gestion Joystick sur le jeu|vignette|800px|left|Gestion Joystick sur le jeu ]]
[[Fichier:Space Invaders.jpg|alt=Space Invaders|vignette|700px|right|Space Invaders]]
 
<p style="clear: both;" />
 
Sur la capture "gestion Joystick sur le jeu", plusieurs fonctions sont implémentées.
<p style="clear: both;" />
La dernière fonction "bouton_joystick_equivalent_touche_clavier" nous permet d'assimiler les boutons du joystick aux boutons du clavier.
<p style="clear: both;" />
Par exemple, lors d'un appui sur le bouton S1, le vaisseau se déplace à gauche par le bais de la fonction qui renvoie donc le caractère 'q' utilisé en tant que paramètre touche dans la fonction gestionEventClavier().
<p style="clear: both;" />
De même pour le bouton S4, où la touche 'd' est renvoyée ou bien pour le bouton S2, où la touche 's' est renvoyée puis utilisée en tant que paramètre dans la fonction gestionEventClavier().
<p style="clear: both;" />
[[Fichier:Fonction controle des touches.png|alt=Fonction contrôle des touches|vignette|1200px|left|Fonction contrôle des touches]]
 
<p style="clear: both;" />
 
Le mode Joystick de notre carte n'étant plus détecté par le PC, nous n'avons pas pu tester les programmes ci-dessus.
 
<p style="clear: both;" />

Version actuelle datée du 12 juin 2024 à 20:09

Sujet : Manette de jeu

Cahier des Charges

Concevoir une manette de jeu vidéo, afin de pouvoir jouer à Space Invader, codé en informatique.

  • Utilisation d'au moins 3 boutons poussoirs, 2 pour les déplacements à gauche, à droite, et 1 pour pouvoir tirer des missiles sur les monstres.
  • Utilisation de LEDs afin de savoir le nombre de vies restantes à l'utilisateur.

Lien GIT

https://archives.plil.fr/sdeparis/projet_manette_sd_ah.git

Partie électronique

Kicad

Schématique Kicad

Sur notre carte, nous avons :

  • Un microcontrôleur
  • 4 LEDS et leurs résistances associées.
  • 4 boutons poussoirs (seulement 3 sont utiles pour jouer).
  • Le connecteur ISP afin de pouvoir relancer des programmes sur la carte ainsi que des boutons reset pour établir une liaison USB en mode DFU.
Schématique manette
ATMEGA16U4
NOM PIN
LED2 PF0
LED3 PF1
LED4 PF4
LED5 PE6
SW1 PD6
SW2 PD7
SW3 PB4
SW4 PB5

Routage

Routage PCB

Lors du routage, n'ayant jamais réalisé de carte auparavant, nous n'avions pas conscience des faibles dimensions de cette dernière. Par conséquent, les boutons sont très rapprochés, ce qui ne facilite pas leur utilisation.

PCB vue 3D

Visualisation du PCB

Brasure

PCB sans composants

Carte PCB

Brasure des principaux composants

Principaux composants brasés sur la carte
Principaux composants brasés sur la carte
Carte nettoyée avec les principaux composants
Carte avec les principaux composants et nettoyée du surplus de flux

De plus, nous avons brasé les boutons poussoirs sur le dessus de la carte, sans tenir compte du fait qu'ils étaient traversants. Par conséquent les boutons poussoirs ne sont pas tous au même niveau.

Partie programmation

Implémentation d'un programme en C pour allumer les LEDs d'un PCB

Dans cette partie, nous avons testé notre programme qui permet de faire clignoter les leds sur une carte des étudiants de l'année dernière.

#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>

int main(){   
  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)
  DDRD |=0x03;            // car on souhaite déclarer en sortie les ports 0 et 1 ce qui correspond à 3 en hexa
  while(1){
    PORTD ^=0x03;       // le xor permet d'allumer et éteindre les leds successivement
    _delay_ms(1000);    // tps en ms
  }
  return 0; 
}

Détection du mode DFU sur notre carte

Utilisation de la carte Arduino Uno afin de détecter le mode DFU

Le mode DFU de notre carte n'étant pas détecté, nous avons du utilisé un Arduino et implémenté les commandes suivantes :

  • avrdude -c stk500v1 -p atmega16u4 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xFF:m -U efuse:w:0xF7:m
  • avrdude -c stk500v1 -p atmega16u4 -P /dev/ttyACM0 -b 19200 -U flash:w:ATMega16U4-usbdevice_dfu-1_0_0.hex

Utilisation arduino
Utilisation arduino pour détecter le mode dfu
mode dfu détecté

Initialisation de notre carte

Programmation des leds

programme pour les leds
programme pour les leds

Programmation des boutons

programmation des boutons
programmation des boutons

LUFA

Modification de la LUFA téléchargée en version low level, qui est la bibliothèque USB permettant de communiquer entre le PC et la manette.

En premier lieu, nous avons modifié les fichiers minimal.c et descriptor.c afin que la manette soit détectée en mode DFU.

Pour tester les programmes sur notre carte, on vérifie d'abord que la carte est bien en mode DFU à l'aide de la commande lsusb puis on exécute ensuite le programme à l'aide de la commande make.

Joystick

Afin de pouvoir déplacer notre vaisseau sur le jeu Space invaders, nous avons besoin des déplacements en x à gauche et à droite de l'écran. Pour se déplacer à gauche, on utilise le premier bouton SW1 et pour aller à droite, on utilise le dernier bouton SW4.

Pour tirer des missiles sur les monstres, nous avons besoin besoin d'appuyer sur le deuxième bouton poussoir SW2.


Nous avons modifié le fichier descriptor.c afin de permettre à la carte d'être détectée en tant que joystick. Afin que les boutons soient détectés comme étant des joysticks, on déclare les boutons en tant qu'entrées puis on attribue à chaque bouton sa fonction (déplacement ou tir).

Vérification des touches pour le Joystick
Déclaration boutons en sorties
Déclaration boutons en sorties
Fonctions des boutons
Fonctions des boutons


On teste notre joystick en utilisant la commande jstest-gtk sur le terminal.

Fusion de minimal et de descriptor

L'objectif de cette partie est de fusionner les fichiers pour pouvoir contrôler les leds et les boutons en même temps.

Pour cela, on fusionne le fichier descriptor du joystick et le fichier descriptor du minimal en un seul fichier descriptor. On aura donc deux interfaces, une pour le joystick et une pour les leds réunies au sein d'un même fichier.

Descriptor.h
Descriptor.h

On fusionne ensuite les deux decriptor.c en un seul. Et enfin, on fusionne également le fichier minimal.c et le fichier joystick.c en un fichier nommé Fusion_Minimal_Joystick.c.

Utilisation de la manette pour le jeu

Afin d'utiliser le Joystick sur notre jeu Space Invaders, on programme le joystick à l'aide de la bibliothèque SDL.

Gestion Joystick sur le jeu
Gestion Joystick sur le jeu
Space Invaders
Space Invaders

Sur la capture "gestion Joystick sur le jeu", plusieurs fonctions sont implémentées.

La dernière fonction "bouton_joystick_equivalent_touche_clavier" nous permet d'assimiler les boutons du joystick aux boutons du clavier.

Par exemple, lors d'un appui sur le bouton S1, le vaisseau se déplace à gauche par le bais de la fonction qui renvoie donc le caractère 'q' utilisé en tant que paramètre touche dans la fonction gestionEventClavier().

De même pour le bouton S4, où la touche 'd' est renvoyée ou bien pour le bouton S2, où la touche 's' est renvoyée puis utilisée en tant que paramètre dans la fonction gestionEventClavier().

Fonction contrôle des touches
Fonction contrôle des touches

Le mode Joystick de notre carte n'étant plus détecté par le PC, nous n'avons pas pu tester les programmes ci-dessus.