Aus Raspberry Pi Geek 03/2014

Analoge Spiegelreflexkamera mit dem RasPi ansteuern

© Joo Young Cho,123RF

Pi am Drücker

Dmitri Popov

Der RasPi kann sogar analog: Mit ein paar zusätzlichen Bauteilen verwandeln Sie den Mini-PC in einen automatischen Selbstauslöser für eine alte Spiegelreflexkamera.

README

Mit einem Raspberry Pi, einer Handvoll Elektronikbauteilen und ein paar Python-Skripts bringen Sie Ihrer alten Spiegelreflexkamera völlig neue Tricks bei, wie zeitgesteuerte Serienaufnahmen oder das Erfassen der zugehörigen Geodaten.

Obwohl ich eine recht anständige DSLR-Kamera besitze, schieße ich die meisten Fotos auf altmodischem Film. Zu meinen Lieblingen unter meinen Fotoapparaten zählt eine fast 30 Jahre alte Nikon-Spiegelreflexkamera des Typs F-501, die ich günstig im Internet erworben habe. Zu ihrer Ausstattung zählt neben dem Systemobjektiv auch ein MC-12B-Fernauslösekabel. Als ich Letzteres aus Neugier auseinanderbaute, erwies es sich als simple Konstruktion, die lediglich einen Stromkreis zwischen zwei Pins im Fernauslöser der Kamera schließt. Als mir dann noch beim Wühlen in meiner Computer-Grabbelkiste ein alter USB-GPS-Empfänger in die Hände fiel, war die Idee zu einem Wochenend-Bastelprojekt geboren: Ein RasPi sollte die F-501 auslösen und gleichzeitig die zugehörigen Geodaten in eine Datei ablegen.

Teileliste

Statt meiner Nikon F-501 ließe sich auch jede andere Spiegelreflexkamera als Basis verwenden, sofern sie einen Fernauslöser besitzt, der sich durch das Verbinden zweier Pins des Fernauslösekabels ansteuern lässt. Das MC-12B-Kabel kommt auch mit dem Motor MD-12 zum Einsatz, sodass die hier vorgestellte Lösung theoretisch mit jeder Nikon-SLR funktionieren sollte, die mit dem MD-12 kompatibel ist. Neben einem RasPi brauchen Sie noch einen 2N2222-Transistor und einen 1-kOhm-Widerstand. Einen passenden USB-GPS-Empfänger bekommen Sie preiswert auf Amazon oder eBay. Ich habe einen Globalsat BU-353 verwendet, aber es funktioniert auch jeder anderes GPS-Empfänger, der mit dem GPS-Daemon Gpsd zusammenspielt. Eine Liste kompatibler Modelle finden Sie auf der Gpsd-Website [1].

Einfacher Auslöser

Der mechanische Kameraauslöser, der ja lediglich einen Stromkreis zwischen zwei Pins schließt, lässt sich unschwer durch eine elektronische Variante ersetzen. Dazu dient ein einfacher Bipolartransistor, den man über einen GPIO-Pin des RasPi ansteuert. Ich verwendete dazu einen STMicroelectronics 2N2222 [2], wie Sie ihn in jedem gut sortierten Elektronikladen kaufen können. Abbildung 1 zeigt den entsprechenden Schaltplan, in dem auch noch ein 1-kOhm-Widerstand zum Einsatz kommt. In Abbildung 2 sehen Sie ein Platinenlayout für den Schalter, das ich mit der Software Fritzing [3] erzeugt habe. Das Ansteuern des Schaltkreises übernimmt der GPIO-Pin 25 des RasPi. Sobald Sie ihn hochziehen, schließt er über den Transistor den Stromkreis und löst damit die Kamera aus.

Abbildung 1: Das Schaltdiagramm des elektronischen Auslösers.

Abbildung 1: Das Schaltdiagramm des elektronischen Auslösers.

Abbildung 2: Der Verkabelungsplan des elektronischen Auslösers.

Abbildung 2: Der Verkabelungsplan des elektronischen Auslösers.

