camera winch [timelaps / hyperlaps]

Hi fellow enthusiasts,

I like to make things, who doesn't.
also i like to make youtube video's of it. Therefore recently i bought a brinno and a Sj4000.

Now i want to make some kind of winch that pulls a carriage with the camera on it while shooting a timelapse, actually when doing so it's called a hyperlapse.

I want to set the speed ratio with a poti and using a switch for choosing up and down winching. the speed (meters/hour) and traveled distance will (mm) be displayed on a small display.

Building material:

  • arduino uno
  • lcd
  • poti
  • uln2003 + 5V stepper
  • 9V block
  • MDF

Tools

  • arduino sketch
  • sketchup
  • fritzing
  • simple woodworking tools

The project will be fully open source code, skeme & mechanical therefore i started this tread.
For now i'm still designing and researching it, if i have questions hopefully someone can help.
Any other idea or suggestion are welcome of course.

Greeting Sjuul

Will the sort of small stepper that works with a ULN2003 be powerful enough?

...R

The motor has a built in gearbox, 1/65 this must be enough to pull along a small camera.

I am curious how much travel you want your setup to have. If you would like to stick to wood, I think that will work well for the frame, but the sliding portion may be more difficult. Maybe some angle aluminum or c-channel as a slide. Or use a drawer slide. Really depends on your range of motion.

You mention using a winch, but another option might be using a standard thread (1/4-20, 6mm, ...) and push a nut up and down its length by coupling the stepper to the rod. This makes a very rigid and high torque setup.

I'm planning on making timelapse video's.
The camera will be mounted on a small rollerblade-wheel carriage or hung from a cable.

cablespeed: 0,5meter/hour till 5meter/hour

Previous discussions that might be of interest.

https://www.google.com/search?as_q=camera+slider&as_epq=&as_oq=&as_eq=&as_nlo=&as_nhi=&lr=&cr=&as_qdr=all&as_sitesearch=http%3A%2F%2Fforum.arduino.cc%2Findex&as_occt=any&safe=images&tbs=&as_filetype=&as_rights=&gws_rd=ssl

Thanx zoomkat.

In the meantime i made a practical design, i posted it on YT:

Did some work, now working an the code almost finished…
Why can I post Youtube vid’s here, or don’t I know how?

///////////////////////////// LIBRARIES ///////////////////////////////////////
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins

/*Connect LCD to Arduino:
  LCD    -> Arduino
  --------------------------
  1|VSS| -> Arduino GND
  2|VDD| -> Arduino +5v
  3|VO | -> Arduino GND pin + Resistor or Potentiometer
  4|RS | -> Arduino pin 12
  5|RW | -> Arduino GND - pin can be conected to 11. But Ground was used here.
  6|E  | -> Arduino pin 11
  7|D0 | -> Arduino - Not Connected
  8|D1 | -> Arduino - Not Connected
  9|D2 | -> Arduino - Not Connected
 10|D3 | -> Arduino - Not Connected
 11|D4 | -> Arduino pin 5 
 12|D5 | -> Arduino pin 4
 13|D6 | -> Arduino pin 3
 14|D7 | -> Arduino pin 2
 15|A  | -> Arduino Pin 13 + Resistor (Backlight power)
 16|K  | -> Arduino GND (Backlight ground)
*/
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


///////////////////////////// DECLARE VARIABLES ///////////////////////////////////////
//declare variables for the motor pins
int motorPin1 = 7;	// Blue   - 28BYJ48 pin 1                  
int motorPin2 = 8;	// Pink   - 28BYJ48 pin 2                 
int motorPin3 = 9;	// Yellow - 28BYJ48 pin 3                 
int motorPin4 = 10;     // Orange - 28BYJ48 pin 4
                        
//declare variables for the rest                      
int motorSpeed = 0;     //variable to set stepper speed
int potPin = 2; 	//variable to set stepper speed   
int potValue = 0; 	//variable to read A0 input
int speedled = 6;       //speed indicater led 
int backled = 13;       //LED backlight 
int cabelspeed = 0;     //speed of the cabel
unsigned long lastPotChange = 0;
int lastPotValue =- 1;


