Aller au contenu

Cube musicaux

L’objectif de ce projet était de créer des cubes programmable grâce à une application python capable d’émettre de la lumière et des sons qui communiquent entre eux par infrarouge. Il a été mené par Ahmed-Manaf Damnani, Ghofrane Hamdouni et Thomas Alexaline.

Cette page vise à résumer comment nous avons décidé notre sujet ainsi que les différentes étapes pour créer un cube musical comme le nôtre.

Choix du sujet

Au début nous voulions crée 2 cubes produisant de la lumière dont l’intensité augmenterait lorsqu’ils sont proche. Ces cubes auraient permis de proposer différentes activités ludiques principalement basé sur la recherche d’un des cubes.

Nous avons beaucoup exploré cette piste, mais avons fini par l’abandonner au vu de la difficulté que représentait le problème du calcul d’une distance entre 2 objets dans une pièce, via bluetouth, avec une précision de l’ordre d’une dizaine de centimètres. La seul technologie actuellement existante permettant ce genre de précision est l’ultra wide band et nécessite une installation avec plusieurs capteurs qui coûtaient trop chère.

Le bluetoouth ne correspondant pas à notre besoin, nous avons essayé de passer à l’infrarouge. Pour cela l’un des cubes devait émettre un signal infrarouge en continue dans toutes les directions dans toutes les directions. L’autre cube aurait plusieurs récepteurs sur chacune de ses faces. Les faces qui réceptionneraient un signal s’illumineraient alors que les autres resteraient éteintes (cf le schéma ci-dessous). Ce changement permettrait de garder l’idée du jeu de retrouver un cube en se déplaçant avec l’autre tout en évitant le problème du calcul de distance. Cependant, la création d’un système émettant un signal infrarouge dans toute une pièce était bien plus complexe que prévu. Nous avons donc abandonné cette deuxième idée en concluant que l’infrarouge était une technologie que nous aimerions utiliser et que le projet était trop complexe à mettre en place.

fonctionnement de la 2e idée

De retour à zéro, c’est en combinant les idées d’avoir des cubes qui communiquent par infrarouge et le fait qu’ils produisent des sons et de la lumière que nous en sommes arrivé au concept de nos cubes musicaux. Chaque face d’un cube contient un émetteur et un récepteur infrarouge. L’utilisateur programme le réseau de cubes en branchant un à son ordinateur et en choisissant les instructions à exécuter pour chaque cube à partir de l’application. Le cube branché transmet ensuite par infrarouge les instructions qu’il a reçues aux autres cubes. Chaque cube regarde si la trame contient des instructions qui le concerne puis la transmet à son tour. Les angles des émetteurs et récepteur étant volontairement assez limités, les cubes doivent être alignés pour appartenir au réseau et donc recevoir les instructions.

Composants

La liste des composants électroniques utilisés dans ce projet est la suivante :

  • LEDs RGB
  • Buzzer
  • LED infra-rouge TSUS5202
  • Récepteur infra-rouge TSMP58000
  • Arduino nano
  • inverting schmitt trigger (74HCT14)
  • Multiplexeur (CD74HC138E)
  • Batterie lithium 3.7V
  • Circuit de recharge et de protection de la batterie TP4056
  • Circuit step up : LM2596

Circuit

Récepteur TSMP58000 :

Pour s’assurer de la bonne réception des données, la fiche technique du TSMP58000 recommande le montage suivant contitué d’un filtre passe bas :

Le TSMP58000 ne fait pas la démodulation du signal reçu comme le font d’autres recepteurs. Pour aléger la quantité de travail donnée à l’arduino, nous avons choisi de faire la démodulation avec un circuit électronique. Nous obtenons le circuit suivant :

Pour les Schmitt trigger nous utilisons le 74HCT14

Puisque les pins de l’Arduino nano ne peut fournir que 40mA de courent, nous utilisons des transistors pour controler les LEDs RGB à partir de l’alimentation externe :

Le control du buzzer se fait de façon similaire :

Les émetteurs infra-rouges TSUS5202 peuvent en théorie supporter des pulsations courtes de courant de 1A. Nous n’avons pas besoin d’utiliser le courant maximal pour notre projet, nous rajoutons donc une résistance de 10ohm en série avec la LED infra-rouge pour la protéger.

Dans ce projet nous avons besoin de plusieurs pins capables de générer des signaux PWM. Pour éviter d’utiliser plusieurs de ces pins pour les émetteurs infra-rouges, nous allons utilisé un pin PWM et le multiplexer aux différents émetteurs. Le choix du canal se fera avec deux pins normaux capables de faire un digitalWrite.

Avec ces circuits nous avons créé 3 PCB.

