Irgendwo im Netz habe ich vor kurzem ein Video eines Roboters gesehen, der als bewegliche Plattform eine darauf abgestellte Zimmerpflanze immer an den hellsten Punkt im Raum bewegt. Ganz so anspruchsvoll ist dieser einfache Lichtverfolger nicht und mit nur einem Servo kann man ohnehin keine großen Sprünge machen.

Ziel dieses Projekts ist eine Schaltung und ein Arduino Sketch, mit dem ein Modellbauservo in der Lage ist, einer sich bewegenden Lichtquelle zu folgen.

Benötigte Bauteile

Die lichtempflindlichen Widerstände sollten so auf den Servo montiert werden, dass sie möglichst getrennte Blickfelder haben. Ich hab das mit 2 kleinen Hartschaumstücken so gelöst. Die lichtempfindlichen Widerstände habe ich zuerst auf das Doppelklebeband gedrückt und dann noch mit Isolierband befestigt.

Achtung: Die beiden Beinchen eines Widerstands dürfen sich unter dem Klebeband nicht berühren!

light-follower-resistors

Die Schaltung am Breadboard besteht aus zwei Spannungsteilern für die beiden lichtempfindlichen Widerstände. Diese werden an die Analogpins 0 und 1 geführt. Zum Thema Spannungsteiler und lichtempfindliche Widerstände habe ich schon einmal ein Video gemacht: Arduino: LED und Lichtsensor.

Im aktuellen Video ist der Aufbau samt Schaltung ebenfalls erklärt:


Und hier der benötigte Arduino Sketch.

Anpassen müsst ihr vielleicht den Toleranzwert im loop(). Ich hab hier 20 verwendet, abhängig von eurem Widerständen kann hier aber auch ein höherer oder niedrigerer Wert sinnvoll sein. Diese Toleranz gibt den maximalen Unterschied zwischen rechtem und linkem Messwert an, bei dem der Servo noch nicht bewegt wird. Steigt die Differenz der beiden Messungen über diesen Wert, dann wird der Servo in Schritten von 2 Grad in Richtung der helleren Seite bewegt. Je kleiner der Wert gewählt wird, desto nervöser wird der Servo.

// Servo-Library einbinden
#include <Servo.h>

// Servo-Objekt erzeugen
Servo myservo;

// Startwinkel für den Servo (Bereich 0-179 Grad)
int angle = 90;


void setup() {
// Serielle Schnittstelle initialisieren
Serial.begin(9600);
// Pin 3 als Ausgabe-Pin
pinMode(3, OUTPUT);
// Pin 3 ist Steuerpin für den Servo
myservo.attach(3);
}


void loop() {

// Helligkeit der beiden lichtempfindlichen Widerstände
int rightEye = analogRead(0);
int leftEye = analogRead(1);

// Differenz ausrechnen
int diff = (rightEye - leftEye);

// Wenn rechts deutlich heller als links -> 2 Grad nach rechts drehen
if (diff > 20) {
angle = angle+2;
}

// Wenn links deutlich heller als rechts -> 2 Grad nach links drehen
if (diff < -20) {
angle = angle-2;
}

// Servo max. bis 179 Grad drehen
if (angle > 179) {
angle = 179;
}

// Servo min. bis 0 Grad drehen
if (angle < 0) {
angle = 0;
}

// Grad an den Servo schicken
myservo.write(angle);

// Die beiden Helligkeitswerte zu Testzwecken an den PC übertragen
Serial.println(String(rightEye)+"-"+String(leftEye));

// Kurze Wartezeit, dann nächste Messung.
// Sollte es beim Testen der Einstellungen zu chaotisch werden,
// diesen Wert einfach auf 50 oder 100 erhöhen und damit den Vorgang verlangsamen
delay(20);
}
Code-Sprache: Arduino (arduino)

Das war es schon. Fragen, Anregungen und Kritik bitte einfach als Kommentar hinterlassen. Vielen Dank.

