PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hardware Mitmach-Projekt: Kamera für den RP6



Dirk
27.03.2010, 20:09
Hallo RP6 Fans,

im RN-Wissen gibt es jetzt ein "Mitmach-Projekt", bei dem eine Schaltung auf der Experimentierplatine des RP6 entstehen soll, die den Anschluß einer CMOS-Kamera an den RP6 ermöglichen soll:
http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt
Das Projekt ist in 4 Abschnitten geplant, die 1. Phase ist schon fertig.

Wer hat Lust, mitzumachen?

Gruß Dirk

Thund3r
27.03.2010, 20:25
Hallo

Ne gute Idee.

Ich wär soweit dabei! Müsste mich aber ersmal ins Thema einarbeitn und das notwenidge Zeugs besorgn.

Gruß Thund3r

Thomas$
27.03.2010, 20:51
lust schon aber ich wäre aber für eine extern controler lösung.
und programierung in c und in bascom.
natürlich wären alle infos über pal und fbas nützlich

Dirk
28.03.2010, 10:15
@Thund3r:

Ich wär soweit dabei!
Toll! Ich will 'mal sehen, ob ich heute noch die Teileliste für Phase 2 fertig kriege, damit sich der Einkauf lohnt! O:)

@Thoma$:

.. ich wäre aber für eine extern controler lösung
Ich werde z.B. die RP6Control M32 zur Auswertung nehmen. Man kann aber natürlich einen eigenen uC auf eine 2. Exp aufbauen.

Gruß Dirk

Martinius11
28.03.2010, 10:38
ich hätte dazu mal ne frage ,soll der Roboter damit bilder an den Pc,Fernseher übermitteln oder dient die Kammera als Sensor? :-k :-k

Thomas$
28.03.2010, 12:39
ich hab kein rp6 :-) beschäftige mich aber auch mit dem thema darum wollt ich etwas neutrales den extra µC.
da der µC sicher zu langsam ist für bunt bild kann man das ja auch selber machen. also rgb led als beleuchtung somit sinkt zwar die bild rate aber dafür hätte man bunt bild
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=53330&highlight=arduino
http://images.google.de/imgres?imgurl=http://pics.computerbase.de/lexikon/121336/Fbas.png&imgrefurl=http://www.computerbase.de/lexikon/Fernsehsignal&usg=__Qs7ChXw8B93n0EZE_01_9Wy5hs8=&h=358&w=450&sz=3&hl=de&start=2&um=1&itbs=1&tbnid=_uFmpYr-1ZDGKM:&tbnh=101&tbnw=127&prev=/images%3Fq%3Dfbas%26um%3D1%26hl%3Dde%26client%3Dfi refox-a%26rls%3Dorg.mozilla:de:official%26tbs%3Disch:1

Dirk
28.03.2010, 16:46
@Martinius11:

... oder dient die Kammera als Sensor?
Ja, sie soll als Sensor zum Linienfolgen und z.B. zum Auffinden eines hellen Punktes o.ä. dienen.
Ein Senden des Bildes an einen PC kann man mit einem separaten Sender machen, der Videoanschluß könnte dann an der CINCH-Buchse sein.

Gruß Dirk

Mc Delta
28.03.2010, 18:23
Die Idee mit dem Kamera-Rp6 Projekt finde ich wirklich gut. Ich habe mir auch schon das thema angeschaut und das ist alles sehr schön geordnet und gut verständlich beschrieben.Nur eine Frage:
werden eigentlich auch Programme zur Signalauswertung gepostet und kommentiert?

Martinius11
28.03.2010, 19:47
wie viel wird das Projekt den insgesammt kosten den 40€ für die erste Phase
sind nich wenig für einen Schüler :-k

radbruch
28.03.2010, 20:12
Hallo

Nette Idee :)

Man sollte unbedingt einen jumperbaren 75Ohm-Widerstand (oder etwas größer) parallel zum Kontrollbildausgang mit einplanen. Als Kamera würde sich vielleicht diese sehr günstige (15€) SW-Kamera eignen:
http://www.conrad.de/medias/global/ce/1000_1999/1500/1500/1500/150001_RB_00_FB.EPS_250.jpg (http://www.conrad.de/ce/de/product/150001/)
Bild von: http://www.conrad.de/ce/de/product/150001/

Ich habe die allerdings nicht selbst erprobt:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=435509#435509

Für den Fall, dass ihr es im Kamera-Thread nicht gesehen habt: Es gibt auch eine Bascom-Variante dazu:
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=47232

btw: Ohne zuviel zu verraten wird mein Teelichtlöscher eine Kamera verwenden...

Viel Spaß beim Nachbau.

Gruß

mic

Dirk
28.03.2010, 20:35
@Mc Delta:

werden eigentlich auch Programme zur Signalauswertung gepostet und kommentiert?
Ja, das ist geplant. Bei dem Mitmach-Projekt brauche ich aber Unterstützung durch alle "Mitmacher".

@Martinius11:
Die 1. Phase war die teuerste, auch durch die 20€ für die Exp. Die 2. Phase gibt's schon für 2,56€, die weiteren auch nur für wenige €.

@Radbruch:

Man sollte unbedingt einen jumperbaren 75Ohm-Widerstand (oder etwas größer) parallel zum Kontrollbildausgang mit einplanen. Als Kamera würde sich vielleicht diese sehr günstige (15€) SW-Kamera eignen:
Der Widerstand 75 Ohm kommt in Phase 2 mit rein. Die S/W-Kamera (150001) nehme ich auch für das Projekt.

Gruß Dirk

radbruch
28.03.2010, 21:21
Die S/W-Kamera (150001) nehme ich auch für das Projekt.Oje, ich bin blind. Hatte ich voll überlesen, dann sind die 40€ quasi komplett für alles. Echt beeindruckend gut wie du das Projekt hier angehst.

Thund3r
28.03.2010, 22:56
Hallo

Ich bin mal auf deine Teelicht-Lösung gespannt radbruch. :D

Gruß Thund3r

Martinius11
29.03.2010, 20:11
könnte mir bitte noch jemand erklären wie die kamera die daten sendet und
wie man sie im programm verarbeitet ich blicke durch das programm von radbruch nicht wirklich durch

radbruch
29.03.2010, 21:44
Hallo

Die Kamera sendet keine Daten, sie hat nur einen analogen Ausgang der mit einem ADC des Microkontrollers gemessen wird. Um das zu verstehen muss man sich etwas mit dem Bildaufbau eines Fernsehbildes beschäftigen. Ohne Kamera könnte man das Signal auch "mit der Hand" erzeugen (ein Gedankenspiel):

Ein umgebauter Kugelschreiber hat vorne einen Lichtsensor eingebaut und hinten geht eine Messleitung raus. An der Messleitung ist ein Spannungsmessgerät für den Bereich 0 bis 1,2V Gleichspannung angeschlossen. Vor uns liegt ein Bild auf einer schwarzen Unterlage. Wenn man den Lichtsensor im Kugelschreiber über einen hellen Bereich des Bildes hält, zeigt das Messgerät etwa 1V, bei einer dunklen Stelle ca. 0,3V und über der Unterlage 0V.

Mit dieser Anordnung können wir nun das Bild Zeile für Zeile abtasten. Wir beginnen oben links und führen den Stift an der oberen Bildkante nach rechts bis an den Rand des Bildes. Die gemessene Spannung wird dabei immer zwischen 0,3 und 1V bleiben. Dann führen wir den Stift um das Bild herum zum Start der zweiten Zeile und messen dabei 0V. Das wiederholen wir nun solange bis wir an der untersten Zeile angekommen sind. Nach der letzen Zeile führen wir den Stift gaaanz außenrum wieder an der Start der ersten Zeile oben links und beginnen von vorne.

Wenn wir das lange genug geübt haben und flüssig hinbekommen, können wir so das Signal der Kamera nachbilden. Nun bitten wir einen Helfer den Microkontroller zu simulieren. Dazu versucht er, für jede Zeile getrennt, möglichst viele Messwerte aufzuschreiben. Allerdings darf er dabei weder das Bild noch den Lesestift sehen, er sieht nur das Messgerät. Mit etwas Übung wird er erkennen, dass jede Zeile mit einer kurzen 0V-Phase startet, jedes neue Bild beginnt mit einer etwas längeren 0V-Phase (, weil der Weg für den Abtaststift länger ist). Er braucht nur die Werte jeder x-ten Zeile zu notieren um Papier (=Speicherplatz) zu sparen. Anschließend soll er beschreiben, was auf dem Bild zu sehen ist.

Als Variante könnte der zusätzlich mit einer Stoppuhr ausgerüstete Helfer versuchen, für jede Zeile denjenigen Wert zu notieren, der nach einer festgelegten Zeit nach dem Zeilenstart gemessen wird. Oder er könnte eine Tabelle für alle Zeilen und alle Zeitwerte zwischen Zeilenstart und Zeilenende erstellen. Auch hier kann man Zeilen überspringen oder weniger kleine Zeitschritte verwenden.

Ungefähr das machen die Kamera und der Microkontroller. Allerdings natürlich unglaublich schnell, in einer Sekunde wird 50 mal das Bild "gesendet" und der Microkontroller muss in diesem Tempo die einzelnen Abschnitte in den Bilddaten erkennen und speichern.

(Ich hoffe, der Vergleich ist nicht zu albern)

@Dirk:
Du erklärst das viel besser als ich es kann. Dein Wikibeitrag ist genial.

Gruß

mic

Martinius11
29.03.2010, 22:37
gut das prinzip ist klar aber ich verstehe an deinen programm nicht ganz wie
der Rp6 das in seinem Programm umsetzt und wie du das adc eingestellt hast. könntest du das Programm mal ganz kurz erklärend zusammen fassen ?

Vielen Dank

_|Alex|_
30.03.2010, 14:21
ich werd mir mal den Notwendigen kramm besorgen.

Thund3r
30.03.2010, 14:23
Hallo

Auf nach Conrad :D

Gruß Thund3r

Thund3r
30.03.2010, 16:03
Hallo

Ich hab hier ne alte Webcam "VideoCAM Express" von Genius ausgegraben. Nachdem ich die Hülle abgemacht hab konnte ich einen Blick auf die Elektronik werfen und wollte fragen ob ich die Cam auch für des RP6-Projekt nutzen könnte:

http://img121.imageshack.us/i/cam002w.jpg/
http://img717.imageshack.us/i/cam007.jpg/
http://img534.imageshack.us/i/cam006.jpg/
http://img709.imageshack.us/i/cam004.jpg/

Gruß Thund3r

_|Alex|_
30.03.2010, 17:02
Hallo

Auf nach Conrad :D

Gruß Thund3r

da war ich jezt eben die hatten alles außer eine Stiftleiste die werde ich mit aber irgendwo rauslöten

Martinius11
30.03.2010, 17:18
hatten alles außer eine Stiftleiste

bei mir wars ähnlich ich war vor zwei Monaten und vor zwei Wochen und heute da und jedes mal hies es Stiftleisten ausverkauft

_|Alex|_
30.03.2010, 17:45
alle werden Sterben globales stiftleisten ende :lol:

Dirk
30.03.2010, 19:13
@Thund3er:
Die LR126 ist eine USB-Kamera. Wenn du irgendwo auf der Platine das Video-Signal (1V p-p) auskoppeln kannst, müßte die auch gehen.

@Martinius11 & _|Alex|_ :
Oh je! Das Projekt scheitert an weltweit fehlenden Stiftleisten!
Das ist eine tragische Entwicklung. :(

Gruß Dirk

Thund3r
30.03.2010, 19:18
Hallo

Wie kann ich denn das Video-Signal (1V p-p) auskoppeln?

Gruß Thund3r

asurofreak.
30.03.2010, 19:40
@Thund3r: ich hab auch so eine ähnliche web-cam, werd mich damit dann auch mal informieren, will auch wissen, wie man das signal auskoppelt :)

werd auch mal schauen, ob ich in dem wiki auch was schreiben werden kann, werd mir die teile aber auf jeden fall holen :wink:
p.s. eventuell werd ich so in 2 wochen auch nen RP6 haben, dann kann ich die cam auch verwenden \:D/

radbruch
30.03.2010, 20:29
Hallo

Ich kann mir nicht vorstellen, dass in einer USB-Cam irgendwo ein analoges Videosignal zu finden ist.

Ihr müßt euch von der Vorstellung eines Bildes lösen. Aus Speicher- und Zeitgründen wird immer nur eine sehr kleine Auswahl der Bildpunkte eingelesen und verarbeitet. Vergleichbar vielleicht mit einem Blatt Papier durch das man mit einer Nadel viele Löcher sticht. Es wird versucht, über die Helligkeit in den einzelnen Löchern Rückschlüsse auf das zu ziehen, was sich hinter dem Blatt befindet.

Gruß

mic

asurofreak.
31.03.2010, 10:50
...wird immer nur eine sehr kleine Auswahl der Bildpunkte eingelesen und verarbeitet. Vergleichbar vielleicht mit einem Blatt Papier durch das man mit einer Nadel viele Löcher sticht. Es wird versucht, über die Helligkeit in den einzelnen Löchern Rückschlüsse auf das zu ziehen, was sich hinter dem Blatt befindet.

ja, ungefähr so hab ich es mir schon vorgestellt, so ein ganzes bild währe sicherlich zu viel für einen µC, der eventuell auch noch andere sensoren auswerten muss oder aktoren steuert...

die webcam war für mich jetzt auch einfach nur mal eine alternative, die kamera vom C kann man sich ja auch noch leisten :wink:

MfG

RoboNull
31.03.2010, 12:03
Man kann das Prinzip - wunderbar erklärt - im Wiki nachlesen.
Natürlich wäre der µC mit solch einer Aufgabe überlasten.

Bin mal gespannt wie sich das Ganze entwickelt. Ich werde ebenfalls demnächst am Projekt teilnehmen :)

Grüße

Thomas$
31.03.2010, 15:03
ob der c code auch auf einem atmega328 (arduino) geht?

radbruch
31.03.2010, 15:52
Hallo

Vermutlich funktioniert es mit allen (älteren) ATMegas. Möglicherweise muss man bei mehr als 8MHz Kontrollertakt einen anderen Prescaler für den ADC verwenden.

Ohne Experimentierplatine, Elkos und Jumper habe ich heute die restlichen Teile für Sufe 1 und 2 für 18,28€ erstanden. Die Transistoren habe ich vorsichtshalber doppelt gekauft. Auch in Stuttgart waren die 36er Stiftleisten nicht vorrätig. Als Alternative habe ich nun diese:
http://www.conrad.de/ce/de/product/732478/

Gruß

mic

Thund3r
31.03.2010, 16:14
Hallo

Ich werd mir alles nötige auch die Tage bei Conrad holen und wollte einfach mal fragen ob das Projekt (ohne große Veränderungen) auch für die M32 realisierbar ist?

Gruß Thund3r

Martinius11
31.03.2010, 16:28
Soweit ich weiß ist das kein Problem für M32 und wurde am Anfang schon erwähnt

Thomas$
31.03.2010, 16:55
der arduino läuft mit 16mhz sollte schwierig sein mit dem vorteiler
1 4 8 256 und 1024 gibts ja meistens nur

radbruch
31.03.2010, 17:36
Hallo

Also echt, ohne Eigeninitiative könnt ihr das Projekt kicken. Ein eigener Blick ins Datenblatt ist hier Pflicht!

Im Datenblatt von Mega8, 16 und 32 unter "ADC Prescaler Selections" findet man folgende Tabelle:

• Bits 2:0 – ADPS2:0: ADC Prescaler Select Bits

These bits determine the division factor between the XTAL frequency and the input clock to the ADC.

Table xx. ADC Prescaler Selections

ADPS2 ADPS1 ADPS0 Division Factor
0 0 0 2
0 0 1 2
0 1 0 4
0 1 1 8
1 0 0 16
1 0 1 32
1 1 0 64
1 1 1 128

Gruß

mic

Thomas$
31.03.2010, 17:44
ok ich kannte bisher nur von den timern die prescaler
der atmega328 bietet dieselben prescaler auch sehr gut also kann man das auch passend machen

edit: http://www.mcselec.com/index.php?option=com_content&task=view&id=227 mir grad begegnet

_|Alex|_
31.03.2010, 19:34
Die Welt meint es doch gut mit mir in der Firma wo ich Arbeite hatten wir Stiftleisten bis zum umfallen hab jezt ne schachtel mit 1000 Stück :D