Démodulation et control du buzzer :

Emetteurs/récepteurs infra-rouges :

LEDs RGB :

Fonctionnement

Pour la communication infra-rouge, le code Arduino du cube utilise une version modifiée de la bibliothèque IRremote perméttant de gérer plusieurs réceptteurs en même temps :

https://github.com/Neco777/IRemoteModified

Nous utilisons la bibliothèque TimerFreeTone pour controler le buzzer sur la boucle principale pour éviter d’impacter timer2 qui est utilisé pour la bibliothèque IRremote et timer1 utilisé pour le signal PWM controlant l’intensité de la couleur bleue sur les RGB.

https://bitbucket.org/teckel12/arduino-timer-free-tone/downloads/

Le cube peut être dans 3 états :

  • Ecoute : Attends des informations sur le port série ou en communication infra-rouge. Quand une requète complète est reçue, le cube décide de changer d’état celon la demande de la requète reçue.
  • Envoie : Transfert des messages en infra-rouge au reste du réseau, il n’est pas possible de recevoir des messages en infra-rouge dans cette période. Le cube revient en état d’écoute après la fin du transfert.
  • Jeu : Le cube arrête toute communication pour jouer la liste des actions qu’il a enregistré en mémoire jusqu’au moment où il est entré dans cet état. Le cube revient en mode écoute à la fin.

La communication entre different cubes était supposée se faire graçe à des requètes imbriquées, mais malheureusement nous avons pas pu l’implémenter par manque de temps.

Model du cube

Le cube est construit avec une combinaison de pièces imprimées 3D avec un filament en pla de 2.87 mm de diamètre et d’autres crée à partir de plaque pmma de 3mm d’épaisseur découpées grâce à une découpeuse laser. Le cube est composé de 6 faces réparties en 4 types différents. Chaque face du cube est composée de 2 pièces qui s’emboîtent et peuvent ensuite être vissées ensemble (une sous-forme de rectangle en pmma et l’autre en pla se mettant par-dessus)

les 2 pièces composant la face d’un cube

Trois des faces des côtés d’un cube se présentent sous la forme visible dans l’image ci-dessus. La quatrième face elle (visible dans l’image si dessous), est légèrement différente. Sa partie en pla inclue 3 trous qui servent respectivement (de gauche à droite) à mettre l’interrupteur, le port de l’arduino nano et le port pour recharger la batterie du cube. Le rectangle en pmma est lui sectionné d’un morceau afin de laisser la place à ces connecteurs.

face « connecteur » d’un cube

La face du dessous d’un cube est très similaire à celle composant les côtés d’un cube. La seule différence est que la structure en pla ne possède pas la décoration en forme de note et que son rectangle en pmma n’inclue pas le trou central. La face du dessus, elle possède la même structure en pla que la face du dessous, mais sa section en pmma est un rectangle avec plein de petits trous au centre qui servent à laissé placer le son produit par le buzzer (la face est de couleur différente pour mieux laisser placer la lumière produite par les led rgb)

section en pmma de la face du dessus

Application

Une attention particulière a été accordée à la conception d’une interface qui permettra à l’utilisateur de contrôler le cube.
Ainsi, parmi les fonctionnalités implémentées on a la possibilité de modifier la couleur de la LED ainsi que la fréquence (note) et le temps de passage.
Ce qui a permis notamment de donner le choix à l’utilisateur pour composer les mélodies.
En plus, d’une outil de conception graphique « Canvas » qui est un système de coordonnées permettant de voir la position des cubes.
L’interface a été faite avec  la bibliothèque graphique libre ‘Tkinter’ de Python.
On récupère dans Python des mesures réalisées par un Arduino en utilisant la liaison série.

Application


Améliorations

Vu le manque de temps, le projet reste inachevé dans l’ensemble. Les parties à achever sont:

  • Code arduino : implémenter les requêtes permettants de transférer un mesage à un autre cube. En d’autre mots, la gestion des requètes imbriquées.
  • Interface : Implémenter le code de communication série arduino/python dans le code de l’interface graphique.
  • Modèl : Terminer l’assamblage du modèl et construire plusieur exemplaires.

Certains aspects ont également besoin d’être améliorés :

  • PCB : les PCB pourrait être redesigné et reorganisé de façon à ce que leur installation à l’intérieur du cube soit plus simple.
  • Communication infra-rouge : Au lieu d’utiliser la bibliothèque IRremote qui ne permet de transférer qu’un entier par trame, il est possible d’utiliser les timers et intérruptions pour écrire une bibliothèque plus performante permettant le transfert et la vérification du transfert de données sur des trams beaucoup plus grandes.