Retro-Filmkamera mit Handy-Film-Streaming

Aus HRW FabLab MediaWiki
Wechseln zu: Navigation, Suche
Retro-Filmkamera mit Handy-Film-Streaming

Super8 main.jpg

Entwickler

Carolle Naoussi, Nico Leidner

Projektdateien

Gitlab

Verwendete Programmiersprachen

C, C++, Java

Eingesetzte Software

Arduino IDE, Visual Studio Code mit ESP-IDF Plugin, Android Studio, Fusion 360

Eingesetzte Hardware

Super8 Kamera, ESP32-Cam, Akku, FTDI-Adapter

Projektidee[Bearbeiten]

Das Ziel dieses Projekts ist es, eine digitale Super-8-Kamera zu bauen. Die Digitalkamera wird gebaut, indem die Kassette der Super-8-Kamera durch ein ESP32-System mit Kamera ersetzt wird. Videomaterial, das mit dieser digitalen Super-8-Kamera aufgenommen wird, wird über WLAN direkt auf ein Handy gestreamt und kann bei Bedarf auch gespeichert werden. Ideengeber und Berater dieses Projektes waren Robert Reichert und Paul Schulte.

Hardware[Bearbeiten]

Komponente Preis
ESP32-CAM 9,50€ Beispiel4.jpg
Lange OV2640 Cam 10€ Beispiel6.jpg
FTDI-Adapter 3,33€
Akkupack (5 Stück mit Ladegerät) 22,99€ Beispiel5.jpg
Super8 Kamera 10€ Beispiel2.jpg


Aufbau[Bearbeiten]

Für die Aufbau der Hardware haben wir neben der gekaufte Elemente folgende Teile mit einem 3D Drucker gedruckt.

  • Die Kassette

Diese Kassette dient dazu die ESP32-CAM in die Super8 Kamera einzubauen. Alle zusätzliche Teile werden hier reingeklebt.

Beispiel7.jpg

  • Die Zylinder

Da wir festgestellt haben, dass der Abstand zwischen dem Loch, aus dem das Licht in die Super8-Kamera eintreten soll, um die kleine Kamera des ESP32 zu erreichen, zu lang war, mussten wir mit dem 3D-Drucker einen Zylinder drucken, um diesen Abstand zu verkürzen. Die Linsen der kleinen Cams wurden in zwei Teile geteilt. Ein Teil wurde am oberen Ende des Zylinders platziert und der andere Teil, der mit dem ESP32 verbunden ist, am unteren Ende des Zylinders, wie auf den Bildern unten zu sehen.

Aufbau1.jpg Zwischenring.PNG

Aufbau2.jpg


  • Ein Sitz zum Anheben des Zylinders

Ein weiteres Problem war, dass die kleine Kamera des ESP32 genau in das Loch der Super8-Kamera zeigen sollte. Daher mussten wir ein weiteres Bauteil drucken, um den Zylinder zu legen, während es in das Loch zeigt.

Aufbau3.jpg Objektivführung.PNG


  • Ein Batteriehalter

Mit dem 3D-Drucker wurde auch ein Komponenten gedruckt, die den Akku fest in der Kassette hält. Dies soll sicherstellen, dass die Kassette ohne Probleme geschlossen werden kann.

Beispiel9.jpg Batterieklemme.PNG


  • Platinenhalter

Der Platinenhalter ist dazu da um die Platine in der Kassette zu befästigen. Dabei wird der ESP in den Schlitz gesteckt und dann richtig zum Sitz platziert. Der Platinenhalter wird in die Kassette geklebt.

Platinenhalter.PNG


Nachdem alle notwendigen Elemente eingesammelt waren, wurde die Kassette nun in die Kamera eingelegt, wie auf dem Bild unten zu sehen ist:


Beispiel8.jpg

Nutzung der Super8-Kamera Optik[Bearbeiten]

Die Idee ist so wenig wie möglich an der Kamera selber zu verändern, deshalb befindet sich die gesamte Technik in der Kassette. In der Kassette befindet sich die ESP32-Cam, die mithilfe des Platinenhalter fest platziert werden kann. Damit die ESP32-Cam das Bild der Super8-Kamera aufnehmen kann, wird an dem Schlitz, der eigentlich zur Belichtung des Films dient, eine transparente Schicht angebracht. Diese Schicht wird als eine art "Mattscheibe" benutzt, auf der das Bild der Super8-Kamera projiziert wird. Dieses projizierte Bild wird dann von der ESP32-Cam abgefilmt. Damit die ESP32-Cam nur den Punkt abfilmt auf den das Bild projiziert wird, muss der Brennpunkt der Linse vom ESP verändert werden. Dies wurde realisiert in dem wir den Abstand von der Linse zum Sensor, mithilfe des Zylinders, verändert haben. Der Zylinder muss dann den richtigen Abstand zur Mattscheibe haben, damit die Schärfe richtig eingestellt ist. Den Sensor direkt ohne die Linse und ohne Infrarotfilter zu benutzen kann dazu führen, dass der ESP das Bild nicht mehr codieren kann. Um den richtigen Abstand zu bestimmen, sollte der Zoom und die Brennweite auf den niedrigsten Wert gesetzt werden. Dann kann mit einer Lichtquelle, mit den Abstand der eingestellten Brennweite in Metern, der gewollte Schärfepunkt ermittelt werden. Damit dauerhaft ein Bild angezeigt werden kann, muss in der Super8-Kamera die Blende entfernt werden, da sonst kein Licht auf den Schlitz geworfen werden kann. Dies ist der einzige Eingriff der in der Kamera selber vorgenommen werden muss.

Super8 Mattscheibe.jpg

Bild durch das Super8-Kamera Objektiv für das Einstellen der Schärfe. Nur mit direkter Lichtquelle überhaupt möglich. Hier ist die Lichtquelle eine Taschenlampe.

Super8 Objektiv Bild.jpg


Schwierigkeiten

  • Da die ESP32-Cam sehr viel Licht braucht um ein Bild ordentlich darzustellen, ist der gebündelte Lichtstrahl auf der Mattscheibe nur bei sehr gutem Licht überhaupt zu erkennen.
  • Um den Punkt auf der Mattscheibe richtig zu fokussieren, muss die Linse millimetergenau sitzen. Leider hatten wir nur einen Versuch hatten diesen exakt zu befästigen.
  • Beim Trennen des Sensors von der Linse (beim ESP32-CAM) sind uns leider mehrere Cams kaputt gegangen.
  • Durch die während des Projekts herrschende COVID-19 Pandemie, waren wir erschwerten Bedingungen ausgesetzt, da wir keinen Zugang zum Labor hatten und Treffen kaum möglich waren.

Software[Bearbeiten]

Architektur[Bearbeiten]

Architektur.jpg

