Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Rasenmaehroboter Test

K (Phase 3)
K (Autoren)
 
(36 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
 +
[[bild:Phase4_B.JPG|right|400px]]
 
= RP6 Kamera - Mitmach-Projekt: Hardware =
 
= RP6 Kamera - Mitmach-Projekt: Hardware =
 
 
[[:Kategorie:Projekte]]
 
[[:Kategorie:Projekte]]
  
Zeile 84: Zeile 84:
 
[[bild:Videokabel_SP.jpg]]
 
[[bild:Videokabel_SP.jpg]]
  
Ein Kabel dient zum Anschluß der Kamera (5-polig mit Abschirmung für das Video-Signal). Das andere abgeschirmte Kabel verbindet einen der ADC-Video-Ausgänge (PG3, PG5, PG6) mit einem ADC-Eingang der RP6Base (PG4) oder der M32 oder M128 (ADC-Wannenstecker). Ein 2-adriges Kabel wird zusätzlich für die IR-LEDs benötigt. Alle Kabel sind steckbar.
+
Ein Kabel dient zum Anschluß der Kamera (5-polig mit Abschirmung für das Video-Signal). Das andere abgeschirmte Kabel verbindet einen der ADC-Video-Ausgänge (PG3, PG5, PG6) mit einem ADC-Eingang der RP6Base (PG4) oder der M32 oder M128 (ADC-Wannenstecker). Ein 2-adriges Kabel wird zusätzlich für die IR-LEDs benötigt. Alle Kabel sind steckbar. ''Hinweis: Es geht bei den kurzen Kabeln auch ohne die Abschirmung. Man sollte die Kabel dann aber verdrillen.''
  
 
So weit dieser erste Abschnitt. Testen, ob alles funktioniert, kann man mit der Software von radbruch (Link siehe oben!)
 
So weit dieser erste Abschnitt. Testen, ob alles funktioniert, kann man mit der Software von radbruch (Link siehe oben!)
Zeile 93: Zeile 93:
 
* Es gibt 2 Codierstecker JP1 und JP2. Zunächst braucht man auf die 2-poligen Stiftleisten keine Codierbrücken (= Jumper) zu setzen. Steckt man bei JP1 einen Jumper auf, wird der Pin "Gamma" der Kamera auf GND gelegt. Laut Anleitung der Kamera ist damit Gamma = 1 gesetzt (sonst 0,45). Setzt man auf JP2 einen Jumper, wird die "Gain" (= Verstärkung) reduziert.
 
* Es gibt 2 Codierstecker JP1 und JP2. Zunächst braucht man auf die 2-poligen Stiftleisten keine Codierbrücken (= Jumper) zu setzen. Steckt man bei JP1 einen Jumper auf, wird der Pin "Gamma" der Kamera auf GND gelegt. Laut Anleitung der Kamera ist damit Gamma = 1 gesetzt (sonst 0,45). Setzt man auf JP2 einen Jumper, wird die "Gain" (= Verstärkung) reduziert.
 
* Die Stiftleisten mit dem Namen PGx sind Plugs (= Stecker). Da darf man auf keinen Fall Jumper aufstecken! Hier wird ein Signal ausgegeben oder eingespeist. An PG1 wird die Kamera angeschlossen, PG2 soll einmal in Phase 4 für IR-LEDs dienen. An PG3 kann man das Videosignal abnehmen und an PG4 über eine lose Drahtverbindung (am besten abgeschirmt!) wieder einspeisen. PG4 ist an IT1 des XBUS angeschlossen, das ist der ADC-Eingang 4 (PA4) der RP6 Base (E_INT1). Dieser ADC-Eingang soll die Helligkeit der Bildpunkte auswerten.
 
* Die Stiftleisten mit dem Namen PGx sind Plugs (= Stecker). Da darf man auf keinen Fall Jumper aufstecken! Hier wird ein Signal ausgegeben oder eingespeist. An PG1 wird die Kamera angeschlossen, PG2 soll einmal in Phase 4 für IR-LEDs dienen. An PG3 kann man das Videosignal abnehmen und an PG4 über eine lose Drahtverbindung (am besten abgeschirmt!) wieder einspeisen. PG4 ist an IT1 des XBUS angeschlossen, das ist der ADC-Eingang 4 (PA4) der RP6 Base (E_INT1). Dieser ADC-Eingang soll die Helligkeit der Bildpunkte auswerten.
* Wenn man keinen Monitor an die CINCH-Buchse angeschlossen hat und das Videosignal mit IT1 verbindet, sollte man einen 75 Ohm Widerstand statt dem Monitor an die CINCH-Buchse anschließen, damit der RP6 das Videosignal auswerten kann.
+
* Wenn man keinen Monitor an die CINCH-Buchse angeschlossen hat und das Videosignal mit IT1 verbindet, sollte man einen 75 Ohm Widerstand statt dem Monitor an die CINCH-Buchse anschließen, damit der RP6 das Videosignal mit der Software von radbruch auswerten kann.
 
* Alternativen zu ADC4 der RP6 Base: Man kann auch ADC0 oder ADC1 nehmen (verfügbar auf dem RP6 Mainboard). Auch die M32 kann schon arbeiten: ADC2..7 sind frei und freuen sich auf diese Aufgabe!
 
* Alternativen zu ADC4 der RP6 Base: Man kann auch ADC0 oder ADC1 nehmen (verfügbar auf dem RP6 Mainboard). Auch die M32 kann schon arbeiten: ADC2..7 sind frei und freuen sich auf diese Aufgabe!
  
Zeile 273: Zeile 273:
 
[[bild:RP6_CMOSCamera_SP_3.jpg]]  
 
[[bild:RP6_CMOSCamera_SP_3.jpg]]  
  
Der Sync-Separator ("Abtrenner der Synchronisierungs-Signale") besteht nur aus dem IC LM 1881N. Zu seinem Pin 2 wird das Video-Signal der Kamera über einen Folienkondensator 100 nF geführt. Die Bauteile 620 Ohm, 39 pF, 470 pF stellen einen Tiefpaß dar und halten die Frequenzen der Bildinformationen vom IC fern. Der Sync-Separator erzeugt die vier Ausgangssignale CSync, VSync, Burst/Back Porch und Odd/Even. Sie werden im Absatz "2.2 Die Synchronisations-Signale" genauer erklärt.
+
Der Sync-Separator ("Abtrenner der Synchronisierungs-Signale") besteht nur aus dem IC LM 1881N. Zu seinem Pin 2 wird das Video-Signal der Kamera über einen Folienkondensator 100 nF geführt. Die Bauteile 620 Ohm, 39 pF, 470 pF stellen einen Tiefpaß dar und halten die Frequenzen der Bildinformationen vom IC fern. Der Sync-Separator erzeugt die vier Ausgangssignale CSync, VSync, Burst/Back Porch und Odd/Even. Sie werden im Absatz "2.1 Die Synchronisations-Signale" genauer erklärt.
  
 
Mit dem Jumper JP8 wird ausgewählt, ob man CSync (Stellung C) oder Burst (Stellung B) für die horizontale Synchronisation (HSync) verwenden möchte. JP9 bestimmt, ob an den 10-poligen I/O-Wannenstecker (I/O M32/M128) eine RP6Control M32 (Stellung 32, 1 Jumper!) oder eine CCPro M128 Karte (Stellung 128, 2 Jumper!) zur Auswertung der Signale angeschlossen wird. Über JP10 (Stellung H) kann HSync mit SDA (für die RP6Base) verbunden werden. Wird JP11 geschlossen (Stellung OE), können die M32 oder M128 das Signal Odd/Even über XBUS IT3 auswerten. JP12 verbindet VSync entweder mit SCL (Stellung 6 für die RP6Base) oder mit XBUS IT2 (Stellung 32 für die M32). Eine Tabelle, die die Verbindungen der Sync-Signale zeigt, findet ihr unter "1.5.3 Verteilung der Sync-Signale".
 
Mit dem Jumper JP8 wird ausgewählt, ob man CSync (Stellung C) oder Burst (Stellung B) für die horizontale Synchronisation (HSync) verwenden möchte. JP9 bestimmt, ob an den 10-poligen I/O-Wannenstecker (I/O M32/M128) eine RP6Control M32 (Stellung 32, 1 Jumper!) oder eine CCPro M128 Karte (Stellung 128, 2 Jumper!) zur Auswertung der Signale angeschlossen wird. Über JP10 (Stellung H) kann HSync mit SDA (für die RP6Base) verbunden werden. Wird JP11 geschlossen (Stellung OE), können die M32 oder M128 das Signal Odd/Even über XBUS IT3 auswerten. JP12 verbindet VSync entweder mit SCL (Stellung 6 für die RP6Base) oder mit XBUS IT2 (Stellung 32 für die M32). Eine Tabelle, die die Verbindungen der Sync-Signale zeigt, findet ihr unter "1.5.3 Verteilung der Sync-Signale".
Zeile 288: Zeile 288:
 
[[bild:RP6_Exp_CMOSCamera_Step3_Bruecken.jpg]]
 
[[bild:RP6_Exp_CMOSCamera_Step3_Bruecken.jpg]]
  
Der LM 1881N wird nicht direkt eingelötet, sondern auf einen Sockel. Die Kerbe des Sockels kommt nach oben (in Richtung JP1,2). Es gibt wieder einige Drahtbrücken (14). Die graue Fläche ist eine größere Massefläche, die man mit Drähten und etwas Lötzinn herstellen kann, wenn alle Bauteile, die da dran sitzen, eingelötet sind. Der 4k7 Widerstand wird stehend eingesetzt. Der Stecker I/O M32/M128 ist ein 10-poliger Wannenstecker. Man kann ihn aber auch als 2-reihige Stiftleiste aufbauen. Hier wird auf einfache Weise mit Flachbandkabel eine Verbindung zum I/O-Stecker der Control M32 oder CCPro M128, die die Sync-Signale auswertet, hergestellt.
+
Der LM 1881N wird nicht direkt eingelötet, sondern auf einen Sockel gesetzt. Die Kerbe des Sockels kommt nach oben (in Richtung JP1,2). Es gibt wieder einige Drahtbrücken (14). Die graue Fläche ist eine größere Massefläche, die man mit Drähten und etwas Lötzinn herstellen kann, wenn alle Bauteile, die da dran sitzen, eingelötet sind. Der 4k7 Widerstand wird stehend eingesetzt. Der Stecker I/O M32/M128 ist ein 10-poliger Wannenstecker. Man kann ihn aber auch als 2-reihige Stiftleiste aufbauen. Hier wird auf einfache Weise mit Flachbandkabel eine Verbindung zum I/O-Stecker der Control M32 oder CCPro M128, die die Sync-Signale auswertet, hergestellt.
  
 
Viel Erfolg beim Aufbau!
 
Viel Erfolg beim Aufbau!
Zeile 294: Zeile 294:
 
'''Erster Funktionstest des Sync-Separators mit der RP6Control M32:'''
 
'''Erster Funktionstest des Sync-Separators mit der RP6Control M32:'''
  
* Jumper in die Standard-Stellung für die M32 bringen
+
* Jumper in die Standard-Stellung für die M32 bringen (Siehe Absatz "1.7.2 Jumper"!)
 
* I/O-Stecker der Exp mit dem der M32 verbinden (falls kein 10-poliges Flachkabel vorhanden ist, reicht es, nur Pin 8 zu verbinden!)
 
* I/O-Stecker der Exp mit dem der M32 verbinden (falls kein 10-poliges Flachkabel vorhanden ist, reicht es, nur Pin 8 zu verbinden!)
 
* Das [http://www.roboternetz.de/phpBB2/viewtopic.php?t=53021 RP6Control M32: Impulslängen-Meßgerät] in die M32 laden, vor dem Kompilieren in der Zeile "//#define FREQUENCY" die "//" entfernen, um die Frequenz zu messen.
 
* Das [http://www.roboternetz.de/phpBB2/viewtopic.php?t=53021 RP6Control M32: Impulslängen-Meßgerät] in die M32 laden, vor dem Kompilieren in der Zeile "//#define FREQUENCY" die "//" entfernen, um die Frequenz zu messen.
Zeile 310: Zeile 310:
 
Wie habe ich das auf der Exp gemessen?
 
Wie habe ich das auf der Exp gemessen?
  
  Antwort: ?
+
  Antwort: JP 9 nach ganz Rechts rücken
  
 
=== Alternativer Aufbau ===
 
=== Alternativer Aufbau ===
Zeile 365: Zeile 365:
  
 
So, jetzt sind wir am Ende unseres Hardware-Projekts angelangt. Für die Phase 4 müssen noch 5 Drahtbrücken eingesetzt werden. Der Transistor BC 556B schaltet die IR-LEDs gegen VCC über PG2. Maximal kann er 100 mA schalten, so dass wir mit den max. 40 mA für die IR-LEDs im sicheren Bereich liegen. '''Bitte aufpassen, dass PG2 nicht aus Versehen kurzgeschlossen wird, weil der Transistor dann u.U. zerstört wird.'''
 
So, jetzt sind wir am Ende unseres Hardware-Projekts angelangt. Für die Phase 4 müssen noch 5 Drahtbrücken eingesetzt werden. Der Transistor BC 556B schaltet die IR-LEDs gegen VCC über PG2. Maximal kann er 100 mA schalten, so dass wir mit den max. 40 mA für die IR-LEDs im sicheren Bereich liegen. '''Bitte aufpassen, dass PG2 nicht aus Versehen kurzgeschlossen wird, weil der Transistor dann u.U. zerstört wird.'''
 +
 +
So sieht die Endversion unseres Projekts bei mir aus:
 +
 +
[[bild:Phase4_B.JPG]]
 +
[[bild:Phase4_L.JPG]]
 +
 +
'''Erster Funktionstest der IR-LED-Ansteuerung mit der RP6Control M32:'''
 +
 +
* Jumper in die Standard-Stellung für die M32 bringen (Siehe Absatz "1.7.2 Jumper"!)
 +
* I/O-Stecker der Exp mit dem der M32 verbinden (falls kein 10-poliges Flachkabel vorhanden ist, reicht es, nur Pin 4 zu verbinden!)
 +
* Falls die Kamera-Platine mit den IR-LEDs noch nicht aufgebaut ist, kann man an PG2 eine LED mit passendem Vorwiderstand anschließen.
 +
* Jetzt ein Programm für die M32 schreiben, das den Pin IO_PC6 auf Ausgang umschaltet und dann in einer Endlosschleife toggelt. Die LED an PG2 muss dann im Rhythmus blinken.
  
 
=== Alternativer Aufbau ===
 
=== Alternativer Aufbau ===
Zeile 475: Zeile 487:
 
[[bild:Jumper_Standardstellung_4.jpg]]  
 
[[bild:Jumper_Standardstellung_4.jpg]]  
  
Dieses Bild zeigt die Jumper-Stellungen für die RP6Base, M32 und M128. Bei der RP6Base wird vorausgesetzt, dass man den ADC4 (an PG4) zur Auswertung des ADC-Video-Signals verwendet. Nimmt man stattdessen ADC0 oder ADC1 der RP6Base, müssen die Jumper JP3 und JP5 so wie bei der M32 oder M128 gesetzt werden. '''Die Jumper 1, 2, 4, 6 und 7 sind in dieser Abbildung NICHT berücksichtigt (als offen eingezeichnet!), weil sie abhängig von der gewünschten Kamera-Einstellung (Gamma: JP1, Gain: JP2) oder vom Software-Konzept (Level Clamp Diode: JP4 ODER Black Level Clamp: JP6 und JP7) gesetzt werden!'''
+
Dieses Bild zeigt die Jumper-Stellungen für die RP6Base, M32 und M128. Bei der RP6Base wird vorausgesetzt, dass man den ADC4 (an PG4) zur Auswertung des ADC-Video-Signals verwendet. Nimmt man stattdessen ADC0 oder ADC1 der RP6Base, müssen die Jumper JP3 und JP5 so wie bei der M32 oder M128 gesetzt werden. ''Bei der RP6Base bitte noch beachten: Der Jumper JP10 (Stellung H) darf erst aufgesteckt werden, wenn das Programm läuft! Nach dem Programmende oder nach einem Reset startet es evtl. wieder neu, wenn JP10 aufgesteckt bleibt. Daher sollte JP10 nach einem Programmabbruch immer wieder abgezogen werden! ''
 +
'''Die Jumper 1, 2, 4, 6 und 7 sind in dieser Abbildung NICHT berücksichtigt (als offen eingezeichnet!), weil sie abhängig von der gewünschten Kamera-Einstellung (Gamma: JP1, Gain: JP2) oder vom Software-Konzept (Level Clamp Diode: JP4 ODER Black Level Clamp: JP6 und JP7) gesetzt werden!'''
  
 
=== Verteilung der Sync-Signale und IR-LED Ansteuerung ===
 
=== Verteilung der Sync-Signale und IR-LED Ansteuerung ===
Zeile 566: Zeile 579:
 
==== Schwarzwert-Klemme ====
 
==== Schwarzwert-Klemme ====
  
Mit dieser Methode wird das ADC-Video-Signal durch eine aktive Klemme bestehend aus 2 Transistoren auf einen festen Wert "geklemmt". Das Oszillogramm im Absatz "1.3 Phase 3" zeigt dieses Signal. Auch hier wird der Schwarzwert annähernd auf GND-Pegel (0 V) festgehalten, indem der CSync-Impuls abgeschnitten wird. Einige Bildpunkte am linken Bildrand gehen verloren (ca. 2 µs vom Anfang des Zeileninhalts). Auch dieses "geklemmte" ADC-Video-Signal kann man gut mit einem ADC auswerten.
+
Mit dieser Methode wird das ADC-Video-Signal durch eine aktive Klemme bestehend aus 2 Transistoren auf einen festen Wert "geklemmt". Das Oszillogramm "AC-ADC-Video MIT Schwarzwert-Klemme (PG6)" im Absatz "1.3 Phase 3" zeigt dieses Signal. Auch hier wird der Schwarzwert annähernd auf GND-Pegel (0 V) festgehalten, indem der CSync-Impuls abgeschnitten wird. Einige Bildpunkte am linken Bildrand gehen verloren. Auch dieses "geklemmte" ADC-Video-Signal kann man gut mit einem ADC auswerten.
  
  
Zeile 572: Zeile 585:
  
 
Da dies ein "Mitmach-Projekt" sein soll, hoffe ich für die Programmierung einer Software für die RP6 Kamera, dass sich viele beteiligen und hier fleißig mitschreiben/bearbeiten!
 
Da dies ein "Mitmach-Projekt" sein soll, hoffe ich für die Programmierung einer Software für die RP6 Kamera, dass sich viele beteiligen und hier fleißig mitschreiben/bearbeiten!
 
== Grundlagen und erste Überlegungen ==
 
 
Auf Wikipedia (siehe Quelle1!) findet man gute Informationen zum Aufbau des BAS Signals, das auch unsere Kamera ausspuckt.
 
Sie ist zwar nicht sehr hochwertig, das Bildelement kann aber laut Datenblatt 352 x 288 Punkte darstellen, was für unsere Zwecke völlig ausreicht. Von den 260 TV-Zeilen, die ausgegeben werden, sind nur ca. 230 Zeilen auf einem Video-Monitor sichtbar.
 
 
Jede Zeile wird in 64 µs übertragen, davon sind nur 52 µs für den Bildinhalt vorgesehen. Für einen µC wie den ATMega32 ist das schon eine Herausforderung: Wollte er jeden der 352 Punkte der Zeile lesen, dann hätte er dafür rechnerisch knapp 0,15 µs Zeit. Beim RP6 dauert ein Taktzyklus 0,125 µs (bei 8 MHz Takt), bei der RP6Control M32 0,0625 µs (bei 16 MHz Takt). Mit der M32 hätte man also 2,4 Taktzyklen Zeit für jeden Punkt.
 
 
Man sieht schon, dass das nichts werden kann!
 
Es ist unmöglich, jeden Punkt der Zeile "live" einzulesen. Es stellt sich die Frage, wie viele Punkte man denn nun einlesen kann. Ich brauche dazu ja den Analog-Digitalwandler Eingang (ADC) des ATMega32, weil ich die Helligkeit jedes Punktes (also eine Spannung) lesen möchte.
 
 
Das Datenblatt zum ATMega32 sagt dazu:
 
Im "free running modus" (auf jede Messung folgt sofort die nächste) braucht jede Analog-Digitalwandlung 13 ADC-Taktzyklen. Das Ergebnis steht dann nach weiteren 0,5 ADC-Taktzyklen zur Verfügung. Was ist eigentlich der "ADC-Takt"? Man muss den Haupttakt des µC für den Analog-Digitalwandler teilen. Das Ergebnis ist dann der ADC-Takt. Der Maximalwert liegt laut Datenblatt bei 1 MHz für den ATMega32. Bei 13 ADC-Taktzyklen pro ADC-Wandlung dauert also jede Wandlung 13 µs.
 
 
Das heißt, dass man max. nur 4 Punkte pro Zeile (= 52 / 13) lesen kann. Das ist ja sehr schade! Man hätte dann kaum Auflösung.
 
 
Diese Feststellungen sind auch nicht vereinbar mit den Ergebnissen von radbruch (siehe Quelle2!), der viel mehr Punkte pro Zeile einlesen kann. Er verwendet als ADC-Takt 4 MHz, was weit außerhalb der Spezifikationen für den ATMega32 ist. Geht das überhaupt? Kann man mit einer Wandlungszeit von 3,25 µs (= 1 / 4 * 13 µs) realistische 8-Bit-Werte ermitteln? Immerhin würde man so rechnerisch auf eine Auflösung von 16 Punkten pro Zeile (= 52 / 3,25 µs) kommen.
 
 
Bevor wir die Fragen beantworten: Überlegen wir erst einmal weiter ...
 
 
Mit dem Einlesen der Punkte ist es noch nicht getan. Wir brauchen auch Zeit, um den gewandelten Wert in einer Byte-Variable zu speichern. Dafür stehen die jeweils 13 µs zur Verfügung, während der der ADC-Wandler mit der nächsten Wandlung beschäftigt ist. Bei 8 MHz Takt der RP6 Base sind das 104 Zyklen, in denen man das in GCC gut auch ohne Optimierung durch Assembler-Teile hinkriegt.
 
Wenn eine ADC-Wandlung nur 3,25 µs braucht, hat man bei der RP6 Base noch 26 Taktzyklen zur Verfügung. Auch das reicht noch aus, um in einer Schleife einen Byte-Wert nach jeder Wandlung zu speichern.
 
Wie groß kann denn ein Bild sein, mit dem der ATMega32 nicht überfordert ist? Er hat 2024 Byte SRAM, den Speicherplatz braucht er für Variablen und den Stack (Stapel). Wenn man kein sehr umfangreiches Programm mit vielen Variablen und Unterprogrammen hat, kann man vielleicht die Hälfte (1024 Byte) für ein Bild verwenden. Das wäre eine Auflösung bei 8 Bit Helligkeitswerten von 32 x 32 Punkten. Reduziert man die Helligkeitswerte auf 4 Bit (16 Graustufen), kann man 45 x 45 Bildpunkte darstellen.
 
Auf ein Seitenverhältnis von 4 : 3 des Fernsehbildes bezogen wären in 1024 Byte RAM Bilder von 36 x 28 (8 Bit) oder 52 x 39 (4 Bit) Punkten zu speichern.
 
16 Graustufen sind für die Aufgabe einer Kamera an einem µC gut ausreichend. Man kann damit Linien folgen und sogar eine einfache Orientierung im Raum erreichen.
 
 
Jetzt ist wohl eine Entscheidung fällig:
 
 
Ich entscheide mich dafür, eine Bildgröße von 52 x 39 Punkten mit 16 Graustufen zu erreichen.
 
 
Kann das klappen? Die 39 Zeilen mache ich dann aus ca. 230 sichtbaren Zeilen der Kamera (Zeilen 15..245). Ich würde also jede 6. Zeile (= 230 / 39) lesen. Jede Zeile dauert 64 µs, also beträgt der Abstand vom Ende der 1. bis zum Anfang der 6. Zeile 256 µs. Das ist genügend Zeit, um die Werte jeder Zeile zu verarbeiten (z.B. in eine Tabelle zu speichern).
 
Kritischer ist die Zeile selbst. Ich will 52 Punkte pro Zeile darstellen. Damit müßte ich jede µs einen Punkt einlesen. Selbst mit der hohen Übertaktung des ADC (4 MHz), die radbruch verwendet hat, komme ich nur auf 16 Punkte pro Zeile. Was tun? Ich könnte das 2. Halbbild benutzen. Bei meiner geringen Auflösung von 52 x 39 Pixeln kann ich ruhig wenige aufeinanderfolgende Zeilen als EINE Zeile betrachten. Wenn ich z.B. Zeilen 5 und 7 eines Halbbildes und Zeile 6 des anderen Halbbildes lesen würde, dann käme ich auf 16 x 3 = 48 Punkte. Natürlich müßte ich nach der Zeile 5 die Zeilen 6 und 7 um je 1,08 µs (= 3,25 / 3) versetzt lesen, damit ich in meiner "dicken Zeile" (besteht aus 3 echten Zeilen!) 48 Punkte (= 16 x 3) lesen kann. Das kommt dem Ziel von 52 Punkten pro Zeile schon nahe.
 
 
Bevor ich das als Methode feststampfe, noch eine letzte Überlegung:
 
 
Wie wäre es, wenn ich das zeitkritische Lesen einer Zeile vermeide und nur Spalten lese? Das hat radbruch auch in seiner Software gemacht und klingt erfolgversprechend.
 
Ich würde also wie beim 1. Ansatz jede 6. Zeile lesen, um meine vertikale Zeilenauflösung von 39 Zeilen zu erreichen. Das mache ich dann 52 mal, indem ich in jedem Halbbild das Lesen der Zeilenpunkte um 1 µs verzögere. Ich lese also mein Bild spaltenweise ein. Eindeutiger Vorteil: Ich komme nicht in Zeitdruck beim Einlesen, weil ich nur alle 64 µs einen Punkt lesen muss. Nachteil: Ich brauche 52 Halbbilder Zeit, um mein Bild mit allen Zeilenpunkten komplett eingelesen zu haben. Das ist über eine Sekunde.
 
 
Schlimm ist das nicht: Ein Bild pro Sekunde ist besser als Nichts. Beim 1. Ansatz wäre das komplette Bild in 60 ms "im Kasten", also 17x schneller.
 
 
Hier braucht's wohl wieder eine Entscheidung:
 
 
Ich entscheide mich für den 1. Ansatz, der nach 3 Halbbildern fertig ist. Grund: Ich will ja z.B. einer Linie folgen, da kann eine Abtastrate von 1 Sekunde schon zu wenig sein. Sicher könnte man das auch mit der 2. Methode des Spaltenlesens schaffen, wenn man nur wenige Spalten liest und die Kamera um 90° dreht. Ich möchte aber nicht die Kameraposition ändern, sondern immer mein ganzes Bild lesen und verarbeiten. Das ermöglicht mir, im selben Programm einer Linie zu folgen, aber auch einen hellen Gegenstand in der Ferne zu "sehen". Ist sicher Geschmackssache ...
 
 
... Baustelle! Hier wird noch weiter gedacht!  ..........
 
  
 
== Die Synchronisations-Signale ==
 
== Die Synchronisations-Signale ==
  
Die Darstellung jeder Zeile wird durch die horizontale Synchronisation ermöglicht.
+
Die Darstellung jeder Zeile wird durch die '''horizontale Synchronisation''' ermöglicht.
  
 
[[bild:BAS-Zeilensynchronisation.jpg]]  
 
[[bild:BAS-Zeilensynchronisation.jpg]]  
Zeile 634: Zeile 602:
  
  
In diesem Bild zeige ich einen Teil der vertikalen Synchronisation, und zwar ab der fallenden Flanke von VSync des Sync-Separators. Könnt ihr sie in der Grafik unten (Zeile Video oder CSync) wiederfinden?
+
In diesem Bild zeige ich einen Teil der '''vertikalen Synchronisation''', und zwar ab der fallenden Flanke von VSync des Sync-Separators. Könnt ihr sie in der Grafik unten (Zeile Video oder CSync) wiederfinden?
 +
 
 +
Vertikale Synchronimpulse ab VSync:
  
 
[[bild:Video_PG6_VSync.jpg]]
 
[[bild:Video_PG6_VSync.jpg]]
Zeile 640: Zeile 610:
 
[[bild:BAS-Bildsynchronisation.jpg]]  
 
[[bild:BAS-Bildsynchronisation.jpg]]  
  
Dieses Bild zeigt die vertikale Bildsynchronisation. Das ist die Abfolge von Signalen, die zwischen den einzelnen Halbbildern gesendet werden. Auch unsere Kamera sendet diese Halbbilder (Datenblatt: "2:1 Interlace").
+
Dieses Bild zeigt die vertikale Bildsynchronisation. Das ist die Abfolge von Signalen, die zwischen den einzelnen Halbbildern oder Seiten gesendet werden. Auch unsere Kamera sendet diese Halbbilder/Seiten (Datenblatt: "2:1 Interlace").
  
In der oberen Bildhälfte ist die vertikale Synchronisation zwischen den geraden (even) und ungeraden (odd) Halbbildern dargestellt. Das ungerade Halbbild ("Field 1") enthält die Zeilen 1, 3 ... 257, 259. Das gerade Halbbild ("Field 2") enthält die Zeilen 2, 4 ... 258, 260.
+
'''ANMERKUNG:''' In diesem Abschnitt werden die Begriffe ''Halbbild'' und ''Seite'' synonym gebraucht.
 +
Das BAS-Signal unserer Kamera kann auf einem klassischen (analogen) Monitor als zwei Halbbilder
 +
dargestellt werden, wobei die Zeilen des einen in die des anderen Halbbildes verschachtelt
 +
gezeigt werden. Auf einem modernen digitalen Monitor können auch stattdessen zwei vollständige
 +
Seiten nacheinander zu sehen sein.
  
In der unteren Bildhälfte ist die vertikale Synchronisation zwischen den ungeraden (odd) und geraden (even) Halbbildern dargestellt.
+
In der oberen Bildhälfte ist die vertikale Synchronisation zwischen den geraden (even, field 2) und ungeraden (odd, field 1) Halbbildern dargestellt, in der unteren Bildhälfte die vertikale Synchronisation zwischen den ungeraden (odd) und geraden (even) Halbbildern.
  
 
Für die Auswertungs-Software ist natürlich wichtig, wie man mit den vertikalen Sync-Signalen Halbbilder und Zeilen ansteuern kann:
 
Für die Auswertungs-Software ist natürlich wichtig, wie man mit den vertikalen Sync-Signalen Halbbilder und Zeilen ansteuern kann:
  
Die Frage, ob es sich aktuell um ein ungerades oder gerades Halbbild handelt, beantwortet Odd/Even des Sync-Separators: Ist Odd/Even HI, liegt ein ungerades Halbbild (Zeilen 1, 3, ...) vor, sonst ein gerades Halbbild (Zeilen 2, 4, ...). Bei der RP6Base, die in der jetzigen Planung Odd/Even nicht auswerten kann (nicht angeschlossen!), kann man sich helfen, indem man eine Variable immer dann toggelt (1-2-1-2...), wenn ein VSync-Impuls kommt. Dadurch weiß man zwar nicht, ob man aktuell wirklich ein gerades oder ungerades Halbbild liest, aber letztlich ist das auch nicht so wichtig: Zwei Folgebilder werden sich nicht so dramatisch unterscheiden.
+
Die Frage, ob es sich aktuell um ein ungerades oder gerades Halbbild handelt, beantwortet Odd/Even des Sync-Separators: Ist Odd/Even HI, liegt ein ungerades Halbbild vor, sonst ein gerades Halbbild. Bei der RP6Base, die in der jetzigen Planung Odd/Even nicht auswerten kann (nicht angeschlossen!), kann man sich helfen, indem man eine Variable immer dann toggelt (1-2-1-2...), wenn ein VSync-Impuls kommt. Dadurch weiß man zwar nicht, ob man aktuell wirklich ein gerades oder ungerades Halbbild liest, aber letztlich ist das auch nicht so wichtig: Zwei Folgebilder werden sich nicht so dramatisch unterscheiden.
  
 
Wenn man aber ohne das Odd/Even-Signal doch wissen will, auf welcher Seite man gerade ist, dann geht das mit der Felderkennung.
 
Wenn man aber ohne das Odd/Even-Signal doch wissen will, auf welcher Seite man gerade ist, dann geht das mit der Felderkennung.
Zeile 662: Zeile 636:
 
Das heißt in unserer Landessprache: '''16 positive oder negative Flanken nach dem VSync-Signal des LM 1881N (nach dessen fallender Flanke!) findet sich der Anfang der Zeile 14 jedes Halbbildes.'''
 
Das heißt in unserer Landessprache: '''16 positive oder negative Flanken nach dem VSync-Signal des LM 1881N (nach dessen fallender Flanke!) findet sich der Anfang der Zeile 14 jedes Halbbildes.'''
  
Warum gerade die Zeile 14? Die Zeilen bis 13 werden nicht benutzt, danach kommt der Datenbereich (Untertitel, Videotext ...) ab Zeile 14 bis Zeile 21. Erst ab Zeile 22,5 sind im PAL-System Bildinformationen zu erwarten.
+
Abgesehen davon, dass diese Angabe auch nur auf NTSC zutrifft: Warum gerade die Zeile 14? Die Zeilen bis 13 werden nicht benutzt, danach kommt der Datenbereich (Untertitel, Videotext ...) ab Zeile 14 bis Zeile 21. Erst ab Zeile 22,5 sind im PAL-System Bildinformationen zu erwarten.
  
 
Wie ist das denn bei unserer Kamera?
 
Wie ist das denn bei unserer Kamera?
  
Leider ist bei unserer Kamera alles anders als beim Standard-PAL, wie der Blick auf den Oszi-Bildschirm zeigt. Im Datenblatt der Kamera sind 260 TV-Zeilen angegeben.
+
Leider ist bei unserer Kamera einiges anders als beim Standard-PAL, wie der Blick auf den Oszi-Bildschirm zeigt. Im Datenblatt der Kamera sind 260 TV-Zeilen angegeben, tatsächlich sind es 288.
 
Hier das Ganze 'mal als Grafik:
 
Hier das Ganze 'mal als Grafik:
  
 
[[bild:BAS-Vertikalaustastung_C-Cam-A.jpg]]  
 
[[bild:BAS-Vertikalaustastung_C-Cam-A.jpg]]  
  
Die erste Zeile mit Bildinhalt findet sich im 1. (ungeraden) Halbbild an Zeilen-Position 18. Zählt man die steigenden Flanken nach dem VSync-Signal, dann befindet man sich nach 21 Flanken an der 17. Zeilen-Position und muss nur noch auf den nächsten HSync-Impuls warten, um die 1. Bildzeile einzulesen.
+
Die erste Zeile mit Bildinhalt findet sich im 1. Halbbild an Zeilen-Position 18. Zählt man die fallenden oder steigenden Flanken nach dem VSync-Signal, dann befindet man sich nach 22 Flanken an der 18. Zeilen-Position. Die letzte Zeile dieser 1. Seite (288) findet man nach 309 Flanken.  
  
Im 2. (geraden) Halbbild findet sich die Zeile 2 (1. Zeile des 2. Halbbildes!) an Zeilen-Position 17 (Gerber-Zählung: 168). Zählt man die steigenden Flanken nach dem VSync-Signal, dann befindet man sich nach 20 Flanken an der 16. Zeilen-Position (167) und muss nur noch auf den nächsten HSync-Impuls warten, um die Zeile 2 einzulesen.
+
Im 2. Halbbild findet sich die 1. Zeile an Zeilen-Position 17 (Gerber-Zählung: 330). Zählt man die Flanken nach dem VSync-Signal, dann befindet man sich nach 21 Flanken an dieser Zeilen-Position. Die letzte Zeile (288) dieser 2. Seite findet man nach 308 Flanken.
  
Man braucht also nur direkt nach der fallenden Flanke von VSync die CSync-Flanken (Achtung: Die angegebenen Werte beziehen sich nur auf die steigenden Flanken!) zu zählen, um eine beliebige Zeile zu wählen.
+
Man braucht also nur direkt nach der fallenden Flanke von VSync die CSync-Flanken zu zählen, um eine beliebige Zeile zu wählen.
Bei unseren 130 Zeilen pro Halbbild kann man eine beliebige Zeile [1..130] mit der Formel:
+
Eine beliebige Zeile [1..288] kann man mit der Formel:
  
  1. Halbbild: Flankenzahl (steigend) = Zeile + 21
+
  1. Halbbild: Zeile = Flankenzahl - 21
  2. Halbbild: Flankenzahl (steigend) = Zeile + 20
+
  2. Halbbild: Zeile = Flankenzahl - 20
  
... ansteuern.
+
... ansteuern, wobei der Bereich von Flankenzahl auf der 1. Seite zwischen 22 und 309, auf der 2. Seite zwischen 21 und 308 liegt.
 +
 
 +
== Grundlagen und erste Überlegungen ==
 +
 
 +
Auf Wikipedia (siehe Quelle1!) findet man gute Informationen zum Aufbau des BAS Signals, das auch unsere Kamera ausspuckt.
 +
Sie ist zwar nicht sehr hochwertig, das Bildelement kann aber laut Datenblatt 352 x 288 Punkte darstellen, was für unsere Zwecke völlig ausreicht. Von den 260 TV-Zeilen, die ausgegeben werden, sind nur ca. 230 Zeilen auf einem Video-Monitor sichtbar.
 +
 
 +
Jede Zeile wird in 64 µs übertragen, davon sind nur 52 µs für den Bildinhalt vorgesehen. Für einen µC wie den ATMega32 ist das schon eine Herausforderung: Wollte er jeden der 352 Punkte der Zeile lesen, dann hätte er dafür rechnerisch knapp 0,15 µs Zeit. Beim RP6 dauert ein Taktzyklus 0,125 µs (bei 8 MHz Takt), bei der RP6Control M32 0,0625 µs (bei 16 MHz Takt). Mit der M32 hätte man also 2,4 Taktzyklen Zeit für jeden Punkt.
 +
 
 +
Man sieht schon, dass das nichts werden kann!
 +
Es ist unmöglich, jeden Punkt der Zeile "live" einzulesen. Es stellt sich die Frage, wie viele Punkte man denn nun einlesen kann. Ich brauche dazu ja den Analog-Digitalwandler Eingang (ADC) des ATMega32, weil ich die Helligkeit jedes Punktes (also eine Spannung) lesen möchte.
 +
 
 +
Das Datenblatt zum ATMega32 sagt dazu:
 +
Im "free running modus" (auf jede Messung folgt sofort die nächste) braucht jede Analog-Digitalwandlung 13 ADC-Taktzyklen. Das Ergebnis steht dann nach weiteren 0,5 ADC-Taktzyklen zur Verfügung. Was ist eigentlich der "ADC-Takt"? Man muss den Haupttakt des µC für den Analog-Digitalwandler teilen. Das Ergebnis ist dann der ADC-Takt. Der Maximalwert liegt laut Datenblatt bei 1 MHz für den ATMega32. Bei 13 ADC-Taktzyklen pro ADC-Wandlung dauert also jede Wandlung 13 µs.
 +
 
 +
Das heißt, dass man max. nur 4 Punkte pro Zeile (= 52 / 13) lesen kann. Das ist ja sehr schade! Man hätte dann kaum Auflösung.
 +
 
 +
Diese Feststellungen sind auch nicht vereinbar mit den Ergebnissen von radbruch (siehe Quelle2!), der viel mehr Punkte pro Zeile einlesen kann. Er verwendet als ADC-Takt 4 MHz, was weit außerhalb der Spezifikationen für den ATMega32 ist. Geht das überhaupt? Kann man mit einer Wandlungszeit von 3,25 µs (= 1 / 4 * 13 µs) realistische 8-Bit-Werte ermitteln? Immerhin würde man so rechnerisch auf eine Auflösung von 16 Punkten pro Zeile (= 52 / 3,25 µs) kommen.
 +
 
 +
Bevor wir die Fragen beantworten: Überlegen wir erst einmal weiter ...
 +
 
 +
Mit dem Einlesen der Punkte ist es noch nicht getan. Wir brauchen auch Zeit, um den gewandelten Wert in einer Byte-Variable zu speichern. Dafür stehen die jeweils 13 µs zur Verfügung, während der der ADC-Wandler mit der nächsten Wandlung beschäftigt ist. Bei 8 MHz Takt der RP6 Base sind das 104 Zyklen, in denen man das in GCC gut auch ohne Optimierung durch Assembler-Teile hinkriegt.
 +
Wenn eine ADC-Wandlung nur 3,25 µs braucht, hat man bei der RP6 Base noch 26 Taktzyklen zur Verfügung. Auch das reicht noch aus, um in einer Schleife einen Byte-Wert nach jeder Wandlung zu speichern.
 +
Wie groß kann denn ein Bild sein, mit dem der ATMega32 nicht überfordert ist? Er hat 2024 Byte SRAM, den Speicherplatz braucht er für Variablen und den Stack (Stapel). Wenn man kein sehr umfangreiches Programm mit vielen Variablen und Unterprogrammen hat, kann man vielleicht die Hälfte (1024 Byte) für ein Bild verwenden. Das wäre eine Auflösung bei 8 Bit Helligkeitswerten von 32 x 32 Punkten. Reduziert man die Helligkeitswerte auf 4 Bit (16 Graustufen), kann man 45 x 45 Bildpunkte darstellen.
 +
Auf ein Seitenverhältnis von 4 : 3 des Fernsehbildes bezogen wären in 1024 Byte RAM Bilder von 36 x 28 (8 Bit) oder 52 x 39 (4 Bit) Punkten zu speichern.
 +
16 Graustufen sind für die Aufgabe einer Kamera an einem µC gut ausreichend. Man kann damit Linien folgen und sogar eine einfache Orientierung im Raum erreichen.
 +
 
 +
Jetzt ist wohl eine Entscheidung fällig:
 +
 
 +
Ich entscheide mich dafür, eine Bildgröße von 52 x 39 Punkten mit 16 Graustufen zu erreichen.
 +
 
 +
Kann das klappen? Die 39 Zeilen mache ich dann aus ca. 230 sichtbaren Zeilen der Kamera (Zeilen 15..245). Ich würde also jede 6. Zeile (= 230 / 39) lesen. Jede Zeile dauert 64 µs, also beträgt der Abstand vom Ende der 1. bis zum Anfang der 6. Zeile 256 µs. Das ist genügend Zeit, um die Werte jeder Zeile zu verarbeiten (z.B. in eine Tabelle zu speichern).
 +
Kritischer ist die Zeile selbst. Ich will 52 Punkte pro Zeile darstellen. Damit müßte ich jede µs einen Punkt einlesen. Selbst mit der hohen Übertaktung des ADC (4 MHz), die radbruch verwendet hat, komme ich nur auf 16 Punkte pro Zeile. Was tun? Ich könnte das 2. Halbbild benutzen. Bei meiner geringen Auflösung von 52 x 39 Pixeln kann ich ruhig wenige aufeinanderfolgende Zeilen als EINE Zeile betrachten. Wenn ich z.B. Zeilen 5 und 7 eines Halbbildes und Zeile 6 des anderen Halbbildes lesen würde, dann käme ich auf 16 x 3 = 48 Punkte. Natürlich müßte ich nach der Zeile 5 die Zeilen 6 und 7 um je 1,08 µs (= 3,25 / 3) versetzt lesen, damit ich in meiner "dicken Zeile" (besteht aus 3 echten Zeilen!) 48 Punkte (= 16 x 3) lesen kann. Das kommt dem Ziel von 52 Punkten pro Zeile schon nahe.
 +
 
 +
Bevor ich das als Methode feststampfe, noch eine letzte Überlegung:
 +
 
 +
Wie wäre es, wenn ich das zeitkritische Lesen einer Zeile vermeide und nur Spalten lese? Das hat radbruch auch in seiner Software gemacht und klingt erfolgversprechend.
 +
Ich würde also wie beim 1. Ansatz jede 6. Zeile lesen, um meine vertikale Zeilenauflösung von 39 Zeilen zu erreichen. Das mache ich dann 52 mal, indem ich in jedem Halbbild das Lesen der Zeilenpunkte um 1 µs verzögere. Ich lese also mein Bild spaltenweise ein. Eindeutiger Vorteil: Ich komme nicht in Zeitdruck beim Einlesen, weil ich nur alle 64 µs einen Punkt lesen muss. Nachteil: Ich brauche 52 Halbbilder Zeit, um mein Bild mit allen Zeilenpunkten komplett eingelesen zu haben. Das ist über eine Sekunde.
 +
 
 +
Schlimm ist das nicht: Ein Bild pro Sekunde ist besser als Nichts. Beim 1. Ansatz wäre das komplette Bild in 60 ms "im Kasten", also 17x schneller.
 +
 
 +
Hier braucht's wohl wieder eine Entscheidung:
 +
 
 +
Ich entscheide mich für den 1. Ansatz, der nach 3 Halbbildern fertig ist. Grund: Ich will ja z.B. einer Linie folgen, da kann eine Abtastrate von 1 Sekunde schon zu wenig sein. Sicher könnte man das auch mit der 2. Methode des Spaltenlesens schaffen, wenn man nur wenige Spalten liest und die Kamera um 90° dreht. Ich möchte aber nicht die Kameraposition ändern, sondern immer mein ganzes Bild lesen und verarbeiten. Das ermöglicht mir, im selben Programm einer Linie zu folgen, aber auch einen hellen Gegenstand in der Ferne zu "sehen". Ist sicher Geschmackssache ...
 +
 
 +
... Baustelle! Hier wird noch weiter gedacht!  ..........
  
 
== Software-Projekte ==
 
== Software-Projekte ==
Zeile 697: Zeile 716:
  
 
Wer schreibt ein Programm (egal für die PP6Base, M32 oder M128 und egal ab welcher Phase des Aufbaus), das anzeigt, wie viele Zeilen unsere Kamera wirklich ausgibt? Sind es wirklich 260 wie das Datenblatt sagt bzw. auf jeder Halbseite 130?
 
Wer schreibt ein Programm (egal für die PP6Base, M32 oder M128 und egal ab welcher Phase des Aufbaus), das anzeigt, wie viele Zeilen unsere Kamera wirklich ausgibt? Sind es wirklich 260 wie das Datenblatt sagt bzw. auf jeder Halbseite 130?
 +
 +
Eine Anregung dazu: [http://www.roboternetz.de/phpBB2/viewtopic.php?t=54190 RP6Control M32: Video Zeilenzähler 1]
  
 
=== Wie kann ein "Graukeil" auf dem Terminal aussehen? ===
 
=== Wie kann ein "Graukeil" auf dem Terminal aussehen? ===
Zeile 705: Zeile 726:
 
Wer schreibt ein Programm, das einen "Graukeil" auf dem Terminal ausgibt?
 
Wer schreibt ein Programm, das einen "Graukeil" auf dem Terminal ausgibt?
  
 +
=== Wer stellt einen Video-Grabber vor? ===
 +
 +
Ein Video-Grabber holt den Inhalt eines Videobildes aus dem Video Stream und stellt ihn irgendwie dar.
 +
 +
Eine Anregung für die RP6Base: [http://www.roboternetz.de/phpBB2/viewtopic.php?t=54071 RP6Base: Video Grabber 1]
 +
 +
... und für die RP6Control M32: [http://www.roboternetz.de/phpBB2/viewtopic.php?t=54044 RP6Control M32: Video Grabber 1]
 +
 +
=== Erkennung des Syncs mit dem internen Analogkomparator ===
 +
 +
Zusätzlich benötigte Hardware: Ein Poti zum Einstellen des Sync-Pegels
 +
 +
[http://www.roboternetz.de/community/threads/29906-Minimall%F6sung-Kamera-f%FCr-den-RP6/page10?p=520992&viewfull=1#post520992 Umsetzung in Bascom]
 +
 +
 +
Es geht sicher noch viel besser!
  
 
= Quellen =
 
= Quellen =
Zeile 716: Zeile 753:
 
;Quelle8: [http://www.soselectronic.com/a_info/resource/pdf/king/l-53f3bt.pdf IR-LED L-53F3BT Datasheet]
 
;Quelle8: [http://www.soselectronic.com/a_info/resource/pdf/king/l-53f3bt.pdf IR-LED L-53F3BT Datasheet]
  
 +
 +
=Siehe auch=
 +
* [[RP6]]
 +
* [[RP6 - Programmierung]]
 +
* [[RP6v2]]
 +
* [[RP6 Sensor Board und Xtra Module]]
 +
* [[RP6v2_I2C-Portexpander]]
 +
* [[RP6v2 USB-RS232-Adapter]]
 +
* [[RP6v2 Orientierung]]
 +
* [[RP6 Multi IO Projekt]]
 +
* [[RP6 Multi IO Projekt - Software]]
 +
* [[RP6 ArduIO]]
 +
* [[RP6 ArduIO - Software]]
 +
* [[Induktive_Ladestation_f%C3%BCr_den_RP6|Induktive Ladestation für den RP6]]
 +
* [[IR-bake_f%C3%BCr_den_RP6|IR-bake für den RP6]]
 +
* [[CCRP5]]
 +
* [[Yeti]]
 +
* [[Asuro]]
 +
* [[C't-Bot]]
 +
 +
<br/><br/>
 +
 +
=Autoren=
 +
--[http://www.roboternetz.de/community/members/1972-Dirk Dirk] 13:36, 11. Jan 2015 (CET)
  
  
--[[Benutzer:Dirk|Dirk]] 03:22, 22. Apr 2010 (CET)
+
[[Kategorie:Elektronik]]
 +
[[Kategorie:Projekte]]

Aktuelle Version vom 11. Januar 2015, 13:36 Uhr

Phase4 B.JPG

RP6 Kamera - Mitmach-Projekt: Hardware

Kategorie:Projekte

In diesem "Mitmach-Projekt" soll in den nächsten Monaten eine Experimentierplatine (CONRAD 191537) für den RP6 "gebaut" werden, mit der eine CMOS-Kamera an den RP6 angeschlossen werden kann. Die Teile, die man für das ganze Projekt braucht, kosten beim großen C ca. 62,- €. Natürlich gibt es auch andere Versender, bei denen es evtl. günstiger wird.

Wer mitmachen will, kann zu jeder Zeit selbst entscheiden, wann er aus dem Projekt aussteigen möchte, weil es in 4 Abschnitten ("Phasen") vorgestellt wird. Jede Phase ist ohne die nachfolgenden Abschnitte funktionsfähig.

Im RN-Forum hat radbruch mit der Minimallösung: Kamera für den RP6 schon eine einfache und tolle Lösung vorgestellt, mit der der RP6 "sehen" kann. Radbruch hat das eine "Minimallösung" genannt, weil keine weitere Hardware zum Anschluß der Kamera benutzt wurde. Dennoch war das wegen der gut beschriebenen Software-Entwicklung durchaus keine Minimallösung!

In diesem Projekt soll auf der Experimentierplatine (Exp) eine Schaltung "zum Mitmachen" in 4 Schritten aufgebaut werden. Man könnte das dann (wenn es 'mal fertig ist ...) als "Midi-Lösung" für eine Kamera für den RP6 bezeichnen.

So werden die 4 Phasen aussehen:

  • Phase 1 -> Anschluß der CMOS-Kamera an den RP6 mit CINCH-Buchse zum Anschluß eines Video-Monitors
  • Phase 2 -> Aufbau eines zweifach Video-Verstärkers zur Verbesserung der Qualität
  • Phase 3 -> Aufbau eines Sync-Separators zur Abtrennung der Synchronisations-Signale
  • Phase 4 -> Anbau von schaltbaren IR-LEDs

Der Aufbau wird so universell wie möglich sein, d.h. eine Auswertung der Kamera kann sowohl mit der Software von radbruch mit dem RP6 erfolgen (schon in Phase 1!), als auch mit der RP6Control M32. Auch an die CCPro M128 wurde hardwaremäßig gedacht,- ob man mit ihr auch eine Video-Auswertung hinbekommt, habe ich nicht probiert.

Was braucht man allgemein für den Aufbau einer Schaltung auf der Exp:

  • Seitenschneider, Schere, Zange
  • Kleinbohrer 1,5 ... 2,5 mm (zur Platinenbearbeitung)
  • Lötkolben 25..30 Watt, Lötzinn
  • Plastik 70 Schutzlack (CONRAD 813621)
  • Isolierter Schaltdraht YV 0,20 mm² (CONRAD 606065)
  • Versilberter CU-Draht 0,6 mm (CONRAD 605581)
  • Isolierte Kupferlitze in verschiedenen Farben (z.B. CONRAD 605808, rot)

Mit dem versilberten CU-Draht stellt man auf der Unterseite (= Lötseite) der Exp Verbindungen zwischen den Bauteilen her; mit dem isolierten Schaltdraht werden Drahtbrücken auf der Oberseite (= Bestückungsseite) der Exp eingesetzt. Die Lage der Verbindungen zeige ich im Bestückungsplan jeder Phase. Man muss sich nicht an die genaue Lage der Verbindungen halten.

Wenn man die Drähte und Bauteile an anderen Positionen einlötet, kann es aber sein, dass man die nächste Phase nicht mehr so aufbauen kann, wie ich das hier zeige! Möglicherweise sind die weiteren Teile dann nur noch mit einer "wilden" Freiverdrahtung machbar!

Phase 1

In der Phase 1 werden Steckkontakte auf die Exp gelötet, an die die Kamera mit einem kurzen Kabel angeschlossen wird. An einer CINCH-Buchse kann das Videosignal abgenommen werden, um zu sehen, was der RP6 sehen sollte. Mit dieser Ausbaustufe kann man eine Auswertung des Bildes genau wie radbruch per Software machen. Für den RP6 existiert dafür die Software im RN-Forum, für die M32 müßte man sie noch etwas anpassen.

Man braucht folgende Bauteile (43,01€ inkl. Versand CONRAD) für die 1. Phase:

Anzahl Bestell-Nr. Bauteil-Bezeichnung:
1 191537 RP6 Experimentierplatine
1 150001 CMOS-Kameramodul 1
1 738699 CINCH Einbaukupplung gelb
1 741119 1-reihige Stiftleiste RM 2,54mm (36-polig)
1 742902 Zwei Codierbrücken (aus Set)
1 500812 Keramik Kondensator 100 nF
1 472360 Elektrolyt Kondensator 100 uF/16 V

Hier erst einmal der Schaltplan:

RP6 CMOSCamera SP 1.jpg

Und dann der Bestückungsplan:

RP6 Exp CMOSCamera Step1 Bruecken.jpg

Die Schaltung wird in der rechten oberen Ecke der Exp aufgebaut (keine Angst: Der übrige Platz wird noch gebraucht!). Für die CINCH-Buchse muss man drei Löcher 1,6 mm für Haltestifte bohren (Kreise auf dem Plan!). Die 2 Kontakte der Buchse haben eine Breite von ebenfalls 1,6 mm,- man sollte aber mit vielleicht 2 mm bohren und die Kontaktzungen auf der Lötseite umbiegen. Es ist gut, die Buchse vor dem Verlöten noch festzukleben.

CINCH B.jpg CINCH L.jpg

Wenn man die Platine nicht bearbeiten kann oder will, sollte man anstelle der Einbaubuchse eine gelbe CINCH-Kupplung (731080) bestellen, die mit kurzen Kabeln (am besten einem kurzen abgeschirmten Kabel von einem alten CINCH-Kabel) angeschlossen wird.

Wenn die CINCH-Einbaukupplung fest sitzt, geht es an den weiteren Aufbau:

  • Die dicken schwarzen Verbindungen werden auf der Lötseite (unten) mit blankem Draht 0,6 mm hergestellt. Man lötet sie an wenigen Punkten an, aber nicht dort, wo noch ein Bauteil oder eine Drahtbrücke von oben durchgesteckt werden soll!
  • Die dünneren schwarzen Verbindungen befinden sich auch auf der Lötseite der Platine. Sie werden hauptsächlich mit den Drähten der von oben eingesteckten Bauteile und der Drahtbrücken hergestellt.
  • Die rechteckigen Felder sind die Stiftleisten (1x 5-polig und 5x 2-polig), die man ebenfalls (von oben) aufsetzt.
  • Die zwei rot eingezeichneten Drahtbrücken entstehen aus isoliertem Draht und verlaufen auf der Oberseite der Platine. An dem Loch, wo sie enden, werden sie nach unten auf die Lötseite geführt. Man isoliert sie so weit ab, dass man auf der Unterseite das nächstgelegene Bauteil erreicht.
  • Jetzt werden die beiden Kondensatoren eingelötet. Der Elektrolyt Kondensator (Elko) muss richtig herum eingesetzt werden (im Plan ist ein Plus + zu sehen, auf dem Elko ist aber meist der Minuspol markiert).
  • Das CMOS-Kameramodul schließt man jetzt an die 5-polige Stiftleiste an. Die Kontakte auf der Exp haben die gleiche Anordnung wie die Stifte an der Kamera. Die Verbindung sollte nicht länger als 10 cm sein. Die Verbindung kann man löten, aber auch mit 5-poligen Stiftbuchsen steckbar machen. Die Kontakte "V out" und "GND" stellt man am besten mit einem abgeschirmten Kabel (von einem alten CINCH-Kabel) her,- die Abschirmung ist dann GND.

Hier noch ein Bild von den beiden Video-Kabeln, die man sich anfertigen kann:

Videokabel.jpg Videokabel SP.jpg

Ein Kabel dient zum Anschluß der Kamera (5-polig mit Abschirmung für das Video-Signal). Das andere abgeschirmte Kabel verbindet einen der ADC-Video-Ausgänge (PG3, PG5, PG6) mit einem ADC-Eingang der RP6Base (PG4) oder der M32 oder M128 (ADC-Wannenstecker). Ein 2-adriges Kabel wird zusätzlich für die IR-LEDs benötigt. Alle Kabel sind steckbar. Hinweis: Es geht bei den kurzen Kabeln auch ohne die Abschirmung. Man sollte die Kabel dann aber verdrillen.

So weit dieser erste Abschnitt. Testen, ob alles funktioniert, kann man mit der Software von radbruch (Link siehe oben!)

Viel Erfolg!

Was bleibt noch:

  • Es gibt 2 Codierstecker JP1 und JP2. Zunächst braucht man auf die 2-poligen Stiftleisten keine Codierbrücken (= Jumper) zu setzen. Steckt man bei JP1 einen Jumper auf, wird der Pin "Gamma" der Kamera auf GND gelegt. Laut Anleitung der Kamera ist damit Gamma = 1 gesetzt (sonst 0,45). Setzt man auf JP2 einen Jumper, wird die "Gain" (= Verstärkung) reduziert.
  • Die Stiftleisten mit dem Namen PGx sind Plugs (= Stecker). Da darf man auf keinen Fall Jumper aufstecken! Hier wird ein Signal ausgegeben oder eingespeist. An PG1 wird die Kamera angeschlossen, PG2 soll einmal in Phase 4 für IR-LEDs dienen. An PG3 kann man das Videosignal abnehmen und an PG4 über eine lose Drahtverbindung (am besten abgeschirmt!) wieder einspeisen. PG4 ist an IT1 des XBUS angeschlossen, das ist der ADC-Eingang 4 (PA4) der RP6 Base (E_INT1). Dieser ADC-Eingang soll die Helligkeit der Bildpunkte auswerten.
  • Wenn man keinen Monitor an die CINCH-Buchse angeschlossen hat und das Videosignal mit IT1 verbindet, sollte man einen 75 Ohm Widerstand statt dem Monitor an die CINCH-Buchse anschließen, damit der RP6 das Videosignal mit der Software von radbruch auswerten kann.
  • Alternativen zu ADC4 der RP6 Base: Man kann auch ADC0 oder ADC1 nehmen (verfügbar auf dem RP6 Mainboard). Auch die M32 kann schon arbeiten: ADC2..7 sind frei und freuen sich auf diese Aufgabe!

So könnte das Ergebnis der Phase 1 bei euch aussehen:

Phase1 B.jpg Phase1 L.jpg

Phase 2

Hier die Stückliste! Man braucht folgende Bauteile (3,33€ ohne Versand CONRAD) für die 2. Phase:

Anzahl Bestell-Nr. Bauteil-Bezeichnung:
1 154989 Transistor BC 547C
1 155080 Transistor BC 556B
1 162280 Diode 1N4148
1 425052 Spindel-Trimmpoti 200 Ohm
1 420603 Widerstand Metall 1% 75 Ohm
2 418137 Widerstand Metall 1% 100 Ohm
1 418196 Widerstand Metall 1% 330 Ohm
1 418218 Widerstand Metall 1% 470 Ohm
1 418293 Widerstand Metall 1% 2,2 kOhm
1 418331 Widerstand Metall 1% 4,7 kOhm
1 411019 Widerstand Metall 1% 4,99 kOhm
1 418374 Widerstand Metall 1% 10 kOhm
1 500812 Keramik Kondensator 100 nF
1 455393 MKS 2 Folien-Kondensator 100 nF
1 472352 Elektrolyt Kondensator 47 uF/16 V

Schaltplan der Phase 2:

RP6 CMOSCamera SP 2.jpg

Jetzt funktioniert der Videoverstärker bei mir wie er soll. Es soll ein einfacher Verstärker sein, der das Video-Signal von 1V p-p auf 2V p-p bringt.

Warum die 2-fache Verstärkung:

  • 1. Die Dynamik der Graustufen wird höher (damit wird der Wertebereich des ADC besser ausgenutzt)
  • 2. Eine einfache "Dioden-Klemme" wird möglich (dazu später)

An das Video-Signal der Kamera wird der Verstärker mit einem Abschlußwiderstand von 75 Ohm und mit einem Elko 47µF angekoppelt. Die beiden Transistoren verstärken das Signal. Der Ausgang liegt am Collector vom BC556B, das ist die 2-polige Ausgangsstiftleiste PG5. Diesen Ausgang habe ich "DC-ADC-Video" genannt, weil hier das Signal für den ADC mit einem Gleichspannungsanteil (DC) aus dem Verstärker ausgekoppelt wird. Das Video-Signal "reitet" also auf einer Gleichspannung. Dieses Signal darf ich nur an eine hochohmige Schaltung anschließen, aber der Analog-Digitalwandler unseres ATMega32 ist ja mit 100 MOhm sehr hochohmig, wenn er nicht (wie bei der RP6 Base der Eingang ADC4) mit einem Pulldown-Widerstand (liegt zwischen dem Eingang und GND) beschaltet ist (RP6 Base: 10 kOhm, R34).

DC-ADC-Video (PG5):

Video PG5.jpg


Mit dem roten MKS 2 Kondensator 100 nF wird das Ausgangssignal als Wechselspannung (AC) ausgekoppelt. Das ist die 2-polige Ausgangsstiftleiste PG6. Dieser Ausgang heißt "AC-ADC-Video".

AC-ADC-Video (PG6):

Video PG6 ohneKlemme.jpg

Über die Codierstecker JP3, JP4 und JP5 können dort noch 3 Bauteile (2 Widerstände und 1 Diode) angeschlossen werden. Das sind die Bauteile der "passiven Klemme" mit Abschlusswiderständen.

Was ist das? Wenn man sich das AC-ADC-Video ansieht, dann fällt auf, dass der Null-Volt-Pegel mitten im Video-Signal, also in den Helligkeitsinformationen liegt. Da der ADC nur positive Spannungen (über 0 Volt) messen kann, würden die unteren (dunkleren) Werte abgeschnitten. Ideal wäre, wenn der Schwarzwert (Black Level) immer auf 0 Volt (GND) liegen würde und die Helligkeitsinformationen darüber. Man müßte das Signal also "anklemmen" können, daher der Name "Klemmschaltung" für Schaltungen, die eine Spannung auf einem festen Wert halten. Wenn es dabei um Video-Signale geht, dann braucht man eine "Schwarzwert-Klemme". Wenn ihr im Netz suchen wollt, werdet ihr bei den englischen Begriffen "Black Level Clamp", "Black Level Restauration" fündig. Da gibt es unendlich viele Schaltungen seit es die Fernsehtechnik gibt. Da kann man auch lesen, dass es eine "passive Klemme" eigentlich für das Video-Signal nicht gibt, sondern man braucht dafür aktive Bauteile (Transistoren, ICs). Die einfachste (passive) Klemme ist eine Diode (1N4148), die man hinter den Folien-Koppelkondensator 100 nF nach GND schaltet (Jumper auf JP4 stecken und als Lastwiderstand den 4,99 kOhm einschalten, d.h. Jumper auch auf JP3 stecken!).

In unserem weiteren Projekt werden wir IMMER einen Lastwiderstand von 5 kOhm für AC-ADC-Video verwenden. Daher schalte ich für die ADC-Kanäle der M32 oder M128 und für die Kanäle ADC0/1 der RP6 Base immer den 4,99 kOhm Widerstand mit JP3 ein. Ausnahme ist der Eingang ADC4 der RP6 Base (an PG4). Da dort auf dem RP6 Mainboard ein Lastwiderstand von 10 kOhm (R34) schon vorhanden ist, brauche ich für diesen ADC-Eingang nur noch einen 10 kOhm Widerstand (Jumper JP5 aufgesteckt, JP3 frei!). Damit errechnet sich wieder ein 5 kOhm Abschlusswiderstand (= 10 * 10 / (10 + 10) kOhm).

AC-ADC-Video MIT Dioden-Klemme (PG6):

Video PG6 mitKlemme.jpg

Jetzt ist das Video-Signal so "festgeklemmt", dass der HSync-Impuls zwar noch unterhalb von 0 Volt liegt, aber der Schwarzwert fast bei 0 Volt. So kann man das schon gut auswerten. Die 0,6 V, die hier geklemmt werden, sind die Durchlaßspannung der Diode. Jetzt wird auch klar, warum ich das Video-Signal der Kamera 2-fach verstärke:

Bei 1 V p-p stehen ca. 0,7 V für die Helligkeitsinformationen zur Verfügung und ca. 0,3 V für den HSync-Impuls. Verstärke ich das 2-fach, ist der HSync-Impuls 0,6 V (= 2 x 0,3 V) hoch. Das paßt gut zur Durchlaßspannung einer Silizium-Diode, damit diese den HSync-Impuls klemmen kann.

Ich kann mit der Dioden-Klemmschaltung jetzt auch meinen Verstärker abstimmen, wenn ich ein Oszi habe: In meinem Bild oben liegt der Schwarzwert noch etwas unter dem 0 Volt Pegel, d.h. ich kann die Verstärkung des Video-Verstärkers noch etwas erhöhen, damit der Schwarzwert genau auf die Nulllinie fällt. Dazu dient der Trimmer 200 Ohm im Video-Verstärker. Rechts herum gedreht wird die Verstärkung größer. Der Regelbereich geht ca. von 1,8-fach bis 3,3-fach. Das sollte ausreichen. Wenn man kein Oszi, aber ein Widerstandsmessgerät hat, kann man VOR dem Einlöten den Trimmer so einstellen, dass das Messgerät ca. 140 Ohm zwischen den beiden enger zusammen liegenden Pins des Spindeltrimmers zeigt. Das ist dann eine Verstärkung von ca. 2-fach.

Wie sieht es eigentlich mit der Software-Auswertung aus, wenn ich ein "geklemmtes" Video-Signal verwende? Da ich ja die HSync-Impulse abschneide, kann ich die Software von radbruch nicht mehr zur Auswertung verwenden. Ich kann ja die Zeilensynchronisation nicht mehr erkennen. Sinn macht das "Klemmen" also nur, wenn ich die Synchron-Impulse auf andere Weise zur Verfügung stellen kann. Das geschieht in der 3. Phase mit dem "Sync-Separator". In dieser 2. Bauphase muß also JP4 offen bleiben!

Jetzt kann es auch an den Aufbau der Phase 2 gehen:

RP6 Exp CMOSCamera Step2 Bruecken H.jpg

Ich habe wieder die Drahtbrücken (diesmal sind's 5) dick rot eingezeichnet. Ein paar Bauteile sind farbig, um zu zeigen, wie man die Drähte z.B. der Widerstände noch auf der Unterseite der Platine weiter führen kann. Dadurch braucht man fast keinen zusätzlichen blanken Draht auf der Unterseite (man kann das so eng auch nicht mit zusätzlichem blanken Draht verlöten!).

Nehmen wir z.B. den hellgrünen Widerstand 100 Ohm: Nachdem sein Draht am oberen Platinenrand nach unten durchgesteckt wurde, wird er nach links (von oben gesehen!) umgebogen, dann 2 Löcher nach unten geführt, 2 Löcher wieder nach links und 1 Loch nach unten. Er landet dann unter dem Spindeltrimmer 200 Ohm an dessen einem Kontakt und kann dort und an den 3 Stellen, wo er um 90° gebogen wurde, verlötet werden. Auf diese Weise können die Drähte aller Bauteile benutzt werden, wie ich es mit den Farben angedeutet habe. Natürlich kann man das auch gaaanz anders machen.

Der 100 nF MKS 2 Folien-Kondensator sitzt direkt rechts vom USRBUS, ich habe ihn hier 'mal als lila Kasten mit Rastermaß 5 mm eingezeichnet. Seine kurzen Drähte gehen rechts von Y1 und Y5 nach unten.

Die Diode 1N4148 überbrückt rechts von JP4 zwei Löcher, ihr schwarzer Strich (Kathode) schaut zum USRBUS.

Die beiden Transistoren sind gekennzeichnet. "E" ist jeweils der Emitter. Wenn man den Transistor so vor sich hält, dass man auf die abgeflachte Seite schaut (Beinchen nach unten), dann ist der Emitter das rechte "Bein".

So kann die Phase 2 aufgebaut aussehen:

Phase2neu B.jpg Phase2neu L.jpg

Radbruch hat vorgeschlagen, den 75 Ohm Widerstand jumperbar zu machen. Man müßte den Widerstand dann stehend einlöten. So könnte das aussehen:

JP 75 Ohm.jpg

Viel Erfolg beim Löten!

Phase 3

Hier die Stückliste! Man braucht folgende Bauteile (9,41€ ohne Versand CONRAD) für die 3. Phase:

Anzahl Bestell-Nr. Bauteil-Bezeichnung:
1 154989 Transistor BC 547C
1 155080 Transistor BC 556B
1 175951 IC LM 1881N *
1 189502 IC Fassung 8-pol
1 420719 Widerstand Metall 1% 620 Ohm
1 418315 Widerstand Metall 1% 3,3 kOhm
1 418331 Widerstand Metall 1% 4,7 kOhm
1 418595 Widerstand Metall 1% 680 kOhm
1 457191 Keramischer Kondensator 39 pF
1 457302 Keramischer Kondensator 470 pF
2 455393 MKS 2 Folien-Kondensator 100 nF
1 741119 1-reihige Stiftleiste RM 2,54mm (36-polig)

Zu *) Beim großen C scheint der LM 1881N nur noch in begrenzter Stückzahl vorrätig zu sein. Es gibt Vergleichstypen, die pin-kompatibel sind:

  • EL 1881CN (Digi-Key: 2,59 €): Es gibt nichts zu beachten. Der Ausgang Burst gibt einen negativen Impuls von 3,5 µs (anstelle von 4 µs beim LM 1881N) aus.
  • EL 1882CN (z.B. Farnell): Auch dieser Typ kann anstelle des LM 1881N eingesetzt werden. Der Ausgang Burst gibt einen negativen Impuls von 3,5 µs (anstelle von 4 µs beim LM 1881N) aus. Der Ausgang VSync gibt einen negativen Impuls von 270 µs (anstelle von 230 µs beim LM 1881N) aus.
  • EL 4581CN (Digi-Key: 6,23 €): Bei diesem Typ sind die Bauteile Widerstand 620 Ohm, keram. Kondensatoren 470 pF und 39 pF nicht einzubauen. Der 620 Ohm Widerstand wird durch eine Drahtbrücke ersetzt. Der Ausgang Burst gibt einen negativen Impuls von 3,5 µs (anstelle von 4 µs beim LM 1881N) aus.

Alle Vergleichstypen funktionieren mit dem Rset Widerstand von 680 kOhm wie der LM 1881N. In den Datenblättern von intersil wird jeweils ein Widerstand von 681 kOhm als Rset angegeben. Das liegt gut in der Toleranz von 1% des 680 kOhm Widerstands. Wer es ganz genau nehmen will, mißt einige 680 kOhm Widerstände aus und baut den ein, der 681 kOhm am nächsten kommt, oder nimmt 2 ausgemessene Widerstände in Reihe, die zusammen 681 kOhm erreichen.


Falls gewünscht, kann man zum sicheren Anschluß der Sync-Signale an die I/O-Wannen-Stecker der RP6Control M32 oder CCPro M128 noch folgende Teile bei Fa. Reichelt bestellen:

Anzahl Bestell-Nr. Bauteil-Bezeichnung:
1 WSL 10G Wannenstecker 10-polig gerade RM 2,54
2 PFL 10 Pfostensteckverbinder 10-polig f. Flachbandkabel
1 AWG 28-10G 3M Flachbandkabel grau 10-polig

Bei Reichelt bekommt man übrigens auch einreihige Stiftleisten (SL 1X36G 2,54), die beim großen C offenbar z.Zt. knapp sind, und passende einreihige Buchsenleisten (BL 1X20G 2,54), mit denen man die Kamera, ADC-Videoverbindungen und die IR-LEDs steckbar anschließen kann.

Jetzt gibt es auch den Schaltplan der Phase 3:

RP6 CMOSCamera SP 3.jpg

Der Sync-Separator ("Abtrenner der Synchronisierungs-Signale") besteht nur aus dem IC LM 1881N. Zu seinem Pin 2 wird das Video-Signal der Kamera über einen Folienkondensator 100 nF geführt. Die Bauteile 620 Ohm, 39 pF, 470 pF stellen einen Tiefpaß dar und halten die Frequenzen der Bildinformationen vom IC fern. Der Sync-Separator erzeugt die vier Ausgangssignale CSync, VSync, Burst/Back Porch und Odd/Even. Sie werden im Absatz "2.1 Die Synchronisations-Signale" genauer erklärt.

Mit dem Jumper JP8 wird ausgewählt, ob man CSync (Stellung C) oder Burst (Stellung B) für die horizontale Synchronisation (HSync) verwenden möchte. JP9 bestimmt, ob an den 10-poligen I/O-Wannenstecker (I/O M32/M128) eine RP6Control M32 (Stellung 32, 1 Jumper!) oder eine CCPro M128 Karte (Stellung 128, 2 Jumper!) zur Auswertung der Signale angeschlossen wird. Über JP10 (Stellung H) kann HSync mit SDA (für die RP6Base) verbunden werden. Wird JP11 geschlossen (Stellung OE), können die M32 oder M128 das Signal Odd/Even über XBUS IT3 auswerten. JP12 verbindet VSync entweder mit SCL (Stellung 6 für die RP6Base) oder mit XBUS IT2 (Stellung 32 für die M32). Eine Tabelle, die die Verbindungen der Sync-Signale zeigt, findet ihr unter "1.5.3 Verteilung der Sync-Signale".

Bleibt noch die Erklärung der "Aktiven Klemme", die aus den beiden Transistoren besteht. Werden JP6 und JP7 geschlossen (JP4: Offen!), dann steuert der Sync-Separator mit dem CSync-Signal den BC 556B so an, dass er während der horizontalen Sync-Impulse durchschaltet. Damit wird auch der BC 547C durchgeschaltet. Er liegt mit seinem Emitter an GND und mit dem Collector über JP6 am AC-ADC-Video-Signal und schließt das Video-Signal für die Dauer des HSync-Impulses kurz. Dadurch wird der HSync-Impuls gekappt und das Signal annähernd auf den Schwarzwert geklemmt. Dies funktioniert sehr gut, Nachteil dieser (einfachen) Lösung ist aber der hohe Abschaltimpuls am Ende der hinteren Schwarzschulter, der zu einem geringen Verlust von Bildinformationen an den Zeilenanfängen führt (2 µs oder knapp 14 Bildpunkte, die in der Regel sowieso nicht sichtbar sind). Und so sieht's aus:

AC-ADC-Video MIT Schwarzwert-Klemme (PG6):

Video PG6 mitKlemme CSync.jpg

Abschließend der Bestückungsplan der Phase 3:

RP6 Exp CMOSCamera Step3 Bruecken.jpg

Der LM 1881N wird nicht direkt eingelötet, sondern auf einen Sockel gesetzt. Die Kerbe des Sockels kommt nach oben (in Richtung JP1,2). Es gibt wieder einige Drahtbrücken (14). Die graue Fläche ist eine größere Massefläche, die man mit Drähten und etwas Lötzinn herstellen kann, wenn alle Bauteile, die da dran sitzen, eingelötet sind. Der 4k7 Widerstand wird stehend eingesetzt. Der Stecker I/O M32/M128 ist ein 10-poliger Wannenstecker. Man kann ihn aber auch als 2-reihige Stiftleiste aufbauen. Hier wird auf einfache Weise mit Flachbandkabel eine Verbindung zum I/O-Stecker der Control M32 oder CCPro M128, die die Sync-Signale auswertet, hergestellt.

Viel Erfolg beim Aufbau!

Erster Funktionstest des Sync-Separators mit der RP6Control M32:

  • Jumper in die Standard-Stellung für die M32 bringen (Siehe Absatz "1.7.2 Jumper"!)
  • I/O-Stecker der Exp mit dem der M32 verbinden (falls kein 10-poliges Flachkabel vorhanden ist, reicht es, nur Pin 8 zu verbinden!)
  • Das RP6Control M32: Impulslängen-Meßgerät in die M32 laden, vor dem Kompilieren in der Zeile "//#define FREQUENCY" die "//" entfernen, um die Frequenz zu messen.
  • Jetzt wird die HSync-Frequenz gemessen. Anzeige:
CNT 1024
FRQ 15625.002

Wenn das so aussieht, ist der Sync-Separator erst einmal intakt.

Wie wäre es, zur Kontrolle noch die VSync-Frequenz zu messen?

Die Anzeige sollte sein:

CNT 320110
FRQ 49.983

Wie habe ich das auf der Exp gemessen?

Antwort: JP 9 nach ganz Rechts rücken

Alternativer Aufbau

Der Anschluß der Sync-Signale erfolgt beim normalen Aufbau (siehe oben!) über den XBUS und den I/O-Stecker an die RP6Base, RP6Control M32 oder RP6 CCPro M128, wobei Jumper eingesetzt werden, um die Signale zu verteilen.

Das mag nicht jedermanns Sache sein. Vielleicht möchten einige von euch nichts mit dem XBUS, I/O-Stecker oder mit vielen Jumpern zu tun haben, sondern die Sync-Signale lieber an einem einfachen Stecker zusammengeführt haben, von dem aus man sie dann mit Kabeln selbst zu Portpins eines Prozessors führen kann.

Dafür zeige ich hier den Schaltplan dieses alternativen Aufbaus der Phase 3:

RP6 CMOSCamera SP 3 S.jpg

An PG8 sind alle Sync-Signale und auch das ADC-Video-Signal zusammen gefasst. PG8 ist 2x 7-polig und kann als 2-reihige Stiftleiste oder als 14-poliger Wannenstecker (das sind die, die auch mit der Exp mitgeliefert werden!) ausgeführt werden. An PG7 kann man das ADC-Video-Signal einspeisen (genau wie an PG4). Es kann dann über PG8 Pin 13 weiter zu einem ADC-Eingang geführt werden. Ich werde hier auch noch den Bestückungsplan einstellen, sonst aber nicht auf diese Art des Aufbaus weiter eingehen.

Alternativer Bestückungsplan der Phase 3:

RP6 Exp CMOSCamera Step3 Bruecken S.jpg

Phase 4

Hier die Stückliste! Man braucht folgende Bauteile (4,65..6,21€ ohne Versand CONRAD) für die 4. Phase:

Anzahl Bestell-Nr. Bauteil-Bezeichnung:
1 155080 Transistor BC 556B
2 406996 Widerstand Metall 1% 60,4 Ohm
2 418145 Widerstand Metall 1% 120 Ohm
1 418331 Widerstand Metall 1% 4,7 kOhm
2..6 154434 IR-LEDs 5 mm, Typ L-53F3BT
1 529593 Lötpunktrasterplatte 160 x 100

Gesamtkosten des Projekts: Ca. 62€

Schaltplan der Phase 4:

RP6 Exp CMOSCamera SP 4.jpg

Beim Jumper JP10 gibt es jetzt 2 neue Stellungen (S/IO). In Stellung S können die IR-LEDs mit SDA geschaltet werden, wobei SDA dann bei der RP6Base nicht mehr für HSync zur Verfügung steht. In Stellung IO werden die IR-LEDs durch die M32 oder M128 über den I/O-Stecker geschaltet. Dafür muss JP13 in Stellung SIO gebracht werden.

Neu in Phase 4 ist JP13. Er schaltet die Ansteuerung der IR-LEDs zwischen dem USRBUS (Stellung U) und dem I/O-Stecker (Stellung SIO) um. Wenn Y11 des USRBUS auf dem RP6 Mainboard mit SL1 (IO1) verbunden ist, können die IR-LEDs in Stellung U durch SL1 angesteuert werden. Wenn die SL1-LED des RP6 leuchtet, sind die IR-LEDs AUSgeschaltet! In Stellung SIO von JP13 erfolgt die Auswahl der IR-LED Ansteuerung durch JP10 (siehe oben!).

Bestückungsplan der Phase 4:

RP6 Exp CMOSCamera Step4 Bruecken.jpg

So, jetzt sind wir am Ende unseres Hardware-Projekts angelangt. Für die Phase 4 müssen noch 5 Drahtbrücken eingesetzt werden. Der Transistor BC 556B schaltet die IR-LEDs gegen VCC über PG2. Maximal kann er 100 mA schalten, so dass wir mit den max. 40 mA für die IR-LEDs im sicheren Bereich liegen. Bitte aufpassen, dass PG2 nicht aus Versehen kurzgeschlossen wird, weil der Transistor dann u.U. zerstört wird.

So sieht die Endversion unseres Projekts bei mir aus:

Phase4 B.JPG Phase4 L.JPG

Erster Funktionstest der IR-LED-Ansteuerung mit der RP6Control M32:

  • Jumper in die Standard-Stellung für die M32 bringen (Siehe Absatz "1.7.2 Jumper"!)
  • I/O-Stecker der Exp mit dem der M32 verbinden (falls kein 10-poliges Flachkabel vorhanden ist, reicht es, nur Pin 4 zu verbinden!)
  • Falls die Kamera-Platine mit den IR-LEDs noch nicht aufgebaut ist, kann man an PG2 eine LED mit passendem Vorwiderstand anschließen.
  • Jetzt ein Programm für die M32 schreiben, das den Pin IO_PC6 auf Ausgang umschaltet und dann in einer Endlosschleife toggelt. Die LED an PG2 muss dann im Rhythmus blinken.

Alternativer Aufbau

Auch hier gibt es für die Phase 4 einen alternativen Aufbau, den man nehmen muss, wenn man die Phase 3 schon in der alternativen Form aufgebaut hat.

Schaltplan des alternativen Aufbaus der Phase 4:

RP6 Exp CMOSCamera SP 4 S.jpg

Bestückungsplan des alternativen Aufbaus der Phase 4:

RP6 Exp CMOSCamera Step4 Bruecken S.jpg

Kamera-Platine

RP6 Exp CMOSCamera IR-LEDs SP.jpg

Es können 2 bis 6 IR-LEDs eingebaut werden:

  • Stromsparende Variante (20 mA) mit 2 oder 3 LEDs
  • Variante mit höherer Leistung (40 mA) mit 4 bis 6 LEDs

Wer von euch könnte hier seine Kamera-Platine als "Bauanleitung" vorstellen?

Letzte Arbeiten

Was bleibt noch?

  • Wenn die Platinen komplett aufgebaut sind, kann man sie mit Plastik 70 Spray auf der Lötseite gegen Korrosion schützen
  • Eine Halterung für die Kamera bauen
  • Sich Anwendungen überlegen
  • Anwendungen programmieren
  • ...

Allgemeine Daten und Tabellen

Stecker

Stecker Signal(e) Pins Bedeutung
PG1 Video-in, GND, VCC, Gamma, Gain 5 Anschluß CMOS Kamera
PG2 IR-LEDs+, GND 2 Ausgang für IR-LEDs
PG3 Video-out, GND 2 Ausgang Video 1V p-p
PG4 ADC-Video-in, GND 2 Eingang ADC4 der RP6Base
PG5 DC-ADC-Video-out, GND 2 Ausgang DC-ADC-Video
PG6 AC-ADC-Video-out, GND 2 Ausgang AC-ADC-Video

Jumper

Zeichenerklärung:

  • Stellung ON = Jumper aufgesteckt (Kontakt geschlossen)
  • Stellung OFF = Jumper abgezogen (Kontakt offen)
Jumper Stellung Bedeutung
JP1 ON Kamera: Gamma = 1
JP1 OFF Kamera: Gamma = 0,45
JP2 ON Kamera: Gain low
JP2 OFF Kamera: Gain high
JP3 ON AC-ADC-Video: Lastwiderstand 5 kOhm (JP5: OFF!)
JP4 ON AC-ADC-Video: Level Clamp Diode (JP6,7: OFF!)
JP5 ON AC-ADC-Video: Lastwiderstand 10 kOhm (JP3: OFF!)
JP6,7 ON AC-ADC-Video: Black Level Clamp (JP4: OFF!)
JP8 C ON HSync = CSync
JP8 B ON HSync = Burst
JP9 32 ON I/O-Stecker der RP6Control M32
JP9 128 ON (2x) I/O-Stecker der RP6 CCPro M128 (2 Jumper!)
JP10 H ON SDA = HSync
JP10 S ON IR-LEDs durch SDA geschaltet (JP13: SIO!)
JP10 IO ON IR-LEDs durch M32/M128 geschaltet (JP13: SIO!)
JP11 OE ON M32/M128: IT3 = Odd/Even
JP12 6 ON SCL = VSync
JP12 32 ON M32: IT2 = VSync
JP13 U ON IR-LEDs durch SL1/IO1 (USRBUS Y11 *) geschaltet
JP13 SIO ON IR-LEDs NICHT durch SL1 geschaltet (JP10: S/IO!)

Zu *) Falls SL1/IO1 auf dem RP6 Mainboard mit USRBUS Y11 verbunden wurde!

Wie aus der Tabelle oben ersichtlich gibt es also eine "Standard-Stellung der Jumper" im Vollausbau (Phase 4) der Exp. Diese Stellung kann man auf einen Blick aus diesem Bild erkennen:

Jumper Standardstellung 4.jpg

Dieses Bild zeigt die Jumper-Stellungen für die RP6Base, M32 und M128. Bei der RP6Base wird vorausgesetzt, dass man den ADC4 (an PG4) zur Auswertung des ADC-Video-Signals verwendet. Nimmt man stattdessen ADC0 oder ADC1 der RP6Base, müssen die Jumper JP3 und JP5 so wie bei der M32 oder M128 gesetzt werden. Bei der RP6Base bitte noch beachten: Der Jumper JP10 (Stellung H) darf erst aufgesteckt werden, wenn das Programm läuft! Nach dem Programmende oder nach einem Reset startet es evtl. wieder neu, wenn JP10 aufgesteckt bleibt. Daher sollte JP10 nach einem Programmabbruch immer wieder abgezogen werden! Die Jumper 1, 2, 4, 6 und 7 sind in dieser Abbildung NICHT berücksichtigt (als offen eingezeichnet!), weil sie abhängig von der gewünschten Kamera-Einstellung (Gamma: JP1, Gain: JP2) oder vom Software-Konzept (Level Clamp Diode: JP4 ODER Black Level Clamp: JP6 und JP7) gesetzt werden!

Verteilung der Sync-Signale und IR-LED Ansteuerung

In dieser Tabelle habe ich aufgelistet, mit welchem Portpin das jeweilige Sync-Signal ab der Phase 3 und die Ansteuerung der IR-LEDs ab der Phase 4 verbunden wird. Dabei habe ich möglichst interruptfähige Pins genommen (auf der RP6Base waren aber keine mehr frei!). Für die horizontale Synchronisation habe ich den ICP-Pin genommen, weil man damit gut Timer starten/stoppen kann, was für das Einlesen der Zeile nützlich sein kann.

System Signal Port Name XBUS USRBUS I/O-Stecker RP6-Name
RP6Base VSync PC0 SCL SCL - - SCL
HSync PC1 SDA SDA - - SDA
Odd/Even - - - - - -
IR PC4 TDO - Y11 * - SL1 (IO1)
RP6Control M32 VSync PD3 INT1 IT2 - - EINT2
HSync PD6 ICP1 - - Pin 8 IO_PD6
Odd/Even PB2 INT2 IT3 - - EINT3
IR PC6 TOSC1 - - Pin 4 IO_PC6
RP6 CCPro M128 VSync PD2 INT2 - - Pin 8 PORT_RXD1
HSync PD4 ICP1 - - Pin 6 PD4 (A16)
Odd/Even PE6 INT6 IT3 - - PORT_PE6_INT
IR PD6 T1 - - Pin 4 PD6

Zu *) Falls SL1/IO1 auf dem RP6 Mainboard mit USRBUS Y11 verbunden wurde!

ADC-Video

Während die Sync-Signale fest verdrahtet sind und nur durch Jumper in ihrer Verteilung verändert werden können, gibt es für die ADC-Video-Ausgänge (PG3, PG5, PG6) nur drei 2-polige Stiftleisten.

In der Praxis stellt man einfach eine abgeschirmte Verbindung zwischen einem der ADC-Video-Ausgänge (PG3, PG5, PG6) und einem ADC-Eingang her. Die Masseverbindung (GND) braucht dabei nicht am ADC-Eingangsstecker verbunden zu werden, d.h. die Abschirmung des Kabels wird nur am ADC-Video-Ausgang an GND angeschlossen.

Die drei ADC-Video-Ausgänge noch einmal kurz zusammengefaßt:

  • PG3 (Video 1V p-p) -> Dies ist das BAS-Videosignal der CMOS-Kamera. Das selbe Signal kann an der CINCH-Buchse für einen Monitor abgenommen werden. An einem Widerstand von 75 Ohm beträgt die Amplitude des Signals nominal 1V. Die Amplitude ändert sich, wenn z.B. ein Monitor angeschlossen oder wieder entfernt wird, daher kann eine Software, die die Sync-Signale im Videosignal mit einem festen Schwellenwert auswertet, u.U. nicht sicher funktionieren. Die CSync-Impulse liegen im BAS-Signal zwischen 0 V und 0,3 V. Oberhalb von 0,3 V bis 1 V findet sich der Bildinhalt (Helligkeit der Bildpunkte).
  • PG5 (DC-ADC-Video) -> Dies ist das 2-fach verstärkte BAS-Videosignal. PG5 ist galvanisch (d.h. direkt leitend) mit dem Ausgang des Video-Verstärkers verbunden. Die Amplitude des verstärkten Videosignals ist natürlich abhängig vom Eingangs-Signal (= PG3), also auch in gewisser Weise vom dortigen Abschlußwiderstand bzw. angeschlossenen Monitor. Der Vorteil des DC-ADC-Video besteht in der höheren Spannung, die sowohl für die Sync-Impulse, als auch für den Bildinhalt besser auszuwerten ist.
  • PG6 (AC-ADC-Video) -> Dies ist das 2-fach verstärkte BAS-Videosignal ohne Gleichspannungsanteil (d.h. reine Wechselspannung). PG6 ist über einen Folien-Kondensator 100 nF mit dem Ausgang des Video-Verstärkers (= PG5) verbunden. Eine direkte Auswertung dieses Signals mit einem ADC ist nicht sinnvoll, weil nur Teile des Bildinhalts (die helleren Bereiche) eine positive Spannung aufweisen, die aber auch noch abhängig von der Gesamthelligkeit stark schwankt. Sinnvoll kann der Ausgang PG6 mit einem ADC nur ausgewertet werden, wenn das Signal "geklemmt" wird. Dafür gibt es zwei Möglichkeiten: Die Dioden-Klemme (Level Clamp Diode: JP4) ODER die Schwarzwert-Klemme (Black Level Clamp: JP6 und JP7). Dadurch wird das Video-Signal auf einen festen Spannungswert "geklemmt". Der Sinn besteht darin, die Bildinformationen optimal auswerten zu können, wobei idealerweise Schwarz immer gleich Null Volt ist. Das "geklemmte" Video-Signal enthält keine Sync-Impulse mehr, also ist man darauf angewiesen, zur Auswertung die Sync-Impulse vom Sync-Separator (LM 1881N) zu beziehen.

Ein paar Meßwerte der Signal-Amplitude [V p-p]:

Stecker Wert Hell Dunkel
PG3 HSync 0,25 0,12
Vpp 0,8 0,4
PG5 DC 0,6 1,1
HSync 1,1 1,35
Vpp 2,2 1,9
PG6 * HSync 0,4 0,2
Vpp 1,4 0,7

Zu *) JP3: ON; JP4..7: OFF (Lastwiderstand 5 kOhm, keine Klemme)!

Die ADC-Eingänge, die benutzt werden können, sind:

  • RP6Base: ADC4 (PG4)
  • RP6Base: ADC0 oder ADC1 (gleichnamige Anschlüsse auf dem RP6 Mainboard,- man muss da ggf. eine 3-polige Stiftleiste einlöten)
  • RP6Control M32: ADC2..ADC7 (am ADC-Wannenstecker auf der M32)
  • RP6 CCPro M128: ADC0..ADC7 (am ADC-Wannenstecker auf der M128)

Video-Klemme

Jumper Videoklemme 3.jpg

Dieses Bild zeigt, welche Jumper (4, 6, 7) für die Auswahl der Video-Klemme gesetzt werden müssen. Die Jumper 1..3, 5, 8..13 sind in dieser Abbildung NICHT berücksichtigt (als offen eingezeichnet!). Wenn keine Video-Klemme eingesetzt werden soll, wird kein Jumper gesetzt (linkes Bild). Wenn die Dioden-Klemme (Level Clamp Diode) verwendet werden soll (mittleres Bild), muß JP4 geschlossen und JP6, JP7 offen sein. Für die Schwarzwert-Klemme (Black Level Clamp) muß JP4 offen sein und JP6 und JP7 geschlossen (rechtes Bild).

Das "geklemmte" ADC-Video-Signal kann am Stecker PG6 abgenommen werden!

Dioden-Klemme

Mit dieser Methode wird das ADC-Video-Signal durch eine Diode auf einen festen Wert "geklemmt". Die Abbildung "AC-ADC-Video MIT Dioden-Klemme (PG6)" im Absatz "1.2 Phase 2" zeigt ein Oszillogramm dieses Signals. Es hat einen negativen Anteil von ca. 0,6 V, so daß der CSync-Impuls abgeschnitten wird. Der Schwarzwert der Bildinformationen liegt etwa auf GND-Pegel (0 V). Durch dieses feste Bezugspotential kann man die Bildinformationen gut mit einem ADC auswerten: Je höher die Meßspannung in einer Zeile, umso heller ist das Bild an der Stelle.

Schwarzwert-Klemme

Mit dieser Methode wird das ADC-Video-Signal durch eine aktive Klemme bestehend aus 2 Transistoren auf einen festen Wert "geklemmt". Das Oszillogramm "AC-ADC-Video MIT Schwarzwert-Klemme (PG6)" im Absatz "1.3 Phase 3" zeigt dieses Signal. Auch hier wird der Schwarzwert annähernd auf GND-Pegel (0 V) festgehalten, indem der CSync-Impuls abgeschnitten wird. Einige Bildpunkte am linken Bildrand gehen verloren. Auch dieses "geklemmte" ADC-Video-Signal kann man gut mit einem ADC auswerten.


RP6 Kamera - Mitmach-Projekt: Software

Da dies ein "Mitmach-Projekt" sein soll, hoffe ich für die Programmierung einer Software für die RP6 Kamera, dass sich viele beteiligen und hier fleißig mitschreiben/bearbeiten!

Die Synchronisations-Signale

Die Darstellung jeder Zeile wird durch die horizontale Synchronisation ermöglicht.

BAS-Zeilensynchronisation.jpg

Oben erkennt man das Videosignal, das hier mit fast 2 Zeilen dargestellt ist. HSync ist 4,7 µs lang und wird gefolgt von der hinteren Schwarzschulter (5,8 µs). Danach werden 52 µs lang die Bildinformationen der Zeile gesendet. Es folgt die vordere Schwarzschulter (1,5 µs) vor dem HSync der nächsten Zeile. In der Mitte ist das Signal CSync des Sync-Separators zu sehen. Es führt normalerweise High-Pegel und wird nur Low (0 V), solange der HSync-Impuls dauert. Ein weiteres Signal, das der Sync-Separator ausgibt, heißt Burst (Back Porch). Es führt für 4 µs Low-Pegel, nachdem der CSync-Impuls beendet ist. Hier liegt beim FBAS-Videosignal (Farb-BAS) der Burst, der die Farbinformationen enthält. Bei unserer S/W-Kamera gibt es keinen Burst.

Man kann jetzt ein paar Zahlen angeben, die man braucht, um die Punkte einer Zeile anzusteuern: Von der fallenden (HI -> LO) Flanke des HSync-Impulses dauert es 10,5 µs bis zum Zeilenanfang (linker Bildrand). Bis zur Zeilenmitte sind es 36,5 µs und bis zum Zeilenende (rechter Bildrand) 62,5 µs. Bei unseren 352 horizontalen Bildpunkten kann man einen beliebigen Punkt [1..352] mit der Formel:

Verzögerung [µs] = 0,14773 * (Bildpunkt - 1) + 10,5

... ansteuern.


In diesem Bild zeige ich einen Teil der vertikalen Synchronisation, und zwar ab der fallenden Flanke von VSync des Sync-Separators. Könnt ihr sie in der Grafik unten (Zeile Video oder CSync) wiederfinden?

Vertikale Synchronimpulse ab VSync:

Video PG6 VSync.jpg

BAS-Bildsynchronisation.jpg

Dieses Bild zeigt die vertikale Bildsynchronisation. Das ist die Abfolge von Signalen, die zwischen den einzelnen Halbbildern oder Seiten gesendet werden. Auch unsere Kamera sendet diese Halbbilder/Seiten (Datenblatt: "2:1 Interlace").

ANMERKUNG: In diesem Abschnitt werden die Begriffe Halbbild und Seite synonym gebraucht.
Das BAS-Signal unserer Kamera kann auf einem klassischen (analogen) Monitor als zwei Halbbilder
dargestellt werden, wobei die Zeilen des einen in die des anderen Halbbildes verschachtelt
gezeigt werden. Auf einem modernen digitalen Monitor können auch stattdessen zwei vollständige
Seiten nacheinander zu sehen sein.

In der oberen Bildhälfte ist die vertikale Synchronisation zwischen den geraden (even, field 2) und ungeraden (odd, field 1) Halbbildern dargestellt, in der unteren Bildhälfte die vertikale Synchronisation zwischen den ungeraden (odd) und geraden (even) Halbbildern.

Für die Auswertungs-Software ist natürlich wichtig, wie man mit den vertikalen Sync-Signalen Halbbilder und Zeilen ansteuern kann:

Die Frage, ob es sich aktuell um ein ungerades oder gerades Halbbild handelt, beantwortet Odd/Even des Sync-Separators: Ist Odd/Even HI, liegt ein ungerades Halbbild vor, sonst ein gerades Halbbild. Bei der RP6Base, die in der jetzigen Planung Odd/Even nicht auswerten kann (nicht angeschlossen!), kann man sich helfen, indem man eine Variable immer dann toggelt (1-2-1-2...), wenn ein VSync-Impuls kommt. Dadurch weiß man zwar nicht, ob man aktuell wirklich ein gerades oder ungerades Halbbild liest, aber letztlich ist das auch nicht so wichtig: Zwei Folgebilder werden sich nicht so dramatisch unterscheiden.

Wenn man aber ohne das Odd/Even-Signal doch wissen will, auf welcher Seite man gerade ist, dann geht das mit der Felderkennung.

BAS-Felderkennung.jpg

Hier ist ein Ausschnitt der vertikalen Austastlücke gezeigt. Unten erkennt man wieder den VSync-Impuls. Sieht man sich das Video-Signal des 1. Halbbildes (odd, oben!) an, dann folgt 256 µs (oder 9 steigende CSync-Flanken) nach der fallenden VSync-Flanke ein Intervall von ca. 32 µs bis zum folgenden CSync-Impuls. Beim 2. Halbbild (even, unten!) folgt an dieser Stelle ein Intervall von ca. 64 µs bis zum folgenden CSync-Impuls. Damit kann man die Seiten eindeutig auseinander halten.

Schwieriger wird es, wenn man eine bestimmte Zeile eines Bildes ansteuern will. Im Datenblatt des LM 1881N, S. 8, findet sich dazu ein interessanter Satz: Since the vertical output pulse from the LM1881 coincides with the leading edge of the first vertical serration, sixteen positive or negative transitions later will be the start of line 14 in either field.

Das heißt in unserer Landessprache: 16 positive oder negative Flanken nach dem VSync-Signal des LM 1881N (nach dessen fallender Flanke!) findet sich der Anfang der Zeile 14 jedes Halbbildes.

Abgesehen davon, dass diese Angabe auch nur auf NTSC zutrifft: Warum gerade die Zeile 14? Die Zeilen bis 13 werden nicht benutzt, danach kommt der Datenbereich (Untertitel, Videotext ...) ab Zeile 14 bis Zeile 21. Erst ab Zeile 22,5 sind im PAL-System Bildinformationen zu erwarten.

Wie ist das denn bei unserer Kamera?

Leider ist bei unserer Kamera einiges anders als beim Standard-PAL, wie der Blick auf den Oszi-Bildschirm zeigt. Im Datenblatt der Kamera sind 260 TV-Zeilen angegeben, tatsächlich sind es 288. Hier das Ganze 'mal als Grafik:

BAS-Vertikalaustastung C-Cam-A.jpg

Die erste Zeile mit Bildinhalt findet sich im 1. Halbbild an Zeilen-Position 18. Zählt man die fallenden oder steigenden Flanken nach dem VSync-Signal, dann befindet man sich nach 22 Flanken an der 18. Zeilen-Position. Die letzte Zeile dieser 1. Seite (288) findet man nach 309 Flanken.

Im 2. Halbbild findet sich die 1. Zeile an Zeilen-Position 17 (Gerber-Zählung: 330). Zählt man die Flanken nach dem VSync-Signal, dann befindet man sich nach 21 Flanken an dieser Zeilen-Position. Die letzte Zeile (288) dieser 2. Seite findet man nach 308 Flanken.

Man braucht also nur direkt nach der fallenden Flanke von VSync die CSync-Flanken zu zählen, um eine beliebige Zeile zu wählen. Eine beliebige Zeile [1..288] kann man mit der Formel:

1. Halbbild: Zeile = Flankenzahl - 21
2. Halbbild: Zeile = Flankenzahl - 20

... ansteuern, wobei der Bereich von Flankenzahl auf der 1. Seite zwischen 22 und 309, auf der 2. Seite zwischen 21 und 308 liegt.

Grundlagen und erste Überlegungen

Auf Wikipedia (siehe Quelle1!) findet man gute Informationen zum Aufbau des BAS Signals, das auch unsere Kamera ausspuckt. Sie ist zwar nicht sehr hochwertig, das Bildelement kann aber laut Datenblatt 352 x 288 Punkte darstellen, was für unsere Zwecke völlig ausreicht. Von den 260 TV-Zeilen, die ausgegeben werden, sind nur ca. 230 Zeilen auf einem Video-Monitor sichtbar.

Jede Zeile wird in 64 µs übertragen, davon sind nur 52 µs für den Bildinhalt vorgesehen. Für einen µC wie den ATMega32 ist das schon eine Herausforderung: Wollte er jeden der 352 Punkte der Zeile lesen, dann hätte er dafür rechnerisch knapp 0,15 µs Zeit. Beim RP6 dauert ein Taktzyklus 0,125 µs (bei 8 MHz Takt), bei der RP6Control M32 0,0625 µs (bei 16 MHz Takt). Mit der M32 hätte man also 2,4 Taktzyklen Zeit für jeden Punkt.

Man sieht schon, dass das nichts werden kann! Es ist unmöglich, jeden Punkt der Zeile "live" einzulesen. Es stellt sich die Frage, wie viele Punkte man denn nun einlesen kann. Ich brauche dazu ja den Analog-Digitalwandler Eingang (ADC) des ATMega32, weil ich die Helligkeit jedes Punktes (also eine Spannung) lesen möchte.

Das Datenblatt zum ATMega32 sagt dazu: Im "free running modus" (auf jede Messung folgt sofort die nächste) braucht jede Analog-Digitalwandlung 13 ADC-Taktzyklen. Das Ergebnis steht dann nach weiteren 0,5 ADC-Taktzyklen zur Verfügung. Was ist eigentlich der "ADC-Takt"? Man muss den Haupttakt des µC für den Analog-Digitalwandler teilen. Das Ergebnis ist dann der ADC-Takt. Der Maximalwert liegt laut Datenblatt bei 1 MHz für den ATMega32. Bei 13 ADC-Taktzyklen pro ADC-Wandlung dauert also jede Wandlung 13 µs.

Das heißt, dass man max. nur 4 Punkte pro Zeile (= 52 / 13) lesen kann. Das ist ja sehr schade! Man hätte dann kaum Auflösung.

Diese Feststellungen sind auch nicht vereinbar mit den Ergebnissen von radbruch (siehe Quelle2!), der viel mehr Punkte pro Zeile einlesen kann. Er verwendet als ADC-Takt 4 MHz, was weit außerhalb der Spezifikationen für den ATMega32 ist. Geht das überhaupt? Kann man mit einer Wandlungszeit von 3,25 µs (= 1 / 4 * 13 µs) realistische 8-Bit-Werte ermitteln? Immerhin würde man so rechnerisch auf eine Auflösung von 16 Punkten pro Zeile (= 52 / 3,25 µs) kommen.

Bevor wir die Fragen beantworten: Überlegen wir erst einmal weiter ...

Mit dem Einlesen der Punkte ist es noch nicht getan. Wir brauchen auch Zeit, um den gewandelten Wert in einer Byte-Variable zu speichern. Dafür stehen die jeweils 13 µs zur Verfügung, während der der ADC-Wandler mit der nächsten Wandlung beschäftigt ist. Bei 8 MHz Takt der RP6 Base sind das 104 Zyklen, in denen man das in GCC gut auch ohne Optimierung durch Assembler-Teile hinkriegt. Wenn eine ADC-Wandlung nur 3,25 µs braucht, hat man bei der RP6 Base noch 26 Taktzyklen zur Verfügung. Auch das reicht noch aus, um in einer Schleife einen Byte-Wert nach jeder Wandlung zu speichern. Wie groß kann denn ein Bild sein, mit dem der ATMega32 nicht überfordert ist? Er hat 2024 Byte SRAM, den Speicherplatz braucht er für Variablen und den Stack (Stapel). Wenn man kein sehr umfangreiches Programm mit vielen Variablen und Unterprogrammen hat, kann man vielleicht die Hälfte (1024 Byte) für ein Bild verwenden. Das wäre eine Auflösung bei 8 Bit Helligkeitswerten von 32 x 32 Punkten. Reduziert man die Helligkeitswerte auf 4 Bit (16 Graustufen), kann man 45 x 45 Bildpunkte darstellen. Auf ein Seitenverhältnis von 4 : 3 des Fernsehbildes bezogen wären in 1024 Byte RAM Bilder von 36 x 28 (8 Bit) oder 52 x 39 (4 Bit) Punkten zu speichern. 16 Graustufen sind für die Aufgabe einer Kamera an einem µC gut ausreichend. Man kann damit Linien folgen und sogar eine einfache Orientierung im Raum erreichen.

Jetzt ist wohl eine Entscheidung fällig:

Ich entscheide mich dafür, eine Bildgröße von 52 x 39 Punkten mit 16 Graustufen zu erreichen.

Kann das klappen? Die 39 Zeilen mache ich dann aus ca. 230 sichtbaren Zeilen der Kamera (Zeilen 15..245). Ich würde also jede 6. Zeile (= 230 / 39) lesen. Jede Zeile dauert 64 µs, also beträgt der Abstand vom Ende der 1. bis zum Anfang der 6. Zeile 256 µs. Das ist genügend Zeit, um die Werte jeder Zeile zu verarbeiten (z.B. in eine Tabelle zu speichern). Kritischer ist die Zeile selbst. Ich will 52 Punkte pro Zeile darstellen. Damit müßte ich jede µs einen Punkt einlesen. Selbst mit der hohen Übertaktung des ADC (4 MHz), die radbruch verwendet hat, komme ich nur auf 16 Punkte pro Zeile. Was tun? Ich könnte das 2. Halbbild benutzen. Bei meiner geringen Auflösung von 52 x 39 Pixeln kann ich ruhig wenige aufeinanderfolgende Zeilen als EINE Zeile betrachten. Wenn ich z.B. Zeilen 5 und 7 eines Halbbildes und Zeile 6 des anderen Halbbildes lesen würde, dann käme ich auf 16 x 3 = 48 Punkte. Natürlich müßte ich nach der Zeile 5 die Zeilen 6 und 7 um je 1,08 µs (= 3,25 / 3) versetzt lesen, damit ich in meiner "dicken Zeile" (besteht aus 3 echten Zeilen!) 48 Punkte (= 16 x 3) lesen kann. Das kommt dem Ziel von 52 Punkten pro Zeile schon nahe.

Bevor ich das als Methode feststampfe, noch eine letzte Überlegung:

Wie wäre es, wenn ich das zeitkritische Lesen einer Zeile vermeide und nur Spalten lese? Das hat radbruch auch in seiner Software gemacht und klingt erfolgversprechend. Ich würde also wie beim 1. Ansatz jede 6. Zeile lesen, um meine vertikale Zeilenauflösung von 39 Zeilen zu erreichen. Das mache ich dann 52 mal, indem ich in jedem Halbbild das Lesen der Zeilenpunkte um 1 µs verzögere. Ich lese also mein Bild spaltenweise ein. Eindeutiger Vorteil: Ich komme nicht in Zeitdruck beim Einlesen, weil ich nur alle 64 µs einen Punkt lesen muss. Nachteil: Ich brauche 52 Halbbilder Zeit, um mein Bild mit allen Zeilenpunkten komplett eingelesen zu haben. Das ist über eine Sekunde.

Schlimm ist das nicht: Ein Bild pro Sekunde ist besser als Nichts. Beim 1. Ansatz wäre das komplette Bild in 60 ms "im Kasten", also 17x schneller.

Hier braucht's wohl wieder eine Entscheidung:

Ich entscheide mich für den 1. Ansatz, der nach 3 Halbbildern fertig ist. Grund: Ich will ja z.B. einer Linie folgen, da kann eine Abtastrate von 1 Sekunde schon zu wenig sein. Sicher könnte man das auch mit der 2. Methode des Spaltenlesens schaffen, wenn man nur wenige Spalten liest und die Kamera um 90° dreht. Ich möchte aber nicht die Kameraposition ändern, sondern immer mein ganzes Bild lesen und verarbeiten. Das ermöglicht mir, im selben Programm einer Linie zu folgen, aber auch einen hellen Gegenstand in der Ferne zu "sehen". Ist sicher Geschmackssache ...

... Baustelle! Hier wird noch weiter gedacht! ..........

Software-Projekte

Hier schlage ich einfach 'mal erste Software-Projekte vor. Wer hat Lust, mitzumachen?

Ist die 1. Zeile des Bildes wirklich an Zeilenposition 18 im 1. Halbbild zu finden?

Wo finde ich genau die 1. Zeile? Ist ja wichtig, wenn ich eine bestimmte Zeile lesen will. Wo ist die 1. Zeile im 2. Halbbild zu finden?

Wer schreibt ein Programm, das die 1. Zeile mit Bildinformationen findet?

Wie viele Zeilen gibt unsere Kamera aus?

Wer schreibt ein Programm (egal für die PP6Base, M32 oder M128 und egal ab welcher Phase des Aufbaus), das anzeigt, wie viele Zeilen unsere Kamera wirklich ausgibt? Sind es wirklich 260 wie das Datenblatt sagt bzw. auf jeder Halbseite 130?

Eine Anregung dazu: RP6Control M32: Video Zeilenzähler 1

Wie kann ein "Graukeil" auf dem Terminal aussehen?

Wenn man ein Bild mit z.B. 16 Graustufen mit dem vorhandenen Zeichensatz darstellen will, muss man 16 Zeichen definieren, die die "Graustufen" wiedergeben. Was klar ist: Das Leerzeichen ist Schwarz. Ein sehr dunkler Bildpunkt ist z.B. der Punkt selbst ... und welches Zeichen ist das hellste?

Wer schreibt ein Programm, das einen "Graukeil" auf dem Terminal ausgibt?

Wer stellt einen Video-Grabber vor?

Ein Video-Grabber holt den Inhalt eines Videobildes aus dem Video Stream und stellt ihn irgendwie dar.

Eine Anregung für die RP6Base: RP6Base: Video Grabber 1

... und für die RP6Control M32: RP6Control M32: Video Grabber 1

Erkennung des Syncs mit dem internen Analogkomparator

Zusätzlich benötigte Hardware: Ein Poti zum Einstellen des Sync-Pegels

Umsetzung in Bascom


Es geht sicher noch viel besser!

Quellen

Quelle1
Wikipedia Fernsehsignal
Quelle2
Minimallösung: Kamera für den RP6
Quelle3
Maxim: AC-Kopplung, Vorspannung und Clamp
Quelle4
Intersil: Technical Brief TB462.1
Quelle5
LM1881N Datasheet
Quelle6
BC 547C Datasheet
Quelle7
BC 556B Datasheet
Quelle8
IR-LED L-53F3BT Datasheet


Siehe auch



Autoren

--Dirk 13:36, 11. Jan 2015 (CET)


LiFePO4 Speicher Test