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 deutlich 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: Zum entfernen muss ein kleiner Hebel am Stecker gedrückt werden
Für diese Komponente müssen zwei DIP Switches des rechten Blockes gesetzt werden. Die Stellung der DIP Switches sollte anschliessend so aussehen:
Nachfolgend wird die Verwendung der Klasse
com.pi4j.crowpi.components.StepMotorComponent
Javadoc
beschrieben.
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. |
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. |
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.
src/main/java/com/pi4j/crowpi/applications/ServoMotorApp.java
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);
}
}