Blackhole Lamp


Introduction: Blackhole Lamp

About: Instagram:

The idea with this project was to create a lamp that also functioned as a visual representation of a blackhole in a 2D universe.

As predicted by Einstein's theory of general relativity, objects of mass distort the fabric of spacetime. Blackholes are points of such immense density that spacetime is distorted so much that neither light nor matter can escape.

To recreate this effect I have used a piece of black lycra to represent the fabric of spacetime, around the edge the event horizon is displayed by a ring of white LEDs; any closer to the blackhole and light would be unable to escape. The longer you leave the lamp on, the bigger the blackhole grows since it is consuming more matter and energy. To achieve this a braided fishing line runs down the copper pipe to a motor hidden in the base. The intensity of the lamp can be adjusted by changing the potentiometer at the base, in doing so the rate at which the blackhole grows also changes; if there is more light (and matter) the blackhole will grow at a faster rate, and visa-versa. The lamp can be turned off at the base by the switch. Doing this results in the motor turning the other way, allowing the fabric to relax, this in turn represents the evaporation of the blackhole via Hawking radiation.

Of course this is just an artistic representation of a blackhole and the physics conveyed in this sculpture is not to be taken literally. For a further introduction into blackholes and Hawking radiation I would suggest this video by the YouTube channel Kurzgesagt.

Step 1: Materials

  • Black stretchable fabric such as lycra
  • 1/2 inch copper piping and 3 fitting 90 degree elbows
  • Wooden base plate
  • Braided fishing line
  • Black spray paint
  • Arduino Nano
  • 9v wall adapter
  • White LED strip
  • L9110 H-Bridge
  • 28BYJ Stepper Motor
  • 2 way switch
  • Potentiometer
  • Wiring/solder/breadboard
  • Assorted woodwork and electronic tools

Step 2: Construct the Lamp

Cut 1/2 inch copper pipe into two 13 inch pieces and one 14.5 inch piece. Using a 5/8 inch drillbit, drill 3 holes:

  • 2 sides holes at approximately 25 degrees from the vertical in both the x&y plane.
  • 1 central hole should be vertical and set back about an inch from the other two

These are the holes the copper pipe will slide into.

Drill 2 more holes; one for the potentiometer and one for the switch. I don't give exact measurements here as it will vary depending on what switches/ potentiometers you have available. Note: In the pictures above I accidentally drilled an extra hole as I had the wrong positioning for the copper pipe, this hole is not required.

3D print the black frame from the provided stls. Link. Note that the pieces are symmetrical and need to be printed twice. After printing you will need to use epoxy to glue the to semicircles together (my print bed was not large enough to print a single continuous ring).

Cut a square of lycra and place it over the thin circular frame. Make small holes in the lycra for the 10 screws and then sandwich the lycra between the thick and thin ring. Screw the frame together keeping the lycra lightly tensioned. Cut off excess lycra around the borders.

Place a single ball bearing in the centre of the lycra and tie a noose using braided fishing line around the small bead, tighten the noose. Feed a ring of white LEDs around the edge of the black frame. Connect the 3D printed black frame to the 13 inch copper tubes via the copper elbows and feed wire through for the LED strip.

Spray paint the wooden base black. Press the 3 copper pipes into their respective holes and feed the fishing line and wires through the pipes.

Step 3: Electronics

Connect the components as shown above.

For clarity the 28BYJ Stepper motor has 5 wires but the red wire does not need to be connected for this project.

The second and forth wires (orange and pink) go to the Motor B port and the third and fifth wires (yellow and blue) go to the Motor A port on the L9110 H-Bridge. Connect the L9110 H-Bridge to the Arduino Nano as follows:

  • B1A to D11
  • B1B to D10
  • A1A to D9
  • A1B to D8

Additionally, connect the LED ring to GND and D3 (or any other PWM pin) and include a 100ohm or similar resistor in series. Connect a 2 way which to GND, 5V and D2 with a 2.2kOhm resistor in series. Attach a potentiometer to A0 and 5V, GND. Lastly connect a 9V power supply to Vin and GND.

Mount the 3D printed pulley on the stepper motor. Link

Step 4: Code

//L9110 Driver -> 28BYJ Stepper

int A1A = 8;
int A2A = 9;
int B1B = 10;
int B2B = 11;
int PotPin = 0; //analog pin A0
int SwitchPin = 2;
int LEDring = 3; // needs to be a PWM pin
int waitTime; // Delay between each motor step (greater than 0)
int PotVal; //reading from potentiometer
int SwitchVal;
int intensity;

//adjust the following as required
float pulleyRadius = 1.4;   //in cm
float maxStringContraction = 7.0;   //in cm
float stepsPerRevolution = 2048.0;

float Pi = 3.14159;
float circumference = 2.0 * Pi * pulleyRadius;
float MaxRevs = maxStringContraction / circumference; //maximum number of allowed revolutions
float MaxSteps = MaxRevs * stepsPerRevolution; //maximum number of allowed steps in one direction</p><p>int StepLimit = MaxSteps; //converted to an integer
int StepCount = 0;

void setup() {
  pinMode(SwitchPin, INPUT);
  pinMode(LEDring, OUTPUT);
  pinMode(A1A, OUTPUT);
  pinMode(A2A, OUTPUT);
  pinMode(B1B, OUTPUT);
  pinMode(B2B, OUTPUT);

void step1() {
  digitalWrite(A1A, LOW);
  digitalWrite(A2A, HIGH);
  digitalWrite(B1B, HIGH);
  digitalWrite(B2B, LOW);
void step2() {
  digitalWrite(A1A, LOW);
  digitalWrite(A2A, HIGH);
  digitalWrite(B1B, LOW);
  digitalWrite(B2B, HIGH);
void step3() {
  digitalWrite(A1A, HIGH);
  digitalWrite(A2A, LOW);
  digitalWrite(B1B, LOW);
  digitalWrite(B2B, HIGH);
void step4() {
  digitalWrite(A1A, HIGH);
  digitalWrite(A2A, LOW);
  digitalWrite(B1B, HIGH);
  digitalWrite(B2B, LOW);
void Stop() {
  digitalWrite(A1A, LOW);
  digitalWrite(A2A, LOW);
  digitalWrite(B1B, LOW);
  digitalWrite(B2B, LOW);

void BHgrowth() {
  analogWrite(LEDring, intensity);
  if (StepCount < StepLimit) { //stop over streching of fabric
    StepCount += 1;

void HawkingRadiation() {
  analogWrite(LEDring, 0);
  if (StepCount > 0) {
    StepCount -= 1;

void loop() {
  PotVal = analogRead(PotVal);
  intensity = map(PotVal, 0, 1024, 0, 254);
  SwitchVal = digitalRead(SwitchPin);
  if (SwitchVal == 1) {
    waitTime = 255 - intensity; //brighter the light, shorter the wait time, and visa-versa
    if (waitTime < 1){
      waitTime = 1;
  else {
    waitTime = 255;



    • Water Contest

      Water Contest
    • Creative Misuse Contest

      Creative Misuse Contest
    • Oil Contest

      Oil Contest

    4 Discussions

    Nice idea!


    Question 2 months ago

    I don't get what to_see or not_see with this lamp ?