13 thoughts on “Lichtverfolgung mit dem Arduino – Arduino Light Follower

  • 26. Mai 2015 at 10:38
    Permalink

    Hallo Adi, obwohl ich lange nach einfachen Möglichkeiten gesucht habe, als Mann im fortgeschrittenen Alter (62) in die Arduino-Welt einzusteigen, bin ich eher durch Zufall auf diesen wunderbaren Blog gestoßen. Alles ist so einfach erklärt, dass ein Nachbauen und -vollziehen fast sofort gelingt. So auch dieser einfache Lichtverfolger. Was ich gern machen würde ist, das Servo durch 2 Relais (Arduino-2-Relais-Karte) zu ersetzen, um einen etwas stärkeren (Getriebe-)Motor ansteuern zu können. Ich denke da an einen Scheibenwischermotor, an dessen Achse man das Poti koppeln könnte. Das müsste doch so machbar sein-oder? Theoretisch (meine Gedanken) könnte man das Poti aber auch weglassen, da das ja den Servoweg begrenzt.
    Wenn jetzt z.B. ein Solarpanel auf die Getriebemotorachse montiert wird, mit den beiden Fotowiderständen, fährt das Panel in die Sonne und verfolgt die Sonne bis zum Untergang. In der Nacht reicht Mond oder Sternenlicht nicht aus, um das Panel auszurichten. Morgens müßte sich (theoretisch) das Panel wieder der Sonne (Osten) zuwenden… , auch wenn es immer noch vom Abend her nach Westen steht?
    Ich hoffe, kein allzu großes Problem aufgeworfen zu haben. Gibt es für diese Variante einen Sketch? Auch wenn ich mich mühe, bin ich doch eher der Mechaniker…
    Viele Grüße aus Mecklenburg,
    Hans-Martin

    Reply
    • 28. Mai 2015 at 21:47
      Permalink

      Hallo Hans-Martin,
      danke erstmal für das Lob. Einen Sketch genau für diesen Anwendungsfall habe ich nicht parat, aber das ist ein interessanter Anwendungsfall. Die Ansteuerung von Relais ist ja sehr einfach, der Aufbau wie von dir beschrieben könnte schon funktionieren. Was die Ansteuerung eines Scheibenwischermotors betrifft, da habe ich leider noch keine Erfahrung. Aber schau mal hier http://rn-wissen.de/wiki/index.php/Getriebemotoren_Ansteuerung fast ganz unten (Abschnitt „Noch mehr Power gewünscht?“), da wird speziell auf das Thema eingegangen.
      Zur Software: Wie beim kleinen Lichtverfolger müsste man gewissen Toleranzschwellen einbauen, damit die Ausrichtung nur bei stärkeren Schwankungen passiert (und nicht mehr Strom verbraucht als erzeugt wird) und ab einer gewissen Untergrenze ganz stoppen und man kann halt nicht wie beim Servo mit Winkelangaben arbeiten und hat damit keinen fixen Anhaltspunkt bezüglich der aktuellen Position.
      Wenn ich in den nächsten Tagen mal Zeit finde, dann mach ich einen kleinen Aufbau mit einem Gleichstrommotor statt des Servos, da wäre das Prinzip ja ähnlich wie bei deinem Projekt.
      lg, Adi

      Reply
  • 21. Oktober 2015 at 12:05
    Permalink

    Hallo Adi!
    das ist echt ein tolles Projekt. Da ich ein blutiger Anfänger habe ich eine Frage: Ich betreibe schon seit Jahren Flugzeugmodellbau und seit einem Jahr FPV (First Person View). Da man bei FPV außer einem Steuersignal fürs Flugzeug sendet, auch ein Videosignal vom Flugzeug (Kamera) empfängt, möchte ich meine Reichweite mit einem RSSI Antennen Tracker erweitern. Nun meine Frage: Wenn ich die beiden Signalkabel (RSSI) statt deinem Widerstand auf A0 und A1 und minus zu Ground anschließe funktioniert das Programm auch? (Signal zwischen 0,5V und 1V. Desto genauer die Richtantenne auf das Flugzeug zeigt desto höher ist die Spannung . max 1,1V)

    Ich hoffe du kannst mir helfen :-)

    Reply
    • 21. Oktober 2015 at 22:07
      Permalink

      Hallo Philipp,
      ja, das müsste ganz ähnlich funktionieren. Bei 0.5-1V werden die von den Analogpins gelieferten Werte vom Wertebereich her anders liegen, aber das Grundprinzip sollte genau so funktionieren. Wichtig ist dass du GND des Empfängers mit GND des Arduino verbindest, damit es eine gemeinsame Masse gibt. Projekte in diese Richtung gibts schon einige, z.B. http://modellfluginfo.de/Modellflugzeug/Blog/fpv-diversity-mit-antennen-tracker.php
      lg, Adi

      Reply
  • 18. Februar 2016 at 11:46
    Permalink

    Hallo,
    welche Kabel verwendest du da um deine LDRs mit dem breadboard zu verbinden? Hast du da vielleicht einen Link?
    Freue mich auf eine Antwort :)
    LG David

    Reply
  • 9. Mai 2017 at 2:05
    Permalink

    Hallo Adi,

    erstmal ein Riesenlob an Dich. Durch Deine Videos habe ich erst
    richtig Lust auf den Arduino bekommen.

    Ich würde gerne den Sketch auf 2- Achsen erweitern.
    Wie binde ich die beiden zusätzlichen LDR ein, und vor allem den 2. Servo?

    Da ich Langzeitaufnahmen machen möchte, würde ich gerne den Sonnenstand nachverfolgen.

    Lieben Gruß

    Jörg

    Reply
    • 10. Mai 2017 at 10:21
      Permalink

      Hallo Jörg, den 2. Servo kannst du einfach mit einem 2. Servo-Objekt einbinden, also sowas wie

      Servo myservo2;
      myservo2.attach(5);

      Die weiteren beiden LDR könntest du an die Analogpins A2 und A3 anschliessen und dann mit sowas wie

      int topEye = analogRead(2);
      int bottomEye = analogRead(3);

      auslesen. Kniffliger wird allerdings die Positionierung der 4 LDRs und dann die richtige Balance bei der Reaktion auf die Messwerte in 2 Achsen. Ich bin mir ohne das ausprobiert zu haben auch gar nicht sicher, ob dieser Ansatz so überhaupt funktioniert, aber die Aufgabenstellung wäre sehr interessant.

      Reply
  • 22. Juni 2018 at 19:50
    Permalink

    Guten Tag, ich habe diesen „Lichtverfolger“ nachgebaut und funktioniert wie gewünscht ! Für mein Solar-Tracker-Projekt benötige ich noch eine 2. Ebende, für ein 2. Servo ! Wer kann mir helfen und diesen Sketch erweitern ? Danke Uwe

    Reply
  • 28. November 2021 at 22:21
    Permalink

    Hallo und guten Tag
    Super Sache Mit der Lichtverfolgung.
    Der Sketch von ihnen funktioniert echt super.
    Habe versucht eine Erweiterung mit einem zweitem Servo um eine zwei Achsen licht Verabfolgung zu Programmieren, habe aber kein Erfolg.
    Gibt es von ihnen ein Sketch mit zwei Servo Lichtverfolgung?
    Habe schon einige anderen Programme probiert und die haben Fehler versucht die Fehler zu korrigieren, ohne Erfolg.
    Bin ein Anfänger bin erst zwei Jahre dabei und etwas begriff stutzig, aber es ist Gehirn Training bin Rentner.
    Habe aber früher schon mit Fischertechnik und C64 gebastelt
    Eigentlich ist ihr Programm das ein-zigste das sofort ohne Fehler lief.

    Reply
  • 5. Dezember 2022 at 12:29
    Permalink

    Hallo, ich fande das Video sehr hilfreich vallah sogar. Mach weiter so Bra ich glaub an dich. Kuss auf die Nuss

    Reply

Schreibe einen Kommentar zu Jörg Meyer Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Time limit is exhausted. Please reload the CAPTCHA.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.