-         
Ergebnis 1 bis 9 von 9

Thema: Sonnenverfolger

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    03.11.2008
    Alter
    25
    Beiträge
    56

    Sonnenverfolger

    Anzeige

    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:
    Code:
     $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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    44
    Beiträge
    2.240
    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 .....
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    03.11.2008
    Alter
    25
    Beiträge
    56
    Hier der neue Code mit geänderten Variablen- und Portnamen.
    Ich hoffe es ist jetzt verständlicher.
    Code:
     $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

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    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

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    473
    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

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    03.11.2008
    Alter
    25
    Beiträge
    56
    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
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken sonnenfolger.jpg  

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von vohopri
    Registriert seit
    11.09.2004
    Ort
    südlich der Alpen
    Beiträge
    1.708
    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

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    03.11.2008
    Alter
    25
    Beiträge
    56
    Hier noch die Zeichnung von den Röhrchen und LDRs



    Mfg

    David
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken sonnenfolger_197.jpg   sonnenfolger_123.jpg  

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •