Timelapse
after playing a bit with a webcam on a tripod:
I wanted to move the cam slowly over like 180° to get a nice pan effekt.
For the first try the webcam was attached to a stepper motor in half step, but with 0.9° steps it looks like crap.
so a small gearbox went between the stepper and the webcam, with a ratio off 1:1000, so the steps are now 0.018° as i move in fullstep.
Here is the final video with nice motion:
The Hardware:
The arduino controls the Stepper with a L293D, like shown on the arduino website: http://arduino.cc/en/Reference/Stepper
The Webcam Software:
I used HandyAvi, what makes the video directly from the webcamstream, perfect tool for things like this
HandyAvi: http://www.azcendant.com/
The Arduino Code:
#include <Stepper.h>
// change this to the number of steps on your motor
#define STEPS 200
#define WaitMS 200
char val; // Data received from the serial port
unsigned long time;
Stepper stepper(STEPS, 3, 5, 6, 9); //This is the new one with PWM
void setup()
{
stepper.setSpeed(500);
Serial.begin(57600);
}
void loop()
{
if (Serial.available()) { // If data is available to read,
val = Serial.read(); // read it and store it in val
if (val == 'R') {
stepper.step(1);
time = millis() + WaitMS;
}
if (val == 'L') {
stepper.step(-1);
time = millis() + WaitMS;
}
}
if(millis() > time){
stepper.SetCurrent(125);
time = millis() + 20000;
}
}
There is a added Function in the stepper.cpp, what enables you to reduce the motorcurrent, so the motor does not heat up so much.
void Stepper::SetCurrent(int Current)
{
switch (this->step_number % 4) {
case 0: // 1010
analogWrite(motor_pin_1, Current);
digitalWrite(motor_pin_2, LOW);
analogWrite(motor_pin_3, Current);
digitalWrite(motor_pin_4, LOW);
break;
case 1: // 0110
digitalWrite(motor_pin_1, LOW);
analogWrite(motor_pin_2, Current);
analogWrite(motor_pin_3, Current);
digitalWrite(motor_pin_4, LOW);
break;
case 2: //0101
digitalWrite(motor_pin_1, LOW);
analogWrite(motor_pin_2, Current);
digitalWrite(motor_pin_3, LOW);
analogWrite(motor_pin_4, Current);
break;
case 3: //1001
analogWrite(motor_pin_1, Current);
digitalWrite(motor_pin_2, LOW);
digitalWrite(motor_pin_3, LOW);
analogWrite(motor_pin_4, Current);
break;
}
}
The Processing Code:
/**
* TimeLapse Coding
*
* Check if the mouse is over a rectangle and writes the status to the serial port.
* This example works with the Wiring / Arduino program that follows below.
*/
import processing.serial.*;
Serial myPort; // Create object from Serial class
int val; // Data received from the serial port
int Time; // Next trigger Time
int TimeBase; // The Increment for the rotation
int Steps; // How many steps are made
int Stepsize; // How big are the steps?
int Count; // For the Counter
void setup()
{
size(200, 200);
// I know that the first port in the serial list on my mac
// is always my FTDI adaptor, so I open Serial.list()[0].
// On Windows machines, this generally opens COM1.
// Open whatever port is the one you're using.
String portName = Serial.list()[1];
myPort = new Serial(this, portName, 57600);
TimeBase = 500;
Steps = 100;
Stepsize = 0;
Time = 0;
Count = 0;
}
void draw() {
background(255);
fill(0, 0, 255, 255);
rect(5, 5, 190, 190); // Draw a square
PFont font;
font = loadFont("Arial-Black-15.vlw");
fill(255, 255, 255);
textFont(font,15);
text("TimeBase: " + TimeBase + " QW",10,25);
text("Steps: " + Steps + " AS",10,50);
text("Stepsize: " + Stepsize + " YX",10,75);
text("Motor Move with +-",10,100);
int RunT = (Steps * TimeBase) / 1000;
text("Time: " + RunT + "sec",10,125);
RunT = RunT /60;
text("Time: " + RunT + "min",10,150);
if(Stepsize!=0){
if(Steps>0){
//Check the Time:
if(Time<millis()){
if(Stepsize>0){
myPort.write('R');
}
if(Stepsize<0){
myPort.write('L');
}
Steps--;
Time = millis() + TimeBase;
} else {
int ToTime = int((Time - millis())/10);
text("NextMove " + ToTime,10,175);
}
} else {
Stepsize = 0;
}
}
}
void keyPressed() {
if( key == '+'){
myPort.write('R');
delay(5);
Count++;
println(Count);
}
if( key == '-'){
myPort.write('L');
delay(5);
}
if(key == 'q'){
TimeBase = TimeBase + 100;
}
if(key == 'w'){
TimeBase = TimeBase - 100;
}
if(key == 'a'){
Steps = Steps + 100;
}
if(key == 's'){
Steps = Steps - 100;
}
if(key == 'y'){
Stepsize = Stepsize + 1;
}
if(key == 'x'){
Stepsize = Stepsize - 1;
}
}
For Questions, please visit the Arduino Forum in this Thread: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1252182542
Comments powered by CComment