Interactive Led Lamp | Tensegrity Structure + Arduino




About: Just create. Is everything I want.

This piece is a movement-responsive lamp. Designed as a minimal tensegrity sculpture, the lamp changes its configuration of colors in response to the orientation and movements of the whole structure.
In other words, depending on its orientation, the lamp turns to a certain color, brightness and light mode.

When the icosahedron rotates (over his own axis), it selects a value from a virtual spherical color picker. This color picker is not visible, but color adjustments happen in real time. Thus, you can figure out where each color is positioned in space, while you play with the piece.

The icosahedral shape provides 20 face planes and the tensegrity structure gives it 6 additional standpoints. This provides a total of 26 possible colors when the lamp rests on a flat surface. This number increases when you turn the lamp in the air.

The system is controlled by a Pro Trinket connected to a three axis accelerometer. The light is provided by RGBW LED strips, that can control the color and white brightness value individually. The entire circuit, including microprocessor, sensors and lighting system works at 5v. To power up the system, a source up to 10A is needed.

A list of the main elements used in the lamp are the following:

- Adafruit Pro Trinket - 5V

- Adafruit LIS3DH Triple-Axis Accelerometer

- Adafruit NeoPixel Digital RGBW LED Strip - White PCB 60 LED/m

- 5V 10A switching power supply

This movement-responsive lamp is the first version or prototype of a longer personal project.
This prototype was made out of recycled materials. Throughout the design and construction processes, I learned from successes and mistakes. With these in mind, now I'm working on the next version which will have a more intelligent structure and robust software.

I want to thank the LACUNA LAB community for their help, ideas and suggestions throughout the development of the project.

you can follow my work at:
action-io / tumblr
action-script / github

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: The Idea

This project was the result of several ideas I had played with in my head for some time.

Since I started, the concept has changed, the initial project evolved and took actual shape.

The initial approach was an interest in geometric shapes as means of interaction. Because of its design, the multiple polygonal faces of this lamp serve as input method.

The first idea was to use a dynamic system to force the icosahedron to move. This could have been controlled by an interactive application, or social media users.

Another possibility would have been to have an internal marble or ball press different buttons or sensors and thus generate random inputs as the piece moved.

The tensegrity structure happened later on.

This construction method fascinated me: the way in which the parts of the structure keep each other balanced. It is very visually pleasing. The entire structure is self balanced; the pieces do not touch one another directly. It is the sum of all tensions which creates the piece; it´s fantastic!

As the initial design has changed; the project moves forward.

Step 2: The Structure

As I mentioned before, this first model was made out of recycled materials that were meant be discarded.

The wooden boards I took from a slatted bed I found on the street. The golden trims were part of the arm of an old lamp and the stoppers for the rubber bands are office clips.

Anyway, the construction of the structure is quite simple and the steps are the same as in any tensegriry.

What I did with the boards is to bring them together, in groups of two. Making a "sandwich" with the gold spacers, leaving a gap where the lights would shine through.

The dimensions of the project are completely variable and will depend on the size of the structure you want to make. The wood bars from the pictures of this project are 38cm long and 38mm wide. The separation between the boards is 13mm.

The wooden boards were cut identically, sanded (to remove the old paint layer) and afterwards perforated on both ends.

Next, I stained the boards with rustic dark varnish. To join the pieces I used 5mm threaded rod, cut into sections of 5cm and 5mm with a knot on each side.

The tensioners are red rubber bands. To attach the rubber to the bars, I made a small hole through which I passed the band and then trapped it with a stopper. This prevents the boards from moving freely and the structure to dismantle moved.

Step 3: Electronics and Lights

The configuration of the electronic components has been designed to maintain the same voltage, both logic and feeding throughout the system using 5v.

The system is controlled by a Pro Trinket connected to a three axis accelerometer. The light is provided by RGBW LED strips, that can control the colors and white brightness values individually. The entire circuit, including microprocessor, sensors and lighting system works at 5v. To power up the system, a source up to 10A is needed.

The Pro Trinket 5V uses the Atmega328P chip, which is the same core chip in the Arduino UNO. It also has almost the same pins. So it is really useful when you want to bring your UNO project to miniaturized spaces.

LIS3DH is a versatile sensor, it can be reconfigured to read into +-2g/4g/8g/16g and also brings Tap, Double-tap, orientation & free fall detection.

The NeoPixel RGBW LED Strip can manage the hue color and the white intensity separately. With a dedicated white LED, you don't need ´to saturate all the colors to have a white light, it also makes you white more pure and bright and on top of that it saves energy.

For wiring and to connect the components together I decided to pass cable and create sockets with male and female pins using crimps and connector housings.

I connected the trinket to the accelerometer throw the SPI with the default configuration. This means connect Vin to the power supply of 5V. Connect GND to common power/data ground. Connect the SCL (SCK) pin to Digital #13. Connect the SDO pin to Digital #12. Connect the SDA (SDI) pin to Digital #11. Connect the CS pin Digital #10.

The led strip is controlled by only one pin, that is going to #6 and the ground and 5v goes directly to the power supply adapter.

All documentation you might need you will find, more detailed and better explained on the adafruit page.

The power supply is connected to a female DC adapter that simultaneously feeds the microcontroller and the LED strip. Also it has a capacitor to protect the circuit from unstable current at the "switch on" moment.

The lamp has 6 light bars, but the LED strips come in a single long band. The LED band was cut in sections of 30cm (18 LEDS) and then welded with male and female 3 pins to connect to the rest of the circuit modularly.

