-
        

Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 47

Thema: [Dringend!] Kamera auslesen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    31.07.2005
    Beiträge
    224

    [Dringend!] Kamera auslesen

    Anzeige

    Hi all,

    Ich habe eine billige eine Kamera finden können
    (dazu hab ich leider nur folgende Informationen:
    Techn. Daten:
    Spannung / Strom 5VDC (+/-5%) 10mA
    Brennweite f=4,9mm
    Öffnungswinkel 36° x 27°
    Blende F=2,8
    Bildwandler 1/4" CMOS
    Video Ausgang 1Vpp / 75 Ohm
    Auflösung = 260 TV-Linien
    Pixelanzahl EIA Mode = 320(H) x 240(V)

    Sie hat auf der einen Seite 2 auf der anderen 3 Pins
    )
    Bei einem beistehenden Text ist die Rede von einem LM1881 (http://ee.usc.edu/library/ee459/datasheets/LM1881.pdf) um das Signal zu wandeln, ich denke danach erhalte ich durch diesen Chip ein PAL Kompatibles Signal, doch wie funktioniert dieses PAL Verfahren? Was ich später haben will ist eine Bildverarbeitung um mit meinem Roboter Linien zu fahren (Ich will das verfahren sehr einfach halten, mein Programm soll später erkennen ob die Linie eher Rechts oder eher Links ist). Dafür würde ich gerne an jedem Pixel eine Graustufe haben, 8 Bit reichen da völlig aus. Ich will also Quasi bei einer Auflösung von 320*240 Pixel an jeden Pixel einen Grauwert abrufen können.

    Erstmal die Frage, ist das möglich oder nicht? Ich will eine Hardware mit einem Mega128 mit externem RAM, doch erstmal die Frage, wie viel brauch ich? Mit meiner sehr simplen Rechnung bin ich auf 75kB gekommen, könnte das hinkommen? Und wo krieg ich einen passenden, der Mega128 unterstützt die ja von Haus aus, hat ja extra Anschlüsse fürn Externen RAM, brauch also kein I2C sein, hauptsache schnell. Laufen soll das ganze auf 16 Mhz.

    Hört sich das realistisch an?

    Also nochmal alle Fragen auf einem Haufen:
    - Wie krieg ich aus dem Videoformatkrams die Informationen die ich haben will (für 320*240 Pixel jeweils eine Grauabstufung von 8 bit)
    - geht das alles mit dem Hradware Setup?
    - Wäre es schnell genug um damit auf Linie zu fahren?

    So, genug Fragen, ich will antworten \/

    Mfg

    Christian

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    Hi,
    LM1881 um das Signal zu wandeln, ich denke danach erhalte ich durch diesen Chip ein PAL Kompatibles Signal
    Nö. Gerade andersrum...
    Der LM 1881 ist ein Sync-Separator, holt also aus einem "Pal kompatiblen" Videosignal die Synchronimpulse raus.

    doch wie funktioniert dieses PAL Verfahren?
    http://de.wikipedia.org/wiki/Phase_Alternating_Line

    Gruß
    Christopher

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    31.07.2005
    Beiträge
    224
    Hmm, die Kamera ist ja aber Schwarz Weiß, also hat PAL letzten Endes nix mehr damit zu tun oder? Und was mach ich nun mit den Synchronimpulsen? Wie verarbeite ich die?

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685
    Moin!
    Ich mache selber sowas, und Radbruch hat eigentlich schon alles rausgefunden zu dem Thema, schau mal hier
    http://www.roboternetz.de/phpBB2/zei...ghlight=kamera
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    31.07.2005
    Beiträge
    224
    Ah cool, vielen Dank für den Link, ich werds mal mit nem externen ADC nachbauen, ma sehn wie weit ich komme!

    Mfg

    Christian

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo Christian

    Für echte Bildverarbeitung sind die AVRs nicht besonders gut geeignet. Ob das mit einem Mega128 mit externem Speicher und schnellerem ADC über I2C viel besser als mit meinem 8MHz-Mega32 funktioniert kann ich nicht sagen. Aber um eine Linie zu erkennen und ihr folgen zu können benötigt man auch keine 320X240 Bildpunkte mit 8-Bit Auflösung. Man muss auch nicht jedes Halbbild auswerten dass die Kamera liefert.

    Der ADC hat laut Atmel-Spezifikation sowieso keine Chance das Bas-Bild einzulesen, aber wie ich in meinem Kamera-Thread gezeigt habe, wenn man ihn etwas "quält" kann er es schon. Um zu verstehen, wie das funktioniert solltest du dich etwas in den Aufbau des Signals einlesen. Im Wesentlichen sieht das so aus:

    Jede Zeile startet mit einem Syncronimpuls dem die Bilddaten folgen. Jede Seite startet mit einem besonders langem Syncronimpuls. Schwarz wird mit ca. 0,3V dargestellt, weiss mit ca. 1V. Spannungen kleiner 0,3V bedeutet Syncronimpuls.

    Um nun das Bild einzulesen muss man zuerst die Sycronimpulse erkennen. Dazu schaltet man den ADC auf superschnellen Dauerlauf mit linksbündigem Ergebniss von dem man nur das High-Byte (ADCH) einliest und auswertet. Bei meinem 8MHz-Mega32 hatte ich prescaler /2 verwendet, möglicherweise muss man bei 16MHz einen größeren Teiler wählen. Als Referenzspannung nimmt man die internen 2,56V (sofern vorhanden). Da nur die oberen 8 Bit ausgewertet werden erhält man einen Wertebereich von 0 bis 255 für 0V bis 2,56V. (Das der ADC mit der Wandlung nicht immer fertig ist wird im Folgenden missachtet!)

    Den Start des Syncronimpulses erkennt man nun daran, dass der eingelesenen Wert deutlich unter 0,3V (also unter 30) ist, der optimale Wert ist etwas von der Hardware abhängig. Dann wartet man bis der Wert wieder über 0,3V ist und zählt dabei die Anzahl der ADC-Messungen im Dauerlauf. Das ergibt die Länge des Sync. Dann zählt man die Anzahl der Messungen bis zum nächsten Sycronimpuls, das ist die Zeilenlänge. Der Code dazu sieht etwa so aus:

    syncdauer=0;
    zeilendauer=0;
    while(ADCH>30); // warten auf Anfang Syncimpuls
    while(ADCH<30) syncdauer++; // Synclänge messen
    while(ADCH>30) zeilendauer++; // Zeilenlänge messen

    Anstelle der Zeilendauer kann man auch die Messwerte speichern:

    uint8_t werte[255]; // ich schaffte 63 Werte
    uint8_t *speicherzeiger;
    speicherzeiger=&werte[0];
    syncdauer=0;
    while(ADCH>20); // warten auf Anfang Syncimpuls
    while(ADCH<30) syncdauer++; // Synclänge messen
    do *speicherzeiger=ADCH; while (*speicherzeiger++ > 20); // Werte einlesen

    Das wäre der Einstieg. Anhand der Syncdauer kann man dann noch den Bildstart erkennen. Bei mir war das länger als 40:

    do
    {
    syncdauer=0; while (ADCH > 20); while (ADCH < 30) syncdauer++;
    } while (syncdauer < 40);

    Zu Beginn jeder Seite kommen einige Zeilen Schrott die man überlesen sollte:

    zeile=10; // 10 Zeilen überspringen
    while(zeile--) { while(ADCH > 20); while(ADCH < 30); }

    (20/30 ergibt eine kleine Hysterese um die Flanken besser zu erkennen)

    So kann man nun jede beliebige Zeile einlesen, allerdings nur eine pro Halbbild und nur mit geringer x-Auflösung. Wie man diese x-Auflösung deutlich erhöhen kann beschreibe ich später mal auf Nachfrage (Man kann es auch im Kamera-Thread nachlesen).

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    31.07.2005
    Beiträge
    224
    Cool, schonmal Danke für die Antwort, das bringt mich schonmal ein Stückchen weiter.
    Mit deinem Text habe ich jetzt auch das Bild hier verstanden



    Das heißt, da wo dieser Balken nach unten geht beginnt die Zeile, dann kommen 5,8mS Pause, danach werden die Informationen übertragen, undzwar so lange bis der Balken wieder nach unten geht (also unter 0,3 V).
    Soweit richtig?
    Dann ist die Zeile fertig, kommt die nächste Zeile, und immer weiter, bis ich dann irgendwann (bei meiner Auflösung) bei der 320ten Zeile bin (geh ich jetzt von aus wegen 320*240 Pixel auflösung) da gehts dann wieder von vorne los?
    Aber ich kann mir irgendwie nicht vorstellen dass jede Pixel Zeile einzeln übertragen wird, oder doch? Also ist irgendwie die Frage, was ist eine Zeile überhaupt? Hört sich jetzt ein wenig dumm an die Frage, aber ich weiß es echt nicht.

    Und wenn es nach Zeilen geht, wie merk ich dass er die nächste "Zelle" ausliest. Im Bild z.b. erst Grau dann hellgrau, wie merk ich dass er da dann n anderen Punkt grade ausliest?

    Also man merkt, ein paar Verständnisschwierigkeiten gibts schon noch. Ich werd mir das ganze mal morgen anschauen, vllt. ist es auch einfach zu spät


    Aber auf jeden Fall Danke für deine Hilfe!

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    In der Grafik sieht man von links nach rechts: Der Rest der vorherigen Zeile, die Schwarzschulter (wenn ich mich recht erinnere), den Sync, zweite Schwarzschulter und dann die "Daten". Diese würden auf einem Bildschirm eine Linie erzeugen, je 25% der Bildschirmbreite schwarz, grau, hellgrau und weiss. Abschluss bildet dann der Sync für die nächste Zeile.

    Echte "Daten" sehen aus wie eine wilde Zickzack-Linie mit allen Werte zwischen 0,3 und max. Wenn auf dem Bildschirm in der Mitte eine senkrechte schwarze Linie dargestellt würde, wären die Daten am Anfang und Ende der Zeile eher weiss, in der Mitte eher Schwarz. Bei einem total schwarzen Bild (Optik abgedeckt) sind alle Daten nahe 0,3V, bei Gegenlicht nahe max. Die Werte schwanken, weil der Weissabgleich der Kamera reinspuckt.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    31.07.2005
    Beiträge
    224
    Das heißt am Anfang messe ich den Wert von einem Sync zum anderen, das sind dann z.B. 80µs. Und alle Zeilen danach sind dann also 80µs lang, oder kann das schwanken? Ich meine im Prinzip, die 56µs die da stehen, sind dass dann immer 56µs oder kann sich das ändern? (Hoffe du verstehst was ich meine)

    Und auch noch nicht verstanden habe ist wie ich herausfinde wann das Bild "fertig" ist, wann also alle Zeilen übertragen sind.
    Bei Wikipedia steht:
    In der gebräuchlichen analogen Video- und TV-Technik werden die sogenannten HSYNC- und VSYNC-Signale verwendet. Der HSYNC dient der horizontalen Synchronisation der in einer Zeile wiedergegebenen Bilddaten. Der VSYNC koordiniert dagegen den Start der ersten Zeile in der vertikalen Richtung
    Das verwirrt mich jetzt vollkommen. Wenn ich das jetzt wissen würde könnte ich das ganze System verstehen, so kompliziert wie ich erst dachte ist es ja eig garnicht

    Aber dann jetzt mal wieder zur Hardware, brauche ich den LM1881 eig? Weil auf deinem Thread hast du die Cam direkt drangeschlossen. Mich verwirrt jetzt ein wenig dass an dem Kamera Modul 5 Anschlüsse sind, auf einer Seite 2 auf der anderen 3. Da wo die 2 sind kommt VCC und GND hin, das ist ja einfach, aber was mach ich mit den 3 anderen Pins? Ich muss mal den Anbieter auf ein Datenblatt ansprechen...


    EDIT: Noch ne Frage, wieviel XRAM kann der AVR verarbeiten, schafft der nur 64kb? Das steht jedenfalls in der Bascom Hilfe, im Datenblatt hab ich aber keine Begrenzung finden könne. Ich wollte jetzt 512 Kb (Ich weiß... Aber lieber zu viel als zu wenig ^^) rangeben, wollt aber erst fragen, nicht das ich unnötig Geld ausgebe...

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Hallo

    Die Zeiten sind sehr konstant, aber die kann man mit dem AVR nicht messen weil die Abtastrate zu niedrig ist. Man liest Werte ein bis der nächste Sync erkannt wird. Die Messungen in den Beispielen oben sind eher relativ zu bewerten, kurzer Sync- langer Sync. Diese Zeiten kann man nicht ändern, denn sie passen zu der Geschwindigkeit mit der ein Elektronenstrahl über die Rückseite der Mattscheibe düst. Deshalb gibt es auch keine definierten Bildpunkte wie bei einem Computerscreen.

    Das Halbbild endet mit dem langen Seitensync, danach startet das nächste Halbbild. Halbbild bedeutet, es wird nur jede zweite Zeile gesendet, der Bildschirm stellt beide Halbbilder ineinander da (*würks*)

    V-sync und H-sync habe ich auch noch nie richtig gecheckt, offensichtlich bin ich da nicht der einzige. Ich glaube, der V-Sync ist der Seitenstart und H-Sync der Zeilenstart (unverbindlich) Auf jeden Fall startet die Seite nach dem langen Sync...

    Wenn du die Versorgungspins kennst kannst du da mal 5V anschliesen und an den anderen Pins die Spannung messen. Der Signalausgang hat bei dunkel ca. 0,3V, bei sehr hell irgendwas bei 1,5V (unbelastet). Ein zweiter Pin könnte ein Gain-Eingang sein, das ist die Verstärkung, der dritte vielleicht der Weisabgleich? Datenblatt wäre natürlich optimal.

    nicht das ich unnötig Geld ausgebe...
    Egal wieviel, es ist unnötig! Was willst du mit 320X240 8-Bit-Werten anfangen? Dein Mega128 wird total überlastet sein. Und du vermutlich auch...

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

Seite 1 von 5 123 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •