Solartracker zwei Achsen, mit Lichtsensoren

Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Die Position der Sonne mit Sensoren bestimmen

Beitrag von Admin »

Inzwischen würde ich es nicht mehr mit den Sevos machen. Erstens, weil ich mit 180 Grad und 270 Grad nicht weit genug fahren kann. Zweitens, weil die Servos zu sehr ruckeln, wenn sie unter Last sind. Und drittens, weil sie eine bekannte Startstellung brauchen, also müßte ich nach jeder Bewegung die letzte Pos. speichern, falls das Ding Stromlos wird. Wenn ich das nochmal neu aufbaue, dann mit Schrittmotoren. Und ob ich es nochmal aufbaue, hängt davon ab, ab ich das ausrichten nach der Sonne, auch bei bewölkten Himmel, mit den Lichtsensoren sicher hin bekomme. Nach Uhrzeit und Datum, mache ich nicht, das gibts hier schon von Max. Das Rad zweimal erfinden, ist verlorene Zeit. Aber ich glaube das Ausrichten nach dem Licht, bringe ich auch bei bedeckten Himmel hin. Bei totaler Gewitterlage, wird es so dunkel, dass ich das Panel lieber in die Schutzstellung fahre.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Die Position der Sonne mit Sensoren bestimmen

Beitrag von Admin »

Ich habe heute wieder ein bisschen weiter gemacht an der Software. Ich habe jetzt schon eine Lichtabhängige Steuerung des Panels, aber noch keine Pufferung zwischen den Werten. Also das Panel ist noch laufend am austarieren, weil ich noch keine Toleranzen drin habe. Das mache ich morgen, denke ich. Außerdem habe ich mir eine Diffusor-Folie bestellt, weil die gemessenen Lichtwerte deutlich zu hoch sind. Da sind die Werte, bei bedeckten Himmel, schon auf Vollgas.

Es geht vorran :(oo):
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Die Position der Sonne mit Sensoren bestimmen

Beitrag von Admin »

So, ich habe jetzt das Programm soweit, dass es so gut wie möglich nach Lichtwerte zum hellsten Punkt steuert. Ein Problem ist, dass ich an die Servo Grenzen komme. Also Position 0 oder 180. wenn dann die Lichtwerte noch nicht toll sind, dann rödelt das Ding weiter. Aber das ist jetzt bei mir am Tisch. Da ist das Licht natürlich 360 Grad rund herum. Ich werde meine Versuche wohl am Balkon oder im Garten fortsetzen müßen. :roll: Im Garten ist allerdings das Licht erst mal zu hell. Aber die Diffusor-Folie zum Abdunklen der Lichtsensoren ist bestellt. Kommt leider erst nächste Woche :???:

Das Programm kennt jetzt 4 Richtungen, rechts, links, rauf, runter. Wenn sich das Licht in einer Richtung negativ entwickelt, dann wird diese Richtung ausgeschalten, solange sich das Licht in einer der vier Richtungen pos. entwickelt, fährt das Ding weiter in diese Richtung. Sobald es sich dann doch engegengesetzt entwickelt, wird auch diese Richtung abgeschalten. Wenn alles passt, sind ganz schnell alle 4 Richtungen ausgeschalten und die Mühle steht. Wenn sich in einer der 4 Richtungen die Lichtwerte ändern, wird diese Richtung wieder aktiviert, es wird nachgesteuert, und wenn die Werte wieder gut sind, wieder ausgeschalten.

Aber ok, das Ziel ist noch nicht ereicht. Aber die Richtung stimmt, denke ich. Die Bewegungsgrenzen der Servos sind aber sicher nicht toll. Also wenn ich die Lichtsteuerung so hinbekomme, dass das Ding auch bei Bedecken / Bewölkten Himmel macht, was sie soll, dann ist auf jeden Fall ein anderer Motor-Unterbau angesagt. Mit den Servos hat das ganze keine Zukunft.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Die Position der Sonne mit Sensoren bestimmen

Beitrag von Admin »