For this project I'm using a 5v - 10A power supply. But depending of the number of leds you need you will need to calculate the current needed to feed the system.

Throughout the documentation of the piece, you can see that the LED has 80mA drawn per LED. I am using 108 LEDs in total.

Step 4: The Code

The scheme works is quite simple. An accelerometer provides information of movement on the x, y, z axis. Based on the orientation, the RGB values of the LEDs are updated.

The work is broken down into the following phases.

  • Do a reading from sensor.
    Simply use the api.
  • By trigonometry, solve the values of "roll and pitch".
    You can find much more information in this document by Mark Pedley.
  • Obtain the corresponding color, related to the rotation values.
    For that we turn to 0-360 RGB value using a HSL - RGB conversion function.
    The value of the pitch is used at various scales to regulate the intensity of white light and color saturation. The opposite hemispheres of the color picker sphere are completely white.
  • Update the buffer of lights that stores information of individual LED colors.
    Depending on this information, the buffer controller will create an animation or will respond with complementary colors.
  • Finally show the colors and refresh the LEDs.

Initially, the idea was to create a color sphere where you could choose any color. Placing the color wheel on the meridian and poleward the dark and light tones.

But quickly the idea was discarded.
Because the LEDs create different tones, off and quickly lit each rgb LED, when given low values to represent dark colors, the LEDs give a very poor performance and you can see how they start flashing. This makes the dark hemisphere of the color sphere can not function properly.

Then I come up with the idea to assign complementary colors to the currently selected tone.

So, one hemisphere is picking a monochromatic color value of a wheel from 50% illumination 90 ~ 100% saturation. Meanwhile the other side, picks a color gradient from the same color-position but adds, at the other side of the gradient, its complementary color.

The read of data from the sensor is raw. A filter can be applied to smooth the noise and the vibrations of the lamp itself. For the moment, I find it interesting because it looks more analogical, reacts to any touch and takes a second to completely stabilize.

I'm still working on the code and adding new features and optimizing the animations.

You can check the latest versions of the code on my github account.

Step 5: Wrapping Up

The final assembly is fairly simple.
Glue the silicone cover of the LED strips with two Component Epoxy Adhesive into the bars and connect the 6 parts in series one behind the other.

Fix a point where you want to anchor the components and screw the accelerometer and the pro trinket to the wood. I used a plastic spacers to protect the bottom of the pins. The power supply adapter is properly fixed between the space of the bars with more epoxy epoxy adhesive. Was designed to fit and prevents it moves when the lamp is rotating.

Observations and improvements

Throughout the development of the project have been emerged new ideas about ways to solve problems. I also realized some design flaws or parts that can be improved.

The next step that I would like to take, is an improvement in product quality and the finish; mostly in the structure. I come with great ideas about better structreas even simpler, incorporating tensors as part of the design and hiding the components. This structure will require more powerful tools like 3D printers and laser cutters.

I still have pending the way to hide the wiring along the structure. And work into a more efficient energy consumption; to reduce spending when the lamp is working for long and is not changing the lighting.

Thanks for reading the article and your interest in my work.
I hope you learned from this project as much as I did.

Reclaimed Wood Contest 2016

Participated in the
Reclaimed Wood Contest 2016

Automation Contest 2016

Participated in the
Automation Contest 2016

Rainbow Contest 2016

Participated in the
Rainbow Contest 2016

Be the First to Share


    • Made with Math Contest

      Made with Math Contest
    • Multi-Discipline Contest

      Multi-Discipline Contest
    • Robotics Contest

      Robotics Contest

    11 Discussions


    Question 1 year ago on Introduction

    But if you can still provide me with the length or size of the rubber band I would be thankful cause i have everything done but im stuck cause of the rubber band


    Question 1 year ago on Introduction

    Im making a similar project but i have a problem with the rubber bands, can you tell me from where exactly you purchased the rubber bands and the size of it? And how many rubber bands did you use or is it one long rubber band for the whole project? Im making a similar one so im gonna probably need the same exact rubber band! Thank you

    1 answer

    Answer 1 year ago

    Dear Hamza,

    The lamp structure is based on a icosahedron following the tensegrity technique.

    Is made by 6 solid sticks and 6 individual rubber rings.

    I made this project with recycled materials, the rubber bands comes from a local market; the sellers use them to wrap the packing boxes. So I dont know which exactly material or brand it is.

    The size of the rubber depends on the elasticity and maximun extrength of the band.

    Good luck.


    2 years ago

    I try to make it. But the code has error said : "ACAngel.h: No such file or directory"

    I installed the adafruit sensors library. Is there any other library I should also install, or it is because I have not tested it with an Adaptor power supply?

    1 reply

    Reply 2 years ago

    Hi there Vivian.

    The ACAngle.h file is included in multiple libraries. I can recommend you to include the "Adafruit Unified Sensor" library in your project. And, if you are using the same hardware, then also add the "Adafruit LIS3DH".

    For the LEDs I'm using the NeoPixel RBGW so I included he "Adafruit NeoPixel".

    These libraries are dedicated for the hardware I used at the lamp. Depends on what hardware you are using, you may need different libraries and perhaps change a bit the code.

    Good luck.


    2 years ago

    Hello really great job here! I am a newbie totally. Could you also upload the ACAngle and Ledcontroller class coding online? Thank you very much!


    3 years ago

    Great work and thanks for sharing.

    You should make a video, it will be much fun :-)

    1 reply

    3 years ago

    Me ha encantado!! Eres un crack!