Martinius11
31.03.2010, 19:46
du könntst uns allen welche abgeben, inder weltweiten stiftkrise solten alle einander helfen [-o< [-o<

_|Alex|_
31.03.2010, 19:50
und wer bezahlt den ganzen Versand?

ich werde mal welche in die Wanderkiste legen :D

robokiller
01.04.2010, 09:32
Echt cooles projetkt.
Ich werde mir das zeug besorgen und dann auch mir machen.
Aber ich würde die kammera auf ein servo bauen damit man die in verschiedene richtungen schwenken kann.

asurofreak.
01.04.2010, 10:09
da dies ein "freies" projekt ist, schätze ich, dass man es auch beliebig verändern und erweitern kann, wie gesagt z.B. ein servo. könnte man auch noch unter z.B. "erweiterungen" im artikel mit eintragen.

MfG

radbruch
01.04.2010, 18:15
Hallo

Die Experimentierplatine nur mit Stiftleiste und Cinch-Buchse bestückt mache ich erste Tests mit der neuen Kamera:

// Kleines Testprogramm zur Funktionsprüfung 1.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[1024], *bildzeiger; // 1KB * 8Bit Bildspeicher bereitstellen
uint8_t spalte, zeile, sync, c;

initRobotBase();
ADC_Init();

while(1)
{
writeString_P("---------------------------\n");
for(c=0; c<255; c++) // Bildspeicher löschen (mit Byte-Variable)
{
bildspeicher[c]=bildspeicher[256+c]=\
bildspeicher[2*256+c]=bildspeicher[3*256+c]=0;
}

for(c=0; c<4; c++) // viermal den selben Bereich einlesen
{
bildzeiger=&bildspeicher[256*c]; // Zeiger auf Start des Bildspeicherbereich
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

zeile=150; // durchhangeln bis Zeile 150
while(zeile--)
{
while (ADCH > 20); // Bilddaten
while (ADCH < 30); // Sync
}

spalte=255; // oje
do *bildzeiger++=ADCH; while(spalte--); // 254 Werte einlesen
//while(spalte--) *bildzeiger++=ADCH; // dito
//do *bildzeiger=ADCH; while(*bildzeiger++ > 20); // schneller ;)
sei();
}

for(spalte=0; spalte != 255; spalte++) // Alle Durchgänge gemeinsam ausgeben
{
writeInteger(spalte, 10);
writeString_P(": ");
writeInteger(bildspeicher[spalte], 10);
writeString_P(" ");
writeInteger(bildspeicher[256+spalte], 10);
writeString_P(" ");
writeInteger(bildspeicher[2*256+spalte], 10);
writeString_P(" ");
writeInteger(bildspeicher[3*256+spalte], 10);
writeString_P("\n");
}
while(!(getBumperLeft() || getBumperRight())); // Nochmal? Terminal löschen!
}
return(0);
}

Die Ausgabe dazu beim Blick auf ein Blatt Papier mit eingesteckem Kontrollmonitor als 75Ohm-Last:

Terminal cleared!
---------------------------
0: 56 56 54 56
1: 56 56 54 56
2: 56 56 54 56
3: 56 57 56 57
4: 56 57 56 57
5: 56 57 56 57
6: 60 57 60 60
7: 60 57 60 60
8: 60 57 60 60
9: 62 60 62 60
10: 62 60 62 60
11: 62 60 62 60
12: 62 62 62 60
13: 62 62 62 62
14: 62 62 62 62
15: 62 62 62 62
16: 63 62 62 62
17: 63 62 62 62
18: 63 62 62 62
19: 62 62 62 62
20: 62 62 62 62
21: 62 62 62 62
22: 60 60 62 62
23: 60 60 62 62
24: 60 60 62 62
25: 60 56 62 62
26: 56 56 60 60
27: 56 56 60 60
28: 56 56 60 60
29: 57 56 57 57
30: 57 56 57 57
31: 57 56 57 57
32: 56 56 56 56
33: 56 56 56 56
34: 56 56 56 56
35: 56 56 56 56
36: 56 56 56 56
37: 56 56 56 56
38: 56 54 56 56
39: 56 54 56 56
40: 56 54 56 56
41: 56 54 56 56
42: 56 56 56 56
43: 56 56 56 56
44: 56 56 56 56
45: 56 56 56 51
46: 56 56 56 51
47: 56 56 56 51
48: 54 51 51 54
49: 54 51 51 54
50: 54 51 51 54
51: 54 30 51 54
52: 15 30 31 35
53: 15 30 31 35
54: 15 30 31 35
55: 4 6 6 6
56: 4 6 6 6
57: 4 6 6 6
58: 28 28 28 28
59: 28 28 28 28
60: 28 28 28 28
61: 28 28 28 28
62: 28 28 28 28
63: 28 28 28 28
64: 28 56 28 28
65: 56 56 56 56
66: 56 56 56 56
67: 56 56 56 56
68: 56 57 56 56
69: 56 57 56 56
70: 56 57 56 56
71: 57 60 60 60
72: 57 60 60 60
73: 57 60 60 60
74: 60 62 62 60
75: 60 62 62 60
76: 60 62 62 60
77: 60 62 62 60
78: 62 62 60 62
79: 62 62 60 62
80: 62 62 60 62
81: 62 62 62 62
82: 62 62 62 62
83: 62 62 62 62
84: 60 60 62 63
85: 60 60 62 63
86: 60 60 62 63
87: 57 60 60 62
88: 57 60 60 62
89: 57 60 60 62
90: 57 56 60 62
91: 56 56 57 56
92: 56 56 57 56
93: 56 56 57 56
94: 56 56 57 57
95: 56 56 57 57
96: 56 56 57 57
97: 56 56 56 56
98: 56 56 56 56
99: 56 56 56 56
100: 56 56 56 56
101: 56 56 56 56
102: 56 56 56 56
103: 56 56 56 56
104: 56 56 56 56
105: 56 56 56 56
106: 56 56 56 56
107: 54 54 56 56
108: 54 54 56 56
109: 54 54 56 56
110: 51 54 56 51
111: 51 54 56 51
112: 51 54 56 51
113: 49 51 51 56
114: 49 51 51 56
115: 49 51 51 56
116: 49 7 51 56
117: 7 7 30 30
118: 7 7 30 30
119: 7 7 30 30
120: 3 3 6 6
121: 3 3 6 6
122: 3 3 6 6
123: 28 28 28 28
124: 28 28 28 28
125: 28 28 28 28
126: 49 31 28 28
127: 49 31 28 28
128: 49 31 28 28
129: 49 56 28 28
130: 57 56 56 56
131: 57 56 56 56
132: 57 56 56 56
133: 60 60 57 56
134: 60 60 57 56
135: 60 60 57 56
136: 60 60 60 60
137: 60 60 60 60
138: 60 60 60 60
139: 62 62 63 60
140: 62 62 63 60
141: 62 62 63 60
142: 62 62 63 60
143: 62 62 63 62
144: 62 62 63 62
145: 62 62 63 62
146: 62 62 63 62
147: 62 62 63 62
148: 62 62 63 62
149: 60 62 62 62
150: 60 62 62 62
151: 60 62 62 62
152: 60 56 60 60
153: 60 56 60 60
154: 60 56 60 60
155: 60 56 60 60
156: 56 56 56 56
157: 56 56 56 56
158: 56 56 56 56
159: 56 56 57 56
160: 56 56 57 56
161: 56 56 57 56
162: 56 56 56 56
163: 56 56 56 56
164: 56 56 56 56
165: 56 56 56 56
166: 56 56 56 56
167: 56 56 56 56
168: 56 56 56 56
169: 56 56 56 55
170: 56 56 56 55
171: 56 56 56 55
172: 56 51 56 54
173: 56 51 56 54
174: 56 51 56 54
175: 51 54 56 56
176: 51 54 56 56
177: 51 54 56 56
178: 44 49 54 51
179: 44 49 54 51
180: 44 49 54 51
181: 44 7 54 51
182: 7 7 7 7
183: 7 7 7 7
184: 7 7 7 7
185: 28 17 3 3
186: 28 17 3 3
187: 28 17 3 3
188: 28 28 28 28
189: 28 28 28 28
190: 28 28 28 28
191: 56 54 28 28
192: 56 54 28 28
193: 56 54 28 28
194: 56 60 28 28
195: 56 60 56 56
196: 56 60 56 56
197: 56 60 56 56
198: 60 60 60 56
199: 60 60 60 56
200: 60 60 60 56
201: 62 62 60 60
202: 62 62 60 60
203: 62 62 60 60
204: 62 62 62 60
205: 62 62 62 60
206: 62 62 62 60
207: 62 62 62 60
208: 60 62 62 60
209: 60 62 62 60
210: 60 62 62 60
211: 62 63 62 62
212: 62 63 62 62
213: 62 63 62 62
214: 56 60 60 60
215: 56 60 60 60
216: 56 60 60 60
217: 57 60 60 56
218: 57 60 60 56
219: 57 60 60 56
220: 57 56 60 56
221: 56 56 56 56
222: 56 56 56 56
223: 56 56 56 56
224: 56 56 56 56
225: 56 56 56 56
226: 56 56 56 56
227: 56 56 56 56
228: 56 56 56 56
229: 56 56 56 56
230: 56 56 54 56
231: 56 56 54 56
232: 56 56 54 56
233: 56 56 54 56
234: 56 56 56 54
235: 56 56 56 54
236: 56 56 56 54
237: 56 54 56 49
238: 56 54 56 49
239: 56 54 56 49
240: 51 54 51 51
241: 51 54 51 51
242: 51 54 51 51
243: 30 30 49 49
244: 30 30 49 49
245: 30 30 49 49
246: 30 6 49 49
247: 6 6 7 7
248: 6 6 7 7
249: 6 6 7 7
250: 28 28 6 3
251: 28 28 6 3
252: 28 28 6 3
253: 28 28 28 28
254: 28 28 28 28


Ausgabe mit alternativer Einlesezeile
do *bildzeiger=ADCH; while(*bildzeiger++ > 20);


Terminal cleared!
---------------------------
0: 51 51 55 51
1: 51 51 55 51
2: 51 51 55 51
3: 51 51 55 51
4: 56 56 56 56
5: 56 56 56 56
6: 56 56 56 56
7: 56 56 56 56
8: 56 56 57 56
9: 56 56 57 56
10: 56 56 57 56
11: 56 56 57 56
12: 56 60 60 56
13: 60 60 60 56
14: 60 60 60 56
15: 60 60 60 56
16: 60 60 60 56
17: 60 60 60 60
18: 60 60 60 60
19: 60 60 60 60
20: 60 60 60 60
21: 62 62 62 60
22: 62 62 62 60
23: 62 62 62 60
24: 62 62 62 60
25: 62 62 62 62
26: 62 62 62 62
27: 62 62 62 62
28: 62 62 62 62
29: 62 62 62 62
30: 60 60 60 60
31: 60 60 60 60
32: 60 60 60 60
33: 60 60 60 60
34: 60 56 56 57
35: 60 56 56 57
36: 60 56 56 57
37: 60 56 56 57
38: 60 56 56 56
39: 56 56 56 56
40: 56 56 56 56
41: 56 56 56 56
42: 56 56 56 56
43: 56 56 56 56
44: 56 56 56 56
45: 56 56 56 56
46: 56 56 56 56
47: 56 56 56 56
48: 56 56 56 56
49: 56 56 56 56
50: 56 56 56 56
51: 56 54 56 54
52: 56 54 56 54
53: 56 54 56 54
54: 56 54 56 54
55: 56 54 56 54
56: 52 52 51 51
57: 52 52 51 51
58: 52 52 51 51
59: 52 52 51 51
60: 54 51 51 49
61: 54 51 51 49
62: 54 51 51 49
63: 54 51 51 49
64: 54 49 49 49
65: 49 49 49 49
66: 49 49 49 49
67: 49 49 49 49
68: 49 49 49 49
69: 33 17 7 30
70: 33 0 0 30
71: 33 0 0 30
72: 33 0 0 30
73: 6 0 0 6
74: 0 0 0 0
75: 0 0 0 0
76: 0 0 0 0

Neue Erkenntniss durch diese Versuche: Die Variablen dürfen nicht global definiert sein. So wird alles total langsam:

uint8_t bildspeicher[1024], *bildzeiger; // 1KB * 8Bit Bildspeicher bereitstellen
uint8_t spalte, zeile, sync, c;

int main(void)
{
initRobotBase();
ADC_Init();


Compileroptimierung steht bei mir übrigends auf "Size".

Gruß

mic

Martinius11
01.04.2010, 22:44
Vielen Dank für deine Bemühungen Radbruch =D> =D>

Thomas$
01.04.2010, 23:10
wie kommt man an die RP6RobotBaseLib.h?

Martinius11
02.04.2010, 11:22
wie kommt man an die RP6RobotBaseLib.h?

Du musst es nicht einfügen es ist ja nur ein Test programm aber für später:
du kannst solche Programme als Funktion in die Lib einfügen .Einfach
void name(void)
{
}

dann must du nur noch name; schreiben und das Programm ist eingefügt

radbruch
02.04.2010, 12:30
Hallo

Das Programm:

// RP6 sendet eine 64x48-Bitmap über die serielle Schnittstelle 2.4.10 mic

// Der RP6 sendet eine Bitmap über die serielle Schnittstelle zum PC.
// Dort wird es von einem kleinen Tool empfangen und abgespeichert:
// http://www.mikrocontroller.net/topic/74659#616065

// Den Header habe ich von einer echten Bitmap mit passendem Format abgeschrieben.
// Infos zum Aufbau einer BMP-Datei bei Wikipedia:
// http://de.wikipedia.org/wiki/Windows_Bitmap

// Es werden die unveränderten Kameradaten verwendet.

#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!
uint8_t bmp_header_64_48_24bit[54]={ // Header für ein 64x48x24-BMP hat 54 Bytes
0x42, 0x4d, 0x36, 0x24, 00, 00, 00, 00, 00, 00, 0x36, 00, 00, 00, 0x28, 00,
00, 00, 0x40, 00, 00, 00, 0x30, 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_64_48_24bit[c]); // Header senden
for(c=0; c<48; c++) // 48 Bildzeilen einlesen und als RGB-Pixel senden
{
setLEDs(c); // working
bildzeiger=&bildspeicher[0]; // Zeiger auf Start des Bildspeicherbereich
zeile=c*5+35; // aktuelle Zeile (35 Zeilen sind der Schrott beim Bildstart)

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
}

do *bildzeiger=ADCH; while(*bildzeiger++ > 20); // eine schnelle Zeile einlesen
sei(); // (das sind ca. 70 Werte)

for(zeile=0; zeile<64; zeile++) // 64 Pixel senden
{
if (bildspeicher[zeile] > 20)
{
writeChar(bildspeicher[zeile]); // RGB in Pixelfarbe
writeChar(bildspeicher[zeile]);
writeChar(bildspeicher[zeile]);
}
else
{
writeChar(0); // oder Schwarz
writeChar(0);
writeChar(0);
}
}
}
setLEDs(63); // ready
while(!(getBumperLeft() || getBumperRight())); // Neues Bild senden?
}
return(0);
}

Der Versuchsaufbau:
http://radbruch.bplaced.net/robot/cam2bmp/cam2bmp_klein.jpg (http://radbruch.bplaced.net/robot/cam2bmp/cam2bmp.jpg)

Das Ergebniss:
http://radbruch.bplaced.net/robot/cam2bmp/cam2bmp.bmp (http://radbruch.bplaced.net/robot/cam2bmp/cam2bmp_gross.jpg)
(Die orginalen Bilder gibt es hier (http://radbruch.bplaced.net/robot/cam2bmp/cam2bmp.zip) als Zip-Archiv.)

Was ist das? Der RP6 erzeugt Bitmap-Dateien ;) Das ist so zwar etwas fummeilg, aber es funktioniert. Wenn auch im Moment noch spiegelbildlich ;)

Wie funktioniert es? Der RP6 errechnet aus den Kameradaten ein 64x48-Bitmap-Bild und sendet es über die serielle Schnittstelle zum PC. Dort werden die seriellen Daten von einem kleinen Tool empfangen und als BMP-Datei abgespeichert.

Die Grundlagen dazu habe ich mir aus Wikipedia: Windows_Bitmap (http://de.wikipedia.org/wiki/Windows_Bitmap) angelesen,
das Tool (mit 38400 Baud an der Schnittstelle des RP6-USB-Moduls) habe ich hier gefunden:
http://www.mikrocontroller.net/topic/74659#616065


Das wollte ich ja schon lange mal machen. Jetzt sieht man endlich das, was der RP6 sieht. Die Zeilen werden hier jeweils "in einem Rutsch" eingelesen und gesendet. Eine "Aufnahme" mit 64x48 Pixeln dauert so ca. 6 Sekunden. In der vierfachen Vergrößerung (http://radbruch.bplaced.net/robot/cam2bmp/cam2bmp_gross.jpg) sieht man schon deutlich die Pixelgröße.

Viel Spaß beim Nachmachen.

Gruß

mic

asurofreak.
02.04.2010, 12:58
hey, das ist ja mal cool :)

jetzt erzeugt der RP6 auch schon bitmap dateien, nicht schlecht, sobald ich auch die nötigen teile zur hand habe setze ich mich gleich mal ans nachmachen :D
MfG

Thund3r
02.04.2010, 12:59
Hallo

Das sieht doch sehr gut aus!
Ich denke damit lässt sich ne Menge anfangen.
Bin mal gespannt wie meins wird wenn ich die Bauteile beisammen hab...

Gruß Thund3r

radbruch
02.04.2010, 13:16
Wenn auch im Moment noch spiegelbildlichDas stimmt so nicht. Die Bilder stehen auf dem Kopf. Der Grund dafür ist einfach und eher banal: Im Header wird die Höhe des Bildes mit +48 angegeben. Bei positiven Bildhöhen wird das BMP-Bild von unten nach oben aufgebaut, ich sende aber die oberste Zeile zuerst. Abhilfe wäre entweder ein negativer Wert für die Bildhöhe im Header, das scheitert aber an der Erzeugung der Long-Darstellung des negativen Wertes, oder das Lesen der Bildzeilen von unten nach oben.

Martinius11
02.04.2010, 13:19
Ja sieht klasse aus vieleicht könnte man bestimmte bilder ja wieder zu rp6 schicken sodass er darauf reagieren kann
\:D/ \:D/

Martinius11
03.04.2010, 17:42
Hi Leute,

ich hab heute die erste Phase fertig gestellt und wolte sie anschließen aber
dann startet der RP6 nicht hätte jemand ne idee was nicht stimmen könnte ,die kondensatoren und lötbahnen sind geprüft .

Danke

Thund3r
03.04.2010, 17:51
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

Martinius11
03.04.2010, 19:20
Also ich hab eigentlich alles kontrolliert und müsste da nicht die sicherung
rausspringen?

Thund3r
03.04.2010, 19:37
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

Martinius11
03.04.2010, 19:53
der keramik kondensator ist ja ungepolt und beim elek. konden. müssen
die striche zur negativen bahn zeigen ,oder?

Martinius11
03.04.2010, 21:12
ok hab das problemm gelöst \:D/ \:D/ \:D/ \:D/ \:D/ \:D/

radbruch
03.04.2010, 23:24
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.


// 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:
http://radbruch.bplaced.net/robot/cam2bmp/hires.bmp

Gruß

mic

Mc Delta
04.04.2010, 11:12
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.

Martinius11
04.04.2010, 12:31
bei mir dasselbe keine auswertung über die serille schnittstelle

radbruch
04.04.2010, 12:48
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

Martinius11
04.04.2010, 13:02
dann solten wir vieleicht noch eine 5. Phase auf machen inder die Stromversorgung ausgebaut wird mit zusätzlichen Akku oder Thyristor

RoboNull
04.04.2010, 13:21
Falls die Probleme am Programm liegen, welches Daten über die serielle Schnittstelle empfängt:
Gibts da den Quelltext? Dann kann ich mir den mal ansehen.
Natürlich könnte ich auch schnell mit C/C++ ein neues Proggi schreiben und den Quellcode öffentlich machen.

Sonst generelle Lösungsvorschläge:
Richtiges COM Interface ausgewählt?
Treiber vorhanden?
Programm mit Adminrechten gestartet?
Welches Betriebssystem? (Kann sein, dass es unter Win7 nicht funktinoiert -> andere Hardwareansteuerung)
Funktioniert das serielle Kabel?
Kommen überhaupt Daten über das serielle Kabel? (Kann man ganz leicht mit anderen Progs testen -> google. Oder wenn Ihr Linux habt einfach mal via interface listen rausholen)

radbruch
04.04.2010, 13:38
Einfaches Nachladen der Akkus reicht völlig. Volle Akkus werden bei meinem RP6 mit ca. 8,4V gemessen.


Natürlich könnte ich auch schnell mit C/C++ ein neues Proggi schreiben und den Quellcode öffentlich machen.Ich kann das leider nicht, dafür kann ich in drei Minuten ein passendes Tool ergooglen ;)

