IHMA : Interactions Humain-Machine Avancées

Dans cet exercice vous devez implémenter le jeu du Simon. Le but du jeu consiste à reproduire une séquence, présentée par des LEDs de couleur. La séquence commence par une LED au hasard. À chaque bonne réponse, la séquence est allongée. Si l'utilisateur fait une erreur, la séquence recommence à 1.

La carte

Les composants sont relativement simples, il n'y a que des boutons et quelques LEDS. Le choix des résistances associées à chaque LED dépend des spécifications de chaque LED. Les boutons possèdent une résistance de pull down afin d'avoir 0V en entrée quand l'interrupteur est ouvert.

L'ensemble des documentations est disponible ici.

Un binaire montrant le comportement attendu est disponible à ici.

LEDS

Allumez les 4 leds. Pour cela, branchez-les sur un pin chacun. Par exemple PA4, PA5, PB0 et PB1. Sur la carte, ce sont les 4 pins à côté des résistances : LED$R, LED$Y, LED$G et LED$B sur le schéma. Ensuite, utilisez l'en-tête hardware/include/gpio.h :

Boutons

Maitenenant on veut les entrées des boutons. Branchez-les sur un pin chacun, par exemple PA0 et PA1, PA2 et PA3. Changez l'état de la led de chaque joueur en fonction du bouton. Toujours dans hardware/include/gpio.h, regardez :

Le jeu

Vous pouvez maintenant implémenter le jeu. Pour bien organiser votre code, je vous suggère de coder une machine à états. Vous pouvez représenter les états avec un enum, et stocker l'état courant avec une variable globale. Vous disposez d'une fonction rand dans stdlib.h. N'oubliez pas de convertir en uint8_t avant de faire votre modulo. Vous pouvez coder une fonction sleep approximative comme suit :
void sleep(uint16_t ms) { volatile uint32_t i; for (i = 0 ; i < ms * 50000 ; i++) { ; } }

Plus loin

Pour éviter les parasites dues à la mécanique des boutons, assurez-vous que les appuis soient espacés d'au moins 100ms.