Kameraslider

Kameraslider

Mitwirkende: markus
Beginn: 2015-12-15
Fertigstellung: 2016-03-01
Status: fertig

Einführung

Bei diesem Projekt handelt es sich um einen Kameraslider zur Montage einer Kamera (Spiegelreflex, Kompaktkamera, GoPro/Actioncams,…) um eindrucksvolle Zeitraffervideos zu erstellen.


Aufbau

Der Schlitten läuft auf zwei parallel gelegten Edelstahl Stangen welcher über einen GT2 Zahnriemen mit einem Schrittmotor angetrieben wird. Die Steuerung erfolgt auf einem Raspberry Pi auf dem ein Skript mit freier Eingabe der Variablen (Belichtungszeit der Kamera, Schrittzahl bis zum nächsten Foto, Geschwindigkeit und Richtung) läuft.


Hardware

-


Programmablauf

Das Python-Skript frägt am Anfang die benötigten Informationen wie oben genannt ab. Danach kommt die Initialisierung, damit der Schlitten an das Ende der Schiene fährt. Es folgt das Abfahren der Positionen bis zum anderen Ende der Schiene. Des weiteren sind Funktionen wie das automatische wegfahren des Schlittens vom Endanschlag und Schalterentprellung mittels Software im Skript integriert.

  • Die Entprellung ist für einen sauberen Programmablauf notwendig, da sonst evtl. Funktionen mehrmals aufgerufen werden.

Materialliste

  • 2x Edelstahlstab Durchmesser 8mm
  • 4x Aufnahme 8mm
  • 4x Schraube M5 Länge 80mm mit Muttern
  • 2x Linearlager Durchmesser 8mm
  • 2x Endschalter Öffner/Schließer (nur Schließer benötigt)
  • 2x Riemenscheibe für GT2 Riemen
  • 1x Schrittmotor
  • 1x Pololu
  • 1x Axiallager 5mm (Umlenkrolle)
  • 1x Stab 5mm (Achse für Umlenkrolle)
  • 1x Spannungsversorgung min. 12V
  • Xx Diverse Kabel
  • 1x Raspberry Pi

—-

Videos

https://www.youtube.com/watch?v=K3MUMkPOfkY


Code

script_final_version_1.1.3.py
#######################################################
##		Script by Markus Buecher
##	GPIO Pins for Raspberry Pi B+ and 2B
#######################################################
#This script is written to use an A4988 Stepper Driver like an Pololu, a Stepper Motor,
#2 Endswitches and to trigger an Relayboard to trigger a camera with its remote connector.
#Please pay attention while connecting your camera to the remote connector. This could cause
#damage to your camera. Use this script at your own risk!! Have fun
 
from __future__ import division
import time
import RPi.GPIO as GPIO
 
#Deactivate warnings
GPIO.setwarnings(False)
 
#Configure the GPIO-Pins to Input and Output:
#GPIO Number = Pin-Number at Board
GPIO.setmode(GPIO.BOARD)
 
#Variables
zeit=int(raw_input("Exposure time:   "))
dire=int(raw_input("Direction(right=1, left = 0):   "))
numStep=int(raw_input("Steps:   "))
sps=int(raw_input("Steps per Second:   "))
tick= 1 / sps
a=15
b=16
 
#Input
 
GPIO.setup(15, GPIO.IN, pull_up_down = GPIO.PUD_UP) #Switch right
GPIO.setup(16, GPIO.IN, pull_up_down = GPIO.PUD_UP) #Switch left
#Output
 
#Output for Stepper
 
GPIO.setup(35, GPIO.OUT) #DIR
GPIO.setup(36, GPIO.OUT) #STEP
 
#Output Trigger
 
GPIO.setup(29, GPIO.OUT) #Trigger
 
stopFlag = False
 
def initStep():
	counter = 0
	print("Initialising...")
	global stopFlag
	while not stopFlag:
                GPIO.output(36, GPIO.HIGH)
                time.sleep(tick)
                GPIO.output(36, GPIO.LOW)
                time.sleep(tick)
 
def initStop(a):
	ctr = 0
	global stopFlag
	stopFlag = True
	print("Stop")
	while (dire == 1 and ctr < 200):	
		GPIO.output(35, GPIO.HIGH)
		GPIO.output(36, GPIO.HIGH)
		time.sleep(tick)
		GPIO.output(36, GPIO.LOW)
		time.sleep(tick)
		ctr = ctr + 1
 
	while (dire == 0 and ctr < 200):
		GPIO.output(35, GPIO.LOW)
		GPIO.output(36, GPIO.HIGH)
		time.sleep(tick)
		GPIO.output(36, GPIO.LOW)
		time.sleep(tick)
		ctr = ctr + 1
 
def normalStop(b):
	ctr = 0
	global stopFlag
	stopFlag = True
	print("Finished!")
	while (dire == 1 and ctr < 200):
		GPIO.output(35, GPIO.LOW)
		GPIO.output(36, GPIO.HIGH)
		time.sleep(tick)
		GPIO.output(36, GPIO.LOW)
		time.sleep(tick)
		ctr = ctr + 1
 
	while (dire == 0 and ctr < 200):
		GPIO.output(35, GPIO.HIGH)
		GPIO.output(36, GPIO.HIGH)
		time.sleep(tick)
		GPIO.output(36, GPIO.LOW)
		time.sleep(tick)
		ctr = ctr + 1
	if (ctr == 200):
		exit()
 
def trigger():
	print(" ")
	print("Taking Photo!")
	print(" ")
	time.sleep(0.5)
	GPIO.output(29, GPIO.LOW)
	time.sleep(zeit)
	GPIO.output(29, GPIO.HIGH)
	time.sleep(0.5)
 
def step(numStep):
	print("Continue")
	counter = 0
	while (counter < numStep):
		GPIO.output(36, GPIO.HIGH)
		time.sleep(tick)
		GPIO.output(36, GPIO.LOW)
		time.sleep(tick)
		counter = counter + 1
		if counter % 100 == 0:
			print(counter)
 
def right():
	GPIO.output(35, GPIO.HIGH)
 
 
def left():
	GPIO.output(35, GPIO.LOW)
 
def switch(m):
	GPIO.add_event_detect(15, GPIO.FALLING, bouncetime = 500)
	GPIO.add_event_detect(16, GPIO.FALLING, bouncetime = 500)
	if (m == 1):
		GPIO.add_event_callback(15, initStop)
		GPIO.add_event_callback(16, initStop)
	elif (m == 0):
		GPIO.add_event_callback(15, normalStop)
		GPIO.add_event_callback(16, normalStop)
 
 
def init():
	if (dire == 1):
		switch(1)
		left()
		initStep()
 
	elif (dire == 0):
		switch(1)
		right()
		initStep()
 
def rightMainLoop():
	right()
	step(numStep)
	trigger()
 
def leftMainLoop():
	left()
	step(numStep)
	trigger()
 
init()
 
time.sleep(3)
raw_input("Finished initializing. Press any Button to continue...")
print ("Wait!")
while (dire == 1):
	GPIO.remove_event_detect(15)
	GPIO.remove_event_detect(16)
	switch(0)
	rightMainLoop()
 
while (dire == 0):
	GPIO.remove_event_detect(15)
	GPIO.remove_event_detect(16)
	switch(0)
	leftMainLoop()
SLIDER_NO_UI.ino
/*
SLIDER_NO_UI.ino
created by Markus Buecher
markus@lug-saar.de
 
Feel free to contact me if you have any questions, ideas, critics or improvements.
 
RELEASE NOTES
Please note that this Version doesn't contain an user interface (UI). You have to enter all values manually in the Parameter / Varaible section
in the head of this program. Feel free to copy this and build your own camslider. 
**Version 1.0**
    First release of the Arduino Program for Camslider.
    ***WORKING:***
    -Initialisation
    -Move from point to point
    -Auto Reset after reaching the other end of line
 
    ***NOT WORKING / NOT IMPLEMENTED***
    -RUNTIME (means to set a time which gives the duration of the real time duration of a timelapse for example)
     --> does not automatically calculate the amount of Move Step and Exposure Time
    -Cameracontrol
    -lots of more ideas
*/
 
