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-Paneelen 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.
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 nahezu identisch sind, was bedeutet, dass das Licht
im gleichen Winkel auf die Sensoren fällt.
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.
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ührung 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
besonders 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);
}
Statt den Servo-Motoren könnte man auch normale Gleichstrom-Motoren benutzten, die über ein Getriebe die Plattform 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.
zurück