Artist’s Installation: Escalators

Over the past ten years or so, I’ve been fortunate enough to have worked with several artists to create systems for them to display their artwork. You can see some of these here. Most of these pieces have been built out of wood, copper and more recently, welded steel. So when Lise, my poet partner, was invited to participate in an installation at the Blink Gallery, entitled “Something Leads to Something Else“, curated by a wonderful Ottawa artist, Deborah Margo, my creative juices started to flow!  Deborah and I have worked on many projects together and I was looking forward to seeing what the three of us would come up with.

The installation became a stand-alone drafting table-cum-podium on which Lise’s poetry books and notes would rest. The pair of escalators would stand behind this and in front of a large monitor with the audio and video component to her poetry.  Here is a picture of the final result so that the rest of the discussion has some context.

Lise's Art Installation

Lise’s Art Installation

I needed to construct a pair of model escalators that would carry a couple of small figures up and down in front of a projected display. I could smell an Arduino-based project immediately and set about creating cardboard models to get the dimensions right. I then cut some clear 3/16″ plexiglass into the shape of the escalators and installed a geared-down stepper motor with a toothed timing pulley at the bottom. This pulley engaged with a loop of lightly-tensioned timing belt that also passed over an upper idler wheel. At the join of the timing belt, I glued a small angled piece of LEGO, onto which we could attach a LEGO character.

While driving the stepper motor forward and backwards to raise and lower the character was simple enough, I could not allow them to travel over the top or bottom of the loop. I made a simple optical sensor (a white LED and photo-resistor) whose light beam would be broken when interrupted by the character mount. The images show the completed escalator with the stepper, the drive belt assembly and the optical sensor.

Escalator-p1Escalator-p2Escalator-p3

 

 

 

 

The electronics consisted of an Arduino UNO, a pair of 2-phase stepper-motor drivers and the two home-made optical sensors. I wrote a simple start-up routine that illuminated the LEDs and monitored the photo-resistors while driving the steppers to move each of the characters to the bottom of the escalator. Once the light beam was broken, the stepper was stopped as each of the characters were then in their start position. The software then executed a continuous loop driving the steppers very slowly to move the characters up the escalator to the top (some number of steps forward) and then the same number of steps backwards to return the characters to the bottom of the escalator. The speed of the steppers was adjusted so that the ’round-trip’ cycle of moving the characters up and then back down the escalator took about 5 minutes.

Simple, cheap and, dare I say it, elegant!

[codesyntax lang=”php” title=”Artist’s Installation: Escalators – Arduino Source Code” blockstate=”collapsed”]

/*****************************************************************************************
                                       LISE ART PROJECT: Escalators
                                       Adrian Jones, September 2014   
*****************************************************************************************/


#include <Stepper.h>
#define STEPS 200                         // number of steps of stepper motor
Stepper stepperA(STEPS, 2, 4, 3, 5);      // create an instance of the stepper class
Stepper stepperB(STEPS, 6, 8, 7, 9);      // create an instance of the stepper class

const byte steppins[] = {2,3,4,5,6,7,8,9}; // all stepper pins 
const byte sApin = A0;                    // stepper A sensor
const byte lApin = A1;                    // stepper A sensor LED
const byte sBpin = A2;                    // stepper B sensor
const byte lBpin = A3;                    // stepper B sensor LED
const byte sTrig = 500;                   // trigger pint

const byte rSpeed = 120;                  // speed to conduct reset 
const byte nSpeed = 45;                   // nnormal operation speed (RPMs) for ~2 min cycle
const byte topDelay = 2000;               // delay character stays at the top of escalator (ms)
const byte bottomDelay = 4000;            // delay character stays at the top of escalator (ms)
const long totalSteps = 20000;            // total number of steps from top to bottom
const int  up = -1;                       // direction up
const int  down = 1;                      // direction down
int cycle = 0;
char bs=8;

//*****************************************************************************************//
//                                      Initial Setup
//*****************************************************************************************//

void setup() { 
  Serial.begin(57600);                   // start debug process
  Serial.println("Lise Art Project - Escalators: Sep. 2014");
  doSensorPinsSetup();                   // set up sensor pins
  doStartUp();                           // put characters into start position  
  stepperA.setSpeed(nSpeed);             // set the speed of the motor to normal running mode 
  stepperB.setSpeed(nSpeed);             // set the speed of the motor to normal running mode
  Serial.println("*** Ready ***"); 
}


//*****************************************************************************************//
//                                      MAIN LOOP
//*****************************************************************************************//

void loop() {
  cycle++;
  Serial.print("Cycle ");Serial.println(cycle);
  step(totalSteps, up);                  // ascend escalator
  clearStepper();                        // wait up at the top
  delay(topDelay);
  step(totalSteps, down);                // descend escalator
  clearStepper();                        // wait up at the top
  delay(bottomDelay);                    // wait and go round again
}

//*****************************************************************************************//
//                                      SUBROUTINES
//*****************************************************************************************//

// step: moves stepper 'steps' in 'dir' direction 
void step(int steps, int dir) {
  for(int x = 0; x < steps; x++) {
    stepperA.step(dir);
    stepperB.step(-dir);
  } 
}

// halt: shuts down stepper drivere and stops all operation
void halt() { clearStepper(); while(1); }

// clearStepper: turn off all stepper coil 
void clearStepper() { for(byte x=0; x<sizeof(steppins); x++) { digitalWrite(steppins[x],LOW); } }

// doStartUp: function to drive the stepper forward until light sensor is interrupted
void doStartUp() {
   stepperA.setSpeed(rSpeed);          // set the speed of the motor for start-up
   stepperB.setSpeed(rSpeed);          // set the speed of the motor for start-up

// reset stepper A
   digitalWrite(lApin,HIGH);
   delay(500);
   while(analogRead(sApin) < sTrig ) {
     stepperA.step(10);
   }
   clearStepper();
   digitalWrite(lApin, LOW);
   Serial.println("Stepper A reset. In start position");
  
 // do the same for stepper B 
   digitalWrite(lBpin,HIGH);
   delay(500);  
   while(analogRead(sBpin) < sTrig ) {
    stepperB.step(10);
   }
   digitalWrite(lBpin, LOW);
   Serial.print("Stepper B reset. ");
   stepperB.step(-totalSteps);
   delay(bottomDelay);
   Serial.println("In start position");
}

// doPinSetup: set and set set status of sensor pins
void doSensorPinsSetup() {
  pinMode(sApin, INPUT);               // stepper A sensor
  pinMode(lApin, OUTPUT);              // stepper A sensor LED
  digitalWrite(lApin,LOW);             // ensure turned off
  pinMode(sBpin, INPUT);               // stepper B sensor
  pinMode(lBpin, OUTPUT);              // stepper B sensor LED
  digitalWrite(lBpin,LOW);             // ensure turned off
}

[/codesyntax]

Come on... leave a comment...