Erfreulicherweise bringt das aktuelle Raspbian bereits das Python-Modul RPi.GPIO mit, über das sich die GPIO-Pins aus Python-Skripts heraus kontrollieren lassen. So bereitete es kein Problem, das einfache Skript trigger.py zu erstellen, das Pin 25 ansteuert und damit ein Foto auslöst (Listing 1). Der Code initialisiert den GPIO-Pin 25 für die Ausgabe (Zeile 6) und schaltet ihn dann kurz an und wieder aus. Die Verzögerung beträgt dabei eine halbe Sekunde (Zeile 8), was der Kamera genügt, um das Signal zu erkennen und ein Foto auszulösen.

Listing 1

#!/usr/bin/env python
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(25, GPIO.OUT)
GPIO.output(25, True)
sleep(0.5)
GPIO.output(25, False)

Mit etwas kreativem Elan lässt sich das Skript für vielerlei Zwecke einsetzen. Neulich habe ich es in Verbindung mit einem Cron-Job dazu verwendet, von meinem Fenster aus einen Sonnenaufgang fotografisch einzufangen. Als Langschläfer knipse ich nur ungern frühmorgens, und so habe ich den Job an meinen RasPi delegiert. Den richtigen Zeitpunkt für den Schnappschuss – kurz vor acht Uhr morgens – ermittelte ich vorab über den Sunrise and Sunset Photo Calculator [4]. Aus dem exakten Zeitpunkt des Sonnenaufgangs, 7:53 Uhr, ergab sich folgender Cron-Job:

53 7 * * * /home/pi/trigger.py

Weil trigger.py mit Root-Rechten laufen muss, editierte ich diesen Cron-Job über den Befehl sudo crontab -e -u root. Nachdem ein wirklich gutes Foto eines Sonnenaufgangs nur selten im ersten Anlauf entsteht, baute ich das Trigger-Skript zudem so aus, dass es innerhalb einer Viertelstunde fünf Mal auslöst (Listing 2).

Listing 2

#!/usr/bin/env python
from time import sleep
import RPi.GPIO as GPIO
i = 0
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(25, GPIO.OUT)
while i<5:
  GPIO.output(25, True)
  sleep(0.5)
  GPIO.output(25, False)
  sleep(900)
  i = i+1

GPS-Empfänger

Im nächsten Schritt gilt es, den USB-GPS-Empfänger zum Zusammenspiel mit dem Raspberry Pi zu bewegen. Dazu installieren Sie zunächst einmal die beiden Pakete gpsd und gpsd-clients:

$ sudo apt-get install gpsd gpsd-clients

Stecken Sie den GPS-Empfänger nun am RasPi ein. Um zu überprüfen, ob er erkannt wird und fehlerfrei arbeitet, sehen Sie sich die empfangenen GPS-Daten mithilfe des Tools cgps an. Der RasPi-Bastler Dan Mandle hat ein pfiffiges Python-Skript zum Auslesen von geografischer Länge, Breite und Zeitwerten zusammengestellt, das Sie in seinem Blog finden [5]. Die leicht abgeänderte Variante gpsdata.py in Listing 3 unterscheidet sich vom Mandleschen Original dadurch, dass sie statt einer While-Schleife eine Sleep-Anweisung einsetzt (Zeile 22), um dem GPS-Receiver genügend Zeit zum Satelliten-Lock und GPS-Datenempfang zu verschaffen. Außerdem schreibt ein zusätzlicher Code-Block ab Zeile 27 die empfangenen Werte in die Datei gpsdata.txt.

Listing 3

#! /usr/bin/python
import os
from gps import *
from time import *
import time
import threading
gpsd = None
class GpsPoller(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
    global gpsd
    gpsd = gps(mode=WATCH_ENABLE)
    self.current_value = None
    self.running = True
  def run(self):
    global gpsd
    while gpsp.running:
      gpsd.next()
if __name__ == '__main__':
  gpsp = GpsPoller()
  gpsp.start()
  time.sleep(15)
  os.system('clear')
  print 'latitude    ' , gpsd.fix.latitude
  print 'longitude   ' , gpsd.fix.longitude
  print 'time utc    ' , gpsd.fix.time
  f = open('gpsdata.txt', 'a')
  coord = str(gpsd.fix.latitude) + '\t' + str(gpsd.fix.longitude) + '\t', str(gpsd.fix.time) + '\n'
  f.write(coord)
  f.close()
  gpsp.running = False
  gpsp.join()
DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben