I2L 2022 Groupe1
Proposition de système
Notre proposition :
- Créer un pad numérique avec 12 touches, les chiffres (de 0 à 9), le point, la touche verrou numérique et trois led (rouge, bleu, vert).
Les propositions acceptées :
- La touche "verrou numérique" permet d'avoir une double signification des touches (numérique/flèches de direction), avec une LED de contrôle de l'activation du verrou.
- Un mini-simon est disponible en mode autonome, trois leds (rouge, bleu et vert) associées aux touches 1, 2 et 3.
Contre-proposition
Pas de souci sur le principe. Mais étant donné que le code pour votre carte est le plus simple à réaliser vous devez ajouter une fonctionnalité supplémentaire.
Je vous propose les difficultés suivantes :
- une touche "verrou numérique" qui permet d'avoir une double signification des touches (numérique/flèches de direction), avec une LED de contrôle de l'activation du verrou
- un jeu en mode autonome (quand le périphérique est alimenté sans être connecté à un bus USB), par exemple un mini-simon avec les 3 LED associées aux touches 1,2 et 3.
Fonctionnement du système embarqué
Le clavier
Lorsque le système embarqué est connecté sur un pc, celui-ci est en mode clavier numérique, on peut alors utiliser les touches allant de 0 à 9, la virgule et la touche verrouillage numérique qui nous permet de passer en mode utilisation des flèches au lieu des chiffres.
Le simon
Lorsque le système embarqué est branché juste en alimentation (par exemple sur une batterie externe) celui-ci est en mode simon.
- Un nombre n de leds s'allument tour à tour pour montrer l'ordre, n étant un nombre entre 5 et 15
- Une fois l'affichage des leds terminé, le jeu attend une action de l'utilisateur par les boutons 1, 2, 3 ou 5 de l'utilisateur
- Lors de l'appui sur la touche 1, 2 ou 3 correspondantes aux leds rouge (1), bleu (2) et verte (3)
- Si le joueur appuie dans le mauvais ordre : il perd une vie sur les 3 de départs, si les 3 vies sont perdues la led rouge s'allume 5 fois rapidement signalant que le joueur a perdu et le jeu recommence du niveau n=5
- Si le joueur appuie dans le bon ordre : la led correspondante s'allume 100 ms et s'éteint, attendant la suite, si toute la combinaison est trouvée : les leds s'allument et s'éteignent dans l'ordre 5 fois puis n s'incrémente et rejoue une combinaison allant à n+1 leds
- Ce comportement (comportement de victoire) se fait en boucle lorsque l'intégralité des 10 niveaux est passé avec succès
- Comportement de perte : perte d'une vie
- Comportement lorsque le joueur n'a plus de vie : la led rouge s'allume 5 fois puis le jeu recommence au niveau 5 (début)
- Comportement de victoire de niveau : les leds s'allument et s'éteignent dans l'ordre 5 fois puis n s'incrémente
- Comportement de victoire des 10 niveaux : les 3 leds s'allument et s'éteignent en boucle
- Lors de l'appui sur la touche 5 (milieu) : les leds s'allument avec le nombre de vie du joueur (si 2 leds s'allument c'est que le joueur a 2 vies)
Ci dessous l'algorithme correspondant
Définir un nombre de LEDs entre 5 et 15
Définir un nombre de vies initial à 3
Définir un niveau initial à 5
Tant que le joueur n'a pas terminé les 10 niveaux avec succès :
Générer une séquence de LEDs aléatoire de longueur égale au niveau actuel
Afficher la séquence en allumant les LEDs tour à tour
Réinitialiser l'index de la séquence à 0
Réinitialiser le statut de victoire à vrai
Tant que l'index de la séquence est inférieur à la longueur de la séquence et le statut de victoire est vrai :
Attendre l'appui d'un bouton (1, 2, 3 ou 5) par le joueur
Si le joueur appuie sur le bouton 5 :
Afficher le nombre de vies restantes en allumant le nombre correspondant de LEDs
Continuer à la prochaine itération du jeu
Sinon:
Si le bouton appuyé est différent de la LED attendue à l'index actuel de la séquence :
Diminuer le nombre de vies du joueur de 1
Si le nombre de vies du joueur est égal à 0 :
Allumer la LED rouge 5 fois rapidement pour signaler la défaite
Réinitialiser le niveau à 5
Sortir de la boucle de vérification
Sinon :
Réinitialiser le statut de victoire à faux
Continuer à la prochaine itération de la boucle de vérification
Sinon :
Allumer la LED correspondante à l'index actuel de la séquence pendant 100 ms
Éteindre la LED
Augmenter l'index de la séquence de 1
Si le statut de victoire est vrai :
Allumer et éteindre toutes les LEDs dans l'ordre 5 fois
Augmenter le niveau de 1
Fin du jeu
Programmes
Programme version 1:
Programmes version finale:
- Programme USB, LUFA :
- Le code se situe dans I2L/keyboard
- I2L-G1-programme-lufa
Schémas et images du système embarqué
Schémas du système embarqué:
- Schémas du système embarqué sur Kicad :
Images/ vidéos
- Photo du système embarqué
Le système embarqué est divisé en deux parties, la première partie (la partie en haut) contenant le processeur, le connecteur et les leds.
La seconde partie elle contient les touches. Les deux parties sont connectés par 13 câbles, 1 étant la masse et les autres correspondent aux touches.
- Vidéo du simon
Problèmes rencontrés
Nous avons tout d'abord rencontré un problème sur la difficulté du projet, en effet par rapport à d'autres groupes, l'idée d'un clavier numérique de 12 touches étaient trop "simple".
Nous avons donc accepté la contre proposition émise d'ajouter un simon et la possibilité d'utiliser les flèches avec le verrouillage numérique.
Il a donc fallu regarder le fonctionne du jeu du simon, choisir deux autres led car au départ nous n'en avions qu'une.
Le dernier problème que nous avons rencontré a été de distinguer la mode clavier du mode simon. Dans la première version du code le simon ce lance lorsque on le connecte au pc et ensuite il passe en mode clavier.
Ce problème est résolu dans la version finale.
Compilation
Utilitaires
https://winavr.sourceforge.net/
https://github.com/mariusgreuel/avrdude/releases
- gcc-avr
- avr-libc
- dfu-programmer
- DFU/USB
Compilation par ligne de commande:
compilation :
avr-gcc -mmcu=atmega328p -DF_CPU=8000000UL -c -Wall -I. -Os timer.c -o timer.o (8000000 au lieu de 16000000)
- fichier .c → fichier .o
édition des liens :
avr-gcc -mmcu=atmega328p -g -lm -Wl,--gc-sections -o timer.elf timer.o (.elf exécutable)
- fichier .c → fichier .elf
téléversement :
avr-objcopy -j .text -j .data -O ihex timer.elf timer.hex
- fichier .elf → fichier .hex
commande dfu-programmer :
dfu-programmer atmega16u2 erase dfu-programmer atmega16u2 flash timer.hex dfu-programmer atmega16u2 reset
commande compilation makefile:
make dfu
Tableau des touches
cables | ||||||
---|---|---|---|---|---|---|
colonne 1 | colonne 2 | colonne 3 | ||||
port | touche | port | touche | port | touche | |
PB7 | 7 | PB5 | 8 / flèche vers le haut | PB3 | 9 | |
PB6 | 4 / flèche vers la gauche | PB4 | 5 | PB2 | 6 / flèche vers la droite | |
PD4 | 1 | PD6 | 2 / flèche vers le bas | PB1 | 3 | |
PD3 | verrou num | PD5 | 0 | PB0 | . / ; |
Tableau des leds
port | led | touches | bit | ||
---|---|---|---|---|---|
led 1 | PD0 | rouge | chiffres ou flèches | 0x01 | |
led 2 | PD1 | bleu | verrou num | 0x02 | |
led 3 | PD2 | vert | arrêt défil | 0x03 |
Conclusion
Ce projet de système embarqué a été réalisé avec succès, très peu de problèmes ont été rencontrés.
Il nous a permis d'apprendre à mettre en place un système embarqué, à comprendre les composants dont il a besoin et lesquels il peut contenir. Nous avons appris à paramétrer des touches, à allumer des leds via des actions sur des touches définies, à définir le mode de connexion du système afin de changer le mode de fonctionnement (clavier ou jeu).
On a également appris à récupérer le positionnement d'une touche via le schéma afin d'y définir une action.
Ce projet nous a appris beaucoup de choses et a été réalisé dans une bonne ambiance !
Fichiers
Projet KiCAD : Fichier:I2L-2022-CARUYER-MONBORREN.zip.
Programme C : Fichier:I2L-2022-G1-programme.zip.
Programme V1: Fichier:Projet SystemeEmbarque-LUFA V1.zip .
Programme version finale: Fichier:Projet SystemeEmbarque-LUFA VF.zip .
Programme de la LUFA : I2L-G1-programme-lufa