Title: Programmieranleitung Arduino-IDE
Course: iMINT Akademie Unterrichtsmodul intelligente Solarzelle (iSolar) > Section: Experiment 4: Den größten Spannungswert finden

Nutze den Servo um die Solarzelle optimal auszurichten

Grundstruktur

Entwickle ein Programm, welches die Solarzelle mit dem angeschlossenen Servo optimal ausrichtet. Verwende hierzu die unten vorgegebene Grundstruktur.

- In dem Programm werden die bisherigen Elemente Servo und Spannungsmessung miteinander verknüpft. Schaue dir die vorgegebene Programm-Struktur an und erkläre die Funktionsweise des Programmes.
- Erkläre, welche Variablen verwendet werden und wozu diese jeweils benötigt werden.
- Ergänze dann die markierte Stelle um das Programm zu vervollständigen. Eine Lösung findest du auf der nächsten Seite.

Programm

#include <Servo.h>

int sensorValue = 0; // Variable 'sensorValue' für den Spannungswert der Solarzelle
const int analogInPin = A0; // Anschluss des Pluspols der Solarzelle an den Arduino Nano

Servo servo_hor; // Variable 'servo_hor' für ein Servo-Objekt

int pos = 0; // Variable für die Servoposition in Grad

int maximum = 0;
int merke_pos_hor = 0;

void setup()
{
  // Initialisierung für die serielle Kommunikation mit 9600 Baud (Bits/s)
  Serial.begin(9600);
  servo_hor.attach(2); // horizontaler Servo an Pin 2 angeschlossen
}

void loop()
{
  maximum = 0;

  for (pos = 90; pos < 180; pos += 5) // Schwenkbereich des horizontalen Servos
  {
    servo_hor.write(pos); // sende Steuerbefehl mit der Gradzahl an den horizontalen Servo

    delay(1000);
    // Lies den analogen Spannungswert der Solarzelle:
    sensorValue = analogRead(analogInPin);

    // ERGAENZE:
    // Ist der aktuell gemessene Spannungswert der Solarzelle groesser als das bisher
    // gemessene Maximum, speichere das neue Maximum und merke die Position.

    Serial.print("solarcell = " );
    Serial.print(sensorValue);
    Serial.print("\n" );
  }

  Serial.print("horizontale Position: ");
  Serial.print(merke_pos_hor);
  Serial.print(" bei A0: ");
  Serial.print(maximum);
  Serial.print("\n");
  servo_hor.write(merke_pos_hor);

  delay(10000); // warte 10 Sekunden
}


Öffne den seriellen Monitor der Arduino-Programmierumgebenung und notiere dir die Messwerte in Form eines Diagrammes. Trage dazu die Winkelposition des Servomotors auf der X-Achse ein (z.B. 90 Grad - 180 Grad in 5 Grad-Schritten). Die von der Solarzelle erzeugte Spannung bildet die Y-Achse (0 - 5 Volt). Verbinde anschließend die Meßwerte. Es müsste sich eine Kurve mit einem Maximalwert ergeben. An der Stelle des Maximums kannst du den Servowinkel für den maximalen Spannungswert ablesen.

Lösung

Das folgende Fragment vervollständigt das Programm (rot markierte Stelle):

if (sensorValue > maximum) {
 maximum = sensorValue;
 merke_pos_hor = pos;
}


Hierbei wird der aktuell gemessene Spannungswert in der Variable maximum gespeichert, sofern dieser größer als das letzte gemessene Maximum ist. In diesem Fall wird ebenfalls der aktuelle Winkel in der Variable merke_pos_hor gespeichert.