Beim cam2bmp-Programm kann man die seriellen Daten auch im RP6Loader betrachten. Allerdings nur, wenn man man nach der Ausgabe den RP6 mit [STRG-R] wieder stoppt um einen Zeilenvorschub zu erzwingen. Beim einfachen Testprogramm sollte man sofort etwas sehen. Obwohl es etwas ungeschickt programmiert ist sollte es trotzdem funktionieren:

// Kleines Testprogramm zur Funktionsprüfung 1.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[1024], *bildzeiger; // 1KB * 8Bit Bildspeicher bereitstellen
uint8_t spalte, zeile, sync, c;

initRobotBase();
ADC_Init();

while(1)
{
writeString_P("---------------------------\n");
for(c=0; c<255; c++) // Bildspeicher löschen (mit Byte-Variable)
{
bildspeicher[c]=bildspeicher[256+c]=\
bildspeicher[2*256+c]=bildspeicher[3*256+c]=0;
}

for(c=0; c<4; c++) // viermal den selben Bereich einlesen
{
bildzeiger=&bildspeicher[256*c]; // Zeiger auf Start des Bildspeicherbereich
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

zeile=150; // durchhangeln bis Zeile 150
while(zeile--)
{
while (ADCH > 20); // Bilddaten
while (ADCH < 30); // Sync
}

spalte=255;
do *bildzeiger++=ADCH; while(spalte--); // 254 Werte einlesen
//while(spalte--) *bildzeiger++=ADCH; // dito
//do *bildzeiger=ADCH; while(*bildzeiger++ > 20); // schneller ;)
sei();
}

for(spalte=0; spalte != 255; spalte++) // Alle Durchgänge gemeinsam ausgeben
{
writeInteger(spalte, 10);
writeString_P(": ");
writeInteger(bildspeicher[spalte], 10);
writeString_P(" ");
writeInteger(bildspeicher[256+spalte], 10);
writeString_P(" ");
writeInteger(bildspeicher[2*256+spalte], 10);
writeString_P(" ");
writeInteger(bildspeicher[3*256+spalte], 10);
writeString_P("\n");
}
while(!(getBumperLeft() || getBumperRight())); // Nochmal? Terminal löschen!
}
return(0);
}Es werden viermal hintereinander ab dem Start der 150. Zeile jeweils 255 Werte eingelesen und dargestellt. Die Ausgabe beginnt mit:
writeString_P("---------------------------\n");

Wenn danach nichts mehr kommt bleibt das Programm irgendwo bei der Syncsuche stecken. Hier könnte man vielleicht mit geänderten Abfragen weiterkommen:
while (ADCH > 25); // Bilddaten
while (ADCH < 35); // Sync

RoboNull
04.04.2010, 13:52
Einfaches Nachladen der Akkus reicht völlig. Volle Akkus werden bei meinem RP6 mit ca. 8,4V gemessen.

Klar, wenns daran liegt :)




leider nicht, dafür kann ich in drei Minuten ein passendes Tool ergooglen ;)

Yup, wer nicht ;)
Aber die andere Frage ist dann natürlich, ob es einen Sinn ergibt.
Gibts den Quellcode dazu?
Für was brauche ich das Proggi?
Klar, wenns jetzt nur darum geht bmp's zu speichern reicht ein gegoogeltdes Proggi bestimmt. Will man es später aber ausbauen. z.B. Bildunterschiede etc. rausrechnen (was mit gdi+ leicht ist), machts sicherlich Sinn selber zu coden :)

Thund3r
04.04.2010, 13:57
Hallo

Da hat RoboNull nicht ganz Unrecht.
Es kann nie schaden den Quellcode zu haben um ihn später auszubauen bzw zu erweitern

Gruß Thund3r

radbruch
04.04.2010, 14:20
Zur Auswertung auf dem PC bräuchte man den "Umweg" über eine BMP-Datei nicht. Man könnte einfach die nackten Kameradaten verarbeiten.

Aber das ist doch eigentlich nicht Sinn der Übung. Das BMP-Bild dient nur dazu ein "Gefühl" für die Kamera zu bekommen. Die eigentliche Bildbearbeitung sollte der Kontroller schon selbst erledigen.

Den Quellcode habe ich auch nicht, die "Fundstelle" des Tools ist ja schon 3 Jahre alt. Keine Ahnung, ob es da noch einen Support für gibt:
http://www.mikrocontroller.net/topic/74659#616065

Mc Delta
04.04.2010, 14:37
Super!!!!
Das mit dem Monitor wars ich hatte nämlich keinen angeschlossen und deswegen bestand kein Widerstand (75 Ohm) zwischen den Abschlüssen. Ich habe zum Ausprobieren mal einen angeschlossen (ohne Monitor) und das Ergebnis war Positiv.

TrainMen
04.04.2010, 18:01
Hallo,
radbruch@
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:


also für mich ist es ja schon fast das AUS für das Projekt. Das ist ja nur 1,5 V zum vollen Akkusatz. Der RP6 soll mal Linienfolgen oder einen Lichtpunkt suchen. Also Motoren laufen und vielleicht noch andere Sensoren,LED u.s.w Bedienen. Das kann es doch nicht gewesen sein das unser RP6 nach 30 minuten wieder blind ist.
Trainmen
P.S. schönes Osterfest noch

RobbyMartin
04.04.2010, 18:12
dann muss man wahrscheinlich doch auf einen zweiten akku ausweichen ein 9v block akku wiegt nicht viel und nur für die kamera sollte er auch ausreichend sein

LG
martin

P.S. von mir auch ein frohes ostern an euch alle

Thund3r
04.04.2010, 18:19
Hallo

Ja oder wir realisieren den Vorschlag eienr 5. Phase wo wir uns spezeill mit dem Probelem beschäftigen und vielleicht ne elegantere Lösung finden.

PS: Fühlt euch alle geostert

Gruß Thund3r

Martinius11
04.04.2010, 18:46
heißt das ich muss noch einen 75 ohm wiederstand einbauen das es funktioniert?

TrainMen
04.04.2010, 19:04
also ich habe zwar noch nicht angefangen aber soweit wie ich verstanden habe entweder Monitor oder 75Ohm an die Chinchbuchse.
Trainmen

Dirk
04.04.2010, 19:16
@McDelta:
Danke für deinen Hinweis auf den 75 Ohm Widerstand im RN-Wissen!
Fest kommt er erst in Phase 2 auf die Exp, also bis dahin z.B. nur lose an die Cinch-Buchse klemmen!

@Martinius11:
Ich würde den 75 Ohm nur lose anklemmen, er wird in Phase 2 fest eingebaut. Du kannst auch 2x 150 Ohm parallel anklemmen.

