LDR und Servo

Aufgabenstellung

  1. Informieren Sie sich über die Arbeitsweise eines Servomotors (erste Anlaufstelle: Hintergrundinfos weiter unten).
  2. Können Sie den vorhandenen Servo-Motor direkt am Ausgangsport anschließen? Beachten Sie die Ausgangsspannung und Strombelastbarkeit des Port!
    Evtl. mit Brückenschaltung (–> Übung “Farbwechsel mit RGB-LED-Stripe”, Hintergrundinfo “Motorsteuerung mit einem H-Bridge IC”) arbeiten.
  3. Entwerfen Sie ein VI in LabVIEW, so dass Sie über das Frontpanel Positionen vorgeben können die dann vom Servomotor angefahren werden.
  4. Ändern Sie das VI so ab, dass die Helligkeit der Umgebung erfasst wird. Ist es dunkler als ein festzulegender Schwellwert, so soll der Motor (ausgehend von der Grundstellung) um 90 Grad nach links drehen. Ist es heller als der Schwellwert so soll der Motor auf die Position 90 Grad rechts der Grundposition drehen.
  5. Dokumentieren Sie die erstellte Soft- und Hardware (nutzen Sie dafür z.B. die Software von Fritzing.org).

Arduino: Servo Tutorial

Quelle: Arduino – Servo Tutorial

 

Grundgedanken zur Theorie

Ein Servo besteht aus einer Steuerelektronik und einem Gleichspannungs-Elektromotor. Beide Einheiten sind dabei auf engstem Raum untergebracht. Die integrierte Elektronik ermittelt den Drehwinkel des Motors. Dabei erfolgt die Ermittlung des Drehwinkels zum Beispiel über ein Potentiometer. Die Schaltung vergleicht anschließend das Eingangssignal des Servos mit der aktuellen Position des Elektromotors. Somit kann die Position des Motores geregelt werden. Im Falle des Modellbau Servos, welches in den folgenden Aufbauten zum Einsatz kommt, nutze ich ein PWM Signal des Arduinos. Wobei die die Breite des Pulssignals dem Eingangssignal des Servos entspricht. Es handelt sich meist um eine Frequenz von 50 Hertz. Bei einer Periodendauer von 20 ms. Die Pulsweite des Eingangssignals liegt dann im Bereich von 1ms welches den linken Anschlag des Servos darstellt und 2 ms für den rechten Anschlag des Servos. Also liegt die Mittelposition bei ca. 1,5 ms. Während der restlichen Zeit der PWM Periode bleibt das Signal auf LOW.

Etwas zur Praxis

Die gängigsten Modellbau Servos haben 3 Anschlussleitungen. Wobei diese in der Regel wie folgt belegt sind:

  • GND (Schwarz)
  • PWM (Weiß*, Gelb, Orange)
  • +5V (Rot)

* Farbe beim von mir verwendeten Servo

Hier nun, wie der Servo angeschlossen werden muss:

Als erstes muss das Servo mit dem Arduino verdrahtet werden. Die Abbildung zeigt die korrekten Anschlüsse. Schwarze Leitung des Servos auf GND am Arduino. Rote Ader des Servos an 5V. Und zuletzt die weiße Leitung an einen der PWM Pin’s. Wie auf der Abbildung zu sehen ist, wurden hier Pin 9 gewählt.

Die Programmierung

Mit dem folgenden Code kann ein Servo ohne Hinzunahme von Bibliotheken betrieben werden. Dies kann von Vorteil sein, wenn man Platz auf dem Controller sparen möchte. Es hier darauf zu achten, das im folgenden Code Pin 9 als Signalpin für den Servo verwendet wird. Der Servo sollte in diesem Fall also auch an Pin 9 angeschlossen sein.

Beim ausführen des Codes bewegt sich das Servo einmal bis zum Anschlag (180 Grad) und dreht wieder zum entgegengesetzten Anschlag zurück. Das ganze wiederholt sich anschließend.

  1. // Festlegen des Servo Pins
  2. int servo = 9;
  3. // Weitere Variablen für PWM und Drehwinkel (Position)
  4. int pwm;
  5. int pos;
  6. // Funktion um das Servo zu bewegen. Hier wird die Position berechnet und der Wert der neuen Position an das Servo übergeben.
  7. void servoMove(int servo, int pos){
  8.   //Winkel in Mikrosekunden umrechnen
  9.   pwm = (pos * 11) + 500;
  10.   // Servo Pin auf HIGH zum aktivieren des Servos
  11.   digitalWrite(servo, HIGH);
  12.   // Kurze Zeit warten
  13.   delayMicroseconds(pwm);
  14.   // Servo Pin auf LOW zum deaktivieren des servos
  15.   digitalWrite(servo, LOW);
  16.   // 20 ms warten
  17.   delay(20);
  18. }
  19. // Initialisieren des Servo Pins
  20. void setup() {
  21.   pinMode(servo, OUTPUT);
  22. }
  23. // Hauptprogramm
  24. void loop() {
  25.   for(pos=0; pos<180; pos++) {
  26.     servoMove(servo, pos);
  27.   }
  28. }