Forum: Mikrocontroller und Digitale Elektronik Lichtschrankenprobleme


von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von t0mmy (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> 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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

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

von Reinhard Kern (Gast)


Lesenswert?

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

von Route_66 (Gast)


Lesenswert?

@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!

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Daniel G. (daniel83)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Daniel G. (daniel83)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Daniel G. (daniel83)


Lesenswert?

>> 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.

von Route_66 (Gast)


Lesenswert?

@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.

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Daniel G. (daniel83)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.