Sonnenanbeter
mit Fotowiderstand, Arduino und Schrittmotor
Mit „Sonnenanbeter“ konstruieren wir eine Schaltung, die als Lichtverfolger bezeichnet werden kann.
Die Hauptrolle spielen hier zwei Fotowiderstände, die ihren Widerstand abhängig von der Lichteinstrahlung verändern
und in der Schaltung die Rolle der Lichtsensoren übernehmen. Bei ansteigender Lichteinstrahlung verringert sich der
Widerstand der Fotowiderstände. Und umgekehrt: Bei immer geringerer Lichteinstrahlung vergrößert sich der Widerstand.
Genau diese Tatsache wird in der Schaltung genutzt. Die Fotowiderstände werden mit je einem festen 10 kOhm Widerstand
in Reihe verschaltet. Die Spannungsverhältnisse an so gebildeten Spannungsteilern ändern sich dann abhängig vom Licht.
Die Spannungen der beiden Spannungsteiler werden an die analogen Eingänge des Arduino geführt, dort gemessen und
verglichen.
Die richtige Funktionalität der Schaltung hängt von der Einstellung der beiden Lichtsensoren ab. Sie werden in
kleiner Entfernung voneinander positioniert und leicht nach links und rechts ausgerichtet. Natürlich sollen sie
ungehindert von einer Lichtquelle bestrahlt werden können.
In dem konkreten Beispiel befinden sich die Lichtsensoren auf einem Teller, der durch einen Motor bewegt werden
kann. Das Ziel der Schaltung ist es, dafür zu sorgen, dass beide Sensoren die gleiche Lichteinstrahlung erfahren. Wenn
sich die Lichtquelle, z.B. die Sonne, bewegt, muss der Teller ebenfalls bewegt werden, um den alten Zustand der
gleichen Lichteinstrahlung beiden Sensoren herzustellen. So entsteht der Effekt eines Lichtverfolgers.
Fotowiderstand
Der Widerstand der Lichtsensoren, die in der Schaltung zur Messung der Lichteinstrahlung zum
Einsatz kommen, pendelt zwischen ca. 10 MOhm (dunkel) und 500 Ohm (hell). Damit liefern die mit festen Widerständen
von 10 kOhm gebildete Spannungsteiler Spannungen zwischen 0,23V bis 4,99V. Fotowiderstände, auch Photoresistoren oder
LDR (Light Dependent Resistor) genannt, können zu sehr günstigen Preisen unter 1 Euro erworben
werden.
Bei dem Motor 28BYJ-48 handelt es sich um einen Schrittmotor, der für eine volle Umdrehung 2048
Schritte benötigt. Die Drehung des Motors wird durch elektrische Impulse hervorgerufen. Mit der Anzahl der
Impulse, die Reihenfolge und Frequenz werden der gesamte Winkel der Drehung, die Drehrichtung und die Geschwindigkeit
des Motors bestimmt. Der 28BYJ-48 arbeitet mit 5VDC.
Motoranschluss
Technische Daten:
Nennspannung: 5VDC
Anzahl der Phasen: 4
Geschwindigkeitsänderungsverhältnis: 1/64
Schrittwinkel: 5,625° / 64
Widerstand: 50 Ohm
Wellendurchmesser: 5 mm
Abmessungen: 31 mm (Länge), 28 mm (Breite), 29 mm (Höhe)
Zwischen dem Motor und Arduino wird ein Motortreiber zwischengeschaltet. Das ist notwendig, da die
Arduino-Ausgänge nur begrenzt belastet werden können. Bei dem Treiber handelt es sich um ein fertiges Modul, das
auf dem IC ULN2003A basiert. Der Baustein verfügt über sieben Kanäle und kann pro Kanal mit 500 mA
belastet werden.
Die Messung der Spannungen an den Spannungsteilern und ihre Auswertung erledigt Arduino Uno. In der
Schaltung werden sieben digitale I/Os und zwei analoge Eingänge des Mikrocontrollers in Anspruch genommen. Das
bedeutet, dass noch viele freie Pins für eventuelle Erweiterungen zur Verfügung
stehen.
// ************************************************************************************
// Sonnenanbeter
// Schaltung mit Arduino UNO, Schrittmotor 28BYJ-48, Motortreiber ULN2003
// und zwei Fotowiderständen
// Arduino UNO
// IDE 1.8.19
// ************************************************************************************
#include<Stepper.h> // Bibliothek einbinden
int Schritte_pro_Umdrehung = 1024;
Stepper myStepper(Schritte_pro_Umdrehung, 2, 4, 3, 5);
int Taster_Manuell_Links = 8; // Manuelle Steuerung LINKS
int Taster_Manuell_Rechts = 9; // Manuelle Steuerung RECHTS
int Schalter_Automatik = 10; // Schalter für Automatik
int Fotowiderstand_Rechts; // Helligkeitsmessung LINKS
int Fotowiderstand_Links; // Helligkeutsmessung RECHTS
int Wert_Analog; // Analogeingang auslesen
int Abweichung = 0; // Hysterese
void setup() {
pinMode (Taster_Manuell_Links, INPUT_PULLUP); // Taster Bewegung LINKS
pinMode (Taster_Manuell_Rechts, INPUT_PULLUP); // Taster Bewegung RECHTS
pinMode (Schalter_Automatik, INPUT_PULLUP); // Umschaltung auf AUTO
}
void loop() {
// HAUPTPROGRAMM ..............................
Fotowiderstand_Links = 0; // Analoger Eingang wird
for (int i = 0; i < 10; i++) { // 10 Mal ausgelesen
Wert_Analog = analogRead (A1);
Fotowiderstand_Links = Fotowiderstand_Links + Wert_Analog;
}
Fotowiderstand_Links = Fotowiderstand_Links / 10; // Mittelwert
Fotowiderstand_Rechts = 0; // wie oben
for (int i = 0; i < 10; i++) {
Wert_Analog = analogRead (A0);
Fotowiderstand_Rechts = Fotowiderstand_Rechts + Wert_Analog;
}
Fotowiderstand_Rechts = Fotowiderstand_Rechts / 10;
if (digitalRead(Schalter_Automatik) == LOW) { // Automatik aktiviert
// Bewegung LINKS
if (Fotowiderstand_Links > (Fotowiderstand_Rechts + Abweichung)) {
myStepper.setSpeed(5);
myStepper.step(-1);
Abweichung = 0;
}
// Bewegung RECHTS
if (Fotowiderstand_Rechts > (Fotowiderstand_Links + Abweichung)) {
myStepper.setSpeed(5);
myStepper.step(1);
Abweichung = 0;
}
}
// Ziel erreicht
if (Fotowiderstand_Links == Fotowiderstand_Rechts) {
Abweichung = 20;
}
// Hand Betrieb - Manuell LINKS drehen ...........
if (digitalRead(Taster_Manuell_Links) == LOW) {
myStepper.setSpeed(10);
myStepper.step(-1);
Abweichung = 0;} // Abweichung für AUTO nullen
// Hand Betrieb - Manuell RECHTS drehen ..........
if (digitalRead(Taster_Manuell_Rechts) == LOW) {
myStepper.setSpeed(10);
myStepper.step(1);
Abweichung = 0;} // Abweichung für AUTO nullen
}