Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Zweiachsen-Solartracker mit Arduino UNO – DIY Solarpanel-Nachführung

Komponenten und Zubehör

KomponenteMenge
Arduino UNO1
SG90 Mikro-Servomotor2
LDR (Lichtabhängiger Widerstand), 5 MΩ4
Widerstand 330 Ω4
Drehpotentiometer1
Taster (Pushbutton)2
Mini-Solarpanel1

Benötigte Werkzeuge & Software

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:

  1. Zwei Modi: Manuell & Automatisch (Umschaltung per Taster Pin 12)
  2. Manuell: Potentiometer steuert wahlweise Links/Rechts- oder Hoch/Runter-Servo (Umschaltung per Taster Pin 11)
  3. 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°).
  4. 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

Zweiachsen-Solartracker mit Arduino UNO – DIY Solarpanel-Nachführung

Herstellungsprozess

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