Ich habe es jetzt mal bei stark bedeckten Himmel am Balkon versucht. Das klappt wunderbar. Geht auf Position und stoppt auf allen vier Richtungen. Dann drehe ich das ganze etwas, dass der Lichteinfall nicht mehr stimmt, und schon wird die Fahrt wieder aufgenommen. Wieder auf die richtige Position, und Stopp. Wieder die Einrichtung drehen, und es geht von vorne los. Bei stark bedeckten Himmel hatte ich Werte von 3000 - 3500 vom 4095. Jetzt muss ich aber erst mal auf die Diffusor-Folie warten, denn bei Sonnenschein ist es einwandfrei viel zu hell. Und ich muss noch einen Programmteil machen, der dafür sorgt, dass das Panel am Abend, sobald es zu dunkel wird, in eine Parkstellung fährt. Und wenn es Morgens wieder hell wird, gehts wieder an die Arbeit.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Die Position der Sonne mit Sensoren bestimmen

Beitrag von Admin »

Habe noch ein bischen angepasst und die Automatische Abendliche Parkstellung noch programmiert. wenn ein Sensor einen Wert unter 1000 hat, geht das Ding in Parkstellung. Und jetzt brauche ich erst mal die Duffusor-Folie, dass es weiter geht.

Franz
Max
Beiträge: 78
Registriert: Di 27. Sep 2022, 17:37
Kontaktdaten:

Re: Die Position der Sonne mit Sensoren bestimmen

Beitrag von Max »

Hallo Franz,

Du scheinst ja auf einen guten Weg zu sein.
Wie erfasst Du die Morgenstellung (welches Bauteil).
Könnte man statt der Duffusor-Folie auch einen Vorwiderstand verwenden?
Weiterhin viel Forschungserfolg.
Gruß
Max
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Die Position der Sonne mit Sensoren bestimmen

Beitrag von Admin »

Hi Max.
Vorwiderstand ist an jedem Sensor dran. Mehr ist nicht rauszuholen. Also als Spannungsteiler in Verbindung mit dem Lichtempfindlichen Widerstand (LDR_GL5516), wie in der Schaltung zu sehen. Vorher, für die Siemens Logo 8, habe ich gerne die A1060 verwendet. Sind aber nicht mehr zu bekommen und sind in der Funktion recht ähnlich. Hatten aber viel bessere Gehäuse!!

Es gibt keine spezielle Morgenstellung. Es gibt nur die Automatische Einstellung auf die hellste Richtung. Sobald alle vier Sensoren Messwerte größer 1300 bringen, wird die Arbeit wieder aufgenommen. Erfasst wird die "hellste Richtung" eben über die vier Lichtempfindlichen Widerstände. Ich fahre immer in die Richtung wo das stärkste Licht herkommt. In die Richtung fahre ich so lange weiter, bis der gegenüberliegende Sensor die selbe Lichtstärke hat. Wenn die beiden also die fast gleiche Lichtstärke messen, stoppe ich. Das gilt für die beiden Horizontalen Sensoren, genauso wie für die beiden Vertikalen. Wenn sich die Werte in einer Richtung nicht mehr gleichen, dann fährt das Ding wieder in Richtung der Helleren Quelle, wieder bis beide Sensoren etwa gleich sind. Dann ist wieder Stopp und alles gut, bis das Licht wieder aus einer deutlich anderen Richtung kommt, u.s.w.

Franz

PS: Bis jetzt mache ich das aber nur mit künstlichen Licht am Arbeitstisch. Und einmal habe ich das ganze am Balkon bei sehr bewölkten Himmel getestet. Das hat auch ganz gut funktioniert. Die Messwerte unter 1000 zum abschalten und in die Nachtruhe gehen, sowie der Messwert über 1300, zum wieder in Betrieb gehen und die Arbeit aufnehmen, sind beide noch in der Testphase. Ob das die richtigen Werte sind, ist noch völlig unklar.
Hier ist das derzeitige Programm, das aber sicher noch nicht passt. Ob ich es mit der Diffusor-Folie hinbekomme, dass ich das ganze Licht-Spektrum (total bedeckter Himmel bis volle Sonne) erfassen kann, ist noch fraglich. :(o): :(o):

