Commit dc90031e3bb71e8e2fffd640569db119a60812f9

Authored by root
1 parent 3a6e8ae8

Projer terminé

README.md 0 → 100644
@@ -0,0 +1,102 @@ @@ -0,0 +1,102 @@
  1 +# Tutorat Système
  2 +
  3 +Etudiants: Raphaël MARTIN, Pierre FRISON.
  4 +
  5 +## nInvaders contrôlé par Arduino
  6 +
  7 +### Procédure automatique
  8 +
  9 +Pour simplifier la mise en place du programme de l'atmega328p et de l'atmega16u2, nous avons créer un script pour guider l'utilisateur dans les manipulations et exécuter les commandes à ça place.
  10 +
  11 +Lancez le script installAndPlay.sh à la racine du projet.
  12 +
  13 +Avec le shield orienté avec le joystick à gauche et les boutons à droite, les commandes sont les suivantes :
  14 + * Bouton gauche : déplacement à gauche
  15 + * Bouton haut : lancer une partie et tirer
  16 + * Bouton droit : déplacement à droite
  17 +
  18 +Amusez-vous bien ! (pour relancer le jeu sans installation utilisez play.sh)
  19 +
  20 +### Procédure manuelle
  21 +
  22 +Si notre script échoue voici la procédure manuelle :
  23 + * Court-circuitez le pin de reset de l'atmega16u2 à la masse
  24 + * cd atmega16u2/base/
  25 + * make
  26 + * Débranchez et rebranchez la carte Arduino
  27 + * cd atmega328p/
  28 + * make upload
  29 + * Court-circuitez le pin de reset de l'atmega16u2 à la masse
  30 + * cd atmega16u2/custom/PolytechLille/PAD/
  31 + * make upload
  32 + * Débranchez et rebranchez la carte Arduino
  33 + * cd ninvaders
  34 + * make exec
  35 + * Le jeu devrait se lancer
  36 +
  37 +## Tests préprogrammés
  38 +
  39 +Avec l'atmega328p et l'atmega16u2 programmé avec nos programmes, il est possible de réaliser différents tests à partir du PC. Il existe 4 programmes de test :
  40 + * ListDevices : retourne une liste de tous les appareils connectés avec des détails.
  41 + * ListEndpoints : cherche l'Arduino et affiche la liste des endpoints programmés avec quelques détails.
  42 + * SendData : cherche l'Arduino et envoi une séquence automatique via les endpoints pour faire clignoter des LEDs sur l'arduino.
  43 + * ReceiveAndSendData : cherche l'Arduino et se met en attente de données envoyé par la carte via l'endpoint dédié aux boutons. Lorsque l'utilisateur appui sur un bouton, les données sont réceptionnées et retourné sur l'endpoint des LEDs pour ordonner à l'Arduino leur allumage.
  44 +
  45 +## Détails et explications techniques
  46 +
  47 +### Modification de nInvaders
  48 +
  49 +Pour implémenter le contrôle par la carte Arduino, nous avons principalement modifié la fonction readInput. Nous avons choisi de lire les entrées par scrutation. Nous avons donc ajouté un timeout à la fonction getch pour le clavier et nous avons utiliser la fonction receiveData avec un timeout de 50 ms. De ce fait le jeu n'est pas bloqué.
  50 +
  51 +Il suffit ensuite de faire correspondre les données reçues avec des actions en jeu.
  52 +
  53 +### Pilote USB
  54 +
  55 +Pour simplifier l'utilisation du code, nous avons créé plusieurs fonctions clées :
  56 + * Une fonction "start" pour initialiser le librairie usb-1.0, chercher la carte Arduino grâce à ses IDs, réclamer les interfaces, détacher le kernel des interfaces et lister les endpoints dans un tableau.
  57 + * Une fonction "sendData" pour envoyer des données.
  58 + * Une fonction "receiveData" pour recevoir des données.
  59 + * Une fonction "stop" pour libérer les interfaces et supprimer les structures de données.
  60 +
  61 +Ce découpage s'inspire du fonctionnement des sockets (dans son utilisation uniquement, le fonctionnement étant évidemment différent).
  62 +
  63 +### atmega328p
  64 +
  65 +L'atmega328p nous sert ici pour acquérir la valeur des différents capteurs (boutons et joystick) et allumer les LEDs sur commande. Pour nous simplifier la tâche, nous avons utiliser un ordonnanceur et écrit 3 tâches :
  66 + * Pour l'affichage des LEDs
  67 + * Pour la lecture de la valeur des boutons
  68 + * Pour la lecture des axes du joystick
  69 +
  70 +### atmega16u2
  71 +
  72 +L'atmega16u2 sert uniquement de traducteur entre le PC et l'atmega328p. Il lit les informations transmises par le PC via les endpoint et le retransmet via liaison série et vis versa. (Voir "Conventions pour la communication" pour plus de détails sur les traductions).
  73 +
  74 +### Conventions pour la communication
  75 +
  76 +De 328p vers 16u2 : 0bXYZZZZZZ
  77 +* X = 0 -> les Z sont les états de chaque bouton
  78 +* X = 1 & Y = 0 -> les Z correspondent à la valeur X du joystick
  79 +* X = 1 & Y = 1 -> les Z correspondent à la valeur Y du joystick
  80 +
  81 +De 16u2 vers PC. Cas des boutons (Endpoint 0x83) : 0b00ZZZZZZ
  82 +* 2u2 -> PC (endpoint button 1) : 0b000ZZZZZ
  83 +* Z : état d'un bouton
  84 +
  85 +De 16u2 vers PC. Cas du joystick (Endpoint 0x84) : 0b1YZZZZZZ
  86 +* 12u2 -> PC (endpoint button 2) : 0bX0YYYYYY
  87 +* X = 0 -> valeur en X du joystick
  88 +* X = 1 -> valeur en Y du joystick
  89 +
  90 +De PC vers 16u2. Cas des LEDs 8 9 10 11 12 (Endpoint 0x01) : 0b000XXXXX
  91 +* X = état d'une LED (LEDs 8 9 10 11 12)
  92 +
  93 +De PC vers 16u2. Cas de la LED 13 (Endpoint 0x02) : 0b0000000X
  94 +* X = état de la LED 13
  95 +
  96 +De 16u2 vers 328p : 0b00YYYYYY
  97 +* Y = état d'une LED (LEDs 8 9 10 11 12 13)
  98 +
  99 +## Notes
  100 +
  101 +Les licences de certains programmes ont été supprimé pour gagner de la place (nInvaders notemment). Ce projet est à usage privé uniquement.
  102 +
