Projet: Musical MasterMind
Semaine d’ouverture 3A GCC 2018 - Make Your Pulse! Projet réalisé par Balkis Sliti, Gabriel Mayoud, Gabriel Neves Alves Ferreira, Laurane Neron, et Raul Andrei Brebenaru

Objectif du projet

Synthèse sonore & électronique

Description de la méthode de synthèse et de traitement du signal.
Le code de bela est en c++. Il reçoit en input analogique les positions des potentiomètres du joystick qu’il traduit en fréquences correspondant aux notes de musique (Do, Ré, Mi, Fa, Sol, La, Si, Do). Il envoie ensuite via la prise jack un signal traduit en signal sonore et via 5 sorties digitales, un signal binaire à une pièce arduino pour contrôler les lampes LED de l’anneau.

Géométrie & fabrication

On a conçu la forme du jeu pour être ergonomique. La forme est adaptée pour être posée sur un plan. La base du boitier est un octaèdre correspondant aux notes de musique. Le boitier de haut contient le montage électronique du jeu et le joystick. Le boitier de bas est l’amplificateur du jeu et où on place la batterie du jeu.
On a tracé la forme du boitier avec Grasshopper et le plugin Ivy. La forme du joystick est imprimée à l’aide de l’imprimante 3D.

Interaction

Le projet est un jeu se basant sur les règles du jeu Mastermind. Il s’agit de deviner les 5 premières notes d’une mélodie choisie aléatoirement.
Le joueur manipule un joystick dans 8 directions qui représentent les notes (Do, Ré, Mi, Fa, Sol, La, Si, Do), son essai est accompagné des notes musicales et de la lumière des lampes LED. Ensuite, les indices sont indiqués par des sons accompagnés d’un code couleur des lumières de l’anneau LED : Si une note est bien placée, elle est répétée et une lumière verte correspondante à la note s’allume. Dans le cas contraire, il reçoit un son d’erreur et une lumière rouge s’allume. Le joueur peut allumer le jeu ou changer la mélodie via un bouton et contrôler le volume via un potentiomètre.
Le jeu est didactique pour les enfants et bien adapté aux personnes présentant un handicap : malvoyantes, malentendante ou à mobilité réduite grâce à la possibilité de manipuler le joystick d’un seul doigt.

Equipe

Toute l’équipe a participé à la définition du jeu, la conception de l’objet, la fabrication du boitier et l’assemblage des pièces électriques.
Gabriel Mayoud, Gabriel Neves Alves Ferreira et Raul Andrei Brebenaru ont établi le code C++ sur bela et le code des lampes LED sur arduino, Laurane Neron a conçu le modèle du boitier et du joystick sur Grasshopper et Rhinoceros et Balkis Sliti a documenté les étapes du projet.

Description technique

Synthèse sonore & électronique

Au cours de la semaine on a testé le fonctionnement et le montage des différentes pièces.

Tests effectués sur les pièces

  • Tests de l’amplificateur LM386 avec l’enceinte en output
1er test réalisé en se basant sur le schéma électrique de gain 20 de la fiche technique de l’amplificateur LM386 (voir figure). Dans ce premier test le son est très faible.
Ensuite le même test est refait avec une alimentation 9V en utilisant cette fois le schéma électrique du document.
Le son sorti de l’enceinte est fort.
La suite des tests sont effectués avec une alimentation de 5V via bela.
  • Tests sur le volume du son en sortie de l’enceinte
On a ajouté un gobelet sur l’enceinte afin d’amplifier encore le son. Il transmet mieux le son.
On a refait le test avec un gain de 200, le son sature.
Pour un gain de 50. Le son est moins fort et sature moins.
Ces test nous ont poussé à penser la forme du modèle avec l’enceinte à l’intérieur d’un objet de formé conique et troué.
  • Test avec l’enceinte dans le boitier
On a testé la qualité du son en sortie du boitier de l’enceinte. Le son résonne bien dans le boitier.
Pour une meilleure qualité de son, on peut doubler le carton pour plus de résonance et améliorer la position des trous dans l’enceinte via des tests
  • Test des fréquences et leur durée avec un piézoélectrique en output
