Praxis
Raspberry Pi - Auslöser-Code
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.
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:
- Niemals den Code in einem Textverarbeitungssystem bearbeiten. Dafür darf nur ein Text-Editor verwendet werden, wie ihn Rasperry unter "Zubehör - Editor" bereitstellt.
- 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.
- 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.
- 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");