atmega328p/Makefile renamed to atmega328p/makefile
@@ -34,4 +34,4 @@ $(TARGET).hex: $(TARGET).elf @@ -34,4 +34,4 @@ $(TARGET).hex: $(TARGET).elf
34 upload: $(TARGET).hex 34 upload: $(TARGET).hex
35 stty -F $(TERM) hupcl # reset 35 stty -F $(TERM) hupcl # reset
36 $(DUDE) $(PGMERISP) -U flash:w:$(TARGET).hex 36 $(DUDE) $(PGMERISP) -U flash:w:$(TARGET).hex
37 - 37 + make clean
installAndPlay.sh 0 → 100755
@@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
  1 +#!/bin/bash
  2 +
  3 +echo "Compilation et installation du programme dans l'atmega328p..."
  4 +
  5 +echo ""
  6 +echo "Courcircuitez le pin de reset de l'atmega16u2 à la masse."
  7 +read -n1 -s -r -p "Appuyez sur une touche pour continuer"
  8 +make -C ./atmega16u2/base/ || exit 1
  9 +
  10 +echo ""
  11 +echo "Débranchez et rebranchez la carte Arduino."
  12 +read -n1 -s -r -p "Appuyez sur une touche pour continuer"
  13 +make -C ./atmega328p/ upload || exit 1
  14 +
  15 +
  16 +echo ""
  17 +echo "Compilation et installation du programme dans l'atmega16u2..."
  18 +
  19 +echo ""
  20 +echo "Courcircuitez le pin de reset de l'atmega16u2 à la masse."
  21 +read -n1 -s -r -p "Appuyez sur une touche pour continuer"
  22 +make -C ./atmega16u2/custom/PolytechLille/PAD upload || exit 1
  23 +
  24 +echo ""
  25 +echo "Débranchez et rebranchez la carte Arduino."
  26 +read -n1 -s -r -p "Appuyez sur une touche pour continuer"
  27 +
  28 +
  29 +echo ""
  30 +echo "Compilation et lancement du jeu..."
  31 +make -C ./ninvaders/ exec || exit 1
play.sh 0 → 100755
@@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
  1 +#!/bin/bash
  2 +
  3 +echo "Compilation et lancement du jeu..."
  4 +make -C ./ninvaders/ exec || exit 1
tests/SendData/a.out deleted
No preview for this file type