IHMA : Interactions Humain-Machine Avancées

Le but de cet exercice est d'implémenter un métronome.

La carte

La carte permet de donner le tempo à la fois à l'aide d'une LED et d'un buzzer. L'utilisateur pourra changer le tempo avec une roue encodeuse.

L'ensemble des documentations est disponible ici.

LED

Faites clignoter la LED à 100BPM. Pour cela, branchez-la sur un pin, par exemple PA7. Sur la carte, il s'agit du pin du milieu du connecteur. Ensuite, utilisez l'en-tête hardware/include/gpio.h pour configurer le pin :

Pour faire clignoter la LED, nous allons activer un timer sur ce pin. Le timer 3 channel 2 est disponible sur PA7. Configurer ce timer à l'aide de hardware/include/timer.h. Configurez le prescale du timer pour que le compte corresponde aux millisecondes (l'horloge du timer 3 est à 180MHz). La LED doit s'allumer brièvement pendant 50ms.

Buzz

On souhaite faire buzzer en même temps que la LED. Pour faire buzzer, il ne suffit pas de mettre le pin relié au buzzer à 1, mais il faut le faire osciller à la fréquence de la note choisie. Nous allons donc brancher le buzzer sur un pin qui utilise un autre timer, par exemple PA2 avec le timer 5 channel 3. Configurez ce pin, et le timer pour qu'il vibre à 440Hz. Pour activer/désactiver le son il suffit d'utiliser un rapport cyclique de 1/2 ou de 0.

Pour buzzer en mêm temps que la LED, vous pouvez configurer une interruption sur un autre channel du timer de la LED. Regardez dans hardware/include/timer.h :

Bouton

La roue encodeuse peut servir de bouton si on appuie dessus. Branche le pin de gauche du connecteur sur un pin de la carte (par exemple PA6). Toujours dans hardware/include/gpio.h, regardez :

Enclenchez le timer à l'appuie du bouton, et désactivez-le quand on appuie une seconde fois.

La roue

Il vous reste à récupérer les informations de la roue codeuse. Elle utilise deux pins avec un signal en quadrature (voir l'image ci-dessous). À chaque cran de rotation de la roue, l'un ou l'autre pin change de valeur de telle sorte que la séquence est différente selon le sens de rotation de la roue. Il est ainsi possible de déterminer le sens de rotation en lisant les valeurs sur ces deux pins.

Dans un premier temps lisez en boucle les valeurs avec gpio_get et agissez en fonction. Pour aller plus loin, programmez des interruption sur les changements de valeurs despins.