On a fait un test similaire aux tests précédents. Le piézoélectrique est à la place de l’enceinte cette fois. Il est attaché à un gobelet afin d’amplifier. Il est testé une première fois avec un téléphone en tant que input afin de vérifier son fonctionnement. Le son sort avec un peu de bruits parasites.
On teste ensuite différentes fréquences et différentes durées dans le code bela avec en analog output le capteur piézoélectrique.
  • Test des joysticks
On a fait un premier test où on a utilisé les potentiomètres du joystick pour contrôler le volume et la fréquence des notes en sorties du bela via la commande map en C++.
D’abord, on teste avec un seul potentiomètre du joystick. On observe qu’en maniant suivant un axe le joystick, la fréquence est contrôlée. On teste ensuite avec deux potentiomètres. Cela nous permet alors de régler de la fréquence le volume dans les deux axes du joystick.
  • Test des positions du joystick pour l’entrée
On a testé ensuite les positions du joystick afin d’avoir 8 plages correspondant à une note chacune.
On a ensuite travaillé sur la sensibilité, la durée de la note en fonction du temps de maintien du joystick vers une direction.
  • Test des piézoélectriques en tant qu’input
On a effectué d’abord un test avec un seul capteur piézoélectrique : On réalise le schéma suivant avec des résistances de 1,680 ohm.
Figure 7 Schéma électrique d'un capteur piézoélectrique
On a testé le piézoélectrique en tant que capteur de pression (entrée analog du bela). On a testé les notes harmoniques et différentes sensitivités du piézoélectrique.
On réalise ensuite un test des fonctions d’input analog avec deux piézoélectriques afin de voir l’interaction entre les deux capteurs. On a fait un essai un code c++ qui permet de démarrer une mélodie composée dans le code à chaque fois qu’on presse un des deux capteurs. On a utilisé la fonction timer tel que les piézoélectriques, n’enregistrent qu’une réponse, à chaque pression d’un piézoélectrique. On a aussi écrit le code de tel façon qu’à la fin de la mélodie lancée, le programme ne s’arrête pas et qu’en pressant en autre fois, une mélodie démarre.
Afin de gagner de l’espace à l’intérieur du boitier, on a testé avec les piézoélectriques afin de mettre le moins de câbles et de résistances possibles. Au lieu du schéma précèdent, on a testé un piézoélectrique avec uniquement en parallèle une résistance de 1 M Ohm.
  • Test de l’anneau de lampes LED
L’anneau de lampes LED a besoin d’une bibliothèque. Dans Arduino, la bibliothèque de l’anneau de lampes LED du fabriquant est disponible. C’est pour ça qu’on a décidé d’utiliser Arduino pour contrôler l’anneau.
On a besoin d’au moins 18 comportements de l’anneau. On a décidé d’envoyer le signal binaire de bela à arduino avec 5 sorties digitales. Donc on a 2^5=32 possibilités de comportements.
Bela et arduino sont reliés par 5 fils pour les sorties digitales et deux fils pour l’alimentation et la masse.
L’anneau est alimenté avec 5 V.
On a testé d’abord le signal entre bela et arduino avec l’anneau LED seul. Ensuite, on a testé la synchronisation des lampes avec le joystick.
Description des tests réalisés au cours de la semaine et du code implémenté pour atteindre l’objectif. Etablissement du code (fréquences, démarrage).

Géométrie & fabrication

Géométrie du modèle

La forme du qu’on a retenue pour les différentes pistes est globalement la même. L’idée de départ était de partir de capteurs piézoélectriques et d’un anneau de 24 lampes LED.

Pour un jeu avec des capteurs piézoélectriques