@TrainMen:
Ich habe es getestet: Meine Kamera funktioniert noch bis 4,2 Volt herunter. Das liegt sogar unter den im Datenblatt genannten Werten, nach denen die Kamera von 4,5 bis 5,5V arbeiten soll. Bei 4,2 Volt VCC dürfte auch die Akkuspannung des RP6 schon weit unter 7,2V liegen, d.h. die Akkus sind leer.
Wenn man auf Nummer sicher gehen will, könnte man wirklich eine 9V-Blockbatterie zur Spannungsversorgung der Kamera benutzen. Dazu könnte man die Anschlußplatine der Kamera (150325 (http://www.conrad.de/ce/de/product/150325/)) mit bestellen. Da ist ein Spannungsregler 5V drauf und man könnte die Batterie direkt anschließen.

Gruß Dirk

TrainMen
04.04.2010, 20:28
Hi,
@Dirk
schön dann bin ich ja beruhigt, ich habe mich schon gewundert den im Datenblatt steht was von 5V .
Nur warum funktioniert die Kamera nicht mehr wenn im Loader noch 7,2V angezeigt werden. Wie ja "radbruch" schreibt. Das machte mich nervös.
@radbruch
schreib mal bitte was dazu, das Problem gelösst ?

übrigens ich habe ich noch nicht angefangen
Trainmen

radbruch
04.04.2010, 20:47
Oje, was soll ich dazu schreiben? Mein RP6 dümpelt hier zwischen all meinem Chaos und hatte schon ewig keine Steckdose mehr gesehen. Und die Akkus sind noch Erstausrüster mit billigem Ladegerät (Trafo mit Gleichrichterbrücke) schlecht gepflegt. Kurzum: Nicht representativ.

Warum sich das schon bei 7,2V auswirkt kann ich im Moment noch nicht sagen. Wenn es wieder auftritt, werde ich Ursachenforschung betreiben.

Gruß

mic

RobbyMartin
05.04.2010, 16:06
so alle teile sind bestellt ich hoffe das ih noch diese woche starten kann

lg
martin

Martinius11
05.04.2010, 19:37
kann mir einer kurz sagen wie rum ich die Transystoren anschließen muss

Danke

radbruch
05.04.2010, 21:05
Hallo

Mit diesem kleinen Update beende ich mal den Ausflug in die Welt der HiRes-Bilder:

// RP6 sendet eine 48X64-HiRes-Bitmap über die serielle Schnittstelle 5.4.10 mic

// Das Bild ist um 90° nach links gedreht, oben links im TV ist unten links im BMP

// Es werden nur ca. 3/4 des Bildes erfasst. Um das ganze Bild einlesen zu können,
// muss man die Bildgröße des BMP ändern, also den Header anpassen.
// Das ist mir im Moment zuviel Aufwand ;)

#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, spalte, sync, c, i; // und dürfen NICHT global sein!
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+=2)
{
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 {sync=0; while (ADCH > 20); while (ADCH < 30) sync++;}while (sync < 40);
while(zeile--) {while (ADCH > 20); while (ADCH < 30);}
for(c=0; c<48; c++)
{
i=spalte; zeile=5; // Zeilensprung für 48 Zeilen
while(zeile--) {while (ADCH > 20); while (ADCH < 30);}

ADCSRA = (1<<ADATE)|(0<<ADEN)|(1<<ADIF)|(0<<ADSC)|(1<<ADPS0); // ADC stoppen
while(i--); // Pixel ansteuern
ADCSRA = (1<<ADATE)|(1<<ADEN)|(1<<ADIF)|(1<<ADSC)|(1<<ADPS0); // 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);
}

zeile=30;
setLEDs(62-spalte); // working
do {sync=0; while (ADCH > 20); while (ADCH < 30) sync++;}while (sync < 40);
while(zeile--) {while (ADCH > 20); while (ADCH < 30);}
for(c=0; c<48; c++)
{
i=spalte; zeile=5; // Zeilensprung für 48 Zeilen
while(zeile--) {while (ADCH > 20); while (ADCH < 30);}

ADCSRA = (1<<ADATE)|(0<<ADEN)|(1<<ADIF)|(0<<ADSC)|(1<<ADPS0); // ADC stoppen

nop(); nop(); // nächste Spalte zwei NOPs später einlesen

while(i--); // Pixel ansteuern
ADCSRA = (1<<ADATE)|(1<<ADEN)|(1<<ADIF)|(1<<ADSC)|(1<<ADPS0); // 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<96; zeile++) // 96 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);
}
Da spalte und i nun 8Bit-Variablen sind, dauert while(i--) nur noch drei Takte (bei i != 0). Um die Auflösung noch weiter zu steigern lese ich nun zweimal dieselbe Spalte, allerdings beim zweiten Durchgang mit zusätzlichen zwei NOPs vor der while(i--)-Schleife.

Beim Stoppen/Starten des ADC wird das ADCSRA-Register nur noch geschrieben und nicht mehr zuvor eingelesen (= anstelle von &= bzw. |=)

Einer der wenigen Buchstaben mit eindeutiger Orientierung ist das R:
http://radbruch.bplaced.net/robot/cam2bmp/r.bmp (http://radbruch.bplaced.net/robot/cam2bmp/r_gross.jpg)

Gruß

mic

[Edit]
64X96:

// RP6 sendet eine 64x96-HiRes-Bitmap über die serielle Schnittstelle 5.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[150], *bildzeiger; // 150 Byte Bildspeicher sollten reichen
uint8_t zeile, spalte, sync, c, i; // und dürfen NICHT global sein!
uint8_t bmp_header_64_96_24bit[54]={
0x42, 0x4d, 0x36, 0x48, 00, 00, 00, 00, 00, 00, 0x36, 00, 00, 00, 0x28, 00,
00, 00, 0x40, 00, 00, 00, 0x60, 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_64_96_24bit[c]); // Header senden
for(spalte=0; spalte<96; spalte+=2)
{
bildzeiger=&bildspeicher[0]; // Zeiger auf Start des Bildspeicherbereich
zeile=30; // aktuelle Zeile (35 Zeilen sind der Schrott beim Bildstart)
setLEDs(95-spalte); // working

cli();
do {sync=0; while (ADCH > 20); while (ADCH < 30) sync++;}while (sync < 40);
while(zeile--) {while (ADCH > 20); while (ADCH < 30);}
for(c=0; c<64; c++)
{
i=spalte; zeile=3; // Zeilensprung für 64 Zeilen
while(zeile--) {while (ADCH > 20); while (ADCH < 30);}

ADCSRA = (1<<ADATE)|(0<<ADEN)|(1<<ADIF)|(0<<ADSC)|(1<<ADPS0); // ADC stoppen
while(i--); // Pixel ansteuern
ADCSRA = (1<<ADATE)|(1<<ADEN)|(1<<ADIF)|(1<<ADSC)|(1<<ADPS0); // 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);
}

zeile=30;
setLEDs(94-spalte); // working
do {sync=0; while (ADCH > 20); while (ADCH < 30) sync++;}while (sync < 40);
while(zeile--) {while (ADCH > 20); while (ADCH < 30);}
for(c=0; c<64; c++)
{
i=spalte; zeile=3; // Zeilensprung für 64 Zeilen
while(zeile--) {while (ADCH > 20); while (ADCH < 30);}

ADCSRA = (1<<ADATE)|(0<<ADEN)|(1<<ADIF)|(0<<ADSC)|(1<<ADPS0); // ADC stoppen

nop(); nop(); // nächste Spalte zwei NOPs später einlesen

while(i--); // Pixel ansteuern
ADCSRA = (1<<ADATE)|(1<<ADEN)|(1<<ADIF)|(1<<ADSC)|(1<<ADPS0); // 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<128; zeile++) // 2*64 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);
}
http://radbruch.bplaced.net/robot/cam2bmp/ocb.bmp (http://radbruch.bplaced.net/robot/cam2bmp/ocb.bmp) http://radbruch.bplaced.net/robot/cam2bmp/domino1.bmp (http://radbruch.bplaced.net/robot/cam2bmp/domino1.bmp) http://radbruch.bplaced.net/robot/cam2bmp/domino2.bmp (http://radbruch.bplaced.net/robot/cam2bmp/domino2.bmp)

RobbyMartin
05.04.2010, 21:08
@martinius11

gib den namen des transistor bei google an und guck ins datenblatt dort steht die anschluss belegung

lg
martin

Mc Delta
06.04.2010, 08:55
Hey,
@Martinius
Wenn du die Transistoren bei Conrad gekauft hast würde ich nicht googlen sondern einfach das Datenblatt bei Conrad runterladen. Es kommt bei den Transistoren auch auf die Bauform an und da kann es sein, das es bei einem Transistorwert verschiedene Ausführungen gibt. Also folge den Links:
http://www.conrad.de/ce/de/product/155080/TRANSISTOR-BC-556-B/SHOP_AREA_37318 für BC 556 B
http://www.conrad.de/ce/de/product/154989/TRANSISTOR-BC-547-C/SHOP_AREA_37318 für BC 547 C

robokiller
07.04.2010, 17:33
Hallo alle,
Ich hab mir die teile bei conrad besorgt und bin mit derphase 1 feritg.
Nun hab ich ein problem wenn ich den rp6 über die cinch- Buchse an einen monitor anschliesse, sehe ich auf den motor nur wilde balken die hin und her fetzen, und man kann kein bild erkennen. was kann cih dagegen machen?
Schon mal danke im vorraus

Martinius11
07.04.2010, 18:01
kontrolliere mal ob du alles richtig gelötet hast und versuch mal das test programm von radbruch mit dem 75 Ohm Wiederstand

RobbyMartin
07.04.2010, 18:31
hast du auch ein geschirmtes kabel benutzt , da es leicht zu störungen kommen kann

lg
martin

robokiller
07.04.2010, 18:38
Also die lötstellen müssten richtig sein.
Wenn ich das programm von radbruch probiere übterät es nur 27 byte
und bricht dan ab.

Martinius11
07.04.2010, 18:40
Lad doch mal nie akkus bei radbruch funktionierts nicht wenn zu wenig strom da ist

robokiller
07.04.2010, 18:45
ohne wiederstand überträgt es die ganze datei alerdings lässt sich diese auch nicht öffnen

Mc Delta
07.04.2010, 18:48
Hallo an alle,
an der Abschirmung sollte es nicht liegen können, weil das Kabel ja nicht so lang ist??? Bei mir geht´s jedenfalls auch ohne.

Dirk
07.04.2010, 20:12
@robokiller:

... wenn ich den rp6 über die cinch- Buchse an einen monitor anschliesse ...

Was ist das für ein Monitor?

Gruß Dirk

robokiller
07.04.2010, 20:17
ein ganz normaler fernseher

robokiller
07.04.2010, 20:19
ich habs mal mit nem flachbildschirm und mal mit nem alten rörenbildschirm probiert war überall das sellbe

robokiller
07.04.2010, 20:45
HaLLO,
ich hab mal ein par bilder angehängt wie es auf meinen fernseher auschaut wenn ich den rp6 über chinch buchse ansclise die zusehenden streifen bewegen sich. Wenn man die hand vor die kammera hält werden die streifen dunkler.

Was hab ich falschgemacht ?
Währe sehr dankbar wenn mir jemand helfen könne.

schon mal dank im voraus

_________________________
Gruß RoboKiller

Dirk
07.04.2010, 20:47
Viele Fernseher, alte PC-Röhrenmonitore und PC-Flachbildschirme haben gar keinen (gelben) CINCH-Video-Eingang für ein Videosignal 1V p-p.

Nicht funktionieren wird das Ganze z.B. an einer HF-Eingangsbuchse (Antennenbuchse).

Gruß Dirk

robokiller
07.04.2010, 20:54
ich glaub ich hab schon den richtigen anschluss
an denn video anschluss an den man auch die ps 2 ansteckt oder ??
(sihe bild)

wenn ich an der chinch buchse meines rp6 mit dem multimeter mess hab ich bei licht um die 1,4volt und bei abgedecker kammerea um die 0,4 volt

_|Alex|_
08.04.2010, 07:43
ja aber in den Gelben :mrgreen:

Alex

robokiller
08.04.2010, 08:59
Hallo ALex,
ja is scho klar.
Aber ich weiß einfach nicht wass ich falsch gemacht hab ?????
Auf dem fernsehr sehe ich blos streifen und wenn ich dass programn von radbruch probiere sendet es blos dateien die ich nicht öffnen kann.

_____________________

Mfg RoboKiller

RobbyMartin
08.04.2010, 09:08
ich bin mir nicht sicher also verbässert mich wenn ich falsch liege
önnte es sein, dass die kamera keine stromversorgung hat also wenn der roboter aus ist das solche streifen vorkommen können??

manchmal ist der fehler ganz leicht aber wie gesagt bin ich mir nicht ganz sicher!!!

lg
martin

robokiller
08.04.2010, 09:42
Wenn ich direckt da messe wo ich die kammera an die Stromversorgung anschließe hab ich dort genau 5,0 Volt.

_______________________________________

Mfg RoboKiller

robokiller
08.04.2010, 10:08
Kann es sein das meie Kamera kaputt ist (hab sie eigentlich erst vor 2 Tagen bei cornad gekauft). Wie könnte isch meine kammer testen ?????
Wenn ich das programm von radbruch teste erhalte ich eine datei die ich nicht öffnen kann (siehe unten ).


Danke für die hilfe schon mal im voraus
________________________________________________

Mfg roboKiller

radbruch
08.04.2010, 15:08
Hallo


wenn ich an der chinch buchse meines rp6 mit dem multimeter mess hab ich bei licht um die 1,4volt und bei abgedecker kammerea um die 0,4voltMiss mal am Ende des Verbindungskabels, 1,4V bringt die Kamera nur im "Leerlauf" ohne 75Ohm-Last.

Wie lang ist denn die Verbindungsleitung zwischen RP6-Cinch und TV? Das Signal ist scheinbar zu schwach für die Zeilenansteuerung des TV.

Wenn ich meine Verbindungsleitung in den TV-Eingang stecke, kann ich am freien Ende mit dem Ohmmeter die 75Ohm messen. Ich weiß aber nicht, ob dass immer so messbar ist.

Das einfachste Testprogramm ist im Moment das ohne Dateierzeugung. Es werden nur 254 Werte nacheinander eingelesen und zum Terminal gesendet. Start ist Bildschirmzeile 100:

// Kleines Testprogramm zur Funktionsprüfung 1.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[1024], *bildzeiger; // 1KB * 8Bit Bildspeicher bereitstellen
uint8_t spalte, zeile, sync, c;

initRobotBase();
ADC_Init();

while(1)
{
writeString_P("---------------------------\n");
for(c=0; c<255; c++) // Bildspeicher löschen (mit Byte-Variable)
{
bildspeicher[c]=bildspeicher[256+c]=\
bildspeicher[2*256+c]=bildspeicher[3*256+c]=0;
}

for(c=0; c<4; c++) // viermal den selben Bereich einlesen
{
bildzeiger=&bildspeicher[256*c]; // Zeiger auf Start des Bildspeicherbereich
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

zeile=150; // durchhangeln bis Zeile 150
while(zeile--)
{
while (ADCH > 20); // Bilddaten
while (ADCH < 30); // Sync
}

spalte=255; // oje
do *bildzeiger++=ADCH; while(spalte--); // 254 Werte einlesen
//while(spalte--) *bildzeiger++=ADCH; // dito
//do *bildzeiger=ADCH; while(*bildzeiger++ > 20); // schneller ;)
sei();
}

for(spalte=0; spalte != 255; spalte++) // Alle Durchgänge gemeinsam ausgeben
{
writeInteger(spalte, 10);
writeString_P(": ");
writeInteger(bildspeicher[spalte], 10);
writeString_P(" ");
writeInteger(bildspeicher[256+spalte], 10);
writeString_P(" ");
writeInteger(bildspeicher[2*256+spalte], 10);
writeString_P(" ");
writeInteger(bildspeicher[3*256+spalte], 10);
writeString_P("\n");
}
while(!(getBumperLeft() || getBumperRight())); // Nochmal? Terminal löschen!
}
return(0);
}(Das ist die Kopie von hier (https://www.roboternetz.de/phpBB2/viewtopic.php?p=494488#494488))

Gruß

mic

Martinius11
08.04.2010, 17:17
vieleicht musst du scharf stellen

robokiller
08.04.2010, 19:52
vieleicht musst du scharf stellen

Nein eich habs schon versucht ist immernoch das slebe.

Hallo radbruch vielendank für deine hilfe,
das kabel zum vernseher ist 30 cm lang, am ende dieses Kabels hab ich
ungefair 0,892 Volt.
An dem Kamera modul kann es nicht liegen da ich heute bei conrad die kamera reglamiert hab und ne neue mitgenommen hab.

Danke für das programm es gab bei mir folgendes aus (mit wiederstand):


0: 48 48 48 48
1: 48 48 48 48
2: 48 48 48 48
3: 39 48 96 48
4: 39 48 96 48
5: 39 48 96 48
6: 39 48 96 48
7: 39 48 96 48
8: 19 48 92 48
9: 19 48 92 48
10: 19 48 92 48
11: 19 48 92 48
12: 12 48 99 48
13: 12 48 99 48
14: 12 48 99 48
15: 12 48 99 48
16: 7 48 97 48
17: 7 48 97 48
18: 7 48 97 48
19: 7 48 97 48
20: 7 48 97 48
21: 7 48 103 48
22: 7 48 103 48
23: 7 48 103 48
24: 7 48 103 48
25: 7 48 104 48
26: 7 48 104 48
27: 7 48 104 48
28: 7 48 104 48
29: 7 48 99 48
30: 7 48 99 48
31: 7 48 99 48
32: 7 48 99 48
33: 7 48 99 48
34: 7 48 63 48
35: 7 48 63 48
36: 7 48 63 48
37: 7 48 63 48
38: 7 48 56 48
39: 7 48 56 48
40: 7 48 56 48
41: 7 48 56 48
42: 48 48 56 48
43: 48 48 56 48
44: 48 48 56 48
45: 48 48 56 48
46: 48 48 56 48
47: 35 48 56 48
48: 35 48 56 48
49: 35 48 56 48
50: 35 48 56 48
51: 17 48 51 48
52: 17 48 51 48
53: 17 48 51 48
54: 17 48 51 48
55: 12 48 51 48
56: 12 48 51 48
57: 12 48 51 48
58: 12 48 51 48
59: 12 48 51 48
60: 7 48 54 48
61: 7 48 54 48
62: 7 48 54 48
63: 7 48 54 48
64: 7 48 51 48
65: 7 48 51 48
66: 7 48 51 48
67: 7 48 51 48
68: 7 48 56 48
69: 7 48 56 48
70: 7 48 56 48
71: 7 48 56 48
72: 7 48 56 48
73: 7 48 56 48
74: 7 48 56 48
75: 7 48 56 48
76: 7 48 56 48
77: 7 31 31 31
78: 7 31 31 31
79: 7 31 31 31
80: 7 31 31 31
81: 7 48 48 44
82: 7 48 48 44
83: 7 48 48 44
84: 7 48 48 44
85: 7 48 48 48
86: 48 48 48 48
87: 48 48 48 48
88: 48 48 48 48
89: 48 48 48 48
90: 31 48 96 48
91: 31 48 96 48
92: 31 48 96 48
93: 31 48 96 48
94: 17 48 96 48
95: 17 48 96 48
96: 17 48 96 48
97: 17 48 96 48
98: 17 48 96 48
99: 9 48 102 48
100: 9 48 102 48
101: 9 48 102 48
102: 9 48 102 48
103: 7 48 88 48
104: 7 48 88 48
105: 7 48 88 48
106: 7 48 88 48
107: 7 48 103 48
108: 7 48 103 48
109: 7 48 103 48
110: 7 48 103 48
111: 7 48 103 48
112: 7 48 108 48
113: 7 48 108 48
114: 7 48 108 48
115: 7 48 108 48
116: 7 48 96 48
117: 7 48 96 48
118: 7 48 96 48
119: 7 48 96 48
120: 7 48 56 48
121: 7 48 56 48
122: 7 48 56 48
123: 7 48 56 48
124: 7 48 56 48
125: 7 48 56 48
126: 7 48 56 48
127: 7 48 56 48
128: 7 48 56 48
129: 48 48 56 48
130: 48 48 56 48
131: 48 48 56 48
132: 48 48 56 48
133: 31 48 56 48
134: 31 48 56 48
135: 31 48 56 48
136: 31 48 56 48
137: 31 48 56 48
138: 15 48 56 48
139: 15 48 56 48
140: 15 48 56 48
141: 15 48 56 48
142: 9 48 51 48
143: 9 48 51 48
144: 9 48 51 48
145: 9 48 51 48
146: 7 48 54 48
147: 7 48 54 48
148: 7 48 54 48
149: 7 48 54 48
150: 7 48 54 48
151: 7 48 49 48
152: 7 48 49 48
153: 7 48 49 48
154: 7 48 49 48
155: 7 48 51 48
156: 7 48 51 48
157: 7 48 51 48
158: 7 48 51 48
159: 7 48 48 48
160: 7 48 48 48
161: 7 48 48 48
162: 7 48 48 48
163: 7 48 48 30
164: 7 30 30 30
165: 7 30 30 30
166: 7 30 30 30
167: 7 30 30 30
168: 38 48 48 48
169: 38 48 48 48
170: 38 48 48 48
171: 38 48 48 48
172: 48 48 48 48
173: 48 48 48 48
174: 48 48 48 48
175: 48 48 48 48
176: 48 48 48 48
177: 30 48 89 48
178: 30 48 89 48
179: 30 48 89 48
180: 30 48 89 48
181: 48 48 96 48
182: 48 48 96 48
183: 48 48 96 48
184: 48 48 96 48
185: 48 48 103 48
186: 48 48 103 48
187: 48 48 103 48
188: 48 48 103 48
189: 48 48 103 48
190: 48 48 88 48
191: 48 48 88 48
192: 48 48 88 48
193: 48 48 88 48
194: 48 48 97 48
195: 48 48 97 48
196: 48 48 97 48
197: 48 48 97 48
198: 48 48 105 48
199: 48 48 105 48
200: 48 48 105 48
201: 48 48 105 48
202: 48 48 105 48
203: 48 48 81 48
204: 48 48 81 48
205: 48 48 81 48
206: 48 48 81 48
207: 48 48 54 48
208: 48 48 54 48
209: 48 48 54 48
210: 48 48 54 48
211: 48 48 56 48
212: 48 48 56 48
213: 48 48 56 48
214: 48 48 56 48
215: 48 48 56 48
216: 48 48 56 48
217: 48 48 56 48
218: 48 48 56 48
219: 48 48 56 48
220: 30 48 56 48
221: 30 48 56 48
222: 30 48 56 48
223: 30 48 56 48
224: 48 48 54 48
225: 48 48 54 48
226: 48 48 54 48
227: 48 48 54 48
228: 48 48 54 48
229: 48 48 49 48
230: 48 48 49 48
231: 48 48 49 48
232: 48 48 49 48
233: 48 48 49 48
234: 48 48 49 48
235: 48 48 49 48
236: 48 48 49 48
237: 48 48 48 48
238: 48 48 48 48
239: 48 48 48 48
240: 48 48 48 48
241: 48 48 48 48
242: 48 48 49 48
243: 48 48 49 48
244: 48 48 49 48
245: 48 48 49 48
246: 48 48 48 48
247: 48 48 48 48
248: 48 48 48 48
249: 48 48 48 48
250: 48 25 24 44
251: 48 25 24 44
252: 48 25 24 44
253: 48 25 24 44
254: 48 25 24 48

Und ohne wiederstand:

0: 46 48 48 48
1: 46 48 48 48
2: 46 48 48 48
3: 83 48 48 48
4: 83 48 48 48
5: 83 48 48 48
6: 83 48 48 48
7: 83 48 48 88
8: 92 88 86 88
9: 92 88 86 88
10: 92 88 86 88
11: 92 88 86 88
12: 96 92 89 96
13: 96 92 89 96
14: 96 92 89 96
15: 96 92 89 96
16: 112 92 89 96
17: 112 92 89 96
18: 112 92 89 96
19: 112 92 89 96
20: 112 92 89 105
21: 104 112 112 105
22: 104 112 112 105
23: 104 112 112 105
24: 104 112 112 105
25: 112 86 88 96
26: 112 86 88 96
27: 112 86 88 96
28: 112 86 88 96
29: 112 110 110 105
30: 112 110 110 105
31: 112 110 110 105
32: 112 110 110 105
33: 112 110 110 112
34: 104 108 110 112
35: 104 108 110 112
36: 104 108 110 112
37: 104 108 110 112
38: 108 110 112 103
39: 108 110 112 103
40: 108 110 112 103
41: 108 110 112 103
42: 103 103 104 108
43: 103 103 104 108
44: 103 103 104 108
45: 103 103 104 108
46: 103 103 104 104
47: 108 108 110 104
48: 108 108 110 104
49: 108 108 110 104
50: 108 108 110 104
51: 105 108 108 103
52: 105 108 108 103
53: 105 108 108 103
54: 105 108 108 103
55: 105 103 103 103
56: 105 103 103 103
57: 105 103 103 103
58: 105 103 103 103
59: 105 103 103 102
60: 102 103 103 102
61: 102 103 103 102
62: 102 103 103 102
63: 102 103 103 102
64: 97 97 102 103
65: 97 97 102 103
66: 97 97 102 103
67: 97 97 102 103
68: 96 96 99 99
69: 96 96 99 99
70: 96 96 99 99
71: 96 96 99 99
72: 96 96 99 96
73: 96 96 96 96
74: 96 96 96 96
75: 96 96 96 96
76: 96 96 96 96
77: 24 44 44 49
78: 24 44 44 49
79: 24 44 44 49
80: 24 44 44 49
81: 39 9 9 12
82: 39 9 9 12
83: 39 9 9 12
84: 39 9 9 12
85: 39 9 9 48
86: 48 48 46 48
87: 48 48 46 48
88: 48 48 46 48
89: 48 48 46 48
90: 88 48 48 48
91: 88 48 48 48
92: 88 48 48 48
93: 88 48 48 48
94: 96 79 79 81
95: 96 79 79 81
96: 96 79 79 81
97: 96 79 79 81
98: 96 79 79 89
99: 92 92 92 89
100: 92 92 92 89
101: 92 92 92 89
102: 92 92 92 89
103: 112 96 96 96
104: 112 96 96 96
105: 112 96 96 96
106: 112 96 96 96
107: 96 112 112 108
108: 96 112 112 108
109: 96 112 112 108
110: 96 112 112 108
111: 96 112 112 88
112: 112 110 108 88
113: 112 110 108 88
114: 112 110 108 88
115: 112 110 108 88
116: 112 112 112 108
117: 112 112 112 108
118: 112 112 112 108
119: 112 112 112 108
120: 103 112 112 103
121: 103 112 112 103
122: 103 112 112 103
123: 103 112 112 103
124: 103 112 112 103
125: 103 110 112 103
126: 103 110 112 103
127: 103 110 112 103
128: 103 110 112 103
129: 104 108 104 102
130: 104 108 104 102
131: 104 108 104 102
132: 104 108 104 102
133: 103 110 103 103
134: 103 110 103 103
135: 103 110 103 103
136: 103 110 103 103
137: 103 110 103 105
138: 103 104 104 105
139: 103 104 104 105
140: 103 104 104 105
141: 103 104 104 105
142: 103 103 103 103
143: 103 103 103 103
144: 103 103 103 103
145: 103 103 103 103
146: 103 105 99 103
147: 103 105 99 103
148: 103 105 99 103
149: 103 105 99 103
150: 103 105 99 103
151: 99 103 102 103
152: 99 103 102 103
153: 99 103 102 103
154: 99 103 102 103
155: 96 96 97 102
156: 96 96 97 102
157: 96 96 97 102
158: 96 96 97 102
159: 63 96 96 97
160: 63 96 96 97
161: 63 96 96 97
162: 63 96 96 97
163: 63 96 96 49
164: 15 31 31 49
165: 15 31 31 49
166: 15 31 31 49
167: 15 31 31 49
168: 48 7 7 12
169: 48 7 7 12
170: 48 7 7 12
171: 48 7 7 12
172: 48 48 46 48
173: 48 48 46 48
174: 48 48 46 48
175: 48 48 46 48
176: 48 48 46 48
177: 88 78 78 48
178: 88 78 78 48
179: 88 78 78 48
180: 88 78 78 48
181: 96 88 88 78
182: 96 88 88 78
183: 96 88 88 78
184: 96 88 88 78
185: 96 92 96 88
186: 96 92 96 88
187: 96 92 96 88
188: 96 92 96 88
189: 96 92 96 96
190: 110 108 112 96
191: 110 108 112 96
192: 110 108 112 96
193: 110 108 112 96
194: 92 103 103 108
195: 92 103 103 108
196: 92 103 103 108
197: 92 103 103 108
198: 108 108 110 97
199: 108 108 110 97
200: 108 108 110 97
201: 108 108 110 97
202: 108 108 110 105
203: 108 112 112 105
204: 108 112 112 105
205: 108 112 112 105
206: 108 112 112 105
207: 108 105 110 108
208: 108 105 110 108
209: 108 105 110 108
210: 108 105 110 108
211: 108 108 108 110
212: 108 108 108 110
213: 108 108 108 110
214: 108 108 108 110
215: 108 108 108 99
216: 105 103 103 99
217: 105 103 103 99
218: 105 103 103 99
219: 105 103 103 99
220: 104 110 108 103
221: 104 110 108 103
222: 104 110 108 103
223: 104 110 108 103
224: 103 103 108 108
225: 103 103 108 108
226: 103 103 108 108
227: 103 103 108 108
228: 103 103 108 103
229: 103 103 108 103
230: 103 103 108 103
231: 103 103 108 103
232: 103 103 108 103
233: 103 103 103 99
234: 103 103 103 99
235: 103 103 103 99
236: 103 103 103 99
237: 103 99 103 103
238: 103 99 103 103
239: 103 99 103 103
240: 103 99 103 103
241: 103 99 103 99
242: 96 96 96 99
243: 96 96 96 99
244: 96 96 96 99
245: 96 96 96 99
246: 49 96 96 96
247: 49 96 96 96
248: 49 96 96 96
249: 49 96 96 96
250: 12 24 24 35
251: 12 24 24 35
252: 12 24 24 35
253: 12 24 24 35
254: 12 24 24 8

Mc Delta
08.04.2010, 19:53
Hallo, Ich nehme an, dass du eine BPM Datei erstellen willst. Oder?
Dann musst du die Datei natürlich auch als solche abspeichern. (Dateiname.bpm)
PS:
Selbst wenn die Kamera kaputt ist müsste der RP6 doch trotdem eine "Datei" senden - Nur das man dann auf dem Bild nichts erkennt.

robokiller
08.04.2010, 20:24
Hallo mc Delta,
ich will einfach mal testen ob das funktioniert was ich gemacht hab bevor ich mit Phalse 2 weiter mach. auch wenn ich die datei mit .bpm abspeichere. kann sie nicht geöffnet werden.

RoboNull
08.04.2010, 20:44
Also, da kommt einfach "Müll" an:

Mein RAW Tester sagt mir: "No valid bitmap start tag found".
Sieh dir mal mein Screenshot an, ein Vergleich von deinem bmp Bild zu einem "funktionierenden" bmp Bild.

Links das funktionierende Bitmap. (Man sieht den bmp starter)
Rechts dein Bitmap.

http://img687.imageshack.us/img687/5894/errorrg.png

Da kommt was nicht richtig an!
Hast du alle Einstellungen korrekt gesetzt? Baudrate etc. ?

Grüße

robokiller
08.04.2010, 20:54
Ich hab bei baudrate einfach drin stehen gelassen was scho drin war 19200.

________________-
Mfg roboKiller

radbruch
08.04.2010, 21:24
Hallo

Das einfache Testprogramm erzeugt keine BMP-Datei (weil das erzeugen einer BMP-Datei einfach nicht einfach ist):

Bei mir wird folgende Ausgabe erzeugt (mit angeschlossenem TV):

---------------------------
0: 51 60 56 60
1: 51 60 56 60
2: 51 60 56 60
3: 62 63 62 63
4: 62 63 62 63
5: 62 63 62 63
6: 63 62 63 63
7: 63 62 63 63
8: 63 62 63 63
9: 63 63 63 63
10: 63 63 63 63
11: 63 63 63 63
12: 63 63 63 63
13: 63 63 63 63
14: 63 63 63 63
15: 63 63 63 63
16: 63 63 63 63
17: 63 63 63 63
18: 63 63 63 63
19: 63 63 63 63
20: 63 63 63 63
21: 63 63 63 63
22: 63 63 63 63
23: 63 63 63 63
24: 63 63 63 63
25: 63 63 63 63
26: 63 63 63 63
27: 63 63 63 63
28: 63 63 63 63
29: 63 62 63 63
30: 63 62 63 63
31: 63 62 63 63
32: 63 63 63 62
33: 63 63 63 62
34: 63 63 63 62
35: 63 63 60 62
36: 63 63 60 62
37: 63 63 60 62
38: 60 56 56 62
39: 60 56 56 51
40: 60 56 56 51
41: 60 56 56 51
42: 51 55 56 56
43: 51 55 56 56
44: 51 55 56 56
45: 60 60 57 57
46: 60 60 57 57
47: 60 60 57 57
48: 56 54 54 49
49: 56 54 54 49
50: 56 54 54 49
51: 33 30 30 49
52: 33 30 30 24
53: 33 30 30 24
54: 33 30 30 24
55: 6 6 6 6
56: 6 6 6 6
57: 6 6 6 6
58: 25 28 28 28
59: 25 28 28 28
60: 25 28 28 28
61: 28 28 28 28
62: 28 28 28 28
63: 28 28 28 28
64: 60 60 60 28
65: 60 60 60 60
66: 60 60 60 60
67: 60 60 60 60
68: 62 62 63 63
69: 62 62 63 63
70: 62 62 63 63
71: 63 63 62 63
72: 63 63 62 63
73: 63 63 62 63
74: 62 63 63 63
75: 62 63 63 63
76: 62 63 63 63
77: 63 63 63 63
78: 63 63 63 63
79: 63 63 63 63
80: 63 63 63 63
81: 63 63 63 63
82: 63 63 63 63
83: 63 63 63 63
84: 63 63 63 63
85: 63 63 63 63
86: 63 63 63 63
87: 63 63 63 63
88: 63 63 63 63
89: 63 63 63 63
90: 63 63 63 63
91: 63 63 63 63
92: 63 63 63 63
93: 63 63 63 63
94: 63 63 63 63
95: 63 63 63 63
96: 63 63 63 63
97: 63 63 63 63
98: 63 63 63 63
99: 63 63 63 63
100: 62 62 62 62
101: 62 62 62 62
102: 62 62 62 62
103: 56 51 51 62
104: 56 51 51 49
105: 56 51 51 49
106: 56 51 51 49
107: 54 56 56 56
108: 54 56 56 56
109: 54 56 56 56
110: 56 60 56 56
111: 56 60 56 56
112: 56 60 56 56
113: 54 49 48 39
114: 54 49 48 39
115: 54 49 48 39
116: 30 30 8 39
117: 30 30 8 7
118: 30 30 8 7
119: 30 30 8 7
120: 6 6 4 3
121: 6 6 4 3
122: 6 6 4 3
123: 28 28 28 28
124: 28 28 28 28
125: 28 28 28 28
126: 28 28 28 49
127: 28 28 28 49
128: 28 28 28 49
129: 60 60 60 49
130: 60 60 60 60
131: 60 60 60 60
132: 60 60 60 60
133: 63 63 62 63
134: 63 63 62 63
135: 63 63 62 63
136: 63 62 63 62
137: 63 62 63 62
138: 63 62 63 62
139: 63 63 63 62
140: 63 63 63 62
141: 63 63 63 62
142: 63 63 63 62
143: 63 63 63 63
144: 63 63 63 63
145: 63 63 63 63
146: 63 63 63 63
147: 63 63 63 63
148: 63 63 63 63
149: 63 63 63 63
150: 63 63 63 63
151: 63 63 63 63
152: 63 63 63 63
153: 63 63 63 63
154: 63 63 63 63
155: 63 63 63 63
156: 63 63 63 63
157: 63 63 63 63
158: 63 63 63 63
159: 63 63 63 63
160: 63 63 63 63
161: 63 63 63 63
162: 63 63 62 62
163: 63 63 62 62
164: 63 63 62 62
165: 60 60 62 57
166: 60 60 62 57
167: 60 60 62 57
168: 54 51 51 57
169: 54 51 51 49
170: 54 51 51 49
171: 54 51 51 49
172: 56 60 57 60
173: 56 60 57 60
174: 56 60 57 60
175: 56 56 56 56
176: 56 56 56 56
177: 56 56 56 56
178: 48 44 39 33
179: 48 44 39 33
180: 48 44 39 33
181: 15 7 7 33
182: 15 7 7 6
183: 15 7 7 6
184: 15 7 7 6
185: 3 4 3 24
186: 3 4 3 24
187: 3 4 3 24
188: 28 28 28 28
189: 28 28 28 28
190: 28 28 28 28
191: 28 39 56 60
192: 28 39 56 60
193: 28 39 56 60
194: 60 60 62 60
195: 60 60 62 62
196: 60 60 62 62
197: 60 60 62 62
198: 62 63 63 62
199: 62 63 63 62
200: 62 63 63 62
201: 63 63 63 63
202: 63 63 63 63
203: 63 63 63 63
204: 63 63 63 63
205: 63 63 63 63
206: 63 63 63 63
207: 63 63 63 63
208: 63 63 63 63
209: 63 63 63 63
210: 63 63 63 63
211: 63 63 63 63
212: 63 63 63 63
213: 63 63 63 63
214: 63 63 63 63
215: 63 63 63 63
216: 63 63 63 63
217: 63 63 63 63
218: 63 63 63 63
219: 63 63 63 63
220: 63 63 63 63
221: 63 63 63 63
222: 63 63 63 63
223: 63 63 63 63
224: 63 63 63 63
225: 63 63 63 63
226: 63 63 63 63
227: 63 62 62 62
228: 63 62 62 62
229: 63 62 62 62
230: 60 60 57 56
231: 60 60 57 56
232: 60 60 57 56
233: 51 51 54 56
234: 51 51 54 56
235: 51 51 54 56
236: 51 51 54 56
237: 57 60 60 60
238: 57 60 60 60
239: 57 60 60 60
240: 56 56 56 56
241: 56 56 56 56
242: 56 56 56 56
243: 39 33 31 30
244: 39 33 31 30
245: 39 33 31 30
246: 7 7 6 30
247: 7 7 6 6
248: 7 7 6 6
249: 7 7 6 6
250: 3 22 28 28
251: 3 22 28 28
252: 3 22 28 28
253: 28 28 28 28
254: 28 28 28 28
Das sind vier Scans jeweils ab der selben Zeile (100), nach ca. 55 Werten kommt jeweils das Syncsignal, dann bei 120... Alles dazwischen sind die Bilddaten, je größer der Wert, umso heller der Bildpunkt.

Irgendetwas stimmt also bei deiner Ausgabe noch nicht. Kannst du mit der neuen Kamera ein Bild auf dem TV erzeugen?

"das kabel zum vernseher ist 30 cm lang,"
Hast du auch mal ein anderes Kabel versucht?

Gruß

mic

TrainMen
08.04.2010, 22:01
Hi
sag mal warum fummelst du denn mit dem Programm rum? bring doch erst mal die Kamera zum laufen. Die muß dir doch ein klares Bild auf dem Bildschirm bringen.
Nur mal so nebenbei, meine Kamera zeigte das gleiche wirrwar bis ich die Chinchbuchse richtig lötete. Ich dachte nämlich die Masse ist aussen.
Jetzt habe ich ein klares Bild, nichts abgeschirmt und das Chinchkabel ist 1m. Nur mal so.
Trainmen

RoboNull
09.04.2010, 06:45
Hallo
Das einfache Testprogramm erzeugt keine BMP-Datei

Das ist klar.
Ich dachte, er benutzt das Programm, welches du auf dem anderen Forum gefunden hast, um eine bmp Datei zu erstellen.
Von dem her ist klar das dass nur Müll ist bezogen auf ein bmp Bild.

robokiller
09.04.2010, 08:23
Hallo an alle und vielen dank für die hilfe,
leider funktioniert sie immernoch nicht.


Für die bmp datei hab icih natürlich das anrdere porgramm benutz.
Auch mit der neuen Kamera Kann ich auch kein bild am vernseher erzeugen.
mit einem anderen Kabel habs ich acuh schon getestet
War das selbe.
also ich hab bei meiner chinch buchse Vout ausen unt GND innen ](*,)
](*,) ](*,) ](*,) ](*,) ](*,) ](*,) ](*,) ](*,)

