- SF800 Solar Speicher Tutorial         
Seite 6 von 20 ErsteErste ... 4567816 ... LetzteLetzte
Ergebnis 51 bis 60 von 197

Thema: Hardware Mitmach-Projekt: Kamera für den RP6

  1. #51
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2009
    Ort
    NRW
    Beiträge
    562
    Anzeige

    Praxistest und DIY Projekte
    Hallo

    Wenn der RP6 gar nichts macht sieht das schwer nach nem Kurzschluss aus.
    Also nach Lötbrückn oder kalten Lötstellen ausschau halten.

    Gruß Thund3r
    Dein Gott sei mein Zeuge!

  2. #52
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    30
    Beiträge
    661
    Also ich hab eigentlich alles kontrolliert und müsste da nicht die sicherung
    rausspringen?
    MfG Martinius

  3. #53
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.01.2009
    Ort
    NRW
    Beiträge
    562
    Hallo

    Die Sicherung springt nich imma sofort raus.
    Ich hatte schon öfter mal n Kurzschluss und ers beim 20 mal oder so is die rausgesprungen.

    Gruß Thund3r
    Dein Gott sei mein Zeuge!

  4. #54
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    30
    Beiträge
    661
    der keramik kondensator ist ja ungepolt und beim elek. konden. müssen
    die striche zur negativen bahn zeigen ,oder?
    MfG Martinius

  5. #55
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    30
    Beiträge
    661
    ok hab das problemm gelöst \/ \/ \/ \/ \/ \/
    MfG Martinius

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

    Ein paar Gedanken zur Auflösung: Wie man in der Vergrößerung der oberen Bilder deutlich sieht, wir lesen den selben Wert mehrfach aus. Dazu eine kleine Rechnung: Der Takt ist 4MHz, ein Takt dauert 1/4000000=0,25µs. Eine ADC-Wandlung dauert im Dauerlauf 13 Takte, also 13*0,25µs=3,25µs. Wenn die Daten einer Zeile in 52µs durchrauschen sind 52/3,25=16 Wandlungen möglich! Deshalb sind in den 64Pixel breiten Bildern oben immer 4 Pixel nebeneinander gleich. Die Ausreiser kommen von kleinen Unterschieden im Timeing des Signals zum ADC-Takt.

    Das war ja eigentlich klar (wurde auch schon mehrmals angemotzt), aber was ist mit Plan B: Nach dem Zeilenstart kurz warten und dann einen Pixel einlesen. Das bringt keine Verbesserung, weil der ADC ja weiterhin im Dauerlauf digitalisiert. Dummerweise auch noch asyncron zum Signal, bei 64µs pro Zeile kann er maximal 64/3,25=19,irgendwas Werte wandeln. Egal, wann wir den Wert einlesen, es wird immer einer der 16 möglichen Werte der Zeile sein.

    Deshalb hier ein noch schnellerer Ansatz der mehr Werte aus einer Bildzeile rauskitzelt. Wie gehabt hangeln wir uns im Bild mit dem ADC im Dauerlauf durch den Bildstart und die ersten 30 Zeilen. Dann allerdings stoppe ich den ADC. Es wird dann erst der Spaltenversatz abgewartet, der ADC erneut gestartet und schließlich, nachdem der ADC die fertige Wandlung meldet, wird der Wert gespeichert. Da der ADC dann wieder im Dauerlauf digitalisiert, hangeln wir uns 5 Zeilen weiter durch das Bild und samplen nacheinander 48 Pixel in der gewählten Spalte. Nach 64 Halbbildern ist das Bild dann komplett mit 48X64 Pixeln eingelesen.

    Code:
    // RP6 sendet eine 48X64-HiRes-Bitmap über die serielle Schnittstelle      4.4.10 mic
    
     #include "RP6RobotBaseLib.h"
    
    void ADC_Init(void)
    {
    	extIntOFF(); // schaltet den E_INT1-Port auf Eingang für den ADC
    
    // ADC interne Referenz 2,56V, Ergebniss linksbündig, Kanal ADC4 (E_INT1)
    	ADMUX = (1<<REFS1) | (1<<REFS0)  | (1<<ADLAR) | 4;
    // setze free running triggern
    	SFIOR = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
    // kein Interupt, Wandler einschalten, prescaler /2, ADC läuft nun mit 4MHz!
    	ADCSRA = (0<<ADIE) | (1<<ADEN) | (0<<ADPS2) | (0<<ADPS1)  | (1<<ADPS0);
    // Autotriggern bedeutet jetzt free running aktivieren, altes Flag löschen
    	ADCSRA |= (1<<ADATE) | (1<<ADIF);
    // Initialisierung starten
    	ADCSRA |= (1<<ADSC);
    // und noch die empfohlene Initiallesung
    	while (!(ADCSRA & (1<<ADIF)));
    	ADCSRA |= (1<<ADIF);
    }
    
    int main(void)
    {
    	uint8_t bildspeicher[100], *bildzeiger; // 100 Byte Bildspeicher sollten reichen
    	uint8_t zeile, sync, c;                 // und dürfen NICHT global sein!
    	uint16_t spalte, i;
    	uint8_t bmp_header_48_64_24bit[54]={
    	0x42, 0x4d, 0x36, 0x24, 00, 00, 00, 00, 00, 00, 0x36, 00, 00, 00, 0x28, 00,
     	00, 00, 0x30, 00, 00, 00, 0x40, 00, 00, 00, 01, 00, 0x18, 00, 00, 00,
     	00, 00, 00, 0x24, 00, 00, 0xc4, 0x0e, 00, 00, 0xc4, 0x0e, 00, 00, 00, 00,
     	00, 00, 00, 00, 00, 00};
    	initRobotBase();
    	ADC_Init();
    
    	while(1)
    	{
    		for(c=0; c<54; c++) writeChar(bmp_header_48_64_24bit[c]); // Header senden
      		for(spalte=0; spalte<64; spalte++)
    		{
    			bildzeiger=&bildspeicher[0]; // Zeiger auf Start des Bildspeicherbereich
    			zeile=30; // aktuelle Zeile (35 Zeilen sind der Schrott beim Bildstart)
    			setLEDs(63-spalte); // working
    			
    		   cli();
    			do // Warten auf langen Syncbereich = Bildstart
    			{
    				sync=0;
    				while (ADCH > 20); // warten solange Bilddaten erkannt werden
    				while (ADCH < 30) sync++; // Länge des Sync-Signal zählen
    			}while (sync < 40); // größer 40 bedeutet Bildstart
    
    			while(zeile--)
    			{
    				while (ADCH > 20); // Bilddaten
    				while (ADCH < 30); // Sync
    			}
       		for(c=0; c<48; c++)
    			{
    				i=spalte;
    				zeile=4; // Zeilensprung für 48 Zeilen
    				while(zeile--)
    				{
    					while (ADCH > 20); // Bilddaten
    					while (ADCH < 30); // Sync
    				}
    
    				ADCSRA &= ~(1<<ADEN); // ADC stoppen
    				while(i--); // Pixel ansteuern
    				ADCSRA |= (1<<ADATE) | (1<<ADEN) | (1<<ADIF) | (1<<ADSC); // ADC wieder starten
    				while (!(ADCSRA & (1<<ADIF))); 	// 26 ADC-Takte warten bis Wandlung fertig
    				*bildzeiger++=ADCH; 				// das sind ca. 6,5µs
    				ADCSRA |= (1<<ADIF);
    			}
    			sei();
    
    			for(zeile=0; zeile<48; zeile++) // 48 Pixel senden
    			{
    			   if (bildspeicher[zeile] > 20)
    				{
    					writeChar((bildspeicher[zeile]-20)*2); // RGB in Pixelfarbe
    					writeChar((bildspeicher[zeile]-20)*2);
    					writeChar((bildspeicher[zeile]-20)*2);
    				}
    				else
    				{
    					writeChar(0); // oder Schwarz
    					writeChar(0);
    					writeChar(0);
    				}
    			}
    		}
    		setLEDs(63); // ready
    		while(!(getBumperLeft() || getBumperRight())); // Neues Bild senden?
    	}
    	return(0);
    }
    Wirklich beeindruckend ist das Ergebniss allerdings nicht:
    Bild hier  

    Gruß

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

  7. #57
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    Na wenigstens funktioniert es!!!!
    Bei mir funktioniert keines deiner Programme, obwohl ich die Schaltung wie im RN-Wissenteil beschrieben aufgebaut habe. An der Hardware kann es eigentlich nicht liegen, weil wenn ich die Kamera über die Chinch-Buchse an den Fernseher anschließe kommt das Videosignal störungsfrei an. Wenn ich das Programm starte, das weiter oben von Radbruch beschrieben wurde (Testprogramm) , passiert nichts. Ich habe den IT1-Pin mit dem Videoausgang verbunden jedoch passiert immer noch nichts. Vielleicht fällt euch ja noch was ein was ich überprüfen könnte.
    PS: Manchmal sitzt man auch direkt vor dem Problem und siht es nicht.
    Danke!!
    PS_2:
    Allen ein frohes Ostefest.
    Nichts existiert durch sich allein!
    Bild hier  

  8. #58
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    30
    Beiträge
    661
    bei mir dasselbe keine auswertung über die serille schnittstelle
    MfG Martinius

  9. #59
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    Blog-Einträge
    8
    Hallo

    Ich habe den Aufbau nur mit den allernötigsten Bauteilen bestückt, weil ich mal abwarten wollte, was noch alles dazukommt. Verbunden ist GND mit der Kamera und der Cinchbuchse, Vcc mit der Kamera, INT1 mit Video-Out und der Cinchbuchse. Gain und Gamma sind nicht beschaltet. Verbindung zwischen Kamera und Platine ist ein 10poliges Flachbandkabel, jede zweite Ader wird verwendet (nur die Ungeraden), Länge ca. 25cm.

    In der Cinchbuchse steckt die Verbindung zum TV-Monitor um das Kamerasignal mit ca. 75Ohm zu belasten. Ohne diese Last steigen die Pegel des Signals. Das könnte dazu führen, das die Syncs nicht mehr sicher erkannt werden. Normalerweise sind Pegel kleiner als 0,3V (Werte unter 30 bei interner Spannungsreferenz von 2,56V) ein Sync. Spannungen größer 0,3V sind Bilddaten:
    while (ADCH > 20); // Bilddaten
    while (ADCH < 30); // Sync

    Noch eine neue Erkenntniss: Wenn die Spannung der Akkus meines RP6 auf ca. 7,2V gesunken ist (mit "Verbinden" im RP6Loader gemessen), funktioniert die Kamera nicht mehr:

    Connected to:
    "RP6 Robot Base"
    FW Version: 1.4
    Battery Voltage: 7.69V
    Gruß

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

  10. #60
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    27.09.2009
    Alter
    30
    Beiträge
    661
    dann solten wir vieleicht noch eine 5. Phase auf machen inder die Stromversorgung ausgebaut wird mit zusätzlichen Akku oder Thyristor
    MfG Martinius

Seite 6 von 20 ErsteErste ... 4567816 ... LetzteLetzte

Berechtigungen

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

12V Akku bauen