Parmi les pistes qu’on a exploitées :
  • Un objet non fixé sur une table avec lequel on peut jouer même posé sur une main. Il faut que l’objet soit d’une dimension assez petite et que bouger l’objet ne pose pas de soucis par rapport à l’enceinte, les pièces internes et la sensibilité des piézoélectriques.
  • Un objet posé sur une plateforme (sur une table par exemple). Moins de possibilités de positions pour jouer. Mais il permet ainsi de choisir une forme assez volumineuse pour pouvoir mettre toutes les pièces et l’amplification de l’enceinte. Egalement, l’objet bouge moins, ce qui permet d’influer moins sur les capteurs piézoélectriques.
  • Un objet à utiliser avec les deux mains. Dans ce cas, il est difficile de disposer les deux mains autours de l’anneau de lampes LED, et on voudrait une forme de jeu la plus simple visuellement.
  • Un objet à utiliser avec une main. Dans ce cas, les 8 piézoélectriques sont disposées en cercle autour de l’anneau utilisable d’une seule main. C’est la disposition retenue.

Pour un jeu avec un joystick

On garde une forme proche de celle avec les capteurs piézoélectriques. On indique visuellement les notes autour du joystick afin de faciliter l’utilisation.
De ces différentes pistes, on a retenu la forme globale de l’objet. C’est un objet qui se pose sur une plateforme et ayant pour base un octaèdre correspondant aux 8 notes (Do, Ré, Mi, Fa, Sol, La, Si, Do).
  • L’emplacement de l’enceinte
Dans le cas où l’objet se joue en étant posé sur une table. Le boitier de base est le boitier d’amplification de l’enceinte. Il est troué afin de livrer un son plus amplifié.
  • Les dimensions
On a paramétré les dimensions du boitier en fonction de l’encombrement des pièces à l’intérieur de l’objet. On cherche un objet pas très encombrant mais assez grand pour placer toutes les pièces et pouvoir être joué avec une seule main. La hauteur de l‘objet est définie afin qu’il soit facilement utilisable par une personne assise sur une table, mais d’une hauteur suffisante pour l’enceinte et les pièces internes. On a opté pour 25 cm de haut.
La hauteur et le diamètre de chaque cercle composant l’objet est paramétrable sur Grasshopper :
C:\Users\ASUS\Documents\Screen Shot 2018-09-20 at 14.21.53.png
  • La démontrabilité de l’objet
Pour accéder facilement aux parties internes de l’objet. On a choisi un couvercle soulevable et indépendant du reste de la structure.
La partie inférieure est aussi soulevable afin d’accéder facilement au câble et placer la batterie en bas de l’objet ou bien accéder au code de bela sans avoir à démonter l’objet.
  • Agencement des pièces à l’intérieur
Avec un joystick et l’anneau de lampes LED, on économise le nombre de fils et de résistances par rapport à l’utilisation des capteurs piézoélectriques et des lampes LED indépendantes. On a pu aussi gagner de l’espace en liant arduino et bela par des fils électriques pour l’alimentation de l’anneau de lampes LED.
Les cartes bela et arduino sont collés à une pièce en carton verticale trouée pour passer les câbles et qui renforce la structure. On place deux autres pièces en carton horizontale afin de faire tenir la structure externe et les pièces internes. Ça ajoute également une stabilité et une résistance à la structure. Une autre piste était de les coller sur les parois du boitier extérieur.
La forme finale du boitier est la suivante :

Fabrication du modèle

Les matériaux utilisés dans notre prototype final sont :
  • Des cartons de 3 mm d’épaisseur
  • Des fils ABS
  • Un câble USB
  • Une batterie
  • Une carte bela
  • Une carte arduino
  • Une enceinte
  • Un amplificateur LM386
  • Anneau de 24 lampes LED RGB
  • Joy stick avec 2 potentiomètres
  • Un bouton
  • Un potentiomètre
  • Et des fils électriques
  • Premiers prototypes
On a essayé au début un prototype du couvercle en carton de 3 mm avec l’imprimante de découpe Laser pour tester la sensibilité et l’agencement des capteurs piézoélectriques dans le couvercle.
On a ensuite tracé à l’imprimante de découpe laser un premier prototype du boitier avec un joystick à l’aide du plugin ivy avec lequel on a pu tester le son dans l’enceinte et l’agencement des pièces dans le boitier en haut.
  • Conception du modèle sur Grasshopper
Les plans sont tracés sur Grasshopper et le plugin Ivy.
On a pu tracer avec Ivy pour trois pièces différentes du boitier de géométries assez compliquées des plans simples et facilement dépliables (avec les trois épaisseurs différentes).
Les plans sont découpés sur des cartons de 3 mm d’épaisseur.
Le système de couvercle du boiter afin d’accéder au montage
  • Impression 3D du joystick
Le modèle 3D du joystick est fait sur Rhinoceros 3D.
On a imprimé deux modèles avec deux imprimantes 3D. Le matériau choisi est ABS pour les deux modèles.
  • En utilisant une imprimante 3D DIMENSION ELITE
Il faut décoller le support autour de la pièce. Le rendu est bien lisse, cependant on remarque des défauts (des incrustations d’autres matériaux) sur les faces qui disparaissent une fois plongé dans la soude. Les notes ne sont pas bien visibles.
  • En utilisant une imprimante 3D startt
Il faut décoller le support et polir les faces pour enlever le surplus de fils. Le rendu est moins lisse que l’autre prototype. Les notes sont plus visibles. Pour le prototype final, ce modèle a été choisi car l’embout de connexion est plus large et les notes gravées sont plus visibles que sur le modèle précédent. Le fil étant aussi plus souple, nous avons pu l’entailler facilement pour l’adapter au joystick.
  • Assemblage du montage électronique
D’abord, il fallait souder les câbles.
Les cartes Bela et Arduino sont collées sur les pièces en carton verticales avec le pistolet de colle chaude afin de pouvoir les décoller facilement ensuite.
On a positionné ensuite les lampes LED et le joystick sur la pièce A l’aide d’un petit test, on a repéré les notes sur l’anneau de lampes afin de bien le positionner.
On a ensuite positionné les autres pièces : l’enceinte, l’amplificateur, le potentiomètre de volume, le bouton ON/reset.
On a effectué quelques tests sur l’alimentation de l’arduino et bela, le fonctionnement du bouton ON/Reset, l’alimentation par une batterie.

Interaction