RobbyMartin
09.04.2010, 08:26
das sist aber andersherum gnd ist aussen und das nf signal ist innen

lg
martin

robokiller
09.04.2010, 08:50
Nur mal so nebenbei, meine Kamera zeigte das gleiche wirrwar bis ich die Chinchbuchse richtig lötete. Ich dachte nämlich die Masse ist aussen.
Trainmen



das sist aber andersherum gnd ist aussen und das nf signal ist innen
RobbyMartin

Hä was ist jetzt richtig

_____________________________-

Mfg roboKiller

_|Alex|_
09.04.2010, 09:34
Masse ist außen und Signal innen
http://www.itwissen.info/bilder/aufbau-und-belegung-des-cinch-steckers.png

Lg Alex

TrainMen
09.04.2010, 10:07
Hi,
nur um das klar zustellen.
Masse ist außen und Signal innen gilt für die reine Buchse.
Die Lötfahnen sind aber anders. Der Aussen ist Signal und der zwischen den Nippeln ist Masse. Einfach mal draufschauen.
Trainmen

robokiller
09.04.2010, 10:35
JA scho klar aber ich hab ne andere buchse denn die waren beim conrad ausverkauft meine hat blos nen anschluss für inn und eine für ausen

TrainMen
09.04.2010, 10:48
Hä ?
muß ich das jetzt verstehen? einen für innen, einen für außen. Was willst Du denn mehr. Meine Buchse (Bastelkiste) hat auch nur 2 und mehr braucht man doch nicht.
Egal ich wollt ja nur drauf hinweisen das man sich die Buchse genau anguckt bevor man lötet. Ich hatte ja auch verkehrt gelegen und machte ein langes Gesicht, als ich meinen Fehler sah.
Trainmen

robokiller
09.04.2010, 15:15
Hallo und danke an alle,
meine kamera futioniert jetzt alerdings funktioiert das programm für bmp.
dateien nicht

radbruch
09.04.2010, 15:34
Ich hab bei baudrate einfach drin stehen gelassen was scho drin war 19200.Baudrate ist 38400!

RobbyMartin
10.04.2010, 11:13
so habe jetzt die erste phase fertig ohne fehler und am bildschirm habe ich ein gestochen scharfes bild

lg
martin

Martinius11
10.04.2010, 11:25
Ich hab bei baudrate einfach drin stehen gelassen was scho drin war 19200.Baudrate ist 38400!

Sorry aber kann mir jemand sagen was Baudrate ist ?Hat das mit dem Programm zu tun mit der bmp Datei zu tun ich hab das noch nicht ausprobiert.

radbruch
10.04.2010, 12:02
Hallo

"Baudrate" ist die Geschwindigkeit mit der die Daten über die serielle Schnittstelle vom RP6 zum PC gesendet werden. Beide Partner müssen mit der selben Baudrate arbeiten. Weil diese beim RP6 auf 38400 voreingestellt ist, verwende ich diese auch bei der Erzeugung der BMP-Dateien mit dem weiter oben erwähnten Tool. (Eigentlich kann man sie auch erhöhen, aber daran hatte ich bisher noch nicht gedacht...)

Grundsätzlich wird diese BMP-Funktion später nicht mehr benötigt. Sie dient eigentlich nur zum Testen der Kamera. Der RP6 kann damit nicht viel anfangen, weil er die Bilder nicht komplett im eigenen Speicher ablegen und analysieren kann. Für echte (autonome) Anwendungen werden wir später gezielt nur kleine Bereiche oder einzelne Punkte der Bilder untersuchen und auswerten.

