Liebe Robo-Gemeinde,
seit etwa 1/2 Jahr gehe ich mit einem Laser-Ortungssystem schwanger. Ich habe es soweit, dass ich auf etwa 15 m den Winkel zu einer Bake auf 0,1 Grad genau bestimmen kann. Letztlich wäre es nur noch ein kleiner Schritt mit dem Aufbau einer 2. Bake die xy-Koordinaten in einem Areal von etwa 10x10 m und einer Wiederholungsrate von etwa 50 Hz auf einen cm genau zu bestimmen. Allerdings kann ich mich nicht aufraffen das Projekt zu Ende zu basteln.
Sicherlich kommt jetzt der Tip mit DGPS: Einfach die Positionsangaben von 2 GPS subtrahieren. DGPS ist aber bei weitem nicht so einfach. Ich habe noch von keinem funktionierenden DGPS im Forum gelesen. Wegen Interferenzen und Mehrfachausbreitung ist DGPS wohl auch nur auf freiem Feld praktikabel. Kamera und Bildverarbeitung wären eine Alternative, erfordern aber mehr Rechenpower.
Prinzip:
Die Bake arbeitet mit einem rotierenden, vertikal aufgefächerten Laserstrahl.
1. Idee: Ein feststehender Spiegel erzeugt zusätzlich ein Spiegelbild von dem rotierende Laserstrahl. Aus dem Rhythmus der im Detektor eintreffenden Laserstrahlen (direkt und reflektiert) ergibt sich exakt der Winkel zum Spiegel.
Bild hier
Bild hier
2. Idee: Im Detektor bilden 2 Photodioden einen Spannungsteiler. Lichtschwankungen, Fremdlicht wird hierdurch weitgehend eliminiert. Die rotierenden Laserstrahlen treffen aber die beiden unmittelbar nebeneinander angeordneten Photodioden nacheinander. D.h. es werden scharfe Impulse von wenigen us Dauer generiert. Über Transistorverstärker, Hochpass geht das Signal in einen Mikrokontroller.
Bild hier
Bild hier
Bild hier
Bild hier
Zum Aufbau:
Als Bake läst sich wunderbar eine ausrangierte Festplatte verwenden. Je mehr Platten desto besser. Durch die Masse ergibt sich eine konstante Drehgeschwindigkeit, welche natürlich für die Genauigkeit des Systems essentiell ist. Zum Auffächern des Laserstrahls läßt sich gut eine Feinsicherung verwenden.
Die Ansteuerung des Festplattenmotors erfolgt wie mit einem brushless-Regler. Die Position des Plattenstapels bestimme ich über Markierungen und einen CNY70 (die EMK auszuwerten ist mir viel zu kompliziert). Im Mikrokontroller werden je nach Plattenposition nacheinander die 3 Eingänge des Festplattenmotors über FETs (z.B. von der Festplattenplatine abgebrochen) angesteuert. Damit läßt sich eine konstante Rotationsgeschwindigkeit vorgeben.
BASIC - Peogramm in einem Atiny zum Ansteuern des Festplattenmotors:
Code:
$regfile = "ATTINY2313.dat"
$crystal = 8000000
Config Pind.6 = Output
Config Pinb.0 = Output
Config Pinb.1 = Output
'Config Pinb.2 = Input
Dim T0 As Word , T1 As Long , T2 As Long , T3 As Long , T4 As Long , T5 As Long , J As Byte , Jj As Long
Enable Interrupts
Config Int0 = Rising
Enable Int0 'enable the interrupt
On Int0 Label0
Config Timer0 = Timer , Prescale = 8
On Timer0 Timererh
Enable Timer0
Start Timer0
For J = 1 To 5
Portb.1 = 0 : Portb.0 = 0 : Portd.6 = 1
Waitms 20
Portb.1 = 0 : Portb.0 = 1 : Portd.6 = 0
Waitms 20
Portb.1 = 1 : Portb.0 = 0 : Portd.6 = 0
Waitms 20
Next
Xx1:
T1 = 100000
Do
If T1 > 10000 Then
Stop Timer0
T4 = T0
Shift T4 , Left , 8
T4 = T4 + Tcnt0
Start Timer0
T4 = T4 + T5
If T4 > T1 Or T4 <= T2 Then
Portb.1 = 0 : Portb.0 = 0 : Portd.6 = 1
End If
If T4 > T2 And T4 <= T3 Then
Portb.1 = 0 : Portb.0 = 1 : Portd.6 = 0
End If
If T4 > T3 And T4 <= T1 Then
Portb.1 = 1 : Portb.0 = 0 : Portd.6 = 0
End If
Else
Portb.1 = 0 : Portb.0 = 0 : Portd.6 = 0
End If
Loop
Label0:
Stop Timer0
T1 = T0 : Shift T1 , Left , 8
T1 = T1 + Tcnt0 : T0 = 0 : Tcnt0 = 0
Start Timer0
T2 = T1 / 3 : T3 = T2 : T3 = 2 * T3
'T5 = T1 : Shift T5 , Right , 3, '/ 100 : T5 = T5 * 15
T5 = T1 / 100 : T5 = T5 * 15
Return
Timererh:
Incr T0
Return
Als Detektor sind ein Spannungsteiler aus 2 Reihen von Photodioden (4 jeweils parallel) ein 2 stufiger Transistorverstärker und ein Hochpass in einem HF-Gehäuse untergebracht. Am Ausgang geht´s nach einem Hochpass in einen weiteren Transistorverstärker und direkt in den Mikrocontroller. Das Programm misst laufend die Zeitabstände zwischen den Impulsen. Verwertet werden die Impulse dann, wenn die Summe zweiter aufeinanderfolgender Impulsintervalle genau der Rotationsdauer der Bake entspricht. Hierdurch können 1. falsche Impulse eliminiert werden. 2. können Impulse auch richtig 2 Baken zugeordnet werden, wenn diese mit unterschiedlicher Rotationsgeschwindigkeit arbeiten. Rotfilter vor den Photodioden.
Basic - Programm im Detektor:
Code:
$regfile = "m32def.dat"
$crystal = 4000000
'$regfile = "ATTINY2313.dat"
'$crystal = 8000000
Config Lcd = 16 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0
Cls
Config Pind.2 = Input
Dim T1 As Long , T2 As Long , T0 As Word , T3 As Long , T4 As Long , T3a As Long , F1 As Single , F2 As Single
Dim V(5) As Single , Vv As Single
Enable Interrupts
Config Timer0 = Timer , Prescale = 8
On Timer0 Timererh
Enable Timer0
Start Timer0
Do
Do : Loop Until Pind.2 = 0 'warten auf 1. Impuls
Stop Timer0
T3 = T0:
Shift T3 , Left , 8
T3 = T3 + Tcnt0 : T0 = 0 : Tcnt0 = 0 'T3 unwichtig
Start Timer0 'Uhr auf 0 und starten
Waitms 1
Do : Loop Until Pind.2 = 0 'warten auf 2. Impuls
Stop Timer0
T2 = T0:
Shift T2 , Left , 8
T2 = T2 + Tcnt0 : T0 = 0 : Tcnt0 = 0 'T2 erstes Impulsintervall
Start Timer0 'Uhr auf 0 und starten
Waitms 1
Do : Loop Until Pind.2 = 0 'warten auf 3. Impuls
Stop Timer0
T1 = T0:
Shift T1 , Left , 8
T1 = T1 + Tcnt0 : T0 = 0 : Tcnt0 = 0 'T1 zweites Impulsintervall
Start Timer0
T3 = T1 : T3 = T3 + T2 'T3=T2+T1 Zeit für 1 Umdrehung
If T1 > T2 Then 'kürzestes Zeitintervall von T1
T1 = T2 'und T2 auswählen. >> T1 ist
End If 'immer direkt-reflektiert
Locate 1 , 1 : Lcd T3 :
If T3 > 29200 And T3 < 29500 Then 'Selektion von passenden Werten
'Mittelwert aus 3 Messungen:
V(3) = V(2) : V(2) = V(1) : V(1) = T1 / T3 : V(1) = V(1) * 120
Vv = V(1) : Vv = Vv + V(2) : Vv = Vv + V(3)
Locate 2 , 1 : Lcd Vv:
End If
Xx1:
Loop
Timererh:
Incr T0
Return
Video: Der Detektor befindet sich in etwa 15 m Abstand von der Bake. Die Anzeige in der unteren Zeile gibt Grad zum Spiegel der Bake an. Sie schwankt um etwa 0,1 Grad. Verschiebt man den Detektor ändert sich die Positionsangabe.
[stream:fe8a376a4f]http://www.rasenrobo.de/bake/IMGP2168.avi[/stream:fe8a376a4f]
[stream:fe8a376a4f]http://www.rasenrobo.de/bake/IMGP2169.avi[/stream:fe8a376a4f]
oder youTube
http://www.youtube.com/watch?v=1T4V-J581R4
http://www.youtube.com/watch?v=K84CkFU-zxY
Verbesserungsmöglichkeiten:
Bake: Der Laser wird nicht seitlich, sondern genau über der Nabe der Festplatte angebracht. Ein mm-großer Spiegel sollte dann ausreichend sein. Der feststehende Spiegel kann dann näher am rotierenden angebracht werden. Der tote Winkel durch Verdeckung des Speigelbildes könnte dadurch verringert werden.
Mit welcher Anordnung des feststehenden Spiegels könnte man diesen toten Winkel ganz vermeiden?
Wer kann den Verstärker im Detektor verbessern ? Ich bin Elektroniklaie. Wichtig ist ein Ansprechen im us-Bereich.
Zahlenbeispiel: Breite der Photodioden 5mm. 10 m Abstand >>> Kreisumfang 63 m >>> 1:10000. Bei 50 Hz ergibt das eine Impulsbreite von 1:500000 sec = 2 Mikrosekunden. Daraus ergibt sich auch, dass mit üblichen frequenzkodierten IR sender und Detektoren eine ähnliche Genauigkeit und Auflösung nicht erreicht werden kann.
Nu, was haltet Ihr von der Sache ?
Christian H
Lesezeichen