//Pinout
const int END_STOP_LEFT = 5;      //Left Endstop
const int END_STOP_RIGHT = 6;     //Right Endstop
const int STEP_SIGNAL = 3;        //Step Signal for Pololu --> STEP
const int DIRECTION_SIGNAL = 4;   //Direction Signal for Pololu --> DIR
const int LED_INDICATOR = 2;      //LED-Pin for Status Signal
 
//Global Variables
 
int STATE = 0;						        //0 = Slider somewhere -> Initialisation; 1 = Initialisation completed, jump from point to point; 2 = Go home again; 3 = Waiting for reset
int RUNTIME = 1000;						    //RUNTIME in seconds 60s = 1m; 120s = 2m; 600s = 10m; 3600s = 1h; 7200 = 2h. Entered values will be calculated into MoveTime and ExposureTime
int long STEP_COUNTER = 0;        //Counts the amounts of Step-Signals from the Arduino to the Driver
int MOVE_STEP_FROM_SWITCH = 200;  //defines the amount of steps, the cartridge moves back from a collision with the endswitch
int MOVE_STEP = 1200;             //number of Steps made  between each photo
int EXPOSURE_TIME = 1;            //Exposuretime
int FREQUENCY = 3000;             //Set frequency for Step Signal (Steps per Second)
 
void setup() {                    //set pinModes to In- or Output
	pinMode(END_STOP_LEFT, INPUT);
	pinMode(END_STOP_RIGHT, INPUT);
	pinMode(LED_INDICATOR, OUTPUT);
	pinMode(STEP_SIGNAL, OUTPUT);
	pinMode(DIRECTION_SIGNAL, OUTPUT);	
}
 
void step()	{                     //this function is generating the Logic HIGH to LOW Signal for Stepper Driver
	digitalWrite(STEP_SIGNAL, HIGH);
	delayMicroseconds(1000000/(FREQUENCY));
	digitalWrite(STEP_SIGNAL, LOW);
	delayMicroseconds(1000000/(FREQUENCY));
	++STEP_COUNTER;
}
 
void loop() {                     //Main Loop
 
switch (STATE) {                  //Switch/Case Statement in the loop function. The State to the number can be found above in the description of STATE Variable
	    case 0:                     //Initialisation
	      while (digitalRead(END_STOP_RIGHT) == LOW) {
	      	digitalWrite(DIRECTION_SIGNAL, LOW);
	      	step();
          if (digitalRead(END_STOP_RIGHT) == HIGH) {
            digitalWrite(DIRECTION_SIGNAL, HIGH);
            STEP_COUNTER = 0;
            while (STEP_COUNTER <= MOVE_STEP_FROM_SWITCH) {
              step();
            }
          STATE = 1;
          }
          break;
        }
        break;
 
	    case 1:                     //Take Photos with specified delay, stepwidth and exposuretime   
        delay(1000*(EXPOSURE_TIME));          
        while (1) {
          digitalWrite(DIRECTION_SIGNAL, HIGH);
          STEP_COUNTER = 0;
          while (STEP_COUNTER <= MOVE_STEP) {              
            if (digitalRead(END_STOP_LEFT) == HIGH) {
              STATE = 2;
              break;
            }
            else
              step();
          }
          break;
        }
 
      case 2:                     //Move back to home (2nd Initialisation)
        while (digitalRead(END_STOP_RIGHT) == LOW) {
          digitalWrite(DIRECTION_SIGNAL, LOW);
          step();
          if (digitalRead(END_STOP_RIGHT) == HIGH) {
            digitalWrite(DIRECTION_SIGNAL, HIGH);
            STEP_COUNTER = 0;
            while (STEP_COUNTER <= MOVE_STEP_FROM_SWITCH) {
              step();
            }
          STATE = 3;
          }
          break;
        }
        break;
 
       case 3:                    //Indicates with a LED that the Slider is ready with taking photos
        while(1) {
          digitalWrite(LED_INDICATOR = HIGH);
          delay(200);
          digitalWrite(LED_INDICATOR = LOW);
          delay(200);
 
        }
 
       break;
	}	
}
projekte/kameraslider.txt · Zuletzt geändert: 2016/10/04 22:56 von markus
Nach oben
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0