Bevor wir aber ein echtes Projekt angehen sollte sich jeder nochmal klarmachen, wie der Mega32 das Signal einliest und woran man die einzelnen Bereiche eines Bildes (Syncronsignal, Bildanfang, Zeilenanfang) anhand der eingelesenen Signalwerte erkennt.

btw. wäre vielleicht ein erstes gemeinsames Projekt zur Übung nicht schlecht.

Gruß

mic

Martinius11
10.04.2010, 12:12
Wie wärs mit ein Programm beidem der roboter eine Seule erkenen soll

Mc Delta
10.04.2010, 17:37
Wie stellst du dir das denn vor? Der RP6 kann mithilfe der Kamera doch nur 2D Bilder erkennen. Das heißt du müsstest ihn um dieSäule drumfahren lassen. Ich würde erstmal mit was einfacheren anfangen.

Martinius11
10.04.2010, 18:36
nein er soll nur ein bestimmtes objekt erkennen und mit leds anzeigen

TrainMen
10.04.2010, 23:20
Hi,
Kann ich Phase 2 also die Verstärkung auch irgendwie Testen ? bevor ich weiter mache will ich schon wissen ob ich bis dahin alles richtig gemacht habe. Was muß ich also tun? Wo Messe ich was?
Trainmen

Thomas$
10.04.2010, 23:35
mal eine andere frage und zwar zu phase 3 sollte es nicht auch möglich sein ohne den lm1881? den aufbau aus zwei schwingkreisen einer schwingt auf den 50hz der andere auf den 15khz.
maritinius11 das objekt erkennen solltest du sleber hinbekommen denk ich jedenfals einen balken der sich von dem hintergund abhebt sollte erkennbar sein
edit glaub hier war der rechtschreibfehler des tages hoffe das hat keiner vor dem edit gelesen

Dirk
11.04.2010, 19:36
@Thomas$:
Mir ist der LM 1881N aufgefallen, weil er schön einfach einsetzbar ist.

Man kann einen Sync-Separator auch diskret aufbauen, aber das sind dann einige Transistoren und mehrere passive Bauteile mit mehr Platzbedarf auf der Rasterplatine.

... sollte es nicht auch möglich sein ohne den lm1881? den aufbau aus zwei schwingkreisen einer schwingt auf den 50hz der andere auf den 15khz.
Kannst du 'mal einen Schaltplan posten, der das so umsetzt?

Vorteile des LM 1881N:
Er gibt 4 Signale aus:
- VSync: Bildsynchronisation
- CSync: Alle Zeilensynchronimpulse und auch die Impulse der vertikalen Austastlücke
- Burst: Die Stelle der Farbinfos
- Odd/Even: Gerades oder ungerades Halbbild
Wollte man das selbst aufbauen, wäre das schon sehr aufwändig.

Gruß Dirk

RobbyMartin
11.04.2010, 20:41
So habe jetzt radbruchs fotoprogramm erfolgreich getestet und bin erstaunt wie gut es funktioniert
\:D/
aber komischer weise funktioniert es nicht von der 2. phase nur über die erste
also nicht von pg5 zu pg4
sondern nur von pg3 zu pg4

weiß jemand eine antwort darauf

lg
martin

Mc Delta
12.04.2010, 13:42
Hey,
so wie ich das verstanden habe müsste man das Ausgangssignal entsprechend anklemmen, damit der Nullvoltpegel (Blacklevel Schwarzbereich) für den RP6 sichtbar wird dazu muss man zwei Jumper stecken. Auf JP3 + JP4!
Sonst sieht dein RP6 nix!!!

RoboNull
12.04.2010, 17:57
Wie wärs mit ein Programm beidem der roboter eine Seule erkenen soll
Wieder einmal das Thema komplett verfehlt!


Grundsätzlich wird diese BMP-Funktion später nicht mehr benötigt. Sie dient eigentlich nur zum Testen der Kamera.


Bevor wir aber ein echtes Projekt angehen sollte sich jeder nochmal klarmachen, wie der Mega32 das Signal einliest und woran man die einzelnen Bereiche eines Bildes (Syncronsignal, Bildanfang, Zeilenanfang) anhand der eingelesenen Signalwerte erkennt.

Dem stimme ich zu!
Es geht bei diesem Projekt nicht darum irgendwelche Bilder auf dem PC zu erkennen! der Mega32 kann diese Bilder gar nicht komplett speichern und auswerten! Das was Martinius11 da will, ist eine reine PC Sache und gdi+ überhaupt kein Problem. Sind vlt. 40 Zeilen C++ Code.

Aber es verfehlt den Sinn der Übung!

Wie Radbruch schon sagte, es geht um den Mega32 und dessen Fähigkeiten ein Bild zu - sagen wir mal - erkennen.

RobbyMartin
12.04.2010, 18:00
@ mc delta

auch mit den beiden jumpern startet das programm nichtma,l richtig also keine leds leuchten dies lässt mich vermuten das von der kamera kein signal am mega32 pin ankommt ich überprüfe die schaltung nochmal vielleicht ist ja ein löt fehler drinne

lg
martin

Martinius11
12.04.2010, 18:21
er soll die die bilder ja nicht speichern und auch nicht ein ganzes Bild auswerten er soll einfach nur ein zusammen hängendes objekt erkennen das kann auch der mega32 vorallem wenn schon beschlossen wurde das 3 halbbilder gemacht werden

Dirk
12.04.2010, 19:28
@RobbyMartin:

Die ADC-Videosignale an PG5 und PG6 sehen völlig anders aus als das Video-Signal von der Kamera (PG3).

Daher kann radbruchs Programm so nicht funktionieren. Man muss da einiges anpassen.

Mit der Diode (JP4: Aufgesteckt) funktioniert radbruchs Programm gar nicht an PG6, weil die horizontalen Sync-Signale weggeklemmt sind.

Wenn du das Programm von radbruch anpassen willst:
Nimm den Anschluß PG5 (oder weiter PG3 bis die 3. Phase fertig ist).
Als Abschlußwiderstand 5 kOhm (JP3: Aufgesteckt) für alle ADCs außer ADC4 der Base (die braucht den 10 kOhm, JP5: Aufgesteckt).

An PG5 gibt es einen hohen Gleichspannungsanteil, darüber sitzt der Sync-Impuls und darüber die Bildinfos. Man muss also insb. die Werte für den Sync-Impuls heraufsetzen.

Gruß Dirk

RoboNull
13.04.2010, 07:22
er soll die die bilder ja nicht speichern und auch nicht ein ganzes Bild auswerten er soll einfach nur ein zusammen hängendes objekt erkennen das kann auch der mega32 vorallem wenn schon beschlossen wurde das 3 halbbilder gemacht werden
Du musst dich von der Vorstellung eines "Bildes" im Sinne, wie wir es jeden Tag auf dem PC etc. ansehen, verabschieden.

Es sollen ja nur durch ein paar Punkte, Auswertungen und Relationen zu dem Bild hergestellt werden.

Dein Projekt klang mir nach:
Wir schnappen uns das Proggi und lassen die Daten auf den PC reinkommen und werten diese dann aus.


Grüße

Martinius11
13.04.2010, 12:57
Ich hab nichts davon gesagt das ein Photo oder ähnliches gemacht wird
sondern nur das das Bild in drei Abständen ausgewrtet wird. ADC also weiß
hellgrau grau schwarz

TrainMen
13.04.2010, 13:10
Hi,
also nochmal. Dieses Projekt ist in Phasen unterteilt, also müßte man einzelne Phasen Testen können. Phase1 war klar. Jetzt Phase 2. Wie erkenne ich, wie Prüfe ich das Phase 2 richtig gemacht wurde ?
Trainmen

RobbyMartin
13.04.2010, 16:21
und nochmal @ radbruch du hast vorher schon beschrieben, das die kammera nur am rp6 funktioniert wenn ein 75R oder ein monitor angeschlossen ist doch bei mir funktionierts auch ohne widerstand und ohne kontrollmonitor

und als ich die phase 2 aufgebaut habe und das videosignal zu it1 weiterhin von der chinch buchse genommen habe funktioniert es nicht mehr woran kann es liegen da in der 2. phase schon der 75 ohm widerstand verbaut ist glaube ich nicht das es daran liegt
oder funktioniert dein testprogramm nicht mehr wenn phase 2 aufgebaut ist

wie schon gesagt ich benutze nicht pg5 zu pg4 sondern pg3 zu pg4

lg
martin

radbruch
13.04.2010, 16:42
Hallo

Wenn das Signal der Kamera nicht belastet wird, also kein Widerstand oder Monitor vorhanden ist, ist die Spannung etwas höher. Das ist aber nur wichtig, wenn man beim Entwickeln des Programms einen Kontrollmonitor verwendet und diesen dann abstöpselt. Dann sollte man einen Widerstand reinstecken damit die Signalwerte wieder auf dem Level wie mit Monitor liegen.

Zu den einzelnen Phasen und deren Test: Ich habe bisher nur die Kamera mit Cinch-Buchse direkt am PA4. Das ist quasi Phase1. Mehr kann ich deshalb im Moment auch nicht testen. Für die Grundlagenforschung und einfache Anwendungen reicht das eigentlich. Ich warte mal ab ob die weiteren Phasen wirkliche Verbesserungen bringen.

Ab Phase1 kann man auf die Daten der Kamera zugreifen und damit etwas anstellen. Bevor ihr euch in weitere Unkosten stürzt, solltet ihr mal ausprobieren, wie man das macht. In Phase1 ist die Schaltung noch sehr überschaubar, Fehler findet man hier noch leichter als in den späteren Ausbaustufen.

Gruß

mic

Dirk
13.04.2010, 18:46
@RobbyMartin und andere Tester:

... und als ich die phase 2 aufgebaut habe und das videosignal zu it1 weiterhin von der chinch buchse genommen habe funktioniert es nicht mehr woran kann es liegen da in der 2. phase schon der 75 ohm widerstand verbaut ist glaube ich nicht das es daran liegt
oder funktioniert dein testprogramm nicht mehr wenn phase 2 aufgebaut ist
Das Testprogramm von radbruch kann nur mit bestimmten Spannungspegeln des Videosignals funktionieren, die mit einem richtigen Abschlußwiderstand von 75 Ohm ODER einem Monitor mit ähnlichem Innenwiderstand erreicht werden.
Bestimmend sind die Tests auf Bildinhalt und den HSync-Impuls:
while (ADCH > 20); // Bilddaten
while (ADCH < 30); // Sync
Diese Grenzen (>20, <30) bestimmen, in welchem Spannungsbereich der HSync und das Bild erkannt wird.

Dieser Bereich zur Erkennung funktioniert NICHT:
- An PG3: Bei fehlendem oder falschem Abschlußwiderstand von 75 Ohm
- An PG5 generell!

Die Lösung ist einfach: Die Grenzen zur HSync- und Bildinhalts-Erkennung müssen angepaßt werden!
Z.B.: Mit 75 Ohm-Widerstand der Phase 2 + Monitor an PG3 -> Probiert mal 15/25 oder 10/20 ....

PG5: Der Sync-Impuls liegt ÜBER 2V! Damit müssen die Werte stark erhöht werden!! Wegen der Verstärkung x2 sollte auch der Abstand der beiden Grenzwerte auf 20 erhöht werden.

PG6: Funktioniert NICHT mit radbruchs Programm!

Wenn ihr die Phase 2 schon testen wollt, geht das mit radbruchs Programmen NUR an PG3 und PG5. Aber es braucht an PG3 abhängig vom Abschlusswiderstand/Monitor und an PG5 in jedem Fall Software-Anpassungen!

Gruß Dirk

RobbyMartin
13.04.2010, 19:31
vielen dank dirk
für die verständliche erklärung werde wenn ich zeit habe mal ausprobieren
bis jetzt finde ich das kamera projekt sehr spannend und interessant

lg
martin

Dirk
13.04.2010, 20:07
@TrainMen:

Jetzt Phase 2. Wie erkenne ich, wie Prüfe ich das Phase 2 richtig gemacht wurde?
Ich gebe dir 'mal ein paar Meßwerte (Kamera und Monitor nicht angeschlossen, mit Digitalmultimeter gegen GND gemessen), mit denen du deinen Aufbau testen kannst:

Basis BC 547C: 1,6 V
Emitter BC 547C: 1,0 V
Collector BC 547C (= Basis BC 556B): 4,0 V
Emitter BC 556B: 4,8 V
Collector BC 556B: 1,7 V

Alle Meßwerte sind am Verstärker gemessen, nachdem er mit dem Trimmer auf eine 2-fache Verstärkung (Trimmer ca. 140 Ohm) abgeglichen wurde.

Wenn deine Werte in etwa (+- 0,2 V) so aussehen, ist dein Aufbau ok.

Gruß Dirk

P.S.: Ich habe eh keine Zweifel, dass bei dir alles ok gelötet ist! O:)

Thomas$
13.04.2010, 20:38
nach dem das so ausführlich beschrieben ist werd ich mich auch an den bau wagen jedoch werd ich mich hier bascoms bedienen und einen atmega644 20mhz.
ich hab halt keine andere lösung außer dem lm1881 gefunden oder mit röhren was aber irgendwie dann doch nicht mehr zeit gemäs ist.
ein phasen verschiebung kommt nicht zu stande oder? weil ich auch an schrift einblenden dachte.
@radbruch und dirk ist echt super was ihr hier für zeit investiert und euch gedanken macht.

TrainMen
14.04.2010, 12:58
Hi,
@Dirk
also meine BC547: B 1,6V E 0,9V C 4,0V soweit OK
BC556: E 4,6 V C 1,6 V
wie gesagt bei 140 Ohm, ich muß bis auf 64 Ohm runter um auf 2,2 V an C zu kommen. ja und nun ??
Trainmen

P.S. Sind schon andere soweit ? Messergebnisse ?

RobbyMartin
14.04.2010, 13:58
hey trainmen

wenn ich den trimmer auf 140r einstelle kommen bei mir überall die richtigen werte (ganz kleine abweichungen) doch wie bei dir sind vom BC556 E und C nicht korrekt E:4,73 C:1,651

ich weiß nicht woran es liegt da poti habe ich im ausgebauten zustand gemessen (ohne fremdbeschaltung)

die schaltung habe ich auch mehrmals berprüft keine lötfehler
wäre ja auch ein großer zufall wenn wir beide den gleichen fehler gemacht hätten

lg
martin

TrainMen
14.04.2010, 14:26
@RobbyMartin
Dein Emitter liegt ja noch in Toleranz von +- 0,2 V nur eben C nicht.
Na jedenfalls sind wir auf den richtigen weg, mal sehen was Dirk dazu schreibt. Hast Du den Trimmer mal verändert um auf die 2,3 V zu kommen ?
Trainmen

RobbyMartin
14.04.2010, 14:37
ne den trimmer habe ich erstmal auf 140r gelassen bleiben den die anderen werte bei dir gleich wenn du am trimmer drehst oder ist dann der collector korrekt und der rest nicht??

lg
martin

Martinius11
14.04.2010, 14:43
dirk hattest du irentwelche jumper drauf?

Martinius11
14.04.2010, 15:13
ich habe c vom 556 auch nur 1.7V

TrainMen
14.04.2010, 15:40
@RobbyMartin
wenn ich den Trimmer verstelle, ändern sich auch die anderen Werte ein wenig, bleiben aber in Dirks angegebene Toleranz, wie schon oben erwähnt muß ich bis auf 64R runter um auf 2,2V zu kommen.

@Martinius11
die Jumper haben darauf keinen Einfluss

Trainmen

RobbyMartin
14.04.2010, 19:52
@TrainMen

habe den Trimmer jetzt nachjustiert und jetzt liegen alle Spannungen im Toleranzbereich den Trimmer habe ich jetzt nicht nachgemessen aber er liegt deutlich unter 140R

ich kann mir das zwar nicht erklären warum das so ist weil an Bauteiltoleranzen kann es eigentlich nicht liegen da Metallschichtwiderstände verwendet worden sind und bei drei Leuten das gleiche Problem vorliegt aber Hauptsache alle werte sind Korrekt

lg
martin

Martinius11
15.04.2010, 09:36
vieleicht liegt das problem ja auch bei Dirk

RobbyMartin
15.04.2010, 20:11
hallo im wiki steht ja schon der bestückungsplan für die dritte phase wie siehts damit aus mitten im bild ist ein grauer kasten was soll dieser heißen??

lg
martin

Dirk
15.04.2010, 20:43
@Martinius11:

vieleicht liegt das problem ja auch bei Dirk
Möglich ... :-#
Ich hab noch mal nachgemessen: 1,6 .. 2,3 V sind ok je nach Trimmerstellung.

Gruß Dirk

Thomas$
16.04.2010, 14:43
ich hab mir jetzt auch alle teile da.
werd die woche mal bauen
der kleine lm1881 so teuer ....
bei conrad steht nur solange der vorat reicht. was ist wenn die alle sind gibt es da schon eine idee?

Dirk
16.04.2010, 16:11
@Thomas$:

... bei conrad steht nur solange der vorat reicht. was ist wenn die alle sind gibt es da schon eine idee?
Ja, es gäbe noch den EL4581, der ist pinkompatibel.

Gruß Dirk

Thomas$
16.04.2010, 16:23
der scheint sogar günstiger zu sein

RobbyMartin
18.04.2010, 09:18
mir ist gerade aufgefallen der 75R widerstand ist ja nicht mit einem jumper deaktivierbar deshalb wenn man einen kontrollmonitor anschließt und mit den beiden widerständen das programm schreibt kann es doch zu fehlern kommen , da die beiden widerstände parallelgeschaltet sind.

