Site hosted by Angelfire.com: Build your free website today!

Roboterelektronik

Die Gameboy Camera als Auge für den Roboter

Auslesen des Artifical Retina Image Sensors von Mitsubishi


  • Einleitung
  • Öffnen der Camera
  • Funktionsweise
  • Auslesen eines Bildes
  • Die Kameraregister
  • Anschluss an einen Microcontroller
  • Objekterkennung


  • Als 1998 die Gameboy Camera von Nintendo herauskam, war ihr Erfolg nicht so bahnbrechend wie gedacht. Das lag
    vielleicht auch am sehr hohen Preis von damals noch über 200 DM (100 EURO) Nintedo hat inzwischen die Produktion dieser Kamera eingestellt und auch in den meisten Läden gibt es sie
    wenn überhaupt nur noch als Restposten. Ihr Preis liegt bei im Moment gerade mal 10 EUR. Auch bei Ebay gibt es noch einige Exemplare (www.ebay.de).
    Wegen dieses geringen Preises ist sie für Robo-Bastler interessant geworden denn mit ihrer Hilfe kann man
    mit relativ geringem Aufwand, seinem Robot eine Kamera verpassen. Ein Schritt vor dem selbs erfahrene Robo-Bastler
    meistens zurückschrecken, da das Auslesen einer Kamera meistens eine sehr Zeitkritische und Speicheraufwendige Aufgabe darstellt,
    die viele Microcontroller nicht bewältigen können. Die Gameboy Kamera dagegegen kann mit so ziemlich jedem µC ausgelesen werden. Natürlich stellt auch diese Anforderungen an Geschwindigkeit und Speicher (RAM) aber dazu später mehr.

    Es gibt einige englischsprachige Seiten die die GameboyCamera beschreiben deshalb will ich hier die Informationen nochmal in Deutsch geordnet zusammenfassen.

    Der "EyeBall" -- jetzt wird geschraubt !

    Schauen wir uns zunächst eine Handelsübliche GameboyCamera an: Sie besteht aus einem Rechteckigen flachen Teil und dem
    Kameraball (Eyeball). Nur dieser wird benötigt. Um ihn vom Rest des Moduls zu lösen müssen die vier Schrauben am rechteckigen Gehäuse
    geöffnet werden. Da es sich dabei um nicht ganz übliche Schrauben handelt muss man ein wenig Fingerspitzengefühl
    aufbringen um sie zu öffnen. Aber es geht !.

    Der Kameraball ist mit dem restlichen Modul über einen 9pol. Stecker verbunden. Dieser ist Vorsichig zu lösen.
    So den Rest kann man nun wegschmeißen. Benötigt wird nur der "EyeBall". Wer den nicht auch noch öffnen will für den hab ich hier die Pinbelegung des Steckers.

    Ich empfehle aber den EyeBall auch noch aufzuschrauben, man dann die Kamera viel kleiner halten kann. Der Plastikball ausenherum ist nur Dekoration und hat keinen technischen nutzen. Auch dieser hat wieder diese Krankheiten von Schrauben (ich kanns nicht anders nennen). Dahinter kommt der ARChip mit aufgeschraubten Objektiv zum Vorschein.
    Diesen kann man dann herausnehmen. Ist doch viel handlicher als der Ball oder ? Auch hier gibts wieder einen 9pol. Stecker. Die Belegung der Buchse (wo dieser Stecker drinsteckt) folgt sogleich:
  • 1 +5V (VDD)
  • 2 START
  • 3 SIN
  • 4 LOAD
  • 5 RESET
  • 6 XCK
  • 7 Read
  • 8 Vout
  • 9 GND (VSS)


  • Die Funktionsweise der Kamera -- jetzt wirds Wissenschaftlich



    Um näher auf die Funktionsweise einzugehen hier nochmal die Liste der Anschlüsse mit Beschreibung:
    Pin Name Beschreibung
    1 VDD Positive Spannungsversorgung (+5V)
    2 Start Startet den Aufnahmeprozess
    EINGANG
    Besitzt einen internen 10k PullDown Wiederstand
    3 Sin Datenleitung für die Registereinstellungen
    EINGANG
    Besitzt einen internen 10k PullDown Wiederstand
    4 Load Speichern der Registereinstellungen
    EINGANG
    Besitzt einen internen 10k PullDown Wiederstand
    5 Reset System + Speicher Reset
    EINGANG
    Besitzt einen internen 10k PullUp Wiederstand
    6 Xck Taktleitung
    EINGANG
    Besitzt einen internen 10k PullDown Wiederstand
    7 Read Zeigt an ob ein Bild vorliegt
    AUSGANG
    8 Vout Analoger Pixelwert
    AUSGANG
    9 VSS Negative Spannungsversorgung(GND)


    Alle Befehle und Aktionen der Kamera benötigen einen Takt, dieser muss auf den Takteingang XCK (6) gelegt werden.
    Alle Ein - und Ausgaben sind immer mit dem Takt syncronisiert. Hierbei ist die maximale Taktfrequenz 500kHz. Die minimale ist leider unbekannt, aber sie kann um einiges langsamer sein.

    Um ein Bild zu schiessen geht man wie folgt vor:
    Als erstes muss die Kamera zurückgesetzt (Reset) werden. Dazu dient der Pin RESET (5). um einen Reset auszführen zieht man ihn auf Low-Pegel herunter und legt XCK (6) auf Hi-Pegel. Dann läßt man
    Reset wird auf Hi-Pegel und zieht schließlich auch Xck wieder auf Low-Pegel. Das folgende Diagramm zeigt das:
    Xck,Reset Timing

    Dann müssen die Register der Kamera geladen werden. Näheres zu den Registern weiter unten. Es gibt 8 Register. Jeder Register hat eine 3-Bit Adresse und 8-Bit Daten. Somit müssen pro Register 11-Bits übertragen werden. Dazu dient die SIN und die LOAD Leitung. Natürlich wird auch hierfür die Taktleitung Xck benötigt. Die Übertragung erfolgt als sog. syncrones Protkoll, ähnlich dem I²C Bus. Auch hier wird erst das höherwertigste Bit(MSB) übertragen. Dazu legt der µC das Bit (Low oder Hi Pegel) an die SIN Leitung und gibt dann einen positiven Impuls auf die Taktleitung (XCK). So verfährt man bis zum niederwertigsten Bit(LSB). Bevor man allerdings die Taktleitung nach dem letzten Bit (Bit 0) wieder auf LOW fallen läßt muss man den LOAD Eingang auf Hi Legen um der Kamera anzuzeigen dass nun 11 Bits übertragen wurden.
    Folgendes Diagramm verdeutlicht das:
    Sin,Load,Xck Timing
    Auf diese Weise muss man alle 8 Register (von 000 - 111) mit Daten füllen. Ist dies getan so kann man die Kamera dazu verlanlassen ein Bild zu machen. Hierzu muss man den START Eingang auf Hi-Legen und einen positiven Impuls auf die Taktleitung (XCK) geben.
    Und noch ein Diagramm dazu (sonst würd einem ja was fehlen ;-)
    Start,Xck Timing
    So und nun muss man solange einen Takt auf XCK legen bis die Kamera mithilfe des READ Ausgangs (READ geht auf Hi) anzeigt das ein Bild vorliegt. Ist dem so dann kann man das Bild auslesen. Dazu hat die Kamera den Vout Ausgang der den Helligkeitswert jedes Pixels als Spannungswert ausgibt. Diese Wert werden wie immer syncron mit XCK angelegt. Sind alle Pixel (128*128 = 16384) ausgelesen geht READ wieder auf LO-Pegel. Natürlich habe ich dazu auch wieder ein ,anschauliches und auf den ersten Blick nicht allzu informatives, Diagramm (sogar 2 !!):



    Um nun ein weiteres Bild zu machen, kann man das START Signal weglassen. Nach 5 Taktzyklen erzeugt die Kamera dieses von selbst.


    Auslesen eines Bildes --- das man mal was sieht !!


    Wie schon weiter oben angedeutet, besteht der Auslesenvorgange aus genau 2 Schritten:
    Xck Pulse --- Spannung an VOut lesen--> 1. Pixel --- Xck Pulse --- Spannung an VOut lesen--> 2.Pixel ---... usw.
    Natürlich muss man die gelesenen Spannungswerte noch irgendwo abspeichern, z.B. in einenm externen SRAM. Also nun hat man also satte 16834 einzelne Pixel. Und was nun ? Nun, erstmal ein normales Bild daraus machen. Das man auch was erkennt, z.B. könnte der Microcontroller die gelesenen Pixel direkt an einen PC senden. Dazu muss man aber wissen wie man aus den einzelnen Spannungswerten der Pixel, ein normales Bild erzeugt. Darum gehts hier.
    Im Datenblatt des AR-Chips (CMOS Image Sensor in der GameboyCamera) steht, das der 1. Pixel, also der Pixel den die Camera nach dem READ Signal als erstes ausgibt, die Position (0,0) hat. Der 2. Pixel die Position (1,0) usw. Das geht bis (127,0) dann geht es weiter mit (0,1). Schön und gut, nur was bedeutet das konkret. Stellen wir uns also einmal vor das die folgende Tabelle ein Bild darstellt, mit 128 Zeilen und 128 Spalten. Dann kommen die Pixel in folgende Reihenfolge:

    Der 1. Pixel kommt also ganz links oben in die Ecke, und der letzte Pixel (Pixel Nr. 16384) kommt ganz rechts unten in die Ecke. Dazwischen so wie in der Tabelle.
    So, jetzt haben wir die Pixel schonmal richtig im noch nicht vorhandenen Bild verteilt. Jetz gehts um den gelesenen Spannungswert jedes Pixels. Werten wir diesen mit 8-Bit Genauigkeit aus, so liegen die Werte zwischen 0 und 255. Ist der I Register (1-Bit) 0 so wird das Bild positiv ausgegeben, d.h. umso heller der Bildpunkt ist desto höher ist sein Spannungswert. 255 bedeutet also reinstes Weiß und 0 bedeutet total Schwarz.
    Hier ist ein Visual-Basic Codebeispiel zum richtigen Anordnen und einfärben der Bildpunkte:

    '-Bild- ist eine Picturebox
    'i ist die Schleifenvariable
    'pixel() ist ein eindimensionaler Arrays in dem die Pixel der CAM gespeichert sind
    'x,y sind normale Variablen
    
    dim x
    dim y
    dim i
    dim grau  'für den Pixelwert
    
    x=0
    y=0
    
    
    for i=0 to 16384
        grau=pixel(i)
        Bild.Forecolor=RGB(grau,grau,grau)   'erzeugt den richtigen Grauwert
        Bild.pset(x,y) 'malt den Pixel ins Bild
    
        x=x+1     'ein Bildpunkt weiter nach rechts
        if x>127 then x=0:y=y+1  'wenn am Ende einer Spalte ,dann nächste Zeile
    next i
    

    Wenn man die Pixel nur mit 4-Bit Genauigkeit gelesen hat, nimmt man am besten den gemessenen Wert(0-15) mal 17 bevor man ihn in RGB(r,g,b,) einsetzt.


    Anschluss an einen Microcontroller -- holt die Lötkolben raus !



    Zum Betrieb der Kamera an einem Mikrocontroller gibt es zwei Hauptanforderungen: Erstens der µC braucht einen ausreichend schnellen AD-Wandler und min. 16K RAM um die Bilddaten zu speichern. Da ich die C-Control II benutze, welche 64K SRAM besitzt brauchte ich keinen exteren RAM. Lediglich einen I²C AD-Wandler vom Typ PCF8591 war notwendig da der eingebaute AD zu langsam ist. Um die Geschwindigkeit noch weiter zu steigern könnte man einen paralellen AD-Wandler nehmen. Die Geschwindigkeit ist erst in zweiter Linie wichtig, da diese drastisch gesenkt werden kann. Zwar darf sie nicht zu langsam sein, da sonst die interne Pufferung nachläßt und die Pixel ihren Wert verlieren aber man kann sie auf min. 0.5kHz Takt senken.

    Des weiteren kann man die Kamerapins 2-7 direkt an die Digtalports eines Microcontrollers anschließen. Den Vout (8) sollte man an den Vin eines AD-Wandlers anschließen. Bei diesem kann man die Referenzspannung Vref auf 5V einstellen. Lediglich wenn man vorhat die Pixelwerte mit einer Genauigkeit von unter 8-Bit auszuwerten sollte man Vref entsprechend anpassen. Bleibt nur das RAM, diese sollte wie gesagt 16K (=16384 Bytes) haben. Man kann aber auch die Pixelwerte mit einer Genaugkeit von nur 4-Bit auswerten und kann so zwei Pixel in einem Byte speichern. Dann reichen natürlich auch 8K(=8192 Bytes) aus. Zum Vergleich: Der Gameboy wertet die Pixel nur mit 2-Bit (also 4 Graustufen) aus !!!


    Die Kameraregister -- wir Konfigurieren.... !



    Die GameboyCamera hat mehr Einstellungsmöglichkeiten als irgendein Mensch brauchen kann. Das liegt daran das der interne AR-Chip nicht nur ein normales Bild macht, sondern dieses auch noch bearbeiten kann. Z.B. kann er selbst Helligkeitsübergänge festellen und das Bild dann so anpassen das nur extrem helle Objekte darauf zu sehen sind. Für einen Roboter gar nicht so übel. Trotzdem verwirrt die große Anzahl von Einstellungen erstmal kräftig. Deshalb hier der Überblick über alle 8 Register und die darin enthaltenen Bits:

    Reg. No. Address 7 6 5 4 3 2 1 0
    1 001 N VH1 VH0 G4 G3 G2 G1 G0
    2 010 C17 C16 C15 C14 C13 C12 C11 C10
    3 011 C07 C06 C05 C04 C03 C02 C01 C00
    4 100 P7 P6 P5 P4 P3 P2 P1 P0
    5 101 M7 M6 M5 M4 M3 M2 M1 M0
    6 110 X7 X6 X5 X4 X3 X2 X1 X0
    7 111 E3 E2 E1 E0 I V2 V1 V0
    0 000 Z1 Z0 O5 O4 O3 O2 O1 O0


    Um erstmal was zu haben wo man starten kann habe ich hier zwei Beispieleinstellungen für Normale und "Edge-Extracted" Bilder.

    Normal Mode Settings
    Edge Extraction Mode Settings
    Reg Address Value
    0 000 0x80
    1 001 0x0E
    2 010 0x06
    3 011 0x00
    4 100 0x01
    5 101 0x00
    6 110 0x01
    7 111 0x07
    Reg Address Value
    0 000 0x3F
    1 001 0xE6
    2 010 0x0A
    3 011 0x00
    4 100 0x01
    5 101 0x00
    6 110 0x01
    7 111 0xF3


    Die wichtigsten sind die Register C0 und C1. Diese geben die "Exposure Time" an. Also die Zeit in der Licht auf den CMOS Chip fällt, sprich: Die Belichtungszeit. Gibt man sie zu lange an, wird das Bild total weiß. Gibt man sie zu kurz an wird es zu dunkel. Setzt man die Zeit auf 0 haben alle Pixel den minimalen Wert--> das Bild ist absolut Schwarz. Dieser Wert muss u.u. immer Wieder den Lichtverhältnissen angepasst werden. Der Register C1 ist der höherwertigste und der C0 ist der niederwertigste. Zusammen ergeben sie ein 16-Bit Word das, mit 16 multipliziert, die Belichtungszeit in µS (microsekunden) angibt.
    Reg(C0:C1)*16=Belichtungszeit [µS]. Die maximale Belichtungszeit entspricht also etwas mehr als 1 Sekunde [(256*256)*16]/1000000 = 1,048 sec.
    Ebenfalls wichtig sind die Bits O0-05 im Register 000. Diese geben die "Offset Voltage" also die untere Grenze der Spannung für die Pixel an. Dabei zeigt O5 an ob die Spannung positiv ("L") oder negativ("H") sein soll. Die restlichen 5 Bit stellen eine Offsetspannung zwischen 0 und 1 (bzw. -1) ein.
    In Zusammenhang mit der Spannung stehen auch die Bits V0-V2. Diese stellen die Referenzspannung (Vref)also die maximale Spannung der Pixel ein. Je nachdem wie die Bits gesetzt sind ergeben sie folgende Spannungen:
    Register Setting Vref (V)
    V2 V1 V0
    0 0 0 0.0
    0 0 1 0.5
    0 1 0 1.0
    0 1 1 1.5
    1 0 0 2.0
    1 0 1 2.5
    1 1 0 3.0
    1 1 1 3.5

    Als letzten Register will ich hier auf die Bits G0-G4 eingehen. Diese geben den Verstärkungsfaktor für die Pixel an. Dies wirkt sie indirekt auch auf die Spannung aus. Der richtige Faktor ( wird hier in dB angegeben) muss durch probieren ermittelt werden.
    Die restlichen Bits dienen vorallem den EdgeExtraction Operationen und können im Datenblatt des ARChips nachgelesen werden.


    Hier noch ein paar GB Cam Bilder. So ziemlich die ersten die ich gemacht hab:

    Da hat die Auflösung von meinem VB Programm noch nicht so gepasst... es zeigt einen Teil meines Roboters mit LCD und Funkmodul

    Das Buch: "Mobile Roboter" - - Wie passend...

    Der Abo-Geschenk Radiowecker von Elektor -- ebenfalls passend oder ?

    Ich...


    Demnächst... :Einsatz der Camera auf mobilen Robotern - Objekterkennung usw.

    Danke an:
    Daniel Herrington
    Liquid Horizon (http://www.lh.co.nz)

    Some photos courtesy of Daniel R. Herrington. Used with permission.



    Software dazu: Demnächst: Quellcode für die CC2
    Hersteller /Infos : Mitsubishi (ARChip)
    Datenblatt des ARChip: M64282FP
    Bezugsquellen: GameboyCamera: Ebay / ToysRUs o.ä.
    Preis: 10-15 EUR