Projet I haRpe

Envoyé par le 2 Fév 2018

Dans le cadre d’un projet commun entre l’IMT Atlantique et l’école de Design de Brest (eesab), nous avons réalisé une harpe infrarouge.

L’idée de départ était de proposer une structure interactive musicale pour égayer l’espace vert du centre-vie d’IMT Atlantique campus de Brest. Une harpe laser avait déjà été testée par le Téléfab, mais les difficultés liées à la vision des rayons laser (fumée, peu de luminosité) nous ont amené à travailler avec une autre technologie similaire : les capteurs infra-rouge.

En passant sa main devant le capteur, on peu ainsi déclencher un son. Nous avons au final choisi des sons de violoncelle.

nous avons découpé le projet en plusieurs phases pour mieux s’y retrouver :

  1. faire fonctionner 1 capteur infra rouge avec un buzzer et un potentiomètre

Il nous fallait tout d’abord nous réapproprier arduino et ses fonctionnalités. Nous avons testé un capteur infrarouge, lié à un buzzer et un potentiomètre. Le buzzer était un petit haut-parleur que nous utilisions grace à la fonction tone, qui nous permettait d’envoyer un son grâce à une fréquence. le potentiomètre permettait de changer le volume grâce à une résistance variable.

photo

matériel :

  • arduino uno
  • capteur infrarouge
  • plaquette de tests
  • potentiomètre
  • buzzer (mini haut-parleur)
  • fils

programme arduino

<blockquote>#define pin A1 //capteur infrarouge, entrée analogique

const byte PIN_BUZZER = 9; //haut parleur; sortie

void setup () {
Serial.begin (9600); //Pour initialiser le moniteur série
pinMode(pin, INPUT); // capteur infrarouge
pinMode(PIN_BUZZER, OUTPUT); //haut parleur
}

void loop () {
uint16_t value = analogRead (pin);
double distance = get_IR (value); //Convert the analog voltage to the distance
Serial.println (value); //Print the data to the arduino serial monitor
Serial.print (distance);
Serial.println (" cm");
Serial.println ();
if(distance < 20) tone(PIN_BUZZER, 440);
else noTone(PIN_BUZZER);
}

//return distance (cm)
double get_IR (uint16_t value) {
if (value < 16) value = 16;
return 2076.0 / (value - 11.0);

}

2. faire fonctionner 2 capteurs infra rouge avec un buzzer

Nous voulions au minimum avoir 3 « cordes », donc trois capteurs en parallèle. Nous avons eu des soucis en mettant plusieurs capteurs en série car nous utilisions que l’alimentation usb de l’arduino. Je conseille à ce stade d’ajouter une alimentation externe à la carte arduino, même si elle est tout le temps liée à l’ordinateur en usb. Les capteurs sont assez sensibles à leur alimentation (5V). Avec une bonne alimentation, on peut donc aisément ajouter au montage précédent autant de capteur que souhaité, en entrée sur différents pin analogiques, même masse et même alimentation.

Sur le buzzer, la superposition des sons donnait des choses bizarres, du coup nous avons décidé à ce stade de coder des nouveaux sons si plusieurs capteurs étaient utilisés en même temps.

 

3. carte mp3 shield => voir blog : j’ai fait un article pour donner plus de précisions, mais nous avons perdu un temps précieux à essayer de faire marcher la carte.

4. Processing IDE

Nous avons utilisé un logiciel, Processing IDE, qui est proche d’un IDE arduino et qui permettait de lire des fichiers mp3 sur l’ordinateur. faire attention aux librairies à charger. (contacter baptiste.gautier@imt-atlantique.net pour plus d’information sur cette partie.

matériel :

  • une unité centrale possédant une carte son et un haut-parleur
  • une carte arduino uno
  • des fils
  • une plaquette de tests
  • des capteurs infrarouges (un capteur pour une corde)
  • un cable usb
  • un cable d’alimentation de carte arduino

programme à téléverser sur l'arduino

<blockquote>#define PIN0 A0;
#define PIN1 A1;
#define PIN2 A2;
#define PIN3 A3;//ir
byte dos = 30;
byte re = 40;
byte mi = 50;
byte fa = 60;
byte sol = 70;
byte la = 80;
byte si = 90;

int d = 15;

void setup () {
Serial.begin (9600);
pinMode(PIN0, INPUT);
pinMode(PIN1, INPUT);
pinMode(PIN2, INPUT); // ir
pinMode(PIN3, INPUT);
}

void loop () {
uint16_t value1 = analogRead (PIN0);
uint16_t value2 = analogRead (PIN1);
uint16_t value3 = analogRead (PIN2);
uint16_t value4 = analogRead (PIN3);
double distance1 = get_IR (value1); //Convert the analog voltage to the distance
double distance2 = get_IR (value2);
double distance3 = get_IR (value3);
double distance4 = get_IR (value4);
if (distance1 < d && distance2 > d && distance3 > d) {
Serial.write(dos);
}

if (distance1 > d && distance2 < d && distance3 > d) {
Serial.write(re);
}

if (distance1 > d && distance2 > d && distance3 < d) {
Serial.write(mi);
}

if (distance1 < d && distance2 < d && distance3 > d) {
Serial.write(fa);
}

if (distance1 > d && distance2 < d && distance3 < d) {
Serial.write(sol);
}

if (distance1 < d && distance2 > d && distance3 < d) {
Serial.write(la);
}

if ( distance4 < d) {
Serial.write(si);
}

//else Serial.write(none);

//Serial.println(distance1);
delay(600);
}

//return distance (cm)
double get_IR (uint16_t value) {
if (value < 16) value = 16;
return 2076.0 / (value - 11.0);

}</blockquote>

 

programme à compiler sur ordinateur


&nbsp;
<blockquote>import processing.serial.*;

import processing.sound.*;

Serial myPort; // Create object from Serial class
String val;
String valeur;// Data received from the serial port
SoundFile fileDo;
SoundFile fileRe;
SoundFile fileMi;
SoundFile fileFa;
SoundFile fileSol;
SoundFile fileLa;
SoundFile fileSi;
int sound;
void setup()
{
// I know that the first port in the serial list on my mac
// is Serial.list()[0].
// On Windows machines, this generally opens COM1.
// Open whatever port is the one you're using.
String portName = Serial.list()[0];//change the 0 to a 1 or 2 etc. to match your port
myPort = new Serial(this, portName, 9600);
fileDo = new SoundFile(this, "cellog2.wav");
fileRe = new SoundFile(this, "cellobb3.wav");
fileMi = new SoundFile(this, "celloeb3.wav");
fileFa = new SoundFile(this, "celloc4.wav");
fileSol = new SoundFile(this, "celloa3.wav");
fileLa = new SoundFile(this, "cellobb4.wav");
fileSi = new SoundFile(this, "cellog5.wav");
}

void draw()
{
if ( myPort.available() > 0)
{ // If data is available,
sound = myPort.read(); // read it and store it in val
println(sound);
if (sound == 30) fileDo.play();
if (sound == 40) fileRe.play();
if (sound == 50) fileMi.play();
if (sound == 60) fileFa.play();
if (sound == 70) fileSol.play();
if (sound == 80) fileLa.play();
if (sound == 90) fileSi.play();
delay(600);
}

}</blockquote>

les fichiers « celloxx.wav » sont des fichiers sons de cordes de violoncelle. Vous pouvez à cet endroit mettre les fichiers sons que vous voulez (comme des accords d’harpe celtique par exemple).

amélioration possibles : ajouter des Led qui s’activent avec la distance des capteurs infrarouge, utiliser une raspberry pi plutôt qu’un ordi complet

5. collaboration avec l’EESAB :

une structure en contreplaqué de peuplier était suspendue à une arche, par des cordes qui venaient suggérer la présence des cordes infrarouges dans le cadre vide.

 

 

 

 

 

 

 

 

contacts :

Emma Ducos, Baptiste Gautier,  étudiants de IMT Atlantique

Sylvain & Antoine, étudiants de l’EESAB

Laisser une réponse

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *