Zweiachsen-Solartracker mit Arduino UNO – DIY Solarpanel-Nachführung
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino UNO | 1 |
| SG90 Mikro-Servomotor | 2 |
| LDR (Lichtabhängiger Widerstand), 5 MΩ | 4 |
| Widerstand 330 Ω | 4 |
| Drehpotentiometer | 1 |
| Taster (Pushbutton) | 2 |
| Mini-Solarpanel | 1 |
Benötigte Werkzeuge & Software
- Arduino IDE
- Parallax PLX-DAQ (Excel-Makro für Datenerfassung)
Projektbeschreibung
Dieses Projekt stellt einen Open-Hardware/Software-Teststand für einen Solartracker vor. Der Prototyp basiert auf einem zweiachsigen Solartracker, der mit einem Arduino Uno gesteuert wird. Der Tracker kann automatisch über vier LDR-Sensoren oder manuell über ein Potentiometer gesteuert werden. Ein Taster schaltet zwischen den Modi, ein weiterer wählt die Achse (Hoch/Runter oder Links/Rechts) für die manuelle Steuerung.
Zusätzlich bietet der Teststand virtuelle Instrumentierung auf Basis von Excel: Solarpanel-Daten (Spannung, Strom, Leistung) werden in Echtzeit aufgezeichnet und dargestellt. Die Hardware ist kostengünstig, kompakt und vielseitig – ideal für Studierende, um Regelungstechnik zu verstehen und anzuwenden.
Mechanisches Design
Das 3D-CAD-Modell wurde in CATIA erstellt. Der Tracker besteht aus dem PV-Panel, zwei Servomotoren (Links/Rechts und Hoch/Runter) und vier LDR-Sensoren in den Ecken des Panels. Für die horizontale Achse ist ein Lager parallel zum Hoch/Runter-Servo verbaut. Die LDRs sitzen in dunklen Röhrchen mit kleiner Öffnung – diese wirken als Strahlungskonzentratoren und erhöhen die Robustheit.
Hardware-System
Automatischer Modus: Der Mikrocontroller wandelt die analogen LDR-Werte (Pins A0–A3) in digitale Werte um und steuert zwei Servomotoren über PWM-Signale (Pins 5 und 6). Die Bewegung erfolgt in zwei Achsen: Azimut (Ost-West, täglicher Sonnenlauf) und Elevation (Süd-Nord, jahreszeitlicher Sonnenstand).
Manueller Modus: Ein Potentiometer (Pin A4) steuert die Servos. Taster an Pin 11 wählt die Achse, Taster an Pin 12 schaltet zwischen Auto/Manuell.
LDR-Schaltung: Spannungsteiler mit 330 Ω. Die Lichtintensität ist proportional zur Teilerausgangsspannung. Der 10-Bit-ADC liefert Werte 0–1023.
Servomotoren: Ein MG996R (180°) für Links/Rechts, ein SG90 (Mikro) für Hoch/Runter. Vorteil: Steuerung über einzelnen PWM-Draht ohne Treiber.
Leistungsmessung: PV-Spannung an Pin A5, Strom berechnet über bekannten Lastwiderstand, Leistung = Spannung × Strom. Daten werden per USB an PC gesendet und in Excel (PLX-DAQ) visualisiert.
Eingebettete Software
Die Software auf dem Arduino deckt folgende Anforderungen ab:
- Zwei Modi: Manuell & Automatisch (Umschaltung per Taster Pin 12)
- Manuell: Potentiometer steuert wahlweise Links/Rechts- oder Hoch/Runter-Servo (Umschaltung per Taster Pin 11)
- Automatisch: Algorithmus vergleicht LDR-Durchschnittswerte (links vs. rechts, oben vs. unten). Bewegt sich der Tracker, bis Differenz im Bereich [−10, 10] liegt. Nachts (Durchschnitt < 8) fährt der Tracker in Sonnenaufgangsposition (z. B. 0° / 30°).
- PV-Daten (Spannung, Strom, Leistung, Modus) werden per Serial an PLX-DAQ/Excel gesendet.
PLX-DAQ für Excel-Datenerfassung
Das PLX-DAQ Excel-Makro ermöglicht Datenübertragung vom Arduino direkt in Excel. Nach Installation: Spreadsheet öffnen, Baudrate & Port einstellen, "Connect" klicken – Daten erscheinen in Echtzeit.
Prototyp
Die Struktur wurde aus Holzplatten gefertigt. Abbildungen zeigen zerlegten und montierten Zustand sowie den kompletten Teststand mit künstlicher Lichtquelle zum Testen.
Programmcode
Eingebettete Software für Solartracker-Teststand
#include
int mode = 0; // 0=Manuell, 1=Automatisch
int axe = 0; // 0=Links/Rechts, 1=Hoch/Runter
int buttonState1 = 0, buttonState2 = 0;
int prevButtonState1 = 0, prevButtonState2 = 0;
int ldrtopr = 0, ldrtopl = 1, ldrbotr = 2, ldrbotl = 3;
int topl = 0, topr = 0, botl = 0, botr = 0;
Servo servo_updown;
Servo servo_rightleft;
int threshold_value = 10;
void setup() {
Serial.begin(9600);
Serial.println("CLEARDATA");
Serial.println("LABEL,t,voltage,current,power,Mode");
pinMode(12, INPUT); // Modus-Taster
pinMode(11, INPUT); // Achsen-Taster
pinMode(A4, INPUT); // Potentiometer
servo_updown.attach(5);
servo_rightleft.attach(6);
}
void loop() {
// PV-Leistung messen
float volt = analogRead(A5) * 5.0 / 1023.0;
float voltage = 2 * volt; // Spannungsteiler R1=R2=10Ω
float current = voltage / 20.0; // I = U / (R1+R2)
float power = voltage * current;
Serial.print("DATA,TIME,");
Serial.print(voltage); Serial.print(",");
Serial.print(current); Serial.print(",");
Serial.print(power); Serial.print(",");
char Mode;
buttonState1 = digitalRead(12);
if (buttonState1 != prevButtonState1) {
if (buttonState1 == HIGH) {
mode = (mode == 1) ? 0 : 1;
}
}
prevButtonState1 = buttonState1;
delay(50);
if (mode == 0) {
Mode = 'M';
Serial.println(Mode);
manualsolartracker();
} else {
Mode = 'A';
Serial.println(Mode);
automaticsolartracker();
}
}
void automaticsolartracker() {
topr = analogRead(ldrtopr);
topl = analogRead(ldrtopl);
botr = analogRead(ldrbotr);
botl = analogRead(ldrbotl);
int avgtop = (topr + topl) / 2;
int avgbot = (botr + botl) / 2;
int avgleft = (topl + botl) / 2;
int avgright = (topr + botr) / 2;
int diffelev = avgtop - avgbot;
int diffazi = avgright - avgleft;
// Links/Rechts (Azimut)
if (abs(diffazi) >= threshold_value) {
if (diffazi > 0) {
if (servo_rightleft.read() < 180)
servo_rightleft.write(servo_rightleft.read() + 2);
} else {
if (servo_rightleft.read() > 0)
servo_rightleft.write(servo_rightleft.read() - 2);
}
}
// Hoch/Runter (Elevation)
if (abs(diffelev) >= threshold_value) {
if (diffelev > 0) {
if (servo_updown.read() < 180)
servo_updown.write(servo_updown.read() - 2);
} else {
if (servo_updown.read() > 0)
servo_updown.write(servo_updown.read() + 2);
}
}
}
void manualsolartracker() {
buttonState2 = digitalRead(11); // Hinweis: Original nutzt Pin 13, aber Setup definiert Pin 11
if (buttonState2 != prevButtonState2) {
if (buttonState2 == HIGH) {
axe = (axe == 1) ? 0 : 1;
}
}
prevButtonState2 = buttonState2;
delay(50);
if (axe == 0) {
servo_rightleft.write(map(analogRead(A4), 0, 1023, 0, 180));
} else {
servo_updown.write(map(analogRead(A4), 0, 1023, 0, 180));
}
}
Schaltplan

Herstellungsprozess
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- DIY Arduino USB Gaming Controller – Bauen Sie Ihren eigenen High-Performance Gamepad
- Solar Tracker V2.0 – Fortgeschrittenes DIY-Solarnachführsystem
- Pixel Chaser: Interaktives One-Tap-LED-Spiel mit Arduino Nano
- IoT-Solartracker: Intelligentes Energiemanagement mit Arduino Mega
- Arduino-basierte abstoßende Magnetschwebung: Einfache Schaltung & DIY-Anleitung
- Alexa-fähiger Arduino Home Controller: Smarte Automatisierung leicht gemacht
- NeoPixel-Matrix Pong auf Arduino Nano: Neon-Pong selbst bauen
- Präzise Solareinstrahlungsmessung mit Arduino UNO & Ethernet Shield
- DIY LED-Roulette – Ein-Personen-Arcade-Spiel mit Arduino Nano