Le jeu se base sur le concept du jeu Mastermind.
Mastermind se joue à deux personnes. Un premier joueur choisit en secret une combinaison de 4 pions parmi les pions de 6 couleurs disponibles. L’autre joueur doit deviner la séquence en disposant les pions en une rangé selon l’idée qu’il se fait des pions dissimulés. Il a 10 essais. Une fois les pions placés à chaque essai, le premier joueur indique le nombre de pions de bonne couleur et bien placés avec des pions noirs, et les pions de bonne couleur mais mal placés avec des pions blancs.
Initialement, l’idée de base de notre jeu, le Musical MasterMind était de deviner une séquence de sons. Les pions des couleurs sont remplacés par des capteurs correspondant à une note chacun et les pions noirs et blancs remplacés par soit la réponse des lampes LED ou bien par des sons.
Les règles du jeu retenues sont les suivantes :
Le jeu démarre en cliquant sur un bouton ON/Reset. Un son et un jeu de lumière des lampes LED sont lancés pour marquer le démarrage.
Une mélodie est choisie aléatoirement dans le code.
Le joueur essaie une séquence de 5 notes à l’aide du joystick. Les lampes LED en bleu accompagnent les notes.
Si le joueur devine les 5 notes : La mélodie entière est jouée accompagnée des lampes LED en vert correspondant à chaque note en plus d’un son marquant la partie gagnée.
Si le joueur ne devine pas les 5 notes : 5 sons sont joués. Si une note est bien placée par le joueur, elle est répétée accompagné des lampes LED correspondantes en vert, sinon un son marquant l’erreur de note et joué et toutes les lampes LED s’allument en rouge. Dans ce cas, le joueur passe à l’essai suivant.
Le joueur essaie autant de fois qu’il veut jusqu’à deviner la séquence.
S’il gagne, une autre chanson est lancée aléatoirement et une nouvelle partie commence. S’il veut changer de mélodie avant d’avoir deviné la séquence entière, il appuie sur le bouton ON/Reset. 28 mélodies sont possibles.
On a modifié les règles du jeu de MasterMind. Initialement, on a pensé Dans l’anneau de 24 lampes LED RGB, chaques 3 lampes LED sont associés à une des notes (Do, Ré, Mi, Fa, Sol, La, Si, Do) et un des 8 capteurs piézoélectriques ou bien la position du joystick
On joue avec les capteurs les notes successives. Ensuite, Chaque ensemble de lampes associé à une capteur/note s’allume d’une lumière différente, selon la présence ou non et la position de la note dans la séquence. On s’est rendu compte que cette solution posait un souci dans le cas où une note est présente plus d’une fois dans la séquence ou qu’on la presse plus d’une fois dans la séquence et pas dans la bonne position.
Cette solution ne traduit donc pas le concept de MasterMind. On a pensé ensuite d’indiquer avec les anneaux le nombre de notes bien placées d’une couleur de lampes LED, les notes présentes mais mal placées d’une autre couleur, et le reste des lampes d’une autre couleur ou éteints (montrer un schéma). Cette solution est le concept le plus proche et n’est possible que jusqu’à une séquence de 24 notes. Cependant, on a trouvé qu’il est difficile de mémoriser visuellement les couleurs de l’anneau ainsi et on se questionnait sur l’intérêt du jeu si les notes et la couleur des lampes LED sont indépendants.
On a réfléchi sur plusieurs points avant d’établir les règles de notre jeu comme le choix des difficultés, le choix entre une mélodie enregistrée dans le code ou une suite de sons générés aléatoirement, le choix de la langueur de la séquence, le passage à une autre séquence, etc.
Le jeu est solitaire, une piste d’amélioration est d’avoir un jeu en mode multijoueur où un joueur peut composer une séquence qu’il fera deviner à un autre joueur.
On a également pensé à mettre des voix pour indiquer les étapes.
Une autre piste d’amélioration est de mémoriser les résultats qu’on peut afficher à la fin.

Interaction avec l’utilisateur

  • Les capteurs
Des capteurs piézoélectriques
Un objet avec 5 piézoélectriques maniables d’une seule main. Cette idée est rejetée car elle n’offre pas assez de notes pour un jeu.
8 piézoélectriques pour les 8 notes (Do, Ré, Mi, Fa, Sol, La, Si, Do) est plus facile à utiliser et permet de jouer les notes d’un large choix de mélodies. Cependant, En raison de la taille des piézoélectriques, l’objet sera plus encombrant et il y aura plus de câbles à l’intérieur du jeu.
Les 8 capteurs piézoélectriques sont placés en cercle autour de l’anneau de lampes LED.
On a réalisé avec la découpe laser un premier prototype du couvercle où sont disposés les capteurs afin de tester l’ergonomie de l’objet ainsi que la sensibilité et l’interaction entre les différents capteurs.
On réalise qu’avec une seule main placée au-dessus de l’objet on peut atteindre tous les capteurs. Il reste à prendre en compte le choix de l’interface entre les capteurs et l’utilisateur qui dépend de la sensibilité et l’interaction des capteurs.
Pour le prototype on a choisi des languettes et de placer les capteurs piézoélectriques à l’intérieur du boitier.
On a testé avec des sensibilités des capteurs à 0.5, 0.7 et 0.95. Il est plus facile de jouer si les capteurs sont plus sensibles mais il ’y a un risque d’interaction si on appuie sur d’autres capteurs. On a aussi pensé dans le cas où l’objet bouge. S’il est moins sensible, il serait plus difficile d’utiliser les touches.
Il aurait pu être possible aussi de changer la forme des languettes, ou bien mettre des trous pour toucher directement des doigts la face des capteurs.
L’avantage des capteurs piézoélectriques est qu’ils sont faciles pour jouer les notes avec.
Cependant, ils nécessitent un câblage important et utilisent les 8 entrées analogiques du bela. Un travail sur l’interaction et la sensibilité des pièces est à faire.
Un joystick
Le principe d’une interface avec un joystick est de diviser ses positions en 8 intervalles correspondant chacune à une note.
Figure 2 Intervalles des notes en utilisant un Joystick
L’avantage du joystick est qu’il nécessite moins de câbles et deux entrées analogiques. C’est un objet moins encombrant. Jouable avec un seul doigt. Il est avantageux pour une personne à mobilité réduite.
On a testé l’ergonomie de l’utilisation du joystick seul. Il est possible de manier le joystick mais il peut ne pas être facile de passer d’une note à une autre si on ne le maitrise pas assez.
On a pensé à mettre une plaque octaédrale où sont imprimées les notes autour du joystick. C’est plus pratique à manipuler d’une main. Mais la pièce en carton n’est pas assez résistante et on est obligés d’ajouter une faille dans la plaque afin de faire passe la tête du joystick. Pour plus de résistance, on superpose deux plaques. Cette pièce n’est liée à l’objet qu’à travers le joystick.
La piste qu’on a retenue est de modéliser notre propre joystick avec une imprimante 3D de forme plus ergonomique et plus grande.
Des boutons
Une autre piste aurait été de mettre 8 boutons en entrée digitale de Bela.
  • La réponse du circuit
