Hallo, ich wollte eine Art Lcihtschranke zur Geschwindigkeitsmessung von ferngesteuerten Autos bauen, und zwar circa so: LASER---------------------------------------\ Spiegel 1 | - | |10 | |cm | - FOTODIODE-----------------------------------/ Spiegel 2 Jetzt hatte ich mir gedacht, dass ein bewegtes beide Lichtsträhle nacheinander durchbricht und mir jenes C-Programm ausgedacht while PORTB =0{} //Warten bis die erste Lichtschranke durchbrochen wurde While PORTB = 0{ //Bis die zweite Lichschranke durchbrochen wurde, tue... delay_ms(1); // Warte 1 ms inc Counter;} // Erhöhe den Zähler Counter = Counter * 360; //Umrechnen in km/h Und ich frage mich, ist das Progrmam eigentlich in C schnell genug, um eine genauigkeit von 0,5km/h zu ermöglichen? und: Kann ich nicht das delay_ms weglassen? Ein Befehl in C braucht doch sowiso schon länger. Sollte ich das ganze vielleicht besser in Assembler machen? Aber wie? Ich glaube, in Assembler gibt es kein delay_ms und auch kein Counter = Counter *360;) Nitnelav
> inc Counter;} // Erhöhe den Zähler > Counter = Counter * 360; //Umrechnen in km/h Du solltest dir vorher mal die grundlegenden Zusammenhänge zwischen Zeit und Geschwindigkeit erarbeiten: wenn das Auto langsamer fährt, dann läuft der Zähler länger. Und damit wäre deine errechnete Geschwindigkeit größer. Willst du das? > Kann ich nicht das delay_ms weglassen? Ein Befehl in C braucht doch > sowiso schon länger. Welcher Befehl? Wie lange sollte der denn deiner Meinung nach brauchen? Zeiten werden auf uC mit Timern gemessen. Also: wenn die Lichtschranke angefahren wird --> Timer auf 0. Wenn die Lichtschranke verlassen wird --> Timer auslesen und anschliessend (richtig) umrechnen.
Valentin Buck schrieb: > Jetzt hatte ich mir gedacht, dass ein bewegtes beide Lichtsträhle > nacheinander durchbricht das ist aber trotzdem nur 1 Lichtstrahl. Nur dann wenn die Spiegel weit genug auseinanderstehen ist die Reihenfolge der Ereignisse so * Schnauze des Autos durchbricht Strahl -> Empfänger dunkel * Heck des Autos gibt Strahl wieder frei -> Empfänger wieder hell * Schnauze durchbricht den Strahl wieder -> Empfänger wieder dunkel * Heck gibt den Strahl wieder frei -> Empfänger wieder hell > > while PORTB =0{} //Warten bis die erste Lichtschranke durchbrochen wurde zu diesem Zeitpunkt ist also die Lichtschranke dunkel geworden > While PORTB = 0{ //Bis die zweite Lichschranke durchbrochen wurde, No. Die Lichtschranke ist vom ersten "Durchbruch immer noch dunkel. So schnell kann dein Auto gar nicht fahren. Du musst nach dem ersten Durchbruch darauf warten, bis die Lichtschranke wieder hell wird und erst dann gilt die nächste Dunkelphase als Beginn des zweiten Durchbruchs. Die Zeit wird gemessen vom Beginn der ersten Dunkelphase bis zum Beginn der zweiten Dunkelphase. > tue... > delay_ms(1); // Warte 1 ms > inc Counter;} // Erhöhe den Zähler > Counter = Counter * 360; //Umrechnen in km/h Alles in allem ist das ein bischen zu naiv gedacht. > Und ich frage mich, > ist das Progrmam eigentlich in C schnell genug, um eine genauigkeit von > 0,5km/h zu ermöglichen? Ach, dein C-Programm ist schnell genug um damit km/Minute auflösen zu können, wenn es sein muss. > Kann ich nicht das delay_ms weglassen? Ein Befehl in C braucht doch > sowiso schon länger. Das Problem ist: Sowas macht man nicht mit _delay_ms. Sowas macht man mit einem Timer. > Sollte ich das ganze vielleicht besser in Assembler machen? Nein. Aber du solltest mit etwas einfacherem anfangen. Lass erst mal eine LED blinken. Lerne mit Timer umzugehen. Dann findet sich auch der Rest.
Mir sind noch ein paar Sachen aufgefallen: In der while-Schleife brauchst du == statt = (merke: bei Abfragen immer "=="; "=" ist eine Zuweisung) delay_ms(1) sollte 1ms dauern. Wenn deine µC 1MHz Takt hat, dauert ein Befehl in der Theorie 1ns. So langsam ist der µC dann doch nicht... Ich glaube nicht, dass du mit ASM bei dem Code viel optimieren könntest. So eine while-Schleife ist ja nichts komplexes.
> Wenn deine µC 1MHz Takt hat, dauert ein > Befehl in der Theorie 1ns. So langsam ist der µC dann doch nicht... Da hats dich aber gleich um 3 Zehnerpotenzen verhagelt: 1 us wäre richtig(er) :-o
t0mmy schrieb: > Ich glaube nicht, dass du mit ASM bei dem Code viel optimieren könntest. > So eine while-Schleife ist ja nichts komplexes. Um Optimierung gehts noch laaaaaange nicht. Erst mal muss er was Funktionierendes auf die Beine bringen. Nur eine Idee zu haben, reicht nicht.
Gut,gut in der Formel stecken noch ein paar Fehler (okay, es ist totaler Schwachsinn, ich weiß selber nicht mehr wie ich darauf gekommen bin) Aber mit Timern zu arbeiten ist eine gute Idee. Werde ich so machen. Und für die Länge habe ich auch schon eine Lösung. Sonst, wäre es besser zu messen, wie schnell beide Lichtschranken dunkel werden? Nitnelav
Valentin Buck schrieb: > LASER---------------------------------------\ Spiegel 1 > | - > | |10 > | |cm > | - > FOTODIODE-----------------------------------/ Spiegel 2 > > Jetzt hatte ich mir gedacht, dass ein bewegtes beide Lichtsträhle > nacheinander durchbricht und mir jenes C-Programm ausgedacht Hallo, entweder fehlt es am grundsätzlichen logischen Denken, noch lange vor der Elektronik, oder dein Auto muss so schnell sein, dass es durch die relativistische Längenkontraktion kürzer wird als 10 cm. Also alles zurück auf Anfang, auf den Rest lohnt es sich nicht einzugehen. Gruss Reinhard
@kbuchegg >* Schnauze des Autos durchbricht Strahl -> Empfänger dunkel >* Heck des Autos gibt Strahl wieder frei -> Empfänger wieder hell >* Schnauze durchbricht den Strahl wieder -> Empfänger wieder dunkel >* Heck gibt den Strahl wieder frei -> Empfänger wieder hell Genau... und wenn das Auto länger ist als der Abstand der Lichtstrahlen, dann muß man die Autolänge dazurechnen!
Naja, wenn Du die genaue Länge Deines Autos kennst, kannst Du die Unterbrechungszeit eines Lichtstrahl verwenden. Autolänge = 33cm; Unterbrechung 10ms => 10ms für 0,33m => 330m/s
Route_66 schrieb: > @kbuchegg > >>* Schnauze des Autos durchbricht Strahl -> Empfänger dunkel >>* Heck des Autos gibt Strahl wieder frei -> Empfänger wieder hell >>* Schnauze durchbricht den Strahl wieder -> Empfänger wieder dunkel >>* Heck gibt den Strahl wieder frei -> Empfänger wieder hell > > Genau... und wenn das Auto länger ist als der Abstand der Lichtstrahlen, > dann muß man die Autolänge dazurechnen! Wenn das Auto länger ist als der Abstand der Lichtstrahlen, dann funktioniert das überhaupt nicht. Ich würde da überhaupt nicht so kompliziert mit 2 Umlenkspiegeln machen. Alleine das Einrichten ist doch schon eine Tortur. 2 Laserpointer auf jeweils eine Photodiode, fertig sind 2 voneinander unabhängige Lichtschranken.
Auto länge == 33cm daraus folgt Problem. Wenn dein Auto in die Lichtschranke rein fährt also Spiegel 1 Passiert, geht das Licht aus, du detektierst also 0 Licht. das Licht geht erst wieder an wenn dein aute dran vorbei ist. Du kannst also nicht detektiern wann Spiegel 2 passiert wird, solange das Licht nicht wieder an ist. Warum machst du die Spiegel nicht weiter auseinander, oder das Auto kürzer. auto kürzer klingt doof ist aber ganz einfach, bau auf das Dauch ein kleines "Fähnchen" und hänge die Lichtschranke höher. Möglich wäre auch auf 2 Lichtschranken um zu steigen, denn im Momment hast du nur ein. Dann vergleichst du Licht ausschalten 1 mit Licht ausschalten 2 also Timer Start, Timer stopp und du hast die verstrichene Zeit. Jetzt nur noch 0,1 Meter DURCH diese Zeit teilen und du hast m/s in km/H umrechnen wenn du magst und gut ist. Wichtig reagiere auf das gleiche ereignis also entweder Dunkel oder wieder hell. Gruß Daniel PS. geht auch anders, aber warum kompliziert mit autolänge einrechnen usw. dass musst du nur alles komplitziert berechnen und für jedes andere Auto neu berechenen, einen unterbrecher der kürzer als deine Messtrecke ist auf das Auto kleben ist deutlich einfacher.
Wenn ich den Luxus habe eine speziellen und nur dafür gedachten Strahl-Unterbrecher anbringen zu können, nehme ich nur eine Lichtschranke und messe die Dauer der Unterbrechungszeit. Dann braucht man beim Einrichten der Messapperatur auch nicht den Abstand der Lichtstrahlen möglichst genau hinzukriegen.
Die Lichtstarhlen sind doch relativ einfach konstant zu halten. der abstand zwischen spiegeln und Lichtquelle/Sonstor spielt quasi keine rolle, entscheidend ist der abstand von Sensor/Lichtquelle, sowie der zwischen den SPiegeln, diese können bequem auf Bretchen montiert werden und dann am ort des geschehens Positioniert werden. Eine Auswertung der Unterbrechungszeit würde ich aus Genauigkeits gründen nicht machen. Du willst ja an deiner Lichtschranke vorbei fahren, je kürzer die Zeit ist die du auswertest um so Flascher werden deine Werte wenn du nicht genau rechtwinklig zum Aufbau fährst.
Daniel G. schrieb: > Eine Auswertung der Unterbrechungszeit würde ich aus Genauigkeits > gründen nicht machen. Warum nicht. Bei einem mit 10Mhz getaktetem µC und Benutzung des Timers kannst du die Zeit auf 0.0000001 Sekunden genau messen. Ein Auto welches 100km/h fährt bewegt sich in dieser Zeit ~3-tausendstel Millimeter vorwärts. Auf wieviele Stellen nach dem Komma willst du denn messen? > Du willst ja an deiner Lichtschranke vorbei > fahren, je kürzer die Zeit ist die du auswertest um so Flascher werden > deine Werte wenn du nicht genau rechtwinklig zum Aufbau fährst. Und dieser Fehler ist prozentual in beiden Fällen gleich groß und nicht von der Länge der Messstrecke abhängig (Strahlensatz). Je länger deine Messstrecke, desto mehr fliessen Geschwindigkeitsänderungen und Kurvenfahren in der Messzeit in das Messergebnis ein :-)
>> Du willst ja an deiner Lichtschranke vorbei >> fahren, je kürzer die Zeit ist die du auswertest um so Flascher werden >> deine Werte wenn du nicht genau rechtwinklig zum Aufbau fährst. >Und dieser Fehler ist prozentual in beiden Fällen gleich groß. Ok stimmt vertan. Was den ersten Punkt nageht will er ja Auto"S" messen, somit müsste die "Unterbrechungshardware" exakt gleich lang sein. Beim messen mit 2 Spiegel nihct, da ist die Große absolut egal, solange die Länge kurzer als der Abstand ist, das meint ich mit Genauigkeit, dass eine hohe Abtastrate möglich ist, ist klar. Ich verstehe es so, als ginge es hier eher um eine "Bastel" Lösung, als um ein Industrielles Problem, da denke ich ist eine hochgenaue Fertigung eher schwierig.
@kbuchegg >Wenn das Auto länger ist als der Abstand der Lichtstrahlen, dann >funktioniert das überhaupt nicht. Falsch. Man muß nur die Länge der Autos kennen! Denn es gilt: Geschwindigkeit = ( Länge_Auto + Abstand_LS ) / Dunkelzeit. Wenn die Autos unterschiedlich lang sind funktioniert es NUR, wenn der Abstand der Lichtschranken größer als das längste Auto ist. Man muß dann die Zeitspanne zwischen zwei Abdunklungsanfängen ermitteln. Denn dann gilt: Geschwindigkeit = Abstand_LS / Zeitspanne zwischen zwei Verdunkelungsflanken. Bei der zweiten Methode ist allerdings die Gefahr groß, dass sie aus dem "Tritt" geraten kann und dann alle weiteren Messungen falsch sind. Das kann man durch Software rausfiltern. Bei beiden Methoden benötigt sowieso jedes Auto seine eigene Lichtschranke.
Wie wäre es denn mit zwei Lichtschranken? Damit würden sich alle meine Problem in Wohlgefallen auflösen... Bis aufs Progen, aber da habe ich jetzt einen Ansatz. Vielen Dank an alle! Nitnelav
Route_66 schrieb: > @kbuchegg >>Wenn das Auto länger ist als der Abstand der Lichtstrahlen, dann >>funktioniert das überhaupt nicht. > > Falsch. Man muß nur die Länge der Autos kennen! > Denn es gilt: > Geschwindigkeit = ( Länge_Auto + Abstand_LS ) / Dunkelzeit. Ja klar. Aber dann ist auch das Messprinzip ein anderes und es ergibt sich die Frage, warum man da eigentlich mit 2 Strahlen hantieren soll. Sinn der beiden Strahlen ist es ja (wahrscheinlich) die exakte Autolänge eben nicht kennen zu müssen. Diese Idee finde ich ja an und für sich nicht blöd. Denn wer kennt schon die exakt Länge seines ferngesteuerten Autos in einer 'Höhe' von 8.5 Zentimeter (um mal eine Zahl zu nennen). Und die ist auch gar nicht so einfach zu messen. > Bei der zweiten Methode ist allerdings die Gefahr groß, dass sie aus dem > "Tritt" geraten kann und dann alle weiteren Messungen falsch sind. Das > kann man durch Software rausfiltern. So groß ist die Gefahr dann auch wieder nicht. Wenn nach dem ersten Impuls der zweite nicht innerhalb von 2 Sekunden kommt, war die Messung ungültig
Quasi ja. Diese kannst du direkt hinter ein ander montieren, hast fast keine Winkel fehler mehr und gleichzeitig dunkel durfen sie auch sein. Einziges Problem es gehen keine zwei wagen gleichzeitig aber das war bei denem ersten Vorschlag wie oben beschreiben ja auch nicht drin.
Daniel G. schrieb: > Was den ersten Punkt nageht will er ja Auto"S" messen, somit müsste die > "Unterbrechungshardware" exakt gleich lang sein. Beim messen mit 2 > Spiegel nihct, da ist die Große absolut egal, solange die Länge kurzer > als der Abstand ist, Da hast du recht. Aber auch hier sollte man wieder nachrechnen, welchen Messfehler man begeht, wenn die aufgeklebten Plättchen nicht exakt gleich lang sind, sondern von mir aus um 1/500 Millimeter abweichen. > Ich verstehe es so, als ginge es hier eher um eine "Bastel" Lösung, als > um ein Industrielles Problem, da denke ich ist eine hochgenaue Fertigung > eher schwierig. Wenn du nachrechnest, wirst du draufkommen, dass das alles halb so wild ist. Aber ich sehe gerade ein anderes Problem mit solchen Unterbrechern. Modellautos sollen sich auch schon mal überschlagen haben :-) Schon von daher würde ich eine andere Lösung bevorzugen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.