Project Description:
A central panel is suspended from the ceiling grid. The panel is painted black representing the night sky. Holes punched through the board contain LEDs displaying several different constellation patterns and random stars.
Four motion sensors are inserted into separate black boxes. Each box is centered on one wall of the room. As one walks past a motion sensor, there presence will activate the constellation pattern and random stars at that side of the room. The closer one gets to the sensor, the brighter the constellation patterns will get. When the other motion sensors detect activity, they will display other constellation patterns on the ceiling panel corresponding to that specific side of the room. The farther away from the sensors, the dimmer the ceiling panel LEDs become.
Tools:
22 gauge solid core wire (approximately 600 ft), 100 LEDs (we used Christmas lights), 100 – 100 ohm resistors , Wire strippers, Soldering pencil, Solder, Flux, Two ¼” MDF 4’x8’ Panels, One 2”x4” Stud, Pneumatic nailer, Drill and bits, 3/8” threaded rod and nuts, Black spray paint (gloss)
Step 1:
Disassemble the LEDs from a strand of Christmas lights, cut equal lengths of wire (6” and 4”), solder the resistors to the voltage side of the LED and to the 4” wire, solder the 6” wire to the ground of the LED
Step 2:
Laser cut and assemble acrylic boxes with openings to fit the dimensions of the long distance IR sensors. These sensors get three 25’ cables attached to reach the perimeter of the room up to the ceiling panel. Shorter wires can be placed by wire nuts to allow for other groups ease of attachment to their assembled projects. (Spray painting the sand blasted boxes was a cosmetic choice)
Step 3:
Assembling the multiplexer trees. The assembly of these multiplexers off one another should allow each panel to house up to 42 individually signaled LEDs far more than what the arduino can house on its digital pins. This is done through signals of high and low which control a certain pin through their combanation, images of this truth table are mapped out below. Unfortunatly these “trees” were broadcasting duplicated signals resulting in undesired lights to flicker on. The use of two multiplexers was used in the final product.
Step 4:
Fabrication:
The ceiling panel is constructed of 2 1/4″ thick MDF panels cut in 30” x 60” sections. Small holes are drilled through the boards to stick the LED heads through. The holes are arranged in a night sky star pattern using constellations and random stars for a layout. The Ardunio board and multiplexers are mounted to the top of the ceiling panel with all wiring connections including the wiring from the four motion sensors and dance shoe. LEDs were grouped with a common ground (indicated by red wire) and constellations were individually wire to be controlled seperately. The other remaining leds were coupled to save space on the mutiplexer. The ceiling panels were secured together on site to create a 60” x 60” large panel. Ceiling mounts connected to the top of the panel consist of 2×4 wood pieces with holes drilled through. A bolted threaded rod hangs over the ceiling grid at the top of the drilled 2×4 suspending the panel from the ceiling.
Step 5:
Secondary Input:
The XBeeautiful Dancing project (creators Nellie Niespodzinski and Aaron Tarnowski) gives input data to the ceiling panel. The dancing shoe contains a pressure sensor on the bottom sole. Each time the shoe hits the floor, the tap is detected and starts a count. After a certain number of hits, the dress lights up a series of LEDs. At the same time, the ceiling panel will display a constellation pattern at the brightest lighting capacity. A few more steps of the dance will then activate another set of lights on the dress and will switch to a different constellation displayed on the ceiling panel. This pattern of lights displayed on the dress and bright constellation patterns will continue until the dance is finished.
CLICK THE IMAGE BELOW TO SEE HOW THE DANCE EFFECTS OUR PANEL constellations used Ursa Minor, Ursa Major, Draco, Hercules, Cygnus, Cassiopeia, Camelopardalis
Below is the script writen for arduino in C for our project
/*
Media Robotics I
Professor: Mark Shepard
TA: Trinadh Pydipally
Date: December 16, 2009
Team Members:
Nick Capozzoli, Jodi Pfister, Brian Podleski
Project Description:
- 4 motion sensors on mounted on the wall, 1 ceiling panel mounted to ceiling grid with embedded LEDs
LEDs to map the movement around the room through patterning dimming when farther away from a Motion Sensor
and brightening when closer to a Motion Sensor
- Constellation light up when Dance Shoe Sensor reaches a certain number of counts for steps and alternates
different constellations to coordinate with dress LEDs
*/
// Material components needed for project:
// (1) arduino USB board, (1) USB cable, 100ohm resistors, LEDs (used LEDs off of christmas light strand), 22 gauge wire,
// (4) infrared proximity sensor long range – sharp GP2Y0A02YK0F, (2) 16-channel analog/digital mulitplexer/demultiplexer CD74HC4067,
// black spray painted acrylic sheets to form (4) box(es) housing motion sensors, (1) sheet panel for ceiling spray painted black
// Multiplexer truth table for transfer of data from S pins to C pins available at http://focus.ti.com/lit/ds/symlink/cd74hc4067.pdf
/*
To set up Multiplexer 1 pins:
Put SIG pin into digital out pin 1
Put EN pin with 100ohm resitor into GROUND
Put VCC pin into 5V
Put GND pin into GROUND
*/
/*
To set up Multiplexer 2 pins:
Put SIG pin into digital out pin 1
Put EN pin with 100ohm resitor into GROUND
Put VCC pin into 5V
Put GND pin into GROUND
*/
// Multiplexer 1
byte m1SIG = 1;
byte m1S0 = 3; // put S0 pin into digital out pin 2 for multiplexer 1
byte m1S1 = 5; // put S1 pin into digital out pin 3 for multiplexer 1
byte m1S2 = 6; // put S2 pin into digital out pin 4 for multiplexer 1
byte m1S3 = 7; // put S3 pin into digital out pin 5 for multiplexer 1
// Multiplexer 2
byte m2SIG = 1;
byte m2S0 = 8; // put S0 pin into digital out pin 2 for multiplexer 2
byte m2S1 = 9; // put S1 pin into digital out pin 3 for multiplexer 2
byte m2S2 = 10; // put S2 pin into digital out pin 4 for multiplexer 2
byte m2S3 = 11; // put S3 pin into digital out pin 5 for multiplexer 2
// Motion Sensor values for analog output displayed in LEDs
int outputValue0 = 0;
int outputValue1 = 0;
int outputValue2 = 0;
int outputValue3 = 0;
int sensorValue0 = 0;
int sensorValue1 = 0;
int sensorValue2 = 0;
int sensorValue3 = 0;
// Input data from Dance Shoe Sensor
int x = 0;
boolean tempstate;
boolean currstate;
int pulsePin = 12; // Set pin data into digital output pin 12
void setup() {
pinMode(m1S0, OUTPUT); // Sets the digital pin as output for Multiplexer 1
pinMode(m1S1, OUTPUT); // Sets the digital pin as output for Multiplexer 1
pinMode(m1S2, OUTPUT); // Sets the digital pin as output for Multiplexer 1
pinMode(m1S3, OUTPUT); // Sets the digital pin as output for Multiplexer 1
pinMode(m2S0, OUTPUT); // Sets the digital pin as output for Multiplexer 2
pinMode(m2S1, OUTPUT); // Sets the digital pin as output for Multiplexer 2
pinMode(m2S2, OUTPUT); // Sets the digital pin as output for Multiplexer 2
pinMode(m2S3, OUTPUT); // Sets the digital pin as output for Multiplexer 2
Serial.begin(9600);
///////////////////////////////////////////////
// Input data from Dance Shoe Sensor
pinMode(pulsePin, INPUT);
tempstate = digitalRead(pulsePin);
Serial.begin(9600);
}
void loop() {
allOff; // Turns off all LEDs on Multiplexer
sensorValue0 = analogRead(0) + 400; // Reads input from IR Motion Sensor 0
sensorValue1 = analogRead(1) + 400; // Reads input from IR Motion Sensor 1
sensorValue2 = analogRead(2) + 400; // Reads input from IR Motion Sensor 2
sensorValue3 = analogRead(3) + 400; // Reads input from IR Motion Sensor 3
outputValue0 = map(sensorValue0, 0, 1023, 0, 255); // Maps data from analog input to analog output for Motion Sensor 0
outputValue1 = map(sensorValue1, 0, 1023, 0, 255); // Maps data from analog input to analog output for Motion Sensor 1
outputValue2 = map(sensorValue2, 0, 1023, 0, 255); // Maps data from analog input to analog output for Motion Sensor 2
outputValue3 = map(sensorValue3, 0, 1023, 0, 255); // Maps data from analog input to analog output for Motion Sensor 3
///////////////////////////////////////////////
// Maps Motion Sensors to operate the LEDs in analog values on the ceiling panel
if (outputValue0 > 50) {
m1C1();
m1C4();
m1C10();
m1C11();
m1C12();
}
if (outputValue1 > 50) {
m1C8();
m2C6();
m1C13();
m1C14();
m2C1();
m2C2();
}
if (outputValue2 > 50) {
m2C11();
m2C3();
m2C4();
m2C5();
m2C6();
}
if (outputValue3 > 50) {
m1C2();
m2C12();
m2C7();
m2C8();
m2C9();
m2C10();
}
///////////////////////////////////////////////
// Input data from Dance Shoe Sensor to count and operate constellation switches
currstate = digitalRead(pulsePin);
if (currstate != tempstate) {
if ((tempstate-currstate)<0) {
x = x+1;
}
tempstate = currstate;
}
if (x < 15) {
outputValue0 = 255;
m1C1();
}
if (15 < x < 30) {
outputValue0 = 255;
m1C1();
}
if (30 < x < 45) {
outputValue0 = 255;
m1C8();
}
if (45 < x < 60) {
outputValue0 = 255;
m2C12();
}
if (60 < x < 75) {
outputValue0 = 255;
m2C11();
}
if (75 < x < 90) {
outputValue0 = 255;
m1C2();
}
if (90 < x < 105) {
outputValue0 = 255;
m1C4();
}
if (105 < x) {
outputValue0 = 255;
m1C4();
}
///////////////////////////////////////////////
// Print values for Motion Sensors
Serial.print(“S1 – “);
Serial.print(sensorValue0);
Serial.print(“/tS2 – “);
Serial.print(sensorValue1);
Serial.print(“/yS3 – “);
Serial.print(sensorValue2);
Serial.print(“/tS4 – “);
Serial.print(sensorValue3);
// Print calues for x count on Dance Shoe Sensor
Serial.print(“/tx is : “);
Serial.print(x);
Serial.print(“/toutputValue – “);
Serial.println(outputValue0);
}
///////////////////////////////////////////////
// LED operation to turn off all LEDs on Multiplexer
void allOff() {
analogWrite(m1SIG, HIGH);
analogWrite(m1S0, LOW);
analogWrite(m1S1, LOW);
analogWrite(m1S2, LOW);
analogWrite(m1S3, LOW);
analogWrite(m2SIG, HIGH);
analogWrite(m2S0, LOW);
analogWrite(m2S1, LOW);
analogWrite(m2S2, LOW);
analogWrite(m2S3, LOW);
}
///////////////////////////////////////////////
// LED operation for Multiplexer 1
void m1C1() { //Sensor0 – Draco
analogWrite(m1SIG, LOW);
analogWrite(m1S0, outputValue0);
analogWrite(m1S1, LOW);
analogWrite(m1S2, LOW);
analogWrite(m1S3, LOW);
}
void m1C2() { //Sensor3 – Ursa Major
analogWrite(m1SIG, LOW);
analogWrite(m1S0, LOW);
analogWrite(m1S1, outputValue3);
analogWrite(m1S2, LOW);
analogWrite(m1S3, LOW);
}
void m1C4() { //Sensor0 – Ursa Minor
analogWrite(m1SIG, LOW);
analogWrite(m1S0, LOW);
analogWrite(m1S1, LOW);
analogWrite(m1S2, outputValue0);
analogWrite(m1S3, LOW);
}
void m1C8() { //Sensor1 – Camelopardus
analogWrite(m1SIG, LOW);
analogWrite(m1S0, LOW);
analogWrite(m1S1, LOW);
analogWrite(m1S2, LOW);
analogWrite(m1S3, outputValue1);
}
void m1C10() { //Sensor0 – Star
analogWrite(m1SIG, LOW);
analogWrite(m1S0, LOW);
analogWrite(m1S1, outputValue0);
analogWrite(m1S2, LOW);
analogWrite(m1S3, outputValue0);
}
void m1C11() { //Sensor0 – Star
analogWrite(m1SIG, LOW);
analogWrite(m1S0, outputValue0);
analogWrite(m1S1, outputValue0);
analogWrite(m1S2, LOW);
analogWrite(m1S3, outputValue0);
}
void m1C12() { //Sensor0 – Star
analogWrite(m1SIG, LOW);
analogWrite(m1S0, LOW);
analogWrite(m1S1, LOW);
analogWrite(m1S2, outputValue0);
analogWrite(m1S3, outputValue0);
}
void m1C13() { //Sensor1 – Star
analogWrite(m1SIG, LOW);
analogWrite(m1S0, outputValue1);
analogWrite(m1S1, LOW);
analogWrite(m1S2, outputValue1);
analogWrite(m1S3, outputValue1);
}
void m1C14() { //Sensor1 – Star
analogWrite(m1SIG, LOW);
analogWrite(m1S0, LOW);
analogWrite(m1S1, outputValue1);
analogWrite(m1S2, outputValue1);
analogWrite(m1S3, outputValue1);
}
///////////////////////////////////////////////
// LED operation for Multiplexer 2
void m2C1() { //Sensor1 – Star
analogWrite(m2SIG, LOW);
analogWrite(m2S0, outputValue1);
analogWrite(m2S1, LOW);
analogWrite(m2S2, LOW);
analogWrite(m2S3, LOW);
}
void m2C2() { //Sensor1 – Star
analogWrite(m2SIG, LOW);
analogWrite(m2S0, LOW);
analogWrite(m2S1, outputValue1);
analogWrite(m2S2, LOW);
analogWrite(m2S3, LOW);
}
void m2C3() { //Sensor2 – Star
analogWrite(m2SIG, LOW);
analogWrite(m2S0, outputValue2);
analogWrite(m2S1, outputValue2);
analogWrite(m2S2, LOW);
analogWrite(m2S3, LOW);
}
void m2C4() { //Sensor2 – Star
analogWrite(m2SIG, LOW);
analogWrite(m2S0, LOW);
analogWrite(m2S1, LOW);
analogWrite(m2S2, outputValue2);
analogWrite(m2S3, LOW);
}
void m2C5() { //Sensor2 – Star
analogWrite(m2SIG, LOW);
analogWrite(m2S0, outputValue2);
analogWrite(m2S1, LOW);
analogWrite(m2S2, outputValue2);
analogWrite(m2S3, LOW);
}
void m2C6() { //Sensor2 – Star
analogWrite(m2SIG, LOW);
analogWrite(m2S0, LOW);
analogWrite(m2S1, outputValue2);
analogWrite(m2S2, outputValue2);
analogWrite(m2S3, LOW);
}
void m2C7() { //Sensor3 – Star
analogWrite(m2SIG, LOW);
analogWrite(m2S0, outputValue3);
analogWrite(m2S1, outputValue3);
analogWrite(m2S2, outputValue3);
analogWrite(m2S3, LOW);
}
void m2C8() { //Sensor3 – Star
analogWrite(m2SIG, LOW);
analogWrite(m2S0, LOW);
analogWrite(m2S1, LOW);
analogWrite(m2S2, LOW);
analogWrite(m2S3, outputValue3);
}
void m2C9() { //Sensor3 – Star
analogWrite(m2SIG, LOW);
analogWrite(m2S0, outputValue3);
analogWrite(m2S1, LOW);
analogWrite(m2S2, LOW);
analogWrite(m2S3, outputValue3);
}
void m2C10() { //Sensor3 – Star
analogWrite(m2SIG, LOW);
analogWrite(m2S0, LOW);
analogWrite(m2S1, outputValue3);
analogWrite(m2S2, LOW);
analogWrite(m2S3, outputValue3);
}
void m2C11() { //Sensor2 – Hercules
analogWrite(m2SIG, LOW);
analogWrite(m2S0, outputValue2);
analogWrite(m2S1, outputValue2);
analogWrite(m2S2, LOW);
analogWrite(m2S3, outputValue2);
}
void m2C12() { //Sensor3 – Signus
analogWrite(m2SIG, LOW);
analogWrite(m2S0, LOW);
analogWrite(m2S1, LOW);
analogWrite(m2S2, outputValue3);
analogWrite(m2S3, outputValue3);
}













