Praxis

Raspberry Pi - Auslöser-Code

Raspberry Pi

Die Anleitung ergänzt die Artikelserie über die Raspberry-Pi-Kamera ab FOTO HITS 12/2016. Auf dieser Seite kann man den Code kopieren, der den Kameraauslöser steuert und das Bild sichert. 

Auslöser für Raspberry-Pi-Kamera
Aus drei Drähten, einem Widerstand und einem Taster entsteht ein Auslöser. Er wird mit de GPIO-Leiste des Raspberry Pi verbunden, wie es FOTO HITS 1-2/2017 beschreibt.

Die Redaktion empfiehlt, das Zip-Paket herunterzuladen, das das fertige Skript ausloeser.py und ein bereits angelegtes leeres Unterverzeichnis "images" enthält. Nach einem Rechtsklick auf den folgenden Link bietet das Kontextmenü je nach Browser etwa an: "Link speichern unter ...": Download Zip

Zusätzlich enthält das Paket das Test-Skript taster.py, das überprüfen lässt, ob man alles richtig verkabelt hat. Dann gibt es nach erfolgreichem Knopfdruck aus: "gedrueckt", ansonsten herrscht Schweigen.

Wenn man das Skript unten kopiert, muss man "images" selbst unterhalb des Ordners anlegen, in dem ausloeser.py liegt. Ein wertvoller Tipp: Das Tastatur-Layout ist voreingestellt amerikanisch. Es sollte  über "Menü - Einstellungen - Tastatur und Maus" auf "Deutsch" umgestellt werden.

    Wichtig ist:

    1. Niemals den Code in einem Textverarbeitungssystem bearbeiten. Dafür darf nur ein Text-Editor verwendet werden, wie ihn Rasperry unter "Zubehör - Editor" bereitstellt.
    2. Am einfachsten markiert man die Zeilen unten mit dem Mauszeiger und kopiert sie etwa mit dem Tastenbefehl Strg und c. Dann werden sie etwa mit Strg und v in den Texteditor eingefügt.
    3. Die Zeilen müssen so wie auf der Website gezeigt eingerückt werden. Das darf keinesfalls per Leerzeichen geschehen, sondern es muss die Tab-Taste links oben auf der Tastatur genutzt werden – „Python“ ist hier eigen. Wer das Skript unten kopiert, entfernt sicherheitshalber zuerst die Einrückungen, falls sie aus Leerzeichen bestehen. Sie erzeugt man nochmals mittels Tab-Taste. Beispielsweise drückt man für die Zeile writemessage("taking photo...") ein Mal die Tab-Taste, für  if(GPIO.input(4)==False): zwei Mal und für print("button pressed") drei Mal.
    4. Das Ergebnis erhält etwa den Dateinamen ausloeser.py.

    Nachfolgend der Code im Kasten, der auf dem Skript von contractorwolf beruht:

    #!/usr/bin/env python
    from time import sleep
    import os
    import RPi.GPIO as GPIO
    import subprocess
    import datetime
    import pygame
    from pygame.locals import *
    gpio = 4
    #setup pins
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(gpio,GPIO.IN)
    #setup variables
    count = 0
    up = False
    down = False
    command = ""
    current_dir = os.getcwd()
    filename = ""
    image_dir = "images"
    camera_pause  = "1000"
    print("Raspberry Pi - Point & Shoot Camera v2.2")
    print("-with pygame and screen, and messaging")
    running = True;
    pygame.init()
    screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
    width, height = screen.get_size()
    font = pygame.font.SysFont("verdana", 65, bold=1)
    font2 = pygame.font.SysFont("verdana", 55, bold=0)
    textsurface = font.render("Raspberry Pi", 1, pygame.Color(255,255,255))
    screen.blit(textsurface,(20,280))
    textsurface = font2.render("Point & Shoot Camera", 1, pygame.Color(255,255,255))
    screen.blit(textsurface,(20,350))
    if(not os.path.exists(image_dir)):
    command = "mkdir " + image_dir
    print(command)
    os.system(command)
    def takepic(imageName):
        writemessage("taking photo...")
        command = "sudo raspistill -o " + imageName + " -q 100 -rot 270 -t " + camera_pause
        print(command)
        os.system(command)
        writemessage("loading photo...")
    def loadpic(imageName):
        print("loading image: " + imageName)
        
        background = pygame.image.load(imageName);
        background.convert_alpha()
        background = pygame.transform.scale(background,(width,height))
        screen.blit(background,(0,0),(0,0,width,height))
        font = pygame.font.SysFont("verdana", 40, bold=0)
        textsurface = font.render(imageName, 1, pygame.Color(0,0,0))
        screen.blit(textsurface,(20,0))
    def movepic(imageName):
        command = "mv " + imageName + " " + current_dir + "/" + image_dir + "/" + imageName
        print(command)
        os.system(command)
        
    def writemessage(message):
        screen.fill(pygame.Color(0,0,0))
        font = pygame.font.SysFont("verdana", 50, bold=1)
        textsurface = font.render(message, 1, pygame.Color(255,255,255))
        screen.blit(textsurface,(35,40))
        pygame.display.update()
        
    while running:
        if(up == True):
            if(GPIO.input(gpio)==False):
                print("button pressed")
                now = datetime.datetime.now()
                timeString = now.strftime("%Y-%m-%d_%H:%M:%S")
                print("request received: " + timeString)
                filename = "photo-" + timeString + ".jpg"
                takepic(filename)
                loadpic(filename)
                movepic(filename)
                
        up = GPIO.input(gpio)
        count = count + 1
        
        pygame.display.update()
        sleep(.1)
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                running = False
    #never hit
    print("end of loop");