Code: Alles auswählen

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#include <Adafruit_ADS1X15.h> // bindet Wire.h für I2C mit ein
Adafruit_ADS1115 ads;
#define ADS_I2C_ADDR 0x48
#include <MobaTools.h>
MoToServo ServoHorizontal;
MoToServo ServoVertikal;
byte ablauf = 3; // ablauf = 3 Tagbetrieb / ablauf = 4 Nachtbetrieb
const float multiplier = 0.125F; // ADS1115-Multiplikator bei einf. Verstärkung
const byte panel = A0;
int panelwert = 0;
float panelspannung = 0;
float ads_mv0 = 0;  // Sensor rechts
float ads_mv1 = 0;  // Sensor links
float ads_mv2 = 0;  // Sensor hinten
float ads_mv3 = 0;  // Sensor vorne
int adc0 = 0;
int adc1 = 0;
int adc2 = 0;
int adc3 = 0;
const int startposvertikal = 60;
const int startposhorizontal = 90;
byte kontrolle1 = 0;
byte kontrolle2 = 0;
byte kontrolle3 = 0;
byte kontrolle4 = 0;
int posvertikal = startposvertikal;
int poshorizontal = startposhorizontal;
const byte Servo1 = 5;
const byte Servo2 = 6;
unsigned long sekundenablauf1 = 0; // Messabstand 1 Sekunde
const unsigned long pausezeit1 = 1000;
unsigned long sekundenablauf2 = 0; // Messabstand 15 Sekunde
const unsigned long pausezeit2 = 50;
unsigned long aktuellzeit = 0;
void setup() {
  //----------------------------------------------------
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  //----------------------------------------------------
  Serial.begin(9600);
  //----------------------------------------------------
  ads.begin(ADS_I2C_ADDR, &Wire);
  // Werte 1-fach verstärken (ESP32 liefert  max. 3,3V)
  ads.setGain(GAIN_ONE);
  //----------------------------------------------------
  lcd.setCursor (0, 0);            // Zeile 1
  //----------------------------------------------------
  pinMode(panel, INPUT);         // Spannung vom Panel
  //----------------------------------------------------
  ServoHorizontal.attach(Servo1);
  ServoVertikal.attach(Servo2);
  sekundenablauf1 = millis();
  sekundenablauf2 = millis();
  ServoVertikal.setSpeed(5);
  ServoHorizontal.setSpeed(5);
  ServoVertikal.write(startposvertikal);
  ServoHorizontal.write(startposhorizontal);
}
void loop() {
  aktuellzeit = millis();
  //Jede Sekunde Spannung am Panel messen
  if (aktuellzeit - sekundenablauf1 >= pausezeit1) // Eine Sekunde abgelaufen?
  {
    panelwert = analogRead(panel);
    panelspannung = panelwert * 20.3 / 1024.0;
    lcd.setCursor (14, 0);            // Zeile 1
    lcd.print (panelspannung);
    if (ablauf == 3)
    {
      lcd.setCursor (0, 0);            // Zeile 1
      lcd.print (F("Panelspannung "));
    }
    if (ablauf == 4)
    {
      lcd.setCursor (0, 0);            // Zeile 1
      lcd.print (F("Nachtbetrieb  "));
    }
    sekundenablauf1 = millis();
  }
  // -----Kanal 0 Messung------------------------------
  adc0 = ads.readADC_SingleEnded(0);
  ads_mv0 = ads.computeVolts(adc0) * 1000;
  lcd.setCursor (12, 2);             // Zeile 3
  lcd.print (ads_mv0);
  // -----Kanal 1 Messung------------------------------
  adc1 = ads.readADC_SingleEnded(1);
  ads_mv1 = ads.computeVolts(adc1) * 1000;
  lcd.setCursor (0, 2);            // Zeile 3
  lcd.print (ads_mv1);
  // -----Kanal 2 Messung------------------------------
  adc2 = ads.readADC_SingleEnded(2);
  ads_mv2 = ads.computeVolts(adc2) * 1000;
  lcd.setCursor (6, 1);             // Zeile 2
  lcd.print (ads_mv2);
  // -----Kanal 3 Messung------------------------------
  adc3 = ads.readADC_SingleEnded(3);
  ads_mv3 = ads.computeVolts(adc3) * 1000;
  lcd.setCursor (6, 3);            // Zeile 4
  lcd.print (ads_mv3);
  //------------Lichtquelle suchen---------------------
  if (ablauf == 3)
  {
    if (aktuellzeit - sekundenablauf2 >= pausezeit2) { // Alle 50ms
      //--------Horizontal Kontrolle plus--------------
      if (kontrolle1 == 0)
      {
        if ((ads_mv1) < ads_mv0) // Links dunkler als rechts
        {
          if (poshorizontal > 0)
          {
            poshorizontal = poshorizontal - 1; // Fahre nach rechts
            ServoHorizontal.write(poshorizontal);
            lcd.setCursor (0, 3);
            lcd.print ("   ");
            lcd.setCursor (0, 3);
            lcd.print (poshorizontal);
          }
        }
        else
        {
          kontrolle1 = 1;
        }
      }
      //--------Horizontal Kontrolle minus-------------
      if (kontrolle2 == 0)
      {
        if ((ads_mv1) > ads_mv0) // Links heller als rechts
        {
          if (poshorizontal < 180)
          {
            poshorizontal = poshorizontal + 1; // Fahre nacht Links
            ServoHorizontal.write(poshorizontal);
            lcd.setCursor (0, 3);
            lcd.print ("   ");
            lcd.setCursor (0, 3);
            lcd.print (poshorizontal);
          }
        }
        else
        {
          kontrolle2 = 1;
        }
      }
      //-------Vertikale Kontrolle plus----------------
      if (kontrolle3 == 0)
      {
        if ((ads_mv3) < ads_mv2)  // Hinten dunkler als vorne
        {
          if (posvertikal > 60)
          {
            posvertikal = posvertikal - 1;  // Fahre runter
            ServoVertikal.write(posvertikal);
            lcd.setCursor (17, 3);
            lcd.print ("   ");
            lcd.setCursor (17, 3);
            lcd.print (posvertikal);
          }
        }
        else
        {
          kontrolle3 = 1;
        }
      }
      //--------Vertikal Kontrolle minus---------------
      if (kontrolle4 == 0)
      {
        if ((ads_mv3) > ads_mv2) // Hinten heller als vorne
        {
          if (posvertikal < 180)
          {
            posvertikal = posvertikal + 1; // Fahre hoch
            ServoVertikal.write(posvertikal);
            lcd.setCursor (17, 3);
            lcd.print ("   ");
            lcd.setCursor (17, 3);
            lcd.print (posvertikal);
          }
        }
        else
        {
          kontrolle4 = 1;
        }
      }
      //-------Vertikale Kontrolle Ende-------------------

      //------------Lichtquelle suchen Ende-----------------
      sekundenablauf2 = aktuellzeit;
    }

  }
  //------------Kontrolle wieder aktivieren-------------
  //--------------------auf / ab------------------------
  if (ablauf == 3)
  {
    if (kontrolle1 == 1)
    {
      if ((ads_mv1 + 300) <= ads_mv0) // Links dunkler als rechts
      {
        kontrolle1 = 0;
      }
    }
    if (kontrolle2 == 1)
    {
      if ((ads_mv1) >= (ads_mv0 + 300)) // Links heller als rechts
      {
        kontrolle2 = 0;
      }
    }
    //-----------------rechts / links-------------------
    if (kontrolle3 == 1)
    {
      if ((ads_mv3 + 300) <= ads_mv2)  // Hinten dunkler als vorne
      {
        kontrolle3 = 0;
      }
    }
    if (kontrolle4 == 1)
    {
      if ((ads_mv3) >= (ads_mv2 + 300)) // Hinten heller als vorne
      {
        kontrolle4 = 0;
      }
    }
  }
  //-----------------------------------------------------
  //--------------Kontrolle ob schon zu Dunkel-----------
  if ((ads_mv0 < 500) || (ads_mv1 < 500) || (ads_mv2 < 500) || (ads_mv3 < 500))
  {
    ablauf = 4;
  }
  else
  {
    if ((ads_mv0 > 700) && (ads_mv1 > 700) && (ads_mv2 > 700) && (ads_mv3 > 700))
    {
      ablauf = 3;
    }
  }
  //-----------------------------------------------------
  //---------In die Nachtposition fahren-----------------
  if (ablauf == 4)
  {
    ServoVertikal.write(startposvertikal);
    ServoHorizontal.write(startposhorizontal);
  }
  //-----------------------------------------------------
}
.
.
Sonnen_Nachführung_Solarpanel.JPG
Sonnen_Nachführung_Solarpanel.JPG (360.03 KiB) 809 mal betrachtet
Max
Beiträge: 78
Registriert: Di 27. Sep 2022, 17:37
Kontaktdaten:

