Apolline Roccaserra
Camille Jannet
Quy Nguyen
Gonzalo Espinoza
Ce workshop a pour but de redonner une identité visuelle à un lieu par la lumière.
Le centre vie de Telecom Bretagne est un lieu de rassemblement pour les étudiants, les professeurs et le personnel. Il existe différents espaces distincts : la cafeteria, l’espace travail, l’espace de reunion et deux grandes alcoves qui ne sont investis uniquement pour des expositions.
Les alcoves, délaissées en dehors des expositions constituent le point central de notre travail.
Notre projet Eclipse éclaire avec originalité l’ellipse ajourée, spécificité architecturale, que l’on retrouve dans le centre de vie.
Elipse vise à animer le lieu, au rythme des musiques et des couleurs. L’objectif est d’occuper les espaces vides, en les rendant conviviaux. La lumière est sensible aux mouvements. Son intensité augmente quand t’on s’en rapproche. Une fois branchée à un système audio, Eclipse change de facette pour devenir lumière d’ambiance.
Matériel Electronique :
– 2 Capteur de luminosité (LDR)
– 2 Capteurs de proximité
– 5 Neo – LEDs
– 1 Résistance 1kΩ
– 2 Arduino avec des câbles et connecteurs USB
– Câbles
Fonctionnement :
L’idée de la performance du projet est basée sur la programmation de 2 arduinos et l’interaction des capteurs de proximité, des capteurs de luminosité, des LEDs et des NEO LEDs.
Le premier arduino a l’idée de connecter 3 circuit avec 10 LEDs de diffèrent couleur chacune, l’idée est que chaque circuit est éclairé selon le rythme d’une chanson. On programme l’arduino en 3 types différents de sons où chacun est associé à chaque différents circuit de LED, avec l’aide d’un ordinateur et une liste de chansons chaque circuit est allumée.
Le deuxième circuit a l’idée d’éclairer la ronde où se trouve la structure avec l’électronique, avec l’aide de deux capteurs de proximité est possible de faire varier la vitesse avec laquelle les couleurs changent contours de l’environnement, même avec l’aide de deux capteurs de luminosité on change si l’intensité des NEO LEDs s’il y a une lumière extérieure naturelle la intensité diminuera et par exemple à la nuit quand vous ne disposez pas d’une intensité de lumière externe la intensité sera plus.
Code Lumière et capteur de proximité
#include <Adafruit_NeoPixel.h> #ifdef _AVR_ #include <avr/power.h> #endif #define neoPin 7 #define trigPin_1 13 #define echoPin_1 12 #define trigPin_2 11 #define echoPin_2 10 #define lightPin A0 #define NUMPIXELS 16 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, neoPin, NEO_GRB + NEO_KHZ800); long R,G,B; int delayVal = 50; long distance1, distance2; int sensorValue; float brightness; void setup() { #if defined (_AVR_ATtiny85_) if (F_CPU == 16000000) clock_prescale_set(clock_div_1); #endif pinMode(trigPin_1, OUTPUT); pinMode(echoPin_1, INPUT); pinMode(trigPin_2, OUTPUT); pinMode(echoPin_2, INPUT); randomSeed(analogRead(0)); pixels.begin(); Serial.begin(9600); } void loop() { // Generate random values to set colors R = random(255); G = random(255); B = random(255); // Get distance by proximity sensor distance1 = getDistance(trigPin_1,echoPin_1); Serial.print(distance1); Serial.println(" cm- distance 1"); distance2 = getDistance(trigPin_2,echoPin_2); Serial.print(distance2); Serial.println(" cm- distance 2"); // Get light intensity by light sensor sensorValue = analogRead(lightPin); brightness = map(sensorValue, 0, 1000, 0, 100); Serial.print("Sensor Value: "); Serial.println(sensorValue); Serial.print("Brightness Value: "); Serial.println(brightness); // If proximity works, run NeoPixel if (checkCondition(distance1) || checkCondition(distance2)) { for(int i = 0; i < NUMPIXELS; i++){ // pixels.setPixelColor(i, pixels.Color(R,G,B)); // If light intensity works pixels.setPixelColor(i, pixels.Color(R*brightness/100,G*brightness/100,B*brightness/100)); pixels.show(); if(distance1 <= distance2) { if(checkCondition(distance1)) delayVal = distance1; else delayVal = distance2; } else { if(checkCondition(distance2)) delayVal = distance2; else delayVal = distance1; } // Serial.print("value of delay: "); // Serial.println(delayVal); delay(delayVal+10); //delay(distance2+10); } } else { for(int i = 0; i < NUMPIXELS; i++){ pixels.setPixelColor(i, pixels.Color(0,0,0)); pixels.show(); } } } int getDistance(int trig, int echo) { long duration, distance; digitalWrite(trig, LOW); delayMicroseconds(2); digitalWrite(trig, HIGH); delayMicroseconds(10); digitalWrite(trig, LOW); duration = pulseIn(echo, HIGH); distance = (duration/2) / 29.1; return distance; } int checkCondition(int distance) { if (distance >= 0 && distance <=50) return 1; else return 0; }
Code Lumière et musique
Uploading StarndardFirmata.ino which is example of Firmata library. Firmata allows us to operate a firmware between arduino and host computer then they are able to communicate together. From now, we dont need to program in arduino but via processing in host computer. // Code for processing which plays list of music files and decode sound then generate signals to leds ////////////////////////////////// import processing.serial.*; import ddf.minim.*; import ddf.minim.analysis.*; import cc.arduino.*; Minim minim; AudioPlayer song,player; BeatDetect beat; BeatListener bl; Arduino arduino; int ledPin = 5; int ledPin2 = 6; int ledPin3 = 7; float kickSize, snareSize, hatSize; // Variables for play multiple files int indexForNames = 0; String[] names = new String [0]; boolean songIsPaused = true; static final String EXT = ""; boolean restartedsong = false; // void setup() { size(512, 200, P3D); minim = new Minim(this); arduino = new Arduino(this, Arduino.list()[1], 57600); getSongsFromFolder(); player = minim.loadFile(names[indexForNames]); beat = new BeatDetect(player.bufferSize(), player.sampleRate()); beat.setSensitivity(10); bl = new BeatListener(beat, player); kickSize = snareSize = hatSize = 16; textFont(createFont("Helvetica", 16)); textAlign(CENTER); arduino.pinMode(ledPin, Arduino.OUTPUT); arduino.pinMode(ledPin2, Arduino.OUTPUT); arduino.pinMode(ledPin3, Arduino.OUTPUT); } void draw() { background(0); fill(255); if (songIsPaused == true) { player.pause(); } if(beat.isKick()) { arduino.digitalWrite(ledPin, Arduino.HIGH); // set the LED on kickSize = 32; delay(70); } if(beat.isSnare()) { arduino.digitalWrite(ledPin2, Arduino.HIGH); // set the LED on snareSize = 32; delay(50); } if(beat.isHat()) { arduino.digitalWrite(ledPin3, Arduino.HIGH); // set the LED on hatSize = 32; delay(70); } arduino.digitalWrite(ledPin, Arduino.LOW); // set the LED off arduino.digitalWrite(ledPin2, Arduino.LOW); // set the LED off arduino.digitalWrite(ledPin3, Arduino.LOW); // set the LED off textSize(kickSize); text("KICK", width/4, height/2); textSize(snareSize); text("SNARE", width/2, height/2); textSize(hatSize); text("HAT", 3*width/4, height/2); kickSize = constrain(kickSize * 0.95, 16, 32); snareSize = constrain(snareSize * 0.95, 16, 32); hatSize = constrain(hatSize * 0.95, 16, 32); if (!player.isPlaying() && !songIsPaused) { indexForNames++; if (indexForNames>=names.length) { indexForNames=0; //println ("restarting list of songs -----------"); } player = minim.loadFile(names[indexForNames]+EXT); player.play(); //println (""); //println (""); //println ("Just loaded song "+names[indexForNames]+EXT + " ("+str(indexForNames+1)+" of "+names.length+")."); beat = new BeatDetect(player.bufferSize(), player.sampleRate()); beat.setSensitivity(10); bl = new BeatListener(beat, player); } } void stop() { // always close Minim audio classes when you are finished with them song.close(); // always stop Minim before exiting minim.stop(); // this closes the sketch super.stop(); } void getSongsFromFolder() { // File dir = new File( dataPath("") ); //println ("dir "+dir+"\n"); // File[] namesFiles2 = dir.listFiles(); if (namesFiles2==null) { println("no file found - ###############++++++++"); exit(); } else { String [] namesFiles = new String [0]; if (namesFiles2!=null) { // check all found files if they are ok for (int i = 0; i < namesFiles2.length; i++) { // if ok if (fileIsOK(namesFiles2[i].getAbsolutePath() )) { // build new array names = append (names, namesFiles2[i].getAbsolutePath() ); print ( namesFiles2[i].getAbsolutePath() ); } // if else { // println ("skipped "+namesFiles2[i]); } // else } // for println("\n\n"); } // if // println("Found "+ names.length + " songs."); // println(namesFiles); // if (names.length==0) { println ("no song ################-------------------"); } else { // // println (names); } // else } // } boolean fileIsOK (String name) { // AudioPlayer: playback of WAV, AIFF, AU, SND, and MP3 files. if (name==null) { return false; // not ok } name=trim(name); if (name.equals("")) return false; if (name.substring ( name.length()-4 ).equals (".MP3") ) return true; if (name.substring ( name.length()-4 ).equals (".mp3") ) return true; if (name.substring ( name.length()-4 ).equals (".WAV") ) return true; if (name.substring ( name.length()-4 ).equals (".wav") ) return true; if (name.substring ( name.length()-5 ).equals (".aiff") ) return true; if (name.substring ( name.length()-3 ).equals (".au") ) return true; if (name.substring ( name.length()-4 ).equals (".SND") ) return true; if (name.substring ( name.length()-4 ).equals (".snd") ) return true; // when no extension matched: return false; // not ok } void keyPressed() { if ( key == ' ' ) { songIsPaused = !songIsPaused; } // jump to End else if ( keyCode == RIGHT ) { int position = player.length(); player.cue( position ); println (""); println (""); println (""); println ("Skipped to next song"); } else if (keyCode == LEFT) { restartedsong = true; int position = 0; player.cue(position); println (""); println (""); println (""); println ("Jumped to the beggining of " + names[indexForNames]); } if (songIsPaused == true) { println (""); println (""); println ("PAUSED - Press the space bar to continue!"); } else { player.play(); } } class BeatListener implements AudioListener { private BeatDetect beat; private AudioPlayer source; BeatListener(BeatDetect beat, AudioPlayer source) { this.source = source; this.source.addListener(this); this.beat = beat; } void samples(float[] samps) { beat.detect(source.mix); } void samples(float[] sampsL, float[] sampsR) { beat.detect(source.mix); } }