Archiv verlassen und diese Seite im Standarddesign anzeigen : Hardware Mitmach-Projekt: Kamera für den RP6
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
Hallo
Ne gute Idee.
Ich wär soweit dabei! Müsste mich aber ersmal ins Thema einarbeitn und das notwenidge Zeugs besorgn.
Gruß Thund3r
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
@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, 11: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
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
@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, 19: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, 20: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, 21: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
@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, 22: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.
Hallo
Ich bin mal auf deine Teelicht-Lösung gespannt radbruch. :D
Gruß Thund3r
Martinius11
29.03.2010, 21: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, 22: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, 23: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, 15:21
ich werd mir mal den Notwendigen kramm besorgen.
Hallo
Auf nach Conrad :D
Gruß Thund3r
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, 18: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, 18: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, 18:45
alle werden Sterben globales stiftleisten ende :lol:
@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
Hallo
Wie kann ich denn das Video-Signal (1V p-p) auskoppeln?
Gruß Thund3r
asurofreak.
30.03.2010, 20: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, 21: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, 11: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, 13: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
ob der c code auch auf einem atmega328 (arduino) geht?
radbruch
31.03.2010, 16: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
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, 17:28
Soweit ich weiß ist das kein Problem für M32 und wurde am Anfang schon erwähnt
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, 18: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
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, 20: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, 20:46
du könntst uns allen welche abgeben, inder weltweiten stiftkrise solten alle einander helfen [-o< [-o<
_|Alex|_
31.03.2010, 20:50
und wer bezahlt den ganzen Versand?
ich werde mal welche in die Wanderkiste legen :D
robokiller
01.04.2010, 10: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, 11: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, 19: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, 23:44
Vielen Dank für deine Bemühungen Radbruch =D> =D>
wie kommt man an die RP6RobotBaseLib.h?
Martinius11
02.04.2010, 12: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, 13: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, 13: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
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, 14: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, 14: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, 18: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
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, 20:20
Also ich hab eigentlich alles kontrolliert und müsste da nicht die sicherung
rausspringen?
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, 20:53
der keramik kondensator ist ja ungepolt und beim elek. konden. müssen
die striche zur negativen bahn zeigen ,oder?
Martinius11
03.04.2010, 22:12
ok hab das problemm gelöst \:D/ \:D/ \:D/ \:D/ \:D/ \:D/
radbruch
04.04.2010, 00: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, 12: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, 13:31
bei mir dasselbe keine auswertung über die serille schnittstelle
radbruch
04.04.2010, 13: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, 14: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, 14: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, 14: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, 14: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 :)
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, 15: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, 15: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, 19: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, 19: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
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, 19:46
heißt das ich muss noch einen 75 ohm wiederstand einbauen das es funktioniert?
TrainMen
04.04.2010, 20:04
also ich habe zwar noch nicht angefangen aber soweit wie ich verstanden habe entweder Monitor oder 75Ohm an die Chinchbuchse.
Trainmen
@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, 21: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, 21: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, 17:06
so alle teile sind bestellt ich hoffe das ih noch diese woche starten kann
lg
martin
Martinius11
05.04.2010, 20:37
kann mir einer kurz sagen wie rum ich die Transystoren anschließen muss
Danke
radbruch
05.04.2010, 22: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, 22: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, 09: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, 18: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, 19: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, 19:31
hast du auch ein geschirmtes kabel benutzt , da es leicht zu störungen kommen kann
lg
martin
robokiller
07.04.2010, 19: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, 19:40
Lad doch mal nie akkus bei radbruch funktionierts nicht wenn zu wenig strom da ist
robokiller
07.04.2010, 19:45
ohne wiederstand überträgt es die ganze datei alerdings lässt sich diese auch nicht öffnen
Mc Delta
07.04.2010, 19: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.
@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, 21:17
ein ganz normaler fernseher
robokiller
07.04.2010, 21:19
ich habs mal mit nem flachbildschirm und mal mit nem alten rörenbildschirm probiert war überall das sellbe
robokiller
07.04.2010, 21: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
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, 21: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, 08:43
ja aber in den Gelben :mrgreen:
Alex
robokiller
08.04.2010, 09: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, 10: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, 10: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, 11: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, 16: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, 18:17
vieleicht musst du scharf stellen
robokiller
08.04.2010, 20: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, 20: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, 21: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, 21: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, 21:54
Ich hab bei baudrate einfach drin stehen gelassen was scho drin war 19200.
________________-
Mfg roboKiller
radbruch
08.04.2010, 22: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, 23: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, 07: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, 09: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, 09:26
das sist aber andersherum gnd ist aussen und das nf signal ist innen
lg
martin
robokiller
09.04.2010, 09: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, 10: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, 11: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, 11: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, 11: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, 16:15
Hallo und danke an alle,
meine kamera futioniert jetzt alerdings funktioiert das programm für bmp.
dateien nicht
radbruch
09.04.2010, 16:34
Ich hab bei baudrate einfach drin stehen gelassen was scho drin war 19200.Baudrate ist 38400!
RobbyMartin
10.04.2010, 12: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, 12: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, 13: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, 13:12
Wie wärs mit ein Programm beidem der roboter eine Seule erkenen soll
Mc Delta
10.04.2010, 18: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, 19:36
nein er soll nur ein bestimmtes objekt erkennen und mit leds anzeigen
TrainMen
11.04.2010, 00: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
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
@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, 21: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, 14: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, 18: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, 19: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, 19: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
@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, 08: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, 13: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, 14: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, 17: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, 17: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
@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, 20: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
@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:)
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, 13: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, 14: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, 15: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, 15: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, 15:43
dirk hattest du irentwelche jumper drauf?
Martinius11
14.04.2010, 16:13
ich habe c vom 556 auch nur 1.7V
TrainMen
14.04.2010, 16: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, 20: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, 10:36
vieleicht liegt das problem ja auch bei Dirk
RobbyMartin
15.04.2010, 21: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
@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
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?
@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
der scheint sogar günstiger zu sein
RobbyMartin
18.04.2010, 10: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, 10: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, 11: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
@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, 07: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, 18: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, 21: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, 21: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
@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, 18: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, 20: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, 20: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, 21: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
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, 23: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
... wirklich überzeugen tut es mich nicht
Mir geht's auch so ... :-k
Aber wie dann ...?
Gruß Dirk
Martinius11
24.04.2010, 19:57
wenns nach mir geht brauchen wir nur schwarz , weis und grau
RobbyMartin
27.04.2010, 06: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
@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, 22: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
@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, 18: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, 23:02
Erst klassig werd ich bald mal ausprobieren
@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
08.05.2010, 00: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, 01: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, 22:34
vielen dank radbruch
RobbyMartin
21.07.2010, 22:34
so lange wurde zu diesem projekt nichts mehr geschrieben lebt das projekt noch da ich es sehr interessant fand???
lg
martin
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, 08: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, 16: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
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, 17: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, 19: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
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, 12: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
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, 14: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
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, 14: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.
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, 15: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
ich bin nicht gleich mit eagel klargekommen werde erstmal damit üben müssen
openoffice hat erstmal dafür hergehalten
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.