From dc90031e3bb71e8e2fffd640569db119a60812f9 Mon Sep 17 00:00:00 2001 From: root Date: Thu, 24 Jan 2019 00:12:22 +0100 Subject: [PATCH] Projer terminé --- README.md | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ atmega328p/Makefile | 37 ------------------------------------- atmega328p/makefile | 37 +++++++++++++++++++++++++++++++++++++ installAndPlay.sh | 31 +++++++++++++++++++++++++++++++ play.sh | 4 ++++ tests/SendData/a.out | Bin 13960 -> 0 bytes 6 files changed, 174 insertions(+), 37 deletions(-) create mode 100644 README.md delete mode 100755 atmega328p/Makefile create mode 100755 atmega328p/makefile create mode 100755 installAndPlay.sh create mode 100755 play.sh delete mode 100755 tests/SendData/a.out diff --git a/README.md b/README.md new file mode 100644 index 0000000..6b50798 --- /dev/null +++ b/README.md @@ -0,0 +1,102 @@ +# Tutorat Système + +Etudiants: Raphaël MARTIN, Pierre FRISON. + +## nInvaders contrôlé par Arduino + +### Procédure automatique + +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. + +Lancez le script installAndPlay.sh à la racine du projet. + +Avec le shield orienté avec le joystick à gauche et les boutons à droite, les commandes sont les suivantes : + * Bouton gauche : déplacement à gauche + * Bouton haut : lancer une partie et tirer + * Bouton droit : déplacement à droite + +Amusez-vous bien ! (pour relancer le jeu sans installation utilisez play.sh) + +### Procédure manuelle + +Si notre script échoue voici la procédure manuelle : + * Court-circuitez le pin de reset de l'atmega16u2 à la masse + * cd atmega16u2/base/ + * make + * Débranchez et rebranchez la carte Arduino + * cd atmega328p/ + * make upload + * Court-circuitez le pin de reset de l'atmega16u2 à la masse + * cd atmega16u2/custom/PolytechLille/PAD/ + * make upload + * Débranchez et rebranchez la carte Arduino + * cd ninvaders + * make exec + * Le jeu devrait se lancer + +## Tests préprogrammés + +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 : + * ListDevices : retourne une liste de tous les appareils connectés avec des détails. + * ListEndpoints : cherche l'Arduino et affiche la liste des endpoints programmés avec quelques détails. + * SendData : cherche l'Arduino et envoi une séquence automatique via les endpoints pour faire clignoter des LEDs sur l'arduino. + * 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. + +## Détails et explications techniques + +### Modification de nInvaders + +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é. + +Il suffit ensuite de faire correspondre les données reçues avec des actions en jeu. + +### Pilote USB + +Pour simplifier l'utilisation du code, nous avons créé plusieurs fonctions clées : + * 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. + * Une fonction "sendData" pour envoyer des données. + * Une fonction "receiveData" pour recevoir des données. + * Une fonction "stop" pour libérer les interfaces et supprimer les structures de données. + +Ce découpage s'inspire du fonctionnement des sockets (dans son utilisation uniquement, le fonctionnement étant évidemment différent). + +### atmega328p + +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 : + * Pour l'affichage des LEDs + * Pour la lecture de la valeur des boutons + * Pour la lecture des axes du joystick + +### atmega16u2 + +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). + +### Conventions pour la communication + +De 328p vers 16u2 : 0bXYZZZZZZ +* X = 0 -> les Z sont les états de chaque bouton +* X = 1 & Y = 0 -> les Z correspondent à la valeur X du joystick +* X = 1 & Y = 1 -> les Z correspondent à la valeur Y du joystick + +De 16u2 vers PC. Cas des boutons (Endpoint 0x83) : 0b00ZZZZZZ +* 2u2 -> PC (endpoint button 1) : 0b000ZZZZZ +* Z : état d'un bouton + +De 16u2 vers PC. Cas du joystick (Endpoint 0x84) : 0b1YZZZZZZ +* 12u2 -> PC (endpoint button 2) : 0bX0YYYYYY +* X = 0 -> valeur en X du joystick +* X = 1 -> valeur en Y du joystick + +De PC vers 16u2. Cas des LEDs 8 9 10 11 12 (Endpoint 0x01) : 0b000XXXXX +* X = état d'une LED (LEDs 8 9 10 11 12) + +De PC vers 16u2. Cas de la LED 13 (Endpoint 0x02) : 0b0000000X +* X = état de la LED 13 + +De 16u2 vers 328p : 0b00YYYYYY +* Y = état d'une LED (LEDs 8 9 10 11 12 13) + +## Notes + +Les licences de certains programmes ont été supprimé pour gagner de la place (nInvaders notemment). Ce projet est à usage privé uniquement. + diff --git a/atmega328p/Makefile b/atmega328p/Makefile deleted file mode 100755 index 1230694..0000000 --- a/atmega328p/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -export CC = avr-gcc - -export MCU = atmega328p -export TARGET_ARCH = -mmcu=$(MCU) - -export CFLAGS = -Wall -I. -DF_CPU=16000000 -Os #-g -export LDFLAGS = -g $(TARGET_ARCH) -lm -Wl,--gc-sections # -Os - -TARGET = usb -TERM = /dev/ttyACM0 -CPPFLAGS = -mmcu=$(MCU) -PGMERISP = -c stk500v1 -b 115200 -P $(TERM) -ARVDUDECONF= -C /usr/local/arduino/arduino-0022/hardware/tools/avrdude.conf -export DUDE = /usr/bin/avrdude -F -v -p $(MCU) $(AVRDUDECONF) - -C_SRC = $(wildcard *.c) -OBJS = $(C_SRC:.c=.o) - -all: $(TARGET).hex - -clean: - rm -f *.o *.hex *.elf - -%.o:%.c - $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ - -$(TARGET).elf: $(OBJS) - $(CC) $(LDFLAGS) -o $@ $(OBJS) - -$(TARGET).hex: $(TARGET).elf - avr-objcopy -j .text -j .data -O ihex $(TARGET).elf $(TARGET).hex - avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex $(TARGET).elf eeprom.hex - -upload: $(TARGET).hex - stty -F $(TERM) hupcl # reset - $(DUDE) $(PGMERISP) -U flash:w:$(TARGET).hex - diff --git a/atmega328p/makefile b/atmega328p/makefile new file mode 100755 index 0000000..fae98ae --- /dev/null +++ b/atmega328p/makefile @@ -0,0 +1,37 @@ +export CC = avr-gcc + +export MCU = atmega328p +export TARGET_ARCH = -mmcu=$(MCU) + +export CFLAGS = -Wall -I. -DF_CPU=16000000 -Os #-g +export LDFLAGS = -g $(TARGET_ARCH) -lm -Wl,--gc-sections # -Os + +TARGET = usb +TERM = /dev/ttyACM0 +CPPFLAGS = -mmcu=$(MCU) +PGMERISP = -c stk500v1 -b 115200 -P $(TERM) +ARVDUDECONF= -C /usr/local/arduino/arduino-0022/hardware/tools/avrdude.conf +export DUDE = /usr/bin/avrdude -F -v -p $(MCU) $(AVRDUDECONF) + +C_SRC = $(wildcard *.c) +OBJS = $(C_SRC:.c=.o) + +all: $(TARGET).hex + +clean: + rm -f *.o *.hex *.elf + +%.o:%.c + $(CC) -c $(CPPFLAGS) $(CFLAGS) $< -o $@ + +$(TARGET).elf: $(OBJS) + $(CC) $(LDFLAGS) -o $@ $(OBJS) + +$(TARGET).hex: $(TARGET).elf + avr-objcopy -j .text -j .data -O ihex $(TARGET).elf $(TARGET).hex + avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex $(TARGET).elf eeprom.hex + +upload: $(TARGET).hex + stty -F $(TERM) hupcl # reset + $(DUDE) $(PGMERISP) -U flash:w:$(TARGET).hex + make clean diff --git a/installAndPlay.sh b/installAndPlay.sh new file mode 100755 index 0000000..4be70fb --- /dev/null +++ b/installAndPlay.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +echo "Compilation et installation du programme dans l'atmega328p..." + +echo "" +echo "Courcircuitez le pin de reset de l'atmega16u2 à la masse." +read -n1 -s -r -p "Appuyez sur une touche pour continuer" +make -C ./atmega16u2/base/ || exit 1 + +echo "" +echo "Débranchez et rebranchez la carte Arduino." +read -n1 -s -r -p "Appuyez sur une touche pour continuer" +make -C ./atmega328p/ upload || exit 1 + + +echo "" +echo "Compilation et installation du programme dans l'atmega16u2..." + +echo "" +echo "Courcircuitez le pin de reset de l'atmega16u2 à la masse." +read -n1 -s -r -p "Appuyez sur une touche pour continuer" +make -C ./atmega16u2/custom/PolytechLille/PAD upload || exit 1 + +echo "" +echo "Débranchez et rebranchez la carte Arduino." +read -n1 -s -r -p "Appuyez sur une touche pour continuer" + + +echo "" +echo "Compilation et lancement du jeu..." +make -C ./ninvaders/ exec || exit 1 diff --git a/play.sh b/play.sh new file mode 100755 index 0000000..9b5cdd5 --- /dev/null +++ b/play.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +echo "Compilation et lancement du jeu..." +make -C ./ninvaders/ exec || exit 1 diff --git a/tests/SendData/a.out b/tests/SendData/a.out deleted file mode 100755 index 760522e..0000000 Binary files a/tests/SendData/a.out and /dev/null differ -- libgit2 0.21.2