Interactive Neopixel Installation
This was an interactive art project by Mathias Schønning Voss. The aim was to create a decorative installation for the Annual Party at Roskilde University, which would serve as a photo opportunity for party attendees. Guests would then share pictures on social media, creating exposure for the yearly party.
Idea
The original concept looked like this:
The installation consisted of 7 rings cut from plywood, measuring 2,5x 2,5m, put together lengthwise using wooden support rods and strips.A length of 5m of neopixels would then be stripped to the inside of the rings so the light would stream down towards the ground.Each foot of the rings would be supported by a 0,5x0,5x0,5 wooden box, which would, on one side, contain a battery power source, an arduino board and an infrared sensor. The neopixels would be coded so when the infrared sensor was triggered (by a person walking through), the neopixels would change colour.
Ring Construction
The number of rings was later changed to 6, since the relative change in color from one ring to the next would be greater and yield a visually stronger effect. The boxes around the feet were scrapped due to safety concerns for the attendees and because batteries proved to be a less than sufficient source of power.
The model with correct dimensions was drawn up in CorelDraw:
Due to the max dimensions of the FabLab CNC machine, each ring was divided into 4 parts.
These were cut on the cnc and assembled using custom laser cut brackets, one on each side, and put together with bolts and wingnuts for easy construction/deconstruction without the need of tools. This also meant the the rings could flex slightlty in 4 different places so as to adjust for an uneven ground surface.
The feet were then made by clamping and screwing leftover wood on each end piece
Smaller, acrylic boxes containing electronics and an arduino were cut to fit on the feet.
Electronics and Code
The power was supplied by a laptop power supply (output 19V 4.74A 90W). Power was serial connected to each ring, before passing through a step down converter, converting the 19V from the power supply to a neopixel friendly 5V.
The code was made using Sharps #SharpIR Library to get data form IR readers and #FastLED to control neopixels.
Firstly, i needed to define parameters for the IR sensor, Arduino and Pixels:
int sensorPin = A1; // Input for IR reader
int sensorValue = 0;
int threshhold = 100; // Defines a threshold for the IR reader
int hue = 0; // This value is used in place of RGB values
void hsv2rgb_spectrum( const struct CHSV& hsv, struct CRGB& rgb);
void hsv2rgb_spectrum( const struct CHSV* phsv, struct CRGB * prgb, int numLeds);
#define HUE_MAX_SPECTRUM 255 // Defines a color spectrum
#define DATA_PIN 7
#define LED_TYPE WS2811
#define COLOR_ORDER GRB
#define NUM_LEDS 300 // LEDs per ring
CRGBArray<NUM_LEDS> leds;
#define BRIGHTNESS 96
#define FRAMES_PER_SECOND 120
Secondly, i needed to define the brightness, datarate and add a delay for program recovery
void setup() {
delay(3000); // 3 second delay
FastLED.addLeds<LED_TYPE, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip); // tells FastLED about the LED strip configuration
FastLED.setBrightness(100);// sets master brightness control
Serial.begin(9600); //Sets the data rate in bits per second
}
Next, a pre-loop is set up to:
- Read the sensorvalue once
- Wait 20 milliseconds
- Read sensorvalue again
This is to ensure that no accidental glitches/misreadings trigger the light serial
void loop()
{ // This preloop is to rule out accidental readings
sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
if (sensorValue >= threshhold ) // First Reading
{
delay(20); // Delay set to one capture the movement of one person at a time
sensorValue = analogRead(sensorPin); //Second reading to ensure that someone is actually there
if (sensorValue >= threshhold )
{
Lastly, if sensor value reading is above the threshold, the following light serial is triggerede
Serial.println("Person Detected");
hue = (hue + 42);
for (int i = 0; i < NUM_LEDS / 2; i++) {
// Sets a new GRB value using the hue int
leds[i] = CHSV(hue, 255, 255);
// Fills up Neopixels in two halves starting from each end
leds(NUM_LEDS / 2, NUM_LEDS - 1) = leds(NUM_LEDS / 2 - 1 , 0);
FastLED.delay(20); // Speed of fill
}
}
}
}
Reception
The rings were a success in that they attracted alot of media attention. This is the results when you searched for "RUC" as location on instagram the following day
As you can see, the rings were featured fairly prevalently in the overall activity around RUC around the time of the party
The rings also received the most attention of all mayor installations in a survey of 77 party attendees and comments were generally positive
Notes
The wooden frame construction proved too fragile for a rowdy, intoxicated festival audience. At around 1:00, the rings had to be taken down due to people hanging from and running into the rings. A stronger material/design should be considered.