Cette page décrit la réalisation d'un "jam blues" par un groupe de 5 robots.
Ce projet a été réalisé lors du travail de maturité de Théo Gieruc La robotique en essaim au Gymnase de Beaulieu à Lausanne.
But
Le but est d'illustrer le principe de système décentralisé.
- Dans un système centralisé toutes les communications passent par une unité de contrôle centrale, ce qui peut poser différents problèmes :
- Si l'unité de contrôle centrale tombe en panne c'est le système entier qui ne fonctionne plus
- Le nombre de robots est limité par la bande passante et la puissance de calcul de l'unité centrale (plus il y a de robots plus il y a de transfères de données et plus il faut un micro-processeur puissant pour traiter les données)
- Dans un système décentralisé tous les robots sont autonomes et communiquent entre eux de façon locale. Si un robot tombe en panne un autre peut soit le dépanner soit continuer sa tâche à sa place, c'est le principe de redondance. On peut également rajouter ou enlever des robots et le système continue à fonctionner. La robotique en essaim utilise ce type de système.
Un système décentralisé est en quelque sorte très proche d'un jam de blues. Chaque musicien peut influencer le jeu à sa manière, il n'y a pas d'unité de contrôle centrale.
Les instruments
Il y a cinq instruments et chacun d'entre eux ont une identité différente afin de choisir l'ordre des solos.
- une batterie dont l'identité est 10
- une guitare avec un son rock ("dirty") dont l'identité est 5
- une guitare basse dont l'identité est 6
- une guitare acoustique dont l'identité est 7
- une guitare avec un son propre ("clean") dont l'identité est 8
Une piste accompagnement et une piste solo ont été enregistrées pour chaque instrument à part la batterie qui n'a qu'une piste accompagnement. Les robots vont les jouer en suivant un schéma très populaire dans le blues, le 12 bar blues, c'est-à-dire des parties de douze mesures. Dans la première partie tous les robots jouent l'accompagnement, dans les parties deux à cinq il y a à chaque fois un solo d'un autre robot. L'ordre des solos est choisi de manière aléatoire.
La vidéo
Le code
Le code est en six parties.
- La déclaration des variables
- La création des sous-routines
- Tout ce qui traite de la communication entre robots
- La lecture des pistes audio
- La génération de l'ordre des solos
- Les animations leds
Dans la première partie les variables sont déclarées.
Dans la seconde partie deux sous-routines sont créées :
- list_maker qui génère un nombre aléatoire entre 5 et 8 à l'aide de cet algorithme puis vérifie qu'il est différent des valeurs déjà enregistrées dans le tableau ordre qui sert à stocker l'ordre des solos. Si le nombre aléatoire est différent la variable val prend sa valeur, sinon un nombre aléatoire est à nouveau généré puis testé et ainsi de suite un maximum de vingt fois.
- myrand_gen qui est tirée d'ici.
La troisième partie est consacrée à la communication infra-rouge entre robots. Le robot enregistre la valeur reçue dans la variable val si elle est différente de 0 et qu'il n'a pas encore commencé à jouer, supérieur à 4 s’il a commencé, et différente des valeurs déjà utilisée pour les solos. Le robot partage les valeurs reçues et commence à jouer lorsqu’il reçoit la valeur 1.
La quatrième partie s’occupe de la lecture des pistes. Si la valeur reçue par le robot correspond à son identité il joue la piste solo. S’il ne la reçoit pas et que la variable fin est égale à 0 le robot joue l’accompagnement et si fin est égal à 1 le robot se stoppe.
La cinquième partie est la génération de l’ordre des solos. Lorsque le robot commence à jouer de la musique il crée l'évènement timer0 qui est généré chaque 0.5 secondes et qui incrémente la variable temps. Lorsque temps vaut 20 (donc après 10 secondes) un nombre aléatoire est généré, val en prend la valeur. Lorsque temps vaut 55 la valeur de val est enregistrée en première position du tableau ordre. Lorsque temps vaut 90 le robot fait appel à la sous-routine list_maker afin de générer un nombre aléatoire différent du premier. Quand temps = 125 ce nombre est enregistré en deuxième position du tableau ordre. Quand temps = 160 le robot fait de nouveau appel à la sous-routine list_maker qui génère un nombre aléatoire différent des deux premiers. Cette valeur est enregistrée en troisième position du tableau ordre lorsque temps est égal à 195. Quand temps est égal à 230 le robot fait appel une dernière fois à la sous-routine list_maker qui génère un nombre aléatoire différent des trois premiers. Finalement, lorsque temps vaut 300 (donc après 150 secondes) la variable fin vaut 1.
La sixième partie contient toutes animations des diodes électroluminescentes ainsi que le chronomètre. L’évènement timer0 incrémente la variable temps chaque 0.5 seconde et s’occupe de l’animation DEL lors des solos tandis que l’évènement timer1 s’occupe du clignotement de couleur spécifique à chaque robot.
Les fichiers
Il faut télécharger cette archive, la décompresser. Il y a 5 dossiers, chacun pour un instrument. A l'intérieur, il y a à chaque fois un fichier .aesl contenant le code pour le robot et les fichier p0.wav et p1.wav (sauf la batterie qui n'a que p0.wav) qu'il faut copier sur la carte micro-SD de chaque robot.
Pour lancer le programme, il faut l'exécuter sur chaque Thymio, les positionner afin qu'ils puissent tous communiquer par infra-rouge et finalement appuyer sur le bouton central d'un robot.