(75*75)/(75+75)=37,5R

lg
martin

radbruch
18.04.2010, 09:55
Hallo

Ich habe die Schaltung von Dirk nicht überprüft, aber dass der Widerstand schaltbar sein sollte war eigentlich von Anfang an klar:
https://www.roboternetz.de/phpBB2/viewtopic.php?p=493709#493709

Was ich bisher immer noch vermisse sind eure eigenen ersten Anwendungsversuche. Die Hardware aus Phase 1 reicht dazu schon aus. Die weiteren Ausbauphasen bringen nur beim Erfassen der Kameradaten Verbesserungen, auf die Auswertung und Interpertation der Daten haben sie aber keinen positiven Einfluß.

btw: Die einfachere Formel für zwei gleichgroße parallel geschaltete Widerstände lautet:
http://de.wikipedia.org/wiki/Parallelschaltung#Sonderfall_zwei_Widerst.C3.A4nde

Gruß

mic

RobbyMartin
18.04.2010, 10:59
ja das mit dem jumperbaren widerstand habe ich gelesen doch im schaltplan ist er leider nicht so deswegen werde ich es wahrscheinlich so umbauen

lg
martin

Dirk
18.04.2010, 16:02
@RobbyMartin:

ja das mit dem jumperbaren widerstand habe ich gelesen doch im schaltplan ist er leider nicht so deswegen werde ich es wahrscheinlich so umbauen
Das mit dem Jumper für den 75 Ohm-Widerstand habe ich nicht umgesetzt, weil sich in jedem Fall, also ohne und mit 75 Ohm, ohne und mit Monitor und mit den Kombinationen aus den Möglichkeiten eine jeweils andere Video-Spannung einstellt.

Auf einen konstanten Video-Pegel ist man nur dann angewiesen, wenn man die Sync-Signale (wie im Programm von radbruch) direkt aus dem Video-Signal entnehmen muss. Insofern macht es wirklich Sinn, den Jumper für den 75 Ohm-Widerstand einzubauen,- das geht auch gut, wenn man ihn z.B. stehend einsetzt. Ich habe das in die Beschreibung der Phase 2 als Option aufgenommen!
Wirklich sinnvoll ist dieser Jumper aber vor allem für die von euch, die ab der 1. oder 2. Phase nicht mehr weiter mitmachen wollen.

Ziel dieses Projekts ist es ab Phase 3, die Sync-Signale vom Sync-Separator zu beziehen und das Video-Signal (d.h. nur den Zeileninhalt!) selbst vom 2-fach Verstärker mit Klemme zu nehmen. Dann ist der Eingangs-Videopegel egal, weil die Auswertung davon kaum abhängt.

@radbruch:

Die weiteren Ausbauphasen bringen nur beim Erfassen der Kameradaten Verbesserungen, auf die Auswertung und Interpertation der Daten haben sie aber keinen positiven Einfluß.
Beim Erfassen des Video-Signals gibt es sicher Verbesserungen gegenüber dem direkten Anschluß einer Kamera. Die Auswertung dürfte mit den separaten Sync-Signalen anders, d.h. z.B. interruptgesteuert, und zuverlässiger möglich sein. Das würde ich als positiv sehen.
Die Interpretation der Daten, z.B. zur Navigation, ist natürlich nicht von einem Hardware-Aufbau direkt abhängig (allerdings erleichtern zuverlässigere Daten auch die Interpretation ...). Im Wesentlichen geht es mir aber um den Spaß bei der Sache!

Gruß Dirk

RobbyMartin
21.04.2010, 06:56
@ Dirk

du hat im Wiki diese Fragestellung gestellt

"Wie kann ein "Graukeil" auf dem Terminal aussehen? (http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt#Wie_kann_ein_.22Graukeil.22_auf_dem_Termin al_aussehen.3F)"
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? "


was stellst du dir darunter den vor das man im terminal das bild erkennt oder anhand von zahlen die graustufen auslesen kann??

lg
martin

radbruch
21.04.2010, 17:54
Hallo

Zeichen mit unterschiedlicher Helligkeit habe ich schon mal gesucht.
Hier ein Bild mit sechs "Graustufen":

https://www.roboternetz.de/phpBB2/files/screenshot_602.jpg (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=421130#421130)
(Aus https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=421130#421130)

Diese Zeichen hatte ich gewählt:
uint8_t graustufen[6]={32, 184, 216, 120, 165, 35}; // " ·×x¤#"

Gruß

mic

RobbyMartin
21.04.2010, 20:45
dieses bild mit nur 6 graustufen finde ich im terminal schon sehr unüberschauber deswegen wäre meine meinung auf keinefall 16 verschiedene zeichen zu nehmen, da es dann zu unübersichtlich wird

man könnte nur fürs terminal die 16 graustufen in 4 gruppen unterteilen, sodass graustufe 1-4 5-8 9-12 und 13 -16 jeweils ein zeichen sind im program für die auswertung kann man ja mit allen 16 graustufen weiterarbeiten.

lg
martin

Martinius11
21.04.2010, 20:52
Ich habe auch schon an Dirk geschrieben das es sinvoller wäre nur 8 statt 16
Graustuffen zuverwenden, und echt kann mir einer sagen warum 16 graustuffen für den Rp6 notwendig sind? Das wären doch nur mehr programmier aufwand und kostet den RP6 nur Rechenleistung.

PS Dirk das soll kein Angriff auf dich sein

Dirk
21.04.2010, 22:07
@Martinius11:

Ja, 8 Graustufen kann man natürlich auch nehmen. Ist schon deutlich einfacher.

Zum Speichern eines Bildes (wenn man das in 1024 Byte unterbringen will ...) hilft es sehr, von 256 (8 Bit) auf 16 (4 Bit) Farben zu reduzieren, weil dann die doppelte Menge an Bildpunkten gespeichert werden kann.

Reduziert man die 16 auf 8 Farben (3 Bit), dann bringt das ohne viele Klimmzüge keinen Vorteil beim Speichern, weil in ein Byte nicht 3, sondern immer noch 2 Bildpunkte passen (= 6 Bit). 2 Bits bleiben dann pro Byte frei.

@RobbyMartin:
Ja, ich möchte ein Bild auf dem Terminal sehen. Leider gibt es ja die Blockgrafik:
http://de.wikipedia.org/wiki/Blockgrafik nicht mehr, so dass man sich irgendwie helfen muss ... Hast du eine Idee, wie man das machen könnte?

Gruß Dirk

Martinius11
22.04.2010, 17:48
Ich würd gern mal wissen ob man wirklich die Kabel für die Kammera und ADC abschirmen muss Danke

RobbyMartin
22.04.2010, 19:07
@ martinius11

ich habe für meine kamera einfach ein stück flachbandkabel genommen um genau zu sein einfach die ferbindung zwischen der base und dem erweiterungsbord der bus mit y1-y12 oder so und es funktioniert ohne probleme über längere strecken würde ich es wahrscheinlich abschirmen

@dirk

ich bin am überlegen wie es funktionieren kann doch bis jetzt ist mir noch nichts gescheites eingefallen doch ich werde heute abend mal drüber nachdenken

lg
martin

Mc Delta
22.04.2010, 19:08
Hallo,
Bei mir funktioniert das ganze auch gut ohne abschirmung.Ich würd sagen wenn das Kabel nicht länger als 20 cm. ist kann man die Abschirmung auch weglassen.

RobbyMartin
22.04.2010, 20:43
. : o + x O X

diese 8 zeichen kommen mir sinnvol vor wobei das + und das x fast identisch sind

ich würde immer noch dazu tendieren im terminal nur max. 4 verschiedene zeichen zu benutzen da es sonst mit dem ASCII zeichensatz zu unübersichtlich wird.

lasse mich aber gerne umstimmen wenn jemand gute zeichen zeigt die auch klar von der helligkeit unterscheidbar sind sonst sieht das bil eher so aus als wären dort nur sinnlose zeichen im terminal


lg
martin

Dirk
23.04.2010, 21:42
Hallo Leute,

ich habe doch mal 16 Zeichen probiert.

In der 5x7 Punktmatrix ist die Pixelzahl aufsteigend von 0 (Leerzeichen) bis 35 (alles hell).

Wie sieht das aus?

Gruß Dirk

RobbyMartin
23.04.2010, 22:12
so habe den graukeil einfach mal ins terminal eingegeben doch wirklich überzeugen tut es mich nicht 8-[
ich hätte auch gerne die meinung anderer leute gehört die bei dem projekt mitmachen....

lg
martin

Dirk
24.04.2010, 18:50
... wirklich überzeugen tut es mich nicht
Mir geht's auch so ... :-k

Aber wie dann ...?

Gruß Dirk

Martinius11
24.04.2010, 18:57
wenns nach mir geht brauchen wir nur schwarz , weis und grau

RobbyMartin
27.04.2010, 05:55
so habe jetzt den test für die dritte phase gemacht und bei mir kommen ergebnisse die schon mal ganz gut aussehen nur einen abweichung von 0,002 das sollte doch ausreichen oder ??

lg
martin

Dirk
27.04.2010, 19:12
@Martin:

... bei mir kommen ergebnisse die schon mal ganz gut aussehen nur einen abweichung von 0,002 das sollte doch ausreichen oder ??
Das sieht sehr gut aus! Die Zeilenfrequenz beträgt 15625 Hz, d.h. alle 64 µs (Zeilenlänge) kommt ein HSync-Impuls (1 / 0,000064 s = 15625 Hz).

Gruß Dirk

RobbyMartin
27.04.2010, 21:13
habe jetzt mal im wiki die rätsels lösung eingetragen also das man den jumper neun verücken mus um das vsync signal im test messsen zu können

@dirk
ist es okay wenn ich im wiki (rp6 mitmachprojekt (http://www.rn-wissen.de/index.php/RP6_Kamera_-_Mitmach-Projekt)) auch etwas ergänze oder möchtest du das nicht ???

lg
martin

Dirk
28.04.2010, 20:01
@martin:

ist es okay wenn ich im wiki (rp6 mitmachprojekt) auch etwas ergänze
Das ist ok! Sicher gibt es noch an vielen Stellen "Lücken", besonders auch im Software-Teil!

Gruß Dirk

radbruch
04.05.2010, 17:34
Hallo

"Mehr als 16 Werte hintereinander kann der ADC auch bei 4MHZ-Takt nicht digitalisieren"!

Das wußten wir eigentlich schon immer, nur wirklich wahrhaben wollten wir es bisher noch nicht. Nach einem erneuten Anstoß (https://www.roboternetz.de/phpBB2/viewtopic.php?t=54071) habe ich das nun endlich mal aufgegriffen und das Einlesen einer Bildschirmzeile daraufhin "optimiert". Anstelle von "lies Werte so schnell du kannst" verwende ich nun einen regelkonformeren Ansatz:

Der ADC wandelt weiterhin im Dauerlauf, Erkennung von Bildstart und Anfang der gewünschten Zeile funktionieren wie gehabt.

Neu ist nun der Abschnitt nach dem Start der gewünschten Zeile: Bei gefundener Zeile steht nach while(ADC<30) schon der Wert des ersten Zeilenpixel in ADCH. Dieser wird abgespeichert und das ADIF-Flag wird gelöscht. Dann werden die nächsten 15 Werte eingelesen, nachdem der ADC jeweils die Fertigmeldung der Wandlung über ADIF signalisiert hat.

Nach dem Zeilensprung zur nächsten gesuchten Zeile wird das dann bis zum Bildende wiederholt. Ich verwende im Demo unten einen Zeilensprung von 10, das ergibt bei 24 Zeilen und 30 übersprungenen Zeilen eine Bildlänge von 270 Pixel (ungefähr;)

Hier nun ein paar Bilder dazu. Links der Versuchsaufbau (im Bild vom Blitz der Kamera extrem ausgeleuchtet, im Versuch war es deutlich dunkler), das TV-Kontrollbild und schließlich die Terminalausgabe:

http://radbruch.roboterbastler.de/rp6/pics/vt100_24x16_aufbau_klein.jpg (http://radbruch.roboterbastler.de/rp6/pics/vt100_24x16_aufbau.jpg) http://radbruch.roboterbastler.de/rp6/pics/vt100_24x16_tv-kontrollbild_klein.jpg (http://radbruch.roboterbastler.de/rp6/pics/vt100_24x16_tv-kontrollbild.jpg) http://radbruch.roboterbastler.de/rp6/pics/vt100_24x16_klein.jpg (http://radbruch.roboterbastler.de/rp6/pics/vt100_24x16.jpg)

Terminal ist ZOC (https://www.roboternetz.de/phpBB2/viewtopic.php?t=54087) das ich hier (https://www.roboternetz.de/phpBB2/viewtopic.php?t=54087) vorgestellt habe. Der Code unten funktioniert aber mit dem RP6Loader (Infos zur Anpassung im Quelltext):


// Ein 24*16 Ascii-Bild 3.5.10 mic

// Mit neuen Erkenntnissen ein Versuch, diese umzusetzen. Ziel war möglichst
// schnell einen Überblick über den Bildinhalt einzulesen und ohne zu Scrollen
// im Terminal darzustellen. Dazu verwende ich anstelle des Loaders ein anderes
// Terminalprogramm: https://www.roboternetz.de/phpBB2/viewtopic.php?t=54087

// Es funktioniert aber in dieser Version auch mit dem RP6Loader!

// Es werden in einem Halbbild(!) von 24 Linien jeweils die 16 Zeilenwerte am Stück
// eingelesen. Das ergibt zwar ein extrem verzerrtes Bild, aber mit 90°-Drehung
// und mit Ausgabe der Werte im Hexformat hat man so durchaus ein Bildgefühl ;)

#include "RP6RobotBaseLib.h"

#define vt100_Black 0 // VT100 Farbdefinitionen
#define vt100_Red 1
#define vt100_Green 2
#define vt100_Yellow 3
#define vt100_Blue 4
#define vt100_Magenta 5
#define vt100_Cyan 6
#define vt100_White 7

#define vt100_Reset 0
#define vt100_Bright 1
#define vt100_Dim 2
#define vt100_Underscore 4
#define vt100_Blink 5
#define vt100_Reverse 7
#define vt100_Hidden 8

uint8_t c; // freies Char
uint16_t x, y;
uint8_t std, min, sec;

void init(void);
void setMotorPWM(uint8_t power_links, uint8_t power_rechts);
void vt100_cls(void);
void vt100_set_cursor(uint8_t line, uint8_t column);
void vt100_set_color(uint8_t foreground, uint8_t background);
void vt100_set_attrib(uint8_t attrib);
void vt100_writeGrafic(uint8_t *string);
void vt100_writeGraficAt(uint8_t line, uint8_t column, uint8_t *string);

void Bild_aufnehmen(void)
{
// Variablen dürfen NICHT global sein!
uint8_t bildspeicher[24][16], *bildzeiger;
uint8_t zeile, sync, c;

zeile=30; // 30 Zeilen am Bildanfang überlesen
// Warten auf langen Syncbereich = Bildstart
cli();
do{sync=0;while (ADCH > 20);while (ADCH < 30) sync++;}while (sync < 40);
for(c=0; c<24; c++) // 24 Zeilen einlesen
{
bildzeiger=&bildspeicher[c][0];
sync=15; // 15 Werte sollen am Stück gelesen werden
while(zeile--){while (ADCH > 20);while (ADCH < 30);} // auf Zeile warten
*bildzeiger++=ADCH; // erster Wert!
ADCSRA |= (1<<ADIF);
while(sync--) // Werte 2-16 einlesen
{
while(!(ADCSRA & (1<<ADIF)));
*bildzeiger++=ADCH;
ADCSRA |= (1<<ADIF);
}
zeile=10; // 10 Zeilen überlesen (30+ 24*10 = 270 Zeilen) Sind auch 11 möglich?
}
sei();

// Hier kann man die Darstellung mit dem VT100-Terminal verbessern
writeChar('\n'); // extra Vorschub für RP6Loader
writeChar('\n');
// vt100_set_cursor(3,1); // Bildstart bei VT100-Terminal, beim RP6Loader störend

for(c=0; c<16; c++)
{
for(zeile=0; zeile<24; zeile++)
{
writeChar(' ');
//writeIntegerLength(bildspeicher[23-zeile][c], HEX, 2); // Hexwerte
writeChar((bildspeicher[zeile][c]-30)/10+'0');
}
writeChar('\n');
}
}

int main(void)
{
init();
vt100_cls();
writeString_P(" Ein 24*16 Ascii-Bild per VT100 3.5.10 mic");

setStopwatch1(0);
startStopwatch1();
while(1)
{
if(getStopwatch1() >999) // Uhr
{
setStopwatch1(0);
sec++;
if(sec>59) {sec=0; min++;}
if(min>59) {min=0; std++;}
if(std>23) std=0;
vt100_set_cursor(26,72);
writeIntegerLength(std,10,2);
writeChar(':');
writeIntegerLength(min,10,2);
writeChar(':');
writeIntegerLength(sec,10,2);

Bild_aufnehmen(); // Bildrefresh nach einer Sekunde
}
}
return(0);
}
void init(void)
{
initRobotBase();
//DDRC |= (SCL | SDA); // Servopins auf Ausgang setzen
//TIMSK |= (1 << TOIE1); // Die Timer1 Overflow-ISR zur Servoansteuerung

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;
// setzte free running triggern
SFIOR = (0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
// kein interupt, Wandler einschalten, prescaller /2
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 wohl eher unnötige Initiallesung
while (!(ADCSRA & (1<<ADIF)));
ADCSRA |= (1<<ADIF);
//powerON();
}
// Achtung! Die PWM-Werte werden hier OHNE Rampe verändert!
void setMotorPWM(uint8_t power_links, uint8_t power_rechts)
{
extern uint8_t mleft_ptmp, mright_ptmp;

if(power_links > 210) power_links = 210;
if(power_rechts > 210) power_rechts = 210;
mleft_power=mleft_ptmp=power_links;
mright_power=mright_ptmp=power_rechts;

OCR1BL = power_links;
OCR1AL = power_rechts;

if(power_links || power_rechts)
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
else
TCCR1A = 0;
}
void vt100_cls(void)
{
writeString_P("\x1B[2J"); // clear screen ESC [ 2 J
writeString_P("\x1B[H"); // cursor home ESC [ H
}
void vt100_set_cursor(uint8_t line, uint8_t column)
{
writeString_P("\x1B["); // set cursor position ESC [ Pl ; Pc H
writeInteger(line, 10);
writeString_P(";");
writeInteger(column, 10);
writeString_P("H");
}
void vt100_set_color(uint8_t foreground, uint8_t background)
{
writeString_P("\x1b[");
writeInteger(30+foreground, 10);
writeString_P(";");
writeInteger(40+background, 10);
writeString_P("m");
}
void vt100_set_attrib(uint8_t attrib)
{
writeString_P("\x1b[");
writeInteger(0, 10);
writeString_P(";");
writeInteger(attrib, 10);
writeString_P("m");
}
void vt100_writeGrafic(uint8_t *string)
{
while(*string)
writeChar(128|*string++); // Grafikzeichen mit gesetztem Bit7 senden
}
void vt100_writeGraficAt(uint8_t line, uint8_t column, uint8_t *string)
{
vt100_set_cursor(line, column); // Cursor postionieren
while(*string)
writeChar(128|*string++); // Grafikzeichen mit gesetztem Bit7 senden
}

Das Bild wird einmal in der Sekunde neu dargestellt, mit ZOC steht dabei das Bild still und wird nicht hochgescrollt.

Gruß

mic

PS:
Bei der Ausgabe der Werte dreht sich alles um diese Zeile:
writeChar((bildspeicher[zeile][c]-30)/10+'0');

Vom Helligkeitswert von Bildpunkt x, y wird der Grundwert 30 abgezogen, der Rest durch 10 geteilt. Das ergab bei meinem Demo Werte bis 4. Um die Ausgabe z.B. auf einstellige Werte oder begrenzte Graustufen zu optimieren müßte man an dieser Formel schrauben. Die '0' sollte wohl klar sein ;)

Auf diese Bildbasis könnte man schon einfache Bildanalysen wie hellster/dunkelster Punkt/Zeile/Spalte aufsetzen oder Faltungen anwenden um Kanten zu finden ;)

Martinius11
04.05.2010, 22:02
Erst klassig werd ich bald mal ausprobieren

Dirk
05.05.2010, 21:53
@mic:
Wieder mal ein tolles Stück! Muss ich gleich probieren!

(30+ 24*10 = 270 Zeilen) Sind auch 11 möglich?
Ich denke: Nein.

Mein erstes "Zählprogramm", das die wirklich vorhandenen TV Zeilen der CMOS Kamera ermittelt, gibt aus: 288.
Das hat mich auch gewundert, ich war nach Datenblatt von 260 TV Zeilen ausgegangen, obwohl das Bildelement mit 288 angegeben wird.

Gruß Dirk

Martinius11
07.05.2010, 23:30
hi Leute,

ich hätte da ein kleines Problem ich habe nämlich heute mdie kamera platine fertig nun ist die kammera ja festgelötet und ich weiß nicht mehr welcher Pin was ist könnte jemand ein bild von der rückseite seiner Kammera machen

Danke

radbruch
08.05.2010, 00:12
Leider etwas unscharf:

http://radbruch.roboterbastler.de/pics/pinout-cam.jpg

Von oben links nach unten:

Video out
GND
Vcc
Gamma
Gain

Die Kamera sollte man steckbar einbauen ;)

Gruß

mic

Martinius11
08.05.2010, 21:34
vielen dank radbruch

RobbyMartin
21.07.2010, 21:34
so lange wurde zu diesem projekt nichts mehr geschrieben lebt das projekt noch da ich es sehr interessant fand???

lg
martin

Dirk
23.07.2010, 02:53
lebt das projekt noch
... würde mich auch interessieren.

Wer hat das eigentlich nachgebaut?
Hat jemand ein gutes Programm dafür geschrieben?

Gruß Dirk

RobbyMartin
23.07.2010, 07:39
also ich habe es in allen Stufen nachgebaut ausser die letzte mit dem infrarot dies ist aber nicht so wichtig

TrainMen
23.07.2010, 15:36
Also nachgebaut habe ich das Projekt auch bis zur Infrarotstufe, aber um eigene Programme zu entwickeln zu können fehlen mir noch ein paar Jahre. Ich dachte auch das hier das Projekt richtig abgeht, und ich hier das eine oder andere mitnehmen kann, aber daraus wurde nichts. Jetzt liegt die Platine in der Schrottkiste und die CAM wird als Türspion benutzt.
Trainmen

Thomas$
23.07.2010, 15:41
ein bascom programm existiert noch nicht oder?
adc im freerun
timer (oder vlt ohne doch besser?)
und ausgabe über rs232 oder 8 leds für linien erkennung das man was sieht

radbruch
23.07.2010, 16:44
Hallo

Die Umsetzung von C nach Bascom für Stufe 1 (nur Kamera und AVR) gibt's hier:

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=434274#434274

Wesentlich ist die Einstellung des ADC auf gewünschte Funktion: Freeruning mit Prescaler /2 und linksbündiges Ergebniss. Das ist allerdings schon etwas älter. Die neusten Erkenntnisse, die wir erst nach dem Start des Mitmachprojekts gewonnen haben, sind in dieser Umsetzung noch nicht berücksichtigt.

Ich habe bisher "nur" Stufe 1 nachgebaut. Das hatte ich zwar im Prinzip schon immer, neu ist jedoch der Aufbau auf der Experimentierplatine und der jumperbare Widerstand parallel zum Signal.

Gruß

mic

[Edit]
Nebenbei mal bemerkt: Die Hauptschleife der Liniensuche in der Bascom-Umsetzung ist ja echt knuffig:

Do
' keine Störung erlauben
Disable Interrupts

' Warten auf Bildstart
Do
X = 0
While Adch > 30 ' sichtbare Zeile
Wend
While Adch < 50 ' Strahlrücklauf
Incr X
Wend
Loop Until X > 40 ' sync länger als 40


'warten auf 50ste Zeile
X = 50
While X > 0
While Adch > 30 ' sichtbare Zeile
Wend
While Adch < 50 ' Strahlrücklauf
Wend
Decr X
Wend

' Der Strich ist dunkler als 65. Wir zählen von links die Anzahl der
' Lesungen bis der Strich erkannt wird
X = 0
While Adch > 65
Incr X
Wend

' Linie gefunden
Enable Interrupts

' ermittelten Wert in Leerzeichen umrechnen und beides zum Terminal senden
Print X ;
S = Space(x)
Print S;

Print "***"
Waitms 200
LoopHier sieht mal wieder, wie einfach man auch mit Bascom sehr flotte Anwendungen ohne Assembler programmieren kann ;)

[NocheinEdit]
Jetzt wäre eine Erweiterung auf eine Linienverfolgung nicht schwer, wenn man die Antriebe mit Bascom ansteuern kann. Da ich nicht weiß, ob es schon Bascom-Funktionen für den RP6 gibt, habe ich mal auf meiner Festplatte gesucht und ein undokumentiertes RP6-Programm (vom 21.8.08?) mit Motoransteuerung gefunden:

$regfile = "M32def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 64
$baud = 38400

Declare Sub Rp6_vorwaerts()
Declare Sub Rp6_rueckwaerts()
Declare Sub Rp6_stop()
Declare Sub Rp6_links()
Declare Sub Rp6_rechts()

Dim Tccr1a_set As Byte
Dim Tccr1b_set As Byte
Dim Wert As Byte
Dim Zaehler As Word
Dim Zaehler1 As Word
Dim Test As Byte

Dim Address As Byte , Command As Byte

Config Rc5 = Pinb.2

Config Pinc.2 = Output
Config Pinc.3 = Output
Config Pinb.4 = Output

On Int0 Int0_int
On Int1 Int1_int
On Int2 Int2_int

Enable Interrupts

Config Int0 = Falling
Config Int1 = Falling

Enable Int0
Enable Int1
Enable Int2

Tccr1a_set = 0
Tccr1b_set = 0

Reset Tccr1a_set .wgm10
Set Tccr1a_set .wgm11
Set Tccr1a_set .com1a1
Set Tccr1a_set .com1b1
Tccr1a = Tccr1a Or Tccr1a_set

Reset Tccr1b_set .wgm12
Set Tccr1b_set .wgm13
Set Tccr1b_set .cs10
Tccr1b = Tccr1b Or Tccr1b_set

Icr1h = 0
Icr1l = 210

Set Portb.4

Wert = 0

Wait 1

Do

Waitms 500


Loop

Reset Portb.4

End

Int0_int:
Disable Int0
Enable Interrupts
Zaehler = Zaehler + 1
Enable Int0
Return

Int1_int:
Disable Int1
Enable Interrupts
Zaehler1 = Zaehler1 + 1
Enable Int1
Return

Int2_int:
Disable Int2
Enable Interrupts
Getrc5(address , Command)
If Command = 1 Then
Call Rp6_vorwaerts()
End If
If Command = 2 Then
Call Rp6_rueckwaerts()
End If
If Command = 3 Then
Call Rp6_links()
End If
If Command = 4 Then
Call Rp6_rechts()
End If
If Command = 0 Then
Call Rp6_stop()
End If
Enable Int2
Return

Sub Rp6_vorwaerts()
Call Rp6_stop()

Reset Portc.2
Reset Portc.3

For Wert = 0 To 100
Waitms 20
Pwm1a = Wert - 3
Pwm1b = Wert
Next
End Sub

Sub Rp6_rueckwaerts()
Call Rp6_stop()

Set Portc.2
Set Portc.3

For Wert = 0 To 100
Waitms 20
Pwm1a = Wert - 3
Pwm1b = Wert
Next
End Sub

Sub Rp6_links()
Call Rp6_stop()

Set Portc.2
Reset Portc.3

For Wert = 0 To 60
Waitms 20
Pwm1a = Wert
Pwm1b = Wert
Next
End Sub

Sub Rp6_rechts()
Call Rp6_stop()

Reset Portc.2
Set Portc.3

For Wert = 0 To 60
Waitms 20
Pwm1a = Wert
Pwm1b = Wert
Next
End Sub

Sub Rp6_stop()

For Test = Wert To 0 Step -1
Pwm1b = Test
Pwm1a = Test
Waitms 10
Next

Wert = 0

End Sub

Das Programm kennt folgende Motorfunktionen:

Declare Sub Rp6_vorwaerts()
Declare Sub Rp6_rueckwaerts()
Declare Sub Rp6_stop()
Declare Sub Rp6_links()
Declare Sub Rp6_rechts()

Diese Funktionen kann man mit einer RC5-Fernbedienung auswählen. Woher das Programm stammt und ob es funktioniert kann ich leider nicht sagen.

radbruch
28.08.2010, 18:33
Hallo

Die Umsetzung mit einem Pic im elektor-Septemberheft:
http://www.elektor.de/jahrgang/2010/september/bildverarbeitung-mit-kleinem-controller.1468122.lynkx

http://www.elektor.de/Uploads/2010/8/vision-system.jpg (http://www.elektor.de/jahrgang/2010/september/bildverarbeitung-mit-kleinem-controller.1468122.lynkx)
(Bild von Elektor (http://www.elektor.de/jahrgang/2010/september/bildverarbeitung-mit-kleinem-controller.1468122.lynkx))

Das ist übrigens unsere 15€-SW-Kamera;)

Gruß

mic

Thomas$
28.08.2010, 19:46
mal ein anderer gedanken gang
es müsste doch auch möglich sein den hellsten punkt "rein" elektrisch zusuchen

immer den höchsten spannungswert speichern

videosignal( ohne sync signale) ---diode---kondensator---gnd


und dann die spannung vor und nach der diode mit einem komperator(meisten avrs haben ja ein comperator) vergleichen, wenn die spannung vor der diode größer ist soll ein interrupt ausgelöst werden.
die sache hat nur ein paar haken

die 0,7V flusspannung der diode also ist die spannung vor der diode fast immer größer

das eingangssignal muss relativ groß sein um den kondensator schnell genug laden zukönnen bei helligkeitsspitzen.

wie resetet man am einfachsten hinterher den speicher /kondensator
ich hoffe man kann verstehen was ich meine

RobbyMartin
12.09.2010, 11:29
@ Thomas$

so wie du das beschrieben hast. Suchst du nur mit der Kamera einen hellen Punkt kannst aber nicht bestimmen wo genau er sich befindet.

Wie beim Video Grabber müsste man in dem Koordinatensystem von 32x32 Bildpunkten die hellsten stellen suchen und somit zB. eine Led oder auch eine Kerze finden.

So kann man zB. heraus finden an der Stelle (10|13) ist ein heller Punkt und darauf entsprechend reagieren.

Was ich noch sehr interessant fände wäre am Display der M32 2 Spalten der Kamera anzuzeigen und auch nur 2 Farben also Weiß " " und Schwarz "#" und somit zum experimentieren die Situation vor der Kamera Live zu übertragen.

Leider kann ich es noch nicht selbst ausprobieren, da ich programmiertechnisch nicht der beste bin. Meine stärken liegen in der Elektronik.
Wenn jemand interesse daran hat würde ich gerne um Unterstützung bitten, was noch ganz lieb wäre wenn ihr den Programmtext gut kommentiert damit ich dort auch gut durchblicke ;)

Sonst: Ich habe jetzt neue Servos bestellt sodass ich jetzt auch eine Schwenkvorrichtung bauen kann.

@ radbruch

Habe nun auch die neue Eletor und werde mich mal ein wenig einlesen wie es dort vonsatten geht zwar ist esein PIC aber man kann bestimmt einige interessante Details finden.

Ich hoffe das dieses Projekt nicht untergeht, da ich es sehr interssant finde.

Einen schönen Sonntag noch
Martin

Thomas$
12.09.2010, 12:45
aber die schaltung könnte funktionieren oder wie gänge sie besser?

der witz an der sache ist immer wenn die spannung höher ist als im kondensator soll über den compare aeingang ein interrupt ausgelöst werden
und auf dem µC läuft ein timer
jedes mal wenn ein interupt ausgelöst wird
wird der aktuelle zeitpunkt gespeichert am ende einer zeile wird der kondensator entladen
und der letzte interrupt war der hellste punkt und über die zeit die durch den timer bestimmt wurde habe ich die exakte position und da habe ich teoretisch eine höhere auflösung weil ich weniger adc abfragen brauche

mir machen bloß die 0,7 flussspannung zuschaffen
wegen des vergleichs der beiden spannungn
wie groß sollte der kondensator sein
wie entrlade ich den kondensator

RobbyMartin
12.09.2010, 13:41
Das Video Siganl hat ja einen Spannungsbereich von 1V.
0V-0.3V für die Sync Signale und
0.3V-1V für das Video Signal.

Also kann man schon mit deiner Methode den hellsten Punkt bestimmen, aber nicht die genaue Position da du die Syncsignale weglässt somit kann man auch mit Timer die Position nicht bestimmen.

LG
Martin

Thomas$
12.09.2010, 13:46
ok iuch habe zuviel weggekürtzt sry
ich beziehe mich auf die schaltung des projektes mit demschaltkreis der mir schon die sync signal verrät
jetzt kommte der µC ins spiel der timer startet mit em sync der zeilen anfangs
transistor wird von µC geschalten
so das an der diode das videosignal ankommt
so wird fleisig immer wieder nder neue rekordwert bestimmt
und am ende wenn das zeile ende ereicht wird soll der kondensator kurzgeschlussenn werden über ein transtor wieder com µC aus gesteuert
ich hoffe man kan es verstehen was ich meine ansonsten muss ich mich wirklich probiern einen schaltplan zu erstellen der dann noch verbessert werden muss

RobbyMartin
12.09.2010, 13:57
Jetzt verstehe ich es langsam ;)

Ich habe vorher gedacht du willst das reine Videosignal abgreifen und nur die Spannungen auswerten.

So könnte es funktionieren und es wäre auch einen Versuch wert.

Thomas$
12.09.2010, 14:13
ok
nur mangelt es bei mir an der elektornik kenntnis
- als erstes ich brauch viel mehr signal pegel
-die 0,7V stören mich beim compare 2. diode verwenden das dort auch die 0,7V fehlen? sonst ist die spannung vor der diode ja fast immer höher als die am kondensator und ich habe dauerhaft interupts
-der kondensator muss teoritisch mit einem pixel vollaufladbar sein (reliv hohe ström)
-der kondansator muss die ladung bis zum zeilenende behalten können

RobbyMartin
12.09.2010, 14:22
man könnte das Signal mit einem Transistor auf bis zu 5 Volt verstärken. Ein BC547 schaltet ab 0.6-0.7V voll durch also würde die Spannung vollkommend ausreichen. Es fehlt dann nur noch ein Vorwiderstand.

R= (1V-0.7V)/0.002A
R= 150Ohm

Damit könnte hat man dann eine Ausgangspegel bis zu ca. 5 Volt

Ich hoffe ich habe es nicht wieder falsch verstanden. Falls doch wäre es nett wenn du eienn Schaltplan posten könntest.

LG
Martin

Thomas$
12.09.2010, 14:54
ich bin nicht gleich mit eagel klargekommen werde erstmal damit üben müssen

openoffice hat erstmal dafür hergehalten