Wie in der Architektur zu sehen, wird die ESP32-CAM-Platine zusammen mit der Batterie in die Super-8-Kamera integriert. Die ESP32-CAM schafft einen Zugangspunkt, über den sich die Anwendung mit ihr verbinden kann. Wenn sich die App mit dem von der ESP32-CAM geschaffenen Netzwerk verbindet, kann die Kamera nun von der App gesteuert werden. Ebenfalls ist es möglich, dass die ESP32-Cam sich mit einem schon vorhandenen Netzwerk verbindet. Die App steuert die Kamera über das HTTP-Protokoll. Mit der App kann man verschiedene Auflösungen der Kamera einstellen. Das Streaming der Bilder, die in der Anwendung angezeigt werden, erfolgt über das RTSP-Protokoll. Das Real Time Streaming Protocol (RTSP-Protokoll) ist ein Netzwerksteuerungsprotokoll, das zur Steuerung der Übertragung von Echtzeitdaten wie Audio und Video verwendet wird (https://tools.ietf.org/html/rfc2326)

Wenn die ESP32-Cam ihr eigenes Netzwerk erstellt, ist es über die SSID "Super8" und das Passwort "12345678" zu erreichen.

Streamen der Digital Bildern[Bearbeiten]

Es gibt zwei Wege die Bilder zu Streamen. Einmal die für ESP32-Cam übliche Variante über einen JPEG-Stream. Die zweite Variante ist ein RTSP-Stream. Beide Varianten können über ein vorhandenes Wlan oder ihr eigenes streamen.

JPEG-Stream[Bearbeiten]

Der JPEG-Stream wurde hier von uns in ESP-IDF umgesetzt. Dies hat den Vorteil, dass kein Arduino emuliert werden muss und somit Ressource und Laufzeit gespart wird. Dazu ist muss jedoch der Camera-Driver nachinstalliert werden. Die Implementierung basier auf den Beispielen die vom Camera-Driver zur Verfügung gestellt werden. Der Stream wird über http übermittelt.


RTSP-Stream[Bearbeiten]

Der RTSP-Stream wurde mithilfe der Arduino IDE erstellt. Dabei wurde das Projekt von Frenoy Osburn als Vorlage benutzt. Dies ermöglicht eine schneller Datenübertragung, da neben TCP-Packete zur synchronisation zwischen Client und Server beim eigentlich Stream UDP-Packete genutzt werden. Damit wird auch der Lag verringert.

Auflösung[Bearbeiten]

Die ESP32-CAM kann viele verschiedene Auflösungen bereitstellen. Einige der in unserem Projekt benutzen Auflösung, mit FPS (Bildrate) und der Bezeichnung, sind in der Tabelle unten aufgelistet. Die in der Tabelle dargestellten FPS sind die Maximalwerte. Da die Bilder noch codiert und über ein Netzwerk geschickt werden mussen, sind die FPS meist nur ungefähr die Hälfte der angegebenen Werte.

Auflösung FPS (Frames Per Second) Bezeichnung
320x240 25 qvga
640x480 12,5 vga
800x600 12,5 svga
1024x768 6,25 xga
1280x1024 6,25 sxga
1600x1200 6,25 uxga

Um die Auflösung des ESP32-Cam zu ändern, stellt dieser über seinen Webserver URLs bereit, die jeweils die Auflösung anhand der Bezeichnung ändern. Bei dem RTSP-Stream ist dies über die URL *IP*/resolution/*Bezeichnung* möglich. Zum Beispiel würde so die URL "192.168.4.1/resolution/vga" die Auflösung der Kamera auf 640x480 setzen. Was darauf hin zu einer maximalen Bildrate von 12,5 FPS führt. Bei dem JPEG-Stream ist die URL nur *IP*/*Bezeichnung*, die Beispiel URL vom RTSP-Stream ist dann hier "192.168.4.1/vga".


Android App[Bearbeiten]

Die Android App ist dazu da, um den Video-Stream von der Kamera einfach zugänglich zu machen und anzuzeigen. Insgesamt gibt es drei unterschiedliche Activities für die Einstellung der Parameter und anzeigen des Streams genutzt werden. Die App wurde mit Android Studio entwickelt. Um die App benutzen zu können ist ein Gerät mit Android 7 (API 24) oder höher nötig.


Super8 Main Activity IP.jpg

In der MainActivity wird die IP-Adresse der Kamera eingegeben. Falls die Kamera ihr eigenes Netzwerk bereitstellt, kann durch die Checkbox die Standard IP-Adresse sofort gesetzt werden. Wenn eine gültige IP-Adresse angegeben wurde kann in eine Streaming-Activity gewechselt werden. Über den Button IDF wird die Activity mit dem Webstream gewechselt. Durch den Button RTSP wird die Activity mit dem RTSP-Stream angezeigt.


Super8 IDF Activity.jpg Super8 IDF Activity Stream.jpg


In der IDF Activity kann mithilfe des Button "Start" der Stream gestartet und gestoppt werden. Dabei ändert der Button seine Funktion und Aufschrift je nachdem ob der Stream läuft oder nicht. Der Stream wird mithilfe eines Webviews angezeigt. Unten Links kann die Auflösung, mithilfe eines Spinners, eingestellt werden. Dabei wir eine GET-Request mit der angeforderten Auflösung an den ESP gesendet. Das Einstellen der Auflösung ist nur möglich wenn der Stream nicht läuft, da der Spinner sonst ausgegraut ist. Dies liegt daran, dass z.B. beim aufnehmen des Videos die Auflösung sich nicht ändern soll.


Super8 RTSP Activity.jpg Super8 Recorded Stream.jpg


Die RTSP Activity ist ähnlich aufgebaut wie die IDF Activity. Der Stream wird hier jedoch durch einen speziellen View angezeigt der von der Library libVLC bereitgestellt wird. Dies hat den Grund, dass der normale Android Media Player die lange Startzeit des Streams nicht abwarten kann. Dieses Problem hat der libVLC Media Player nicht, da im Kern der VLC Player verwendet wird. Zusatzlich kann in dieser Activity auch der Stream gespeichert werden. Dafür muss der Switch unten in der Mitte aktiviert werden werden. Der Stream wird dann im Pfad "/DCIM/Super8/rtsp_record.mp4" gespeichert. Dafür kann der Stream dann nicht mehr im View angezeigt werden. Dies liegt daran, dass libVLC nur einen Output-Stream zulässt.