Updates

Leider bin ich in der letzten Zeit nicht dazu gekommen an der Fotobooth mit dem Raspberry weiterzuarbeiten. Grund dafür war, dass ich erstmal ein paar Webdienste ablösen und auf meinem eigenen Webserver hosten musste.

GoogleReader

Nachdem ich vor ein paar Jahren bereits von GoogleAnalytics auf Piwik zur Webanalyse umgestiegen bin, hat mich die Ankündigung von Google den Reader dicht zu machen dazu gezwungen eine Alternative zu suchen. Da ich ehrlich gesagt keinen Bock darauf habe in einem Jahr meinen Kram zum nächsten Anbieter umzuziehen, habe ich gezielt nach Möglichkeiten für den eigenen Webspace gesucht. Momentan bin ich bei TT-RSS hängen geblieben, aber so richtig zufrieden bin ich noch nicht.

Außerdem habe ich mir gleich mal SemanticScuttle installiert und damit meinen alten Delicious-Account abgelöst.

Mal schauen, was ich demnächst noch alles auf den eigenen Server zurückhole. Auf so eine Aktion wie beim GoogleReader habe ich jedenfalls keine Lust mehr…

GPIO-Test

Heute habe ich im Elektronikladen um die Ecke ein paar Elektronikbauteile gekauft, um die Auslösung des Fotos mit einem Hardwaretaster zu testen.

Ich habe jetzt erstmal ein Script geschrieben, mit dem ich einen Eingang abfragen kann und das mich bei Änderungen auf der Konsole benachrichtigt. Hier erstmal das Script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/python
 
import RPi.GPIO as GPIO
import time
 
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
 
input_old = ""
cnt = 0
while 1:
    input_new = GPIO.input(17)
    if input_new == input_old:
        cnt += 1
    else:
        cnt += 1
        print str(input_new) + "  #" + str(cnt)
    input_old = input_new
    time.sleep(0.1)

Ich hatte zuerst in Zeile 17 diesen Eintrag

17
GPIO.setup(17, GPIO.IN)

Das Problem war, dass sich der Status dann ca. alle 10 Sekunden von True auf False bzw. False auf True geändert hat. Durch die Option pull_up_down=GPIO.PUD_DOWN wird der Pin mit False belegt und zeigt bei einem Tasterdruck True an.

Die Ausgabe sieht dann so aus, bei jeder Änderung des Wertes wird eine Ausgabe erzeugt:

pi@srv-cacti /var/www/raspbooth/python $ sudo ./gpio-test-2.py
False  #1
True  #58
False  #60
True  #9708
False  #9710
True  #9773
False  #9781

resetusb auf dem Raspberry Pi compilieren

Wie ich in dem vorherigen Artikel geschrieben habe, habe ich für die Ansteuerung meiner Kamera auf dem Raspberry Pi eine Möglichkeit gesucht die USB-Ports zurückzusetzen. Über Google bin ich dann auf einen Post von Benjamin Close gestoßen der eine Umsetzung in C beschrieben hat.

Um den Quelltext auf dem Raspberry zu compilieren müsst ihr so vorgehen:

Eine Datei resetusb.c erstellen und den Quelltext von der Seite einfügen.

Danach könnt ihr den Compiler starten

gcc -o resetusb resetusb.c -lusb

Falls eine Fehlermeldung auftritt, dass die Datei usb.h nicht gefunden wurde, dann muss erst noch libusb-dev installiert werden:

sudo apt-get install libusb-dev

Wenn die Datei fertig ist, kann sie mit ./resetusb aufgerufen werden.

pi@srv-cacti /var/www/raspbooth/python $ ./resetusb
reset 0xeac048 -1 ()
reset 0xead140 -1 ()
reset 0xeae230 -1 ()

RaspBooth – erste Klasse fertig

Ich habe jetzt die Klasse für die Steuerung der Kamera soweit fertig. Für die Ansteuerung der Kamera benutze ich gphoto2, das ich über die Shell anspreche. Da sich meine Kamera totgestellt hatte, nachdem ich ein Foto gemacht habe, setze ich resetusb ein.

Die HTML-Seite für die Anzeige habe ich soweit auch, die poste ich später. Am Ende habe ich noch ein kleines Script zum testen angehängt.

Da ich einen sinnvollen Klassennamen gesucht habe, heisst das Projekt jetzt RaspBooth.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
from datetime import datetime
import os
 
class RaspBooth(object):
 
    def __init__(self):
        self.__status = 'init'
        self.__file_last_picture = "../last-pic.dat"
        self.__status = 'listening'
        pass
 
    # takes a picture using the camera connected
    def takePicture(self):
        global os
 
        self.__status = 'capturing'
        print 'Bild wird erstellt'
 
        self.updateLastPicture('capturing.png')
        self.createNewFilename()
 
        # take a picture
        os.system("gphoto2 --capture-image-and-download --filename=../images/" + self.newfile)
        self.updateLastPicture(self.newfile)
        # reset usb ports
        os.system("./resetusb")
 
        print 'Bild wurde gespeichert'
        self.__status = 'listening'
        pass
 
    def getStatus(self):
        return self.__status
 
    # creates a new filename
    def createNewFilename(self):
        now = datetime.today()
        self.folder = now.strftime("%Y%m%d/")
        self.filename = now.strftime("%Y%m%d-%H%M%S")
        self.newfile = self.folder + self.filename + ".jpg"
 
    def updateLastPicture(self, last_picture):
        global os
 
        os.system("echo " + last_picture + " > " + self.__file_last_picture)
 
    def __getTime(self, t):
        now = datetime.today()
 
        if t == 'log':
            return now.strftime("%Y%m%d-%H%M%S")
1
2
3
4
5
6
7
8
#!/usr/bin/python
 
#import classCapturePicture
from classRaspBooth import *
import os
 
rbooth = RaspBooth()
rbooth.takePicture()

Raspberry Pi als Fotobooth

Nachdem ich mir vor zwei Wochen einen Raspberry Pi zugelegt habe und ihn momentan als kleinen Webserver mit Cacti bei mir im Netz laufen habe, habe ich jetzt nach einer weiteren Verwendung gesucht. Ich habe schon seit längerem überlegt, mir eine Fotobooth zu bauen.

Am Ende soll das so aussehen:

  • Steuerung der Kamera (Canon EOS 450D) mit dem Raspberry
  • Anzeige der Fotos auf einem Monitor in der Fotobooth
  • Auslösung der Kamera am liebsten über einen Knopf an der Vorderseite der Box

Als Addon habe ich mir noch überlegt, dass ich am Raspberry vielleicht einen Fotodrucker zum laufen bekomme, dann könnten die Fotos direkt ausgedruckt werden.

Momentan bastele ich an den Scripten für die Steuerung. Ich hatte das schon in Perl laufen, habe mir jetzt aber überlegt es in Python zu schreiben.