Table des matières

AIR PIANO

Construction

Nous avons découpé une boîte de la taille du socle de l'arduino uno (100\*124*100 mm)

Voici les trous pour les LEDs :

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 :

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.

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.

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.

Code

#define trigPin 10  //Déclaration de variable globale
#define echoPin 8   // Déclaration de variable globale
//librairie Neopixel
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#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
}