IHMA : Interactions Humain-Machine Avancées

Dans cet exercice vous devez implémenter un jeu simple : le duel. C'est un jeu à deux joueurs. Le but de chaque joueur est d'être le premier à appuyer sur son bouton après que la LED centrale (rouge) s'allume. Si un joueur appuie sur le bouton avant que la LED centrale soit allumée, il perd. Chaque joueur possède une lettre verte, qui s'allume pour indiquer le vainqueur d'une manche.

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 3 leds. Pour cela, branchez-les sur un pin chacun. Par exemple PA4, PB0 et PB1. Sur la carte, ce sont les 3 pins du milieu du connecteur : OUT$1, OUT$2 et OUT$3 sur le schéma. Ensuite, utilisez l'en-tête

hardware/include/gpio.h
:

Boutons

Maitnenant on veut les entrées des boutons. Branchez-les sur un pin chacun, par exemple PA0 et PA1. 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 qu'un joueur n'anticipe, considérez que le joueur a perdu s'il a appuyé moins de 100ms après que la LED rouge s'est allumée.