Re: Die Position der Sonne mit Sensoren bestimmen

Beitrag von Max »

Hallo Franz,
Es gibt keine spezielle Morgenstellung. Es gibt nur die Automatische Einstellung auf die hellste Richtung.
wenn ich das recht verstehe, dann bleibt das Panel am Abend da stehen, wo es den Dunkelwert erreicht hat.
Wie finden dann am Morgen die Lichtsensoren den hellsten Punkt, wenn die Sonne im Rücken des Panels ist.

Gruß
Max
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Die Position der Sonne mit Sensoren bestimmen

Beitrag von Admin »

Die Sensoren sind an den 4 äuseren Enden der Platine. Also dass keiner der 4 Sensoren ein helleres Licht bekommt, heller wie die anderen drei, ist wohl unwahrscheinlich. Und wenn einer ein Helleres Licht hat als die anderen. Dann fährt das Ding ja in diese Richtung. Und nein, ich habe einen Startpunkt, zur Zeit 90 Horizontal, 90 Vertikal. Und dieser Punkt ist auch die Parkposition an die das Panal fährt, wenn es zu dunkel wird. Diese Pos. kann man naürlich auch anpassen. Und die sollte schon in Mittelpunkt der möglichen Bewegung sein. Und die Fahrt in Richtung zur Hellsten Lichtquelle, macht das Ding von ganz alleine, sobald alle vier Sensoren eine Morgendliche Mindesthelligkeit erkennen. Also ein Wert größer 1300 auf allen vier Sensoren. Und der Sensor der den größten Wert hat, wird gleich angefahren, weil das die Sonne vermutet wird. DIese Werte sind natürlich nur im Moment so, wenn ich die Verdunklungsfolie drauf habe, werde ich diese Werte wohl weiter nach unten setzen müßen. Ein Sensor unter 1000, dann wird die Übernachtungspos. angefahren, alle vier Sensoren über 1300, dann wird losgefahren und die hellste Pos. gesucht. Maximaler Wert bei jedem Sensor 4095.

Franz
Max
Beiträge: 78
Registriert: Di 27. Sep 2022, 17:37
Kontaktdaten:

Re: Die Position der Sonne mit Sensoren bestimmen

Beitrag von Max »

Hallo Franz,
ich habe einen Startpunkt, zur Zeit 90 Horizontal, 90 Vertikal.
Ein Sensor unter 1000, dann wird die Übernachtungspos. angefahren
jetzt ist es klar, damit sollte es klappen.
Damals hatte ich auch so Milchglasscheiben auf meinen Sensoren (siehe Bild weiter zurück).
Wahrscheinlich waren die zwei winkelig angeortneten Sensoren nicht ausreichend.
Darum habe ich auf Zeitsteuerung umgestellt.
Es sieht schon gut aus, wenn beide Panels gleichzeitig zustellen wie von Geisterhand.

Gruß
Max
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste