PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sonnenverfolger



DaveWagner
10.07.2009, 19:58
Hallo

Wie der Titel schon sagt baue ich gerade einen Sonnenverfolger.

Der Sonnenverfolger funktioniert so, dass zuerst der Motor in die Ausgangsposition zurückfährt bis er an einem Taster anschlägt und stehen bleibt. Daraufhin wird der ADC-Wert eines LDRs, der auf einem Motor befestigt ist gemessen und währenddessen dreht der Motor sich ungefähr 180 Grad .Dabei wird der hellste Wert gemerkt und in eine Variable geschrieben("W" im Programm)
Danach fährt der Motor solange in die andere Richtung bis dieser Wert wieder erreicht ist.
Mein Problem ist , dass nach ca. 8 -10 maligen Ablaufen des Programms der Motor einfach ständig weiterläuft obwohl er sich nur solange drehen soll bis 180 Grad erreicht sind oder einer der beiden Taster gedrückt wird.
(Der andere Taster stellt sicher dass der Motor nicht zu weit in die andere Richtung fährt.Der erste Taster ist in der Ausgangsposition.

Nach dem Suchen des hellsten Punktes wird ca. 300 Sek lang gemessen ob einem zweiten LDR die Lichtstärke größer ist.
Wenn ja dann startet ein erneuter Suchlauf.
Des Weiteren startet ein neuer Suchlauf wenn beim ersten LDR die Lichtstärke weniger als die Hälfte des hellsten Punktes beträgt.

Der Motor wird mit einem L293D angesteuert

Hier das Programm:



$regfile = "m8def.dat " ' specify the used micro

$crystal = 1000000

Config Portd.0 = Input ' Pin 2
Config Portd.1 = Input


Config Portb.1 = Output
Config Portb.2 = Output
Config Portb.0 = Output
Config Portd.7 = Output

Config Adc = Single , Prescaler = Auto , Reference = Avcc 'config ADC

Start Adc



Dim A As Integer
Dim W As Word
Dim B As Integer
Dim D As Integer
Dim L As Integer
Dim F As Integer





W = 0
L = 0




Portd.0 = 1
Portd.1 = 1




Do


Portd.7 = 1
Portb.0 = 1




W = 0
L = 0





Start1:

Portd.7 = 1
Portb.0 = 1


Wait 1




Portd.7 = 0
Portb.0 = 1

If Pind.0 = 0 Then
For A = 1 To 800 Step 1 'Halbkreisdrehung und suche nach hellstem Ad-Wert
If Pind.1 = 0 Then
Goto Start1
End If
If Getadc(0) > W Then
W = Getadc(0)
End If
Waitms 2
Next A
Else
Portd.7 = 1
Portb.0 = 1
Waitms 50
While Pind.0 = 1
Portd.7 = 1
Portb.0 = 0
Wend
Goto Start1
End If





Portd.7 = 1
Portb.0 = 1

D = W - 1
Wait 1







If Pind.1 = 1 Then
While Getadc(0) < D
Portd.7 = 1
Portb.0 = 0 'Wieder zurückfahren zum hellsten Punkt
If Pind.0 = 0 Then
Goto Start1
End If
Waitms 2
Wend
Else
Goto Start1
End If








Portd.7 = 1
Portb.0 = 1
B = W / 2

Wait 1





While L < 300
L = L + 1
Wait 1
If Getadc(0) < B Then
L = 301 'Falls es beim zweiten LDR heller istoder die Helligkeit beim ersten LDR unter der Hälfte liegt dann erneuter Suchlauf
End If
F = Getadc(1) - 75
If Getadc(0) < F Then
L = 301
End If
Wend





Loop




Kann das Problem am Code liegen ?
Wäre gut wenn mir jemand sagen könnte ob es an dem Programm liegt, dass der Motor nach einer bestimmten Anzahl von Suchläufen einfach weiterläuft oder nicht.

Mfg

David

Vitis
10.07.2009, 21:27
es kann an dem Programm liegen ... ist aber schwer zu sagen,
weil Dein Programmablauf etwas "unübersichtlich" ist.
Du springst aus Schleifen, Abfragen usw. per Goto raus,
das kann Problemchen verursachen ...
Ein Tip noch ... versuche aussagekräftige Variablennamen
zu verwenden, das macht anderen und auch Dir das lesen
bzw. interpretieren des Codes einfacher.

Anstatt W z.B. Analogwert_LDR1 ... nur mal als Anregung.
Auch Aliase helfen mitunter ... z.B.

Endanschlag alias Pind.1


if Endanschlag = 1 then .....

DaveWagner
10.07.2009, 23:09
Hier der neue Code mit geänderten Variablen- und Portnamen.
Ich hoffe es ist jetzt verständlicher.


$regfile = "m8def.dat " ' specify the used micro

$crystal = 1000000

Config Portd.0 = Input ' ' Pin 2
Config Portd.1 = Input


Config Portb.0 = Output
Config Portd.7 = Output

Config Adc = Single , Prescaler = Auto , Reference = Avcc 'config ADC

Start Adc



Dim Zaehlvariable As Integer
Dim Helligkeit As Word
Dim Haelftehelligkeit As Integer
Dim Hilfsvariable As Integer
Dim Zaehlvariable2 As Integer
Dim Hilfsvariable2 As Integer

Taster1 Alias Portd.0 'Ausgangsposition
Taster2 Alias Portd.1


Helligkeit = 0
Zaehlvariable2 = 0




Taster1 = 1
Taster2 = 1

Motor1 Alias Portd.7
Motor2 Alias Portb.0




Do


Motor1 = 1
Motor2 = 1




Helligkeit = 0
Hilfsvariable = 0





Start1:

Motor1 = 1
Motor2 = 1



Wait 1




Motor1 = 0
Motor2 = 1

If Taster1 = 0 Then
For Zaehlvariable = 1 To 800 Step 1 'Halbkreisdrehung und suche nach hellstem Ad-Wert
If Taster2 = 0 Then
Goto Start1
End If
If Getadc(0) > Helligkeit Then
Helligkeit = Getadc(0)
End If
Waitms 2
Next Zaehlvariable
Else
Motor1 = 1
Motor2 = 1
Waitms 50
While Taster1 = 1
Motor1 = 1
Motor2 = 0
Wend
Goto Start1
End If





Motor1 = 1
Motor2 = 1

Hilfsvariable = Helligkeit - 1
Wait 1







If Taster2 = 1 Then
While Getadc(0) < Hilfsvariable
Motor1 = 1
Motor2 = 0 'Wieder zurückfahren zum hellsten Punkt
If Taster1 = 0 Then
Goto Start1
End If
Waitms 2
Wend
Else
Goto Start1
End If








Motor1 = 1
Motor2 = 1
Haelftehelligkeit = Helligkeit / 2

Wait 1





While Zaehlvariable2 < 300
Zaehlvariable2 = Zaehlvariable2 + 1
Wait 1
If Getadc(0) < Hilfsvariable Then
Zaehlvariable2 = 301 'Falls es beim zweiten LDR heller istoder die Helligkeit beim ersten LDR unter der Hälfte liegt dann erneuter Suchlauf
End If
Hilfsvariable2 = Getadc(1) - 75
If Getadc(0) < Hilfsvariable2 Then
Zaehlvariable2 = 301
End If
Wend





Loop


Mfg

David

Richard
11.07.2009, 07:01
Moin moin.

Wenn Du 2 LDR in ein Röhrchen befestigat und diese Röhrchen
dann leicht schräg (nach aussen) gegeneinander befestigst,
kannst du aus dem Lichteinfall den mittelwert bilden und hast
den Sonnenwinkel. Dem auch automatisch nachgefahren wird.

Nimmt man 4 LDR klapptz das in allen Richtungen.

Gruß Richard

The Man
11.07.2009, 09:20
Was hast du denn vor, mit deinem Sonnenfolger?
Meine Frage geht in die Richtung, wie genau er der Sonne folgen soll.
Wenn es möglichst genau werden soll, würde ich von der Verwendung von mehreren LDR´s abraten. Die schwanken in der Produktion so dermaßen, dass du die MItte zwischen zweien nur bei der HElligkeit findest, bei der du das System eingestellt hast. Für alle anderen Helligkeiten unterscheiden sich die Kennlinien zu sehr. Bin damit schon selber auf die Nase gefallen.

Mein Tipp währe, eine LDR neigen und drehen zu können und sich dann zu merken, wo es am hellsten war und die Position an deine Aparatur weiter zu geben. Vll. auch eine LDR pro Achse und dann jeweils mit "Scheuklappen" versehen um sie auf die zugedachte Achse zu beschränken.

mfg,
The Man

DaveWagner
11.07.2009, 09:26
Hallo Richard

Wenn ich das richtig verstanden habe meinst du z.B.
dass wenn am ersten LDR der Wert 1000 beträgt und am zweiten 800 dann wird der Mittelwert gebildet und der Motor fährt so lange bis der Wert 900 erreicht ist.
Nur wäre es doch bei dem 1000 heller und sinnvoller dorthin sich
auszurichten

Hier noch eine Zeichnung von den Röhrchen und LDRs
Stimmt das so


Mfg

David

vohopri
11.07.2009, 09:56
Hallo Dave,

ins Programm schaue ich mal nicht, mit Testausgaben und Debuggen kannst du die Fehler selbst besser finden.

Mir scheint nach deiner Beschreibung: du hast einen logischen Fehler im Ablauf. Beim Rücklauf nach der Maximumsuche kann es immer sein, dass durch Rauschen und und die natürliche Schwankung der Strahlungsintensität das vorher gefundene Maximum nachher nicht mehr auftritt.

grüsse,
Hannes

DaveWagner
11.07.2009, 10:10
Hier noch die Zeichnung von den Röhrchen und LDRs



Mfg

David

Richard
11.07.2009, 12:40
Moin moin.

Mit "Mittelwert habe ich mich etwas Vertan. :-( Es müsste eher
heißen wenn beide LDR`s etwa die gleiche Lichtstärke messen
"steht" die Sonne mittig über den beiden LDR`s. Wenn das dann
mittels Motor nachgeführt werden soll muß etwas Hysterese
eingebaut werden damit der Motor auch mal zur Ruhe kommt.
Auch kurze Abschattungen durch Wolken sollten beachtet werden.

Nach diesem Prinzip hat die Elektor mal in den 80. Jahren
Ein Sonnensegel für ne Strand Kühlbox nachgeführt. :-)

Gruß Richard