pwm

Servomotor

Funktionsweise

Servomotoren sind in einer Vielzahl von Bauformen und Grössen erhältlich. Eine Eigenschaft, welche einen Servomotor von einem normalen Elektromotor unterscheidet, ist die Existenz eines Regelkreises. Dieser Regelkreis ermöglicht also erst die Kontrolle über Drehgeschwindigkeit, Beschleunigung und Winkelposition des Motors. Im Gegensatz zum Schrittmotor sorgt nicht der physikalische Aufbau für diese Kontrollmöglichkeiten, sondern eine Regelung. Die Regelung im Falle des beim CrowPi beiliegenden Servomotors wird durch ein simples Potentiometer erreicht. Bei industriellen, hochwertigen Servomotoren werden für die Positionsrückmeldung spezielle Encoder verwendet. Diese erlauben viel höhere Genauigkeiten als die Bauform mit Potentiometer. Verwendet wird diese vereinfachte Form häufig im Modellbau für die Einstellung von Stellwinkeln bei Modellflugzeugen.

Der Anschluss der Servomotors erfolgt so: Anschluss für Schrittmotor

Voraussetzungen

DIP Switches

Für diese Komponente müssen zwei DIP Switches des rechten Blockes gesetzt werden. Die Stellung der DIP Switches sollte anschliessend so aussehen:

ON(links)12345678ON(rechts)12345678

Verwendung

Nachfolgend wird die Verwendung der Klasse com.pi4j.crowpi.components.StepMotorComponent Javadoc beschrieben.

Konstruktoren

Konstruktor Bemerkung
ServoMotorComponent(com.pi4j.context.Context pi4j) Initialisiert einen Servomotor mit den Standardeinstellungen für den CrowPi.
ServoMotorComponent(com.pi4j.context.Context pi4j, float minAngle, float maxAngle, float minDutyCycle, float maxDutyCycle) Initialisiert einen Servomotor mit dem Standardpin. Hier sind jedoch benutzerdefinierte Winkelangaben sowie Tastgrad einstellbar.
ServoMotorComponent(com.pi4j.context.Context pi4j, int address, int frequency, float minAngle, float maxAngle, float minDutyCycle, float maxDutyCycle) Initialisiert einen Servomotor mit frei definierbarem Pin. Zusätzlich sind ebenfalls Winkelangaben sowie Tastgrad einstellbar.

Methoden

Methode Bemerkung
void setAngle(float angle) Rotiert den Motor auf den übergebenen Winkel in Grad [°].
void setPercent(float percent) Positioniert den Motor zwischen minAngle und maxAngle prozentual.
void moveOnRange(float value) Positioniert den Motor entsprechend des übergebenen Werts und anhand der Kalkulation aus den mit setRange gesetzten Grenzwerten.
void moveOnRange(float value, float minValue, float maxValue) Positioniert den Motor entsprechend des übergebenen Werts und anhand der Kalkulation aus den mit angegeben Grenzwerten. Hat keinen Einfluss auf die mit setRange gesetzten Properties.
void setRange(float minValue, float maxValue) Setzt die Unter- und Obergrenze der Werteskala. Wird für die Bewegungskalkulation mit moveOnRange(float value) benutzt.
float getMaxAngle() Gibt den maximal positionierbaren Winkel des Servomotors zurück.
float getMinAngle() Gibt den minimal positionierbaren Winkel des Servomotors zurück.

Beispielapplikation

Die Beispielanwendung zeigt auf einfache Art und Weise wie die verschiedenen Methoden der ServoMotorComponent zu verwenden sind. Als Erstes wird demonstriert, wie einfach mit der prozentualen Positionierung gearbeitet werden kann. Dazu wird die Methode setPercent verwendet. Als Zweites folgt dann ein Beispiel einer Positionierung mittels der Funktion setAngle, welche einen Winkel in Grad entgegennimmt. Zuletzt wird eine benutzerdefinierte Skalierung mit dem Beispiel einer Temperaturanzeige genutzt. Mittels setRange wird der Messbereich des Sensors einprogrammiert. Danach wird mit moveOnRange der Messwert in eine entsprechende Positionierung des Servomotors umgewandelt.

Pfad zum Codebeispiel: src/main/java/com/pi4j/crowpi/applications/ServoMotorApp.java
Auf GitHub ansehen
package com.pi4j.crowpi.applications;

import com.pi4j.context.Context;
import com.pi4j.crowpi.Application;
import com.pi4j.crowpi.components.ServoMotorComponent;

/**
 * This example shows how the servo motor on the CrowPi can be used. It requires the right DIP switch to have 7 and 8 turned on and mainly
 * demonstrates the various ways of setting the servo position, namely either by percentage, angle in degrees or a custom value range.
 */
public class ServoMotorApp implements Application {
    @Override
    public void execute(Context pi4j) {
        // Initialize servo motor component
        final var servoMotor = new ServoMotorComponent(pi4j);

        // Demonstrate the percentage mapping on the servo
        System.out.println("In 2 seconds, the servo motor will move to the left-most position which is 0%");
        sleep(2000);
        servoMotor.setPercent(0);

        System.out.println("In another 2 seconds, the servo motor will show 100% by moving to the right-most position");
        sleep(2000);
        servoMotor.setPercent(100);

        System.out.println("Last but not least, in 2 more seconds the servo will be centered to display 50%");
        sleep(2000);
        servoMotor.setPercent(50);

        // Sweep once from left to right using the setAngle function
        System.out.println("We will sweep once to the left in 2 seconds...");
        sleep(2000);
        servoMotor.setAngle(-90);

        System.out.println("... and now to the right in 2 more seconds!");
        sleep(2000);
        servoMotor.setAngle(90);

        // Use a custom range for displaying the data
        System.out.println("Imagine a pointer on the servo positioned above a label between -20ºC and +40ºC");
        System.out.println("By using the setRange() method, we can automatically map our temperature range to the servo range!");
        System.out.println("As an example, in five seconds the servo will show -10º which should be on the far left of the servo.");
        sleep(2000);

        servoMotor.setRange(-20, +40); // This will define our range as values between -20 and +40
        servoMotor.moveOnRange(-10); // This will map -10 based on the previously defined range

        // And this demo is over, sleep for a second to give the servo some time to position itself
        sleep(1000);
    }
}

Weitere Möglichkeiten

  • Anzeige von Messerwerten mittels eines an der Achse montierten Zeigers.