///////////////////////////// VOID SETUP ///////////////////////////////////////
void setup() {
  lcd.begin(16, 2);
  lcd.setCursor(1,0);                  
  lcd.print("Sjuul's Winch!");       
  lcd.setCursor(13,1);                
  lcd.print("mmh");                   
  
  //declare pins as outputs
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
  pinMode(speedled, OUTPUT); 
  pinMode(backled, OUTPUT);
  Serial.begin(9600);
}

///////////////////////////// VOID LOOP ///////////////////////////////////////


void loop(){

/////////////////  motor  //////////////////  
  Serial.println(potValue);                      
  //Serial.println(motorSpeed);           
  //Serial.println(cabelspeed);     
  
  if (potValue < 512)                    
  {                   
    motorSpeed = (potValue/3 + 3);    
    clockwise();                                       
    lcd.setCursor(0, 1);                        
    lcd.print("-");                                    
    digitalWrite(speedled, HIGH);             
  }
   
  else                                                   
  {                                   
    motorSpeed = ((1024-potValue)/3 + 3);      
    counterclockwise();                                    
    lcd.setCursor(0, 1);                                   
    lcd.print("+");                                         
    digitalWrite(speedled, HIGH);                     
  }
  
/////////////////  LCD backlite  ////////////////// 
 potValue = analogRead(potPin);
  if (potValue !=lastPotValue)
    {lastPotChange=millis();
     lastPotValue=potValue;
    }  

  if ( (millis() - lastPotChange ) < 30000)                   
  {
    digitalWrite(backled, HIGH);           
  }
  
  else                                     
  {
   digitalWrite(backled, LOW);           
  }
  
///////////////////Print pot value//////////////////////////

  lcd.setCursor(1, 1);                     
  lcd.print("     ");                        
  lcd.setCursor(1, 1);             
  lcd.print(potValue);                      
}

///////////////////////////// VOID COUNTERCLOCKWISE ///////////////////////////////////////
//set pins to ULN2003 high in sequence from 1 to 4
//delay "motorSpeed" between each pin setting (to determine speed) 

void counterclockwise (){   
  // 1
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(motorSpeed);
  // 2
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay (motorSpeed);
  // 3
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delay(motorSpeed);
  // 4
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(motorSpeed);
  digitalWrite(speedled, LOW);                   
  // 5
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delay(motorSpeed);
  // 6
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, HIGH);
  delay (motorSpeed);
  // 7
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(motorSpeed);
  // 8
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delay(motorSpeed);
}

///////////////////////////// VOID CCLOCKWISE ///////////////////////////////////////
//set pins to ULN2003 high in sequence from 4 to 1
//delay "motorSpeed" between each pin setting (to determine speed)

void clockwise(){
  // 1
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delay(motorSpeed);
  // 2
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  digitalWrite(speedled, LOW);                
  delay (motorSpeed);
  // 3
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delay(motorSpeed);
  // 4
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delay(motorSpeed);
    digitalWrite(speedled, LOW);                   
  // 5
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delay(motorSpeed);
  // 6
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, HIGH);
  delay (motorSpeed);
  // 7
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delay(motorSpeed);
  // 8
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delay(motorSpeed);  
}

sounds like a great idea, great project.

the winch allows you a huge amount of freedom of movement.

it would seem like you could mount the unit on the trolley and power the trolley, of course, dragging power cords, but that would be easy to deal with.

http://forum.timescapes.org/phpBB3/viewtopic.php?f=31&t=11574

it you want, look at the A4988 might offer some energy saving over a transistor driver, and with a simple 1/4 step setting it would smooth out the stepper motor. any time you drive a stepper in whole steps, it gets jumpy. and at lower speeds, that gets worse.

with a transistor driver, the best you can get is half steps, but that it really both coils fully powered, a real half step would be partial power to each coil.