PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Richtungserkennung mit 2 Lichtschranken



lötkolben100
25.02.2010, 20:16
Hallo zusammen,

hätte eine Frage bezüglich Richtungserkennung.

Möchte mit 2 Reflexionslichtschranken und einem Mikrocontroller die Richtung auswerten, d.h läuft man vorwärts durch die Schranken sollte z.B: eine grüne LED kurz leuchten. Läuft man in entgegengesetzter Richtung soll eine rote LED aufleuchten. Hat schonmal jemand so etwas in Bascom gemacht und könnte mir ein paar Tipps geben ?

Mfg Lötkolben

Sauerbruch
25.02.2010, 21:33
Einer von ca. 1027 Wegen könnte so aussehen:

Du definierst 2 Variablen als Bit und nutzt sie als "flag", die bei Passage der Lichtschranken gesetzt werden (z.B. Flag1 und Flag2). Wird die Lichtschranke 1 ausgelöst, checkst Du ob Flag2 schon gesetzt ist. Wenn ja, geht die Hin-LED an. Wenn nicht, wird Flag1 gesetzt. Lichtschranke 2 macht genau das gleiche: Checken, ob Flag1 gesetzt ist, wenn ja, Rück-LED an, ansonsten Flag2 setzen.

Irgendwann nachdem eine LEDs angeschaltet wurde, musst Du natürlich beide Flags löschen (und die LED wieder ausschalten). Die einfache, aber unelegante Art wäre mit "wait x", das hält das Programm aber auf. Alternativ könntest Du einen Timer starten und in der Überlauf-ISR die Flags löschen.

Besserwessi
25.02.2010, 21:34
Das ist noch etwas einfacher als man es bei Incrementalgebern hat.

Die Lichtschraken sollte so dicht zusammen, dass man beim duchgehen beide gleichzeitig unterbricht.
Man wartet darauf bis die eine Leichtschranke gerade unterbrochen wird. Dann schaut man sich die an ob die andere Lichtschranke auch unterbrichen ist. Daraus kreigt man dann die Richtung.

peterfido
25.02.2010, 21:36
Das kann man z.B. wie eine Dreh-Encoder Abfrage aufbauen.

edit: Man sollte die Fenster nicht so lange offen lassen...

Thomas$
25.02.2010, 21:52
meine lösung http://einbeinreicht.blogspot.com/ hab aber externen schidttrigger zusätzlich

lötkolben100
26.02.2010, 23:32
Hi,

hat jemand vielleicht einen Beispielcode.

Mfg Lötkolben

peterfido
28.02.2010, 10:16
Hier, aber ungetestet. Die Ports müssen angepasst werden, es fehlt der Kopf bezüglich Takt und Stack.
Evtl muss im Lichtschranken SUB jede 0 gegen eine 1 und jede 1 gegen eine 0 getauscht werden.


Dim Zeitrot as integer
Dim Zeitgruen as Integer
Dim DrehungLinks As Byte
Dim DrehungRechts As Byte
Dim Linksrechts As Byte
Links Alias Pind.3 'Eingang 1. Lichtschranke
Rechts Alias Pind.4 'Eingang 2. Lichtschranke
LEDgruen Alias Portd.5 'Ausgang grüne LED
LEDrot Alias Portd.6 ' Ausgang rote LED

ddrd =01100000

do
gosub Lichtschranke
if DrehungRechts >0 then
zeitrot = 32767
set ledrot
DrehungLinks =0
end if
if DrehungLinks >0 then
zeitgruen = 32767
set ledgruen
DrehungLinks = 0
end if
if zeitrot > -32767 then
decr zeitrot
else
reset ledrot
end if
if zeitgruen > -32767 then
decr zeitgruen
else
reset ledgruen
end if

loop
end
Lichtschranke:
If Linksrechts = 0 Then
If Links = 0 And Rechts = 1 Then
Linksrechts = 1
End If
If Rechts = 0 And Links = 1 Then
Linksrechts = 11
End If
End If

If Linksrechts = 1 And Links = 0 And Rechts = 0 Then
Linksrechts = 0
incr DrehungLinks
End If



If Linksrechts = 11 And Links = 0 And Rechts = 0 Then
Linksrechts = 0
incr DrehungRechts
End If

If Links = 1 And Rechts = 1 Then Linksrechts = 0



Return

Thomas$
28.02.2010, 11:29
hab ich da keinen link geschickt?
da war der quell code in bascom für einen 2313 du nimmst dir einfach den µC deiner wahl änderst die pinbelegung nach deiner wahl schließt die leds an
und deine lichtschranken du musst nur die pinbelegung ändern das programm geht. wenn es denoch nicht läuft schreib eine pn und ich änder dir den code und noch eine ausführliche erklärung ok?

Richard
28.02.2010, 13:38
Das geht recht einfach


Wenn IR1 unterbrochen wird LED Grün an
und IR2 Abfrage überspringen
Wenn IR2 unterbrochen wird LED Rot an
und IR1 Abfrage überspringen


Gruß Richard

Thomas$
28.02.2010, 14:02
und was ist wenn das ding wackelt und ir1 auslöst und wieder zurück schwingt?
bei meim code ist das mit berücksichtigt

peterfido
28.02.2010, 19:25
Jo, bei mir auch...

Thomas$
28.02.2010, 19:44
sieht aber umständlich aus für mich kann auch sein das es nur daran liegt das in c nicht ganz fit bin im prinzip hat man 4 verschiedene übergänge in beide richtungen wenn man alles per if abfragt hat man vier impulse pro "strich". ich hatte bloß mein problem mit der frage "hat jemand vielleicht einen Beispielcode. ". ps werd mir mal dein code noch genauer ansehen es mach das selbe aber irgendwie ganz anders