Skip to content

Final Project - 3D papercut lightbox

This project was done in cooperation with my dear friend Aysha. You could find the details of the project Here.

Concept

“Visions Illuminated” is an innovative, interactive light box that brings the world of Coraline to life in an immersive experience. The lightbox acts as a lamp that casts shadows through a meticulously crafted illustration, that are layered to complete a scene showcasing pivotal moments from the film.

The wooden exterior of the box belies the intricate layers within. From Coraline’s initial encounters with the Other Mother to her daring escapes and ultimate triumphs, every scene is rendered in paper to create a rich and immersive atmosphere.

What sets “Visions Illuminated” apart from a regular lightbox is its responsiveness to user input. With a simple motion gesture, the lights can be activated or deactivated. Each side of the box demonstrate different scenes, each one a window into a different moment from the movie that can be rotated through, allowing the viewer to become an integral part of the narrative. It’s as if you are stepping into the world of Coraline itself, influencing the action as it unfolds before your eyes.

How it works

The magic of “Visions Illuminated” lies in its interactive features, which bring the illustrations to life. Here’s a brief overview of how it works:

  1. LED Lighting: The light box is equipped with a series of LED lights that illuminate the illustrations from within. These lights are carefully calibrated to provide an and inviting glow. The colors are curated to represent the aura of the movie.

  2. Motion Sensors: The light box features a motion sensor that detect the swiping of your hand through the front control panel. when doing aspecific gesture , the sensor triggers a response to turn the light on and rotate the box

  3. Arduino Microcontroller: The heart of the light box is an Arduino microcontroller, which is programmed to respond to motion gestures. It processes the sensor data and controls the LED lights and the rotary.

  4. Rotary Mechanism: The box is mounted on a rotary mechanism that allows them to be rotated through different scenes to showcase the diffetent layers of illustrations. This is achieved through a combination of motors and gears, which are controlled by the Arduino microcontroller.

Research

the scenes picked are from the three wonders that coraline experienced and the portal that leads to the other world with coraline unknowinlgy crawling to the spider’s den.

some sketches weremade for the physical model

2D and 3D Modeling

Physical model

the model was designed in fusion to be later used on the laser cutting machine with 3mm MDF

Click here to download the model

sketches

the sketches of the scenes were done on AutoCAD

scene 1

Click here to download the model

scene 2

Click here to download the model

scene 3

Click here to download the model

scene 4

Click here to download the model

Code Example

The combined code we used for the lighting, rotation, and motion sensor:

//====================================================================
//  LIBRARIES
//====================================================================
//  GUESTURE SENSOR LIBRARY
//--------------------------------------------------------------------

  #include    <Adafruit_APDS9960.h>
  Adafruit_APDS9960 apds;

//--------------------------------------------------------------------
//  NEO PIXEL
//--------------------------------------------------------------------

  #include    <Adafruit_NeoPixel.h>
  #define     PIN           13
  #define     NUM_PIXELS    48
  Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_PIXELS, PIN, NEO_GRB + NEO_KHZ800);

//--------------------------------------------------------------------
//  STEPPER MOTOR THINGS
//--------------------------------------------------------------------

  #include    <Stepper.h>
  bool        stepper_ena         = false;
  const int   stepsPerRevolution  = 4056;
  Stepper     myStepper           = Stepper(stepsPerRevolution, 6, 10, 12, 9);

//====================================================================
//  SETUP
//====================================================================

  void setup() {
    Serial.begin(115200);     // Serial Communication BAUD Rate
    neopixel_start();         // Start Neo Pixel
    gesture_sensor_start();   // Start Guesture
    stepper_start();          // Starting Stepper Motor Function
  }

//====================================================================
//  MAIN PROGRAM
//====================================================================

  void loop() {

    // Read A Gesture From The Device
    uint8_t gesture = apds.readGesture();

    // Gesture Detect Direction Of Movment
    if(gesture == APDS9960_DOWN) {
      gesture_read_down();
    } else if(gesture == APDS9960_UP) {
      gesture_read_up();
    } else if(gesture == APDS9960_LEFT) {
      gesture_read_left();
    } else if(gesture == APDS9960_RIGHT) { 
      gesture_read_right();
    }

    // Move Motor If Its enabled
    stepper_move();

  }

//====================================================================
//  END
//====================================================================

functions

//====================================================================
//  GESTURE FUNCTIONS
//====================================================================
//  Statup The Sensor
//--------------------------------------------------------------------

  void gesture_sensor_start() {

    if(!apds.begin()) {
      Serial.println("failed to initialize device! Please check your wiring.");
    } 

    else {
      Serial.println("Device initialized!");
    }

    //gesture mode will be entered once proximity mode senses something close
    apds.enableProximity(true);
    apds.enableGesture(true);

  }

//--------------------------------------------------------------------
//  Function Of UP Direction
//--------------------------------------------------------------------

  void gesture_read_up() {
    Serial.println("up");
    neopixel_set_color(255, 0, 0, 255);
  }

//--------------------------------------------------------------------
//  Function Of DOWN Direction
//--------------------------------------------------------------------

  void gesture_read_down() {
    Serial.println("down");
    neopixel_set_color(0, 255, 0, 255);
  }

//--------------------------------------------------------------------
//  Function Of LEFT Direction
//--------------------------------------------------------------------

  void gesture_read_left() {
    Serial.println("left");
    stepper_ena = false;
    neopixel_set_color(0, 0, 255, 255);
  }

//--------------------------------------------------------------------
//  Function Of RIGHT Direction
//--------------------------------------------------------------------

  void gesture_read_right() {
    Serial.println("right");
    stepper_ena = true;
    neopixel_set_color(255, 0, 255, 255);
  }

//====================================================================
//  NEOPIXEL FUNCTIONS
//====================================================================

  void neopixel_start() {
    strip.begin();
    strip.clear();
    strip.show();
  }

//--------------------------------------------------------------------
//  Function Of RIGHT Direction
//--------------------------------------------------------------------

  void neopixel_set_color(uint8_t r, uint8_t g, uint8_t b, uint8_t intensity) {

    strip.setBrightness(intensity);

    for (int i=0; i<NUM_PIXELS; i++) {
      strip.setPixelColor(i, r, g, b);
    }

    strip.show();

  }

//====================================================================
//  STEPPER MOTOR FUNCTIONS
//====================================================================

  void stepper_start() {
    myStepper.setSpeed(5);
  }

//--------------------------------------------------------------------
//  Function Of RIGHT Direction
//--------------------------------------------------------------------

  void stepper_move() {
    if(stepper_ena == true) {
      myStepper.step(stepsPerRevolution);
    }
  }

//====================================================================
//  END
//====================================================================

Last update: July 15, 2024