Réponse sonore avec l’enceinte en sortie
La réponse sonore doit permettre à elle seule de jouer le jeu sans avoir besoin de voir. Cela inclut de rejouer les notes qu’on a composées lors d’un essai avec indication de notes bien placées ou non, rejouer la mélodie complète une fois la séquence des notes est devinée, démarrer le jeu, accompagner le jeu en cas d’échec/réussite, passage à une autre mélodie, etc.
Réponse visuelle avec les lampes en sortie
La réponse visuelle de l’objet accompagne autant que la partie sonore. Idéalement elle permettrait de jouer sans avoir besoin d’écouter.
On peut opter pour l’utilisation de l’anneau de lampes LED. Ces sont des lampes LED RGB. Les couleurs facilitent l’interaction avec l’utilisateur. Les lampes accompagnent le jeu autant que la réponse sonore. L’anneau divisé en 24 lampes est aussi bien exploité pour accompagner visuellement les notes qu’on joue, que pour accompagner la réponse.
L’anneau est placé à en haut de l’objet à l’extérieur. Il est possible aussi de la placer à l’intérieur du boitier de l’enceinte et les lumières sortent par les trous.
On peut également utiliser des lampes indépendantes. On peut utiliser 8 lampes disposées en cercle autour du joystick par exemple. La réponse peut être en clignotement ou en couleurs différentes. On a plus de liberté pour placer les lampes LED mais elles nécessitent plus de câbles et de résistances à l’intérieur du boitier externe.
Boutons pour le dialogue avec l’utilisateur
Un bouton pour ON est placé en entrée digitale de bela. Il est placé sur une paroi latérale du boitier. Il permet également de changer de mélodie.
Le bouton peut être également celui du joystick, mais on risque d’appuyer dessus en jouant une note.
Il est possible d’ajouter éventuellement d’autres boutons pour le contrôle de la difficulté, reset, etc.

Conclusions

Pistes d’amélioration :
  • Ergonomie du modèle : La forme du joystick.
  • Niveau de difficulté du jeu
  • Interface avec l’utilisateur
  • Le jeu de lumière pour la réponse
  • Un bouton pour éteindre bela.

Références

Fiche technique de LM386
Fiche technique de LED Color SK6812

Annexe

Code C++ d’Arduino :
1
#include <Adafruit_NeoPixel.h>
2
#ifdef __AVR__
3
#include <avr/power.h>
4
#endif
5
6
// Which pin on the Arduino is connected to the NeoPixels?
7
// On a Trinket or Gemma we suggest changing this to 1
8
#define PIN 8
9
10
// How many NeoPixels are attached to the Arduino?
11
#define NUMPIXELS 24
12
13
// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
14
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
15
// example for more information on possible values.
16
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
17
18
int led_port[5]={2,3,4,5,6};
19
int port_state[5];
20
21
//COMPORTAMENT LEDS
22
23
int delayval = 500; // delay for half a second
24
int delay_failure=1000;
25
int delay_intro=1000;
26
27
int note_comp[8]={000,001,010,011,100,101,110,111};
28
int intensity=75; //maximum intensity of coulours
29
30
void all_leds_off(){
31
for (int j=0;j<NUMPIXELS;j++){
32
33
pixels.setPixelColor(j, pixels.Color(0,0,0)) ;
34
pixels.show();
35
delay(0); // Delay for a period of time (in milliseconds).
36
}}
37
38
39
void introduction(){
40
41
for (int i=0;i<NUMPIXELS;i++){
42
pixels.setPixelColor(i, pixels.Color(random(1,intensity),random(1,intensity),random(1,intensity))) ;
43
44
pixels.show();
45
delay(5); // Delay for a period of time (in milliseconds).}
46
}
47
// delay(delay_intro);
48
// all_leds_off();
49
// delay(delay_intro);
50
51
}
52
53
54
void failure(){
55
56
for (int i=0;i<NUMPIXELS;i++){
57
pixels.setPixelColor(i, pixels.Color(intensity,0,0)) ;
58
59
pixels.show();
60
delay(0); // Delay for a period of time (in milliseconds).}
61
}
62
// delay(delay_failure);
63
// all_leds_off();
64
// delay(delay_failure);
65
}
66
67
68
void victory(){
69
70
for (int i=0;i<NUMPIXELS;i++){
71
pixels.setPixelColor(i, pixels.Color(random(1,intensity),100,random(1,intensity))) ;
72
73
pixels.show();
74
delay(5); // Delay for a period of time (in milliseconds).}
75
}
76
// delay(delay_intro);
77
// all_leds_off();
78
// delay(delay_intro);
79
}
80
81
82
void light_note(int note_id, int Red, int Green, int Blue){
83
for (int i=0;i<NUMPIXELS;i++){
84
if(i>=note_id*3 &&i<=note_id*3+2) {
85
pixels.setPixelColor(i, pixels.Color(Red,Green,Blue)) ;
86
pixels.show();
87
}}
88
}
89
90
91
void setup() {
92
// This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
93
#if defined (__AVR_ATtiny85__)
94
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
95
#endif
96
// End of trinket special code
97
98
// initialize serial communication at 9600 bits per second:
99
Serial.begin(9600);
100
// make the pushbutton's pin an input:
101
pinMode(2, INPUT);
102
pinMode(3, INPUT);
103
pinMode(4, INPUT);
104
pinMode(5, INPUT);
105
pinMode(6, INPUT);
106
107
pixels.begin(); // This initializes the NeoPixel library.
108
}
109
110
void loop() {
111
112
113
int last_note_id,Red=0,Green=0,Blue=0, note_id=0;
114
115
for(int l=0;l<5;l++){
116
port_state[l]=digitalRead(led_port[l]);}
117
118
119
120
if(port_state[0]==1){
121
if(port_state[1]==0) {
122
Red=0;
123
Green=0;
124
Blue=intensity;}
125
else {
126
Red=0;
127
Green=intensity;
128
Blue=0; }
129
note_id=0;
130
note_id=port_state[2]*4+port_state[3]*2+port_state[4];
131
132
// if(note_id!=last_note_id) all_leds_off();
133
134
light_note(note_id,Red,Green,Blue);
135
136
137
last_note_id=note_id;
138
139
}
140
else{
141
if (port_state[1]==0&&port_state[2]==0&&port_state[3]==0&&port_state[4]==1) introduction();
142
else {
143
if (port_state[1]==0&&port_state[2]==0&&port_state[3]==1&&port_state[4]==0) victory();
144
else {
145
if(port_state[1]==0&&port_state[2]==0&&port_state[3]==1&&port_state[4]==1) failure();
146
else all_leds_off();}}
147
Serial.print(port_state[4]);
148
149
}
150
}
151
Copied!