zurück

Solar Tracker

In diesem Versuch wird ein Modul-Prototyp mit einer 2-achsigen Basis gebaut, die sich immer in Richtung der stärksten Lichteinstrahlung dreht. Dieses Modul hat außer der Nachführung keinen weiteren Nutzen, kann aber z.B. zur optimalen Ausrichtung von Solar-Panelen verwendet werden. In einer etwas modifizierten Variante kann beispielsweise auch ein (selbstfahrendes) Fahrzeug mit dieser Logik ausgestattet werden, so dass es aus einer dunkleren Umgebung wieder ans Licht (z.B. Höhlenausgang) finden kann.

Funktionsprinzip

Die Idee hinter diesem Aufbau (siehe unten) ist, dass das (Sonnen-)Licht auf ein Bauteil immer in einem bestimmten Winkel fällt und das Modul sich immer so zum Licht drehen soll, dass das Licht im 90°-Winkel darauf fällt.
Um den Auftreffwinkel des Lichts feststellen zu können reicht es nicht, ein lichtempfindliches Bauteil (hier: Fotowiderstand) zu verwenden, sondern mindestens 4 Stück (für dreidimensionale Nachführung des Moduls). Jeder Fotowiderstand muss so zu seinen anderen "Kollegen" bzw. des Lichteinfalls isoliert werden, dass der Einstrahlwinkel des Lichts verschiedene Sensorwerte auf den einzelnen Fotowiderständen generiert.
Im Mikrocontroller (Arduino) kann nun anhand der unterschiedlichen, gemessenen Lichtwerte das Modul so gedreht bzw. geneigt werden, so dass die Werte aller 4 Fotowiderstände nahzu identisch sind, was bedeutet, dass das Licht im gleichen Winkel auf die Sensoren fällt.

Verwendete Bauteile

Aufbau

Schaltplan des Solar Trackers
Abb.: Schaltplan des Solar Trackers

Die beiden Servos müssen so aufgebaut werden, dass sie sich in zwei Achsen bewegen können (vertikal und horizontal). Dazu habe ich einen fertigen 2-Achsen-Fuß für Servos verwendet, der eigentlich zur Montage einer Kamera gedacht ist. An den oberen Servo (vertikale Bewegung) wird eine Plattform befestigt, die in 4 gleiche Segmente abgeteilt ist, wobei zwischen den Segmenten kein Licht durchdringen darf. Es können z.B. auch lichtdichte Röhren verwendet werden. Auf den Boden jedes dieser Segmente wird ein Fotowiderstand (LDR) montiert.

2-Achsen-Fuß für Servo-Motoren
Abb.: 2-Achsen-Fuß für Servo-Motoren dient als Gelenk zum Rotieren und Kippen des Moduls
Aufbau mit LEGO-Teilen
Abb.: Die Abschirmung zwischen den Fotowiderständen wird mit einigen LEGO-Teilen vorgenommen.
Verdrahtung der Fotowiderstände
Abb.: Um die Fotowiderstände besser anstecken zu können wurden 2,54mm-Stiftleisten daran gelötet
Verdrahtung der Fotowiderstände
Abb.: Die Fotowiderstände werden an weibliche Jumperkabel gesteckt, um dann auf dem Breadboard verkabelt zu werden.
Aufbau des Solar-Trackers
Abb.: Fertiger Aufbau des Solar-Trackers
Aufbau des Solar-Trackers
Abb.: Fertiger Aufbau und gesamte Schaltung des Solar-Trackers mit Breadboard

Sketch

Der folgende Sketch führt die Basis in vordefinierten Schritten in die Richtung des stärksten Lichteinfalls und fängt dann sofort wieder mit der Prüfung der Helligkeit an. Dadurch kann das Modul sich recht schnell völlig neuen Lichtverhältnissen anpassen. Wird es jedoch z.B. für eine Nachführung von Solarpanelen verwendet, so kann durchaus zwischen den einzelnen Iterationen zur Nachfürhung eine längere Pause gemacht werden, denn die Sonne bewegt nur recht langsam über den Himmel.
Ich verwende hier zusätzlich eine Library für langsam drehende Servo-Motoren, damit eine zu abrupte Drehung nicht den Prototypen-Aufbau gefährdet. (die LEGO-Steine sitzen teilweise nicht besonder fest).

#include <VarSpeedServo.h>

#define PIN_SERVO_BOTTOM 5
#define PIN_SERVO_TOP    6

#define PIN_LDR_NO A0
#define PIN_LDR_NW A1
#define PIN_LDR_SO A2
#define PIN_LDR_SW A3

#define LDR_SENSITIVITY 10
#define SERVO_STEP       2

#define SERVO_ROTATE_MIN   0
#define SERVO_ROTATE_MAX 170
#define SERVO_TILT_MIN    10
#define SERVO_TILT_MAX    90

VarSpeedServo servoRotate, servoTilt;
byte posRotate, posTilt;
int ldrNo, ldrNw, ldrSo, ldrSw, diff;

void setup()
{
    servoRotate.attach(PIN_SERVO_BOTTOM);
    servoTilt.attach(PIN_SERVO_TOP);

    // move servos to center position
    posRotate = (int)((SERVO_ROTATE_MAX-SERVO_ROTATE_MIN)/2);
    servoRotate.write(posRotate, 20, true);

    posTilt = (int)((SERVO_TILT_MAX-SERVO_TILT_MIN)/2);
    servoTilt.write(posTilt, 20, true);
}

void loop()
{
    ldrNo = analogRead(PIN_LDR_NO);
    ldrNw = analogRead(PIN_LDR_NW);
    ldrSo = analogRead(PIN_LDR_SO);
    ldrSw = analogRead(PIN_LDR_SW);

    diff = (ldrNo + ldrNw)/2 - (ldrSo + ldrSw)/2;
    if (abs(diff) > LDR_SENSITIVITY) {
        if (diff < 0) {
            if (posTilt + SERVO_STEP <= SERVO_TILT_MAX) {
                posTilt+=SERVO_STEP;
                servoTilt.write(posTilt+SERVO_STEP, 10, true);
            }
        } else {
            if (posTilt - SERVO_STEP >= SERVO_TILT_MIN) {
                posTilt-=SERVO_STEP;
                servoTilt.write(posTilt-SERVO_STEP, 10, true);
            }
        }
    }

    diff = (ldrNo + ldrSo)/2 - (ldrNw + ldrSw)/2;
    if (abs(diff) > LDR_SENSITIVITY) {
        if (diff < 0) {
            if (posRotate + SERVO_STEP <= SERVO_ROTATE_MAX) {
                posRotate+=SERVO_STEP;
                servoRotate.write(posRotate+SERVO_STEP, 10, true);
            }
        } else {
            if (posRotate - SERVO_STEP >= SERVO_ROTATE_MIN) {
                posRotate-=SERVO_STEP;
                servoRotate.write(posRotate-SERVO_STEP, 10, true);
            }
        }
    }

    // wait until both servos are in new position
    while(servoTilt.isMoving() && servoRotate.isMoving()) {}

    // optional delay between measurings
    // delay(1000);
}

Varianten

Statt den Servo-Motoren könnte man auch normale Gleichstrom-Motoren benutzten, die über ein Getriebe die Platform bewegen. Eine vereinfachte Form wäre auch ein 1-achsiges Modul, welches eine starre horizontale Ebene besitzt und sich nur horizontal drehen kann. Es gibt auch die Möglichkeit, einen Solar Tracker ohne Mikrocontroller aufzubauen, welcher in diesem Falle auf einem LM324 Operationsverstärker basiert.