====== AIR PIANO ====== **Daphné Chamot-Rooke** (contact : [[daphne.chamot-rooke@etu.upmc.fr|daphne.chamot-rooke@etu.upmc.fr]])\\ **Himany Seri** (contact : [[himany.seri@etu.upmc.fr|himany.seri@etu.upmc.fr]]) **Objectif :** créer un clavier virtuel qui fait de la musique sans touches **Matériel :** * carte Arduino UNO * 1 sonar * 1 buzzer * un ruban de LEDs de couleurs adressable * fils de connexion + breadboard * de quoi souder * du contreplaqué en 3mm * 1 PC + une sortie son ==== Construction ==== Nous avons découpé une boîte de la taille du socle de l'arduino uno (100\*124*100 mm) {{ :wiki:projets:air_piano.png?600 |}} Voici les trous pour les LEDs : {{ :wiki:projets:2018leds.png?600 |}} Ne pas oublier de prévoir des trous pour le sonar (1.7 cm de diamètre) et pour l'alimentation de l'Arduino (carré de 1.2 cm de côté). Après découpe et assemblage, on obtient cette boîte : {{ :wiki:projets:20181122_103735_hdr.jpg?600 |}} Nous avons ensuite découpé 2*4 LEDs sur le ruban de LEDs adressables. Elles sont séparables à l'unité. Nous avons donc soudé les 2 bouts de ruban entre eux (attention car il y a un sens avec le "DO in", on s'était trompées au début). Nous avons mis du scotch d'électricien pour protéger les soudures qui sont très fines. {{ :wiki:projets:20181122_113154_hdr.jpg?600 |}} On a fixé tous les branchements de l'Arduino avec du scotch pour ne pas qu'ils dépassent par les trous de la boîte. Nous avons également fixé le socle de l'arduino dans la boîte pour ne pas que le sonar capte les parois de la boîte en bougeant. Nous avons peint la boîte en noir avec de la peinture acrylique. {{ :wiki:projets:20181129_163320_hdr.jpg?600 |}} Voici le rendu final. Les LEDs changent de couleur en fonction de la distance de la main perçue (plus elle est grande plus ça va vers les rouges). Nous avons décidé de prendre la distance seulement sur 30 cm sinon il y a trop de parasitage, et le sonar captait des informations non désirables. {{:wiki:projets:20181205_153517.jpg?600 |}} {{ :wiki:projets:20181205_153521.jpg?600 |}} ==== Code ==== #define trigPin 10 //Déclaration de variable globale #define echoPin 8 // Déclaration de variable globale //librairie Neopixel #include #ifdef __AVR__ #include #endif #define NUMPIXELS 8 //Déclaration de variable pour le nombre de LEDs qui vont s'allumer sur le strip Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, 9, NEO_GRB + NEO_KHZ800); const byte PIN_BUZZER = 13; // constante qui prend 0 bit ou 1 bit en valeur long duration, distance; //la valeur est codée sur 32 bits int frequence = 0; //Déclaration d'une variable fréquence qui va stocker la fréquence int couleur = 0; //Déclaration d'une variable qui va permettre de changer la couleur des LEDs en fonction de la distance void setup() { Serial.begin(9600); //fixe le débit d'information qui sera reçu par seconde //on prépare les pin 9, 12 , 13 et trig en mode sortie pinMode(9, OUTPUT); pinMode(12, OUTPUT); pinMode(13, OUTPUT); pinMode(trigPin, OUTPUT); //on prépare la pin echo en mode entrée pinMode(echoPin, INPUT); pixels.begin(); //la librairie NeoPixel est initialisée Serial.println("== Début du programme =="); //affiche "== Début du programme ==" dans le moniteur } void loop() { //Envoi de l'onde digitalWrite(trigPin, LOW); delayMicroseconds(200); digitalWrite(trigPin, HIGH); delayMicroseconds(200); digitalWrite(trigPin, LOW); delayMicroseconds(200); //Réception de l'écho duration = pulseIn(echoPin, HIGH); // Calcul de la distance distance = (duration / 2) / 29.1; //variable pour modifier la couleur des LEDs en fonction de la distance couleur = distance * 10; //si la distance est inférieure à 0 ou supérieure à 30 cm, on affiche "hors plage" sur le moniteur et rien ne se passe if (distance >= 30 || distance <= 0) { Serial.println("Hors plage"); noTone(13); //on arrête la note } else { //si la distance est comprise entre 0 et 30 cm, on joue les notes et on allume les LEDs //on affiche la distance dans le moniteur en cm Serial.print("distance = "); Serial.print(distance); Serial.println(" cm"); //For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one. for (int i = 0; i < NUMPIXELS; i++) { //pixels.Color takes RGB values, from 0,0,0 up to 255,255,255 pixels.setPixelColor(i, pixels.Color(couleur / 2, 4 * couleur, 2 * couleur)); //s'allume de différentes couleurs en fonction de la distance pixels.show(); // This sends the updated pixel color to the hardware. delay(50); //les LEDs s'allument 50 ms chacune //pour chaque intervalle de 3cm, on joue une note différente if (distance < 3) { tone(13, 523.25); } else if ((3 <= distance) && (distance < 6)) { tone(13, 554.37); } else if ((6 <= distance) && (distance < 9)) { tone(13, 587.33); } else if ((9 <= distance) && (distance < 12)) { tone(13, 622.25); } else if ((12 <= distance) && (distance < 15)) { tone(13, 659.26); } else if ((15 <= distance) && (distance < 18)) { tone(13, 698.46); } else if ((18 <= distance) && (distance < 21)) { tone(13, 739.99); } else if ((21 <= distance) && (distance < 24)) { tone(13, 783.99); } else if ((24 <= distance) && (distance < 27)) { tone(13, 830.61); } else if ((27 <= distance) && (distance < 30)) { tone(13, 880); } else if ((30 <= distance) && (distance < 33)) { tone(13, 932.33); } } } delay(100); //délai entre deux mesures }