"""Modul zur Steuerung des Modellbauservos.
Das Modul servo.py verwendet die **pigpio** Bibliothek zur Generierung eins PWM-
Signals und enthält diverse Methoden zur Steuerung des Servomotors.
"""
import pigpio
import time
[Doku]class Servo:
[Doku] def __init__(self, grundeinstellungen):
"""Wird aufgerufen, wenn ein Servo-Objekt erzeugt wird.
Grundeinstellungen wie Pin-Konfiguration, vordefineirte Positionen
des Servos oder Timing-Parameter werden ausgelesen und in lokale
Variabeln gespeichert.
Args:
grundeinstellungen (dict): Aus dem Config-File eingelesene
Grundeinstellungen des Roboters.
"""
# Pinkonfiguration
self.servo_pin = int(grundeinstellungen['gpio_servo'])
# Servofrequenz
self.pwm_frequenz = int(grundeinstellungen['servo_pwm_frequenz'])
# Positionen definieren
self.minimale_position = int(grundeinstellungen['servo_min_winkel'])
self.maximale_position = int(grundeinstellungen['servo_max_winkel'])
self.horizontal = int(grundeinstellungen['servo_horizontal_winkel'])
# Schrittweite
self.schrittweite = int(grundeinstellungen['servo_schrittweite'])
self.schrittverzoegerung = float(
grundeinstellungen['servo_schrittverzoegerung'])
self.aktuelle_pulsweite = 1530
self.pwm = pigpio.pi()
[Doku] def servo_initialisieren(self):
"""Initialisiert den Servo indem der PWM-Mode gesetzt und die PWM
Frequenz definiert wird.
Es wird außerdem die Hardware getestet indem der Reinigungskopf einmal
in seine Maximal-Position bewegt und anschließend wieder in die
Horizontalposition (entspricht einer Pulsweite von 1530 :math:`{\\mu s}`
gestellt wird.
"""
# Initialisierung
self.pwm.set_mode(self.servo_pin, pigpio.OUTPUT)
self.pwm.set_PWM_frequency(self.servo_pin, self.pwm_frequenz)
self.stellen(self.maximale_position)
time.sleep(0.5)
self.stellen(self.horizontal)
[Doku] def stellen(self, pulsweite):
"""Verstellt den Servo in die gewünschte Position.
Args:
pulsweite (int): Pulsweite des PWM-Signales in :math:`{\\mu s}`
"""
print("Servo-PWM Signal wird auf Pulsweite", pulsweite, "gestellt ...")
while (not self.aktuelle_pulsweite == pulsweite):
if self.aktuelle_pulsweite < pulsweite:
self.aktuelle_pulsweite += self.schrittweite
if (self.aktuelle_pulsweite < self.maximale_position):
self.pwm.set_servo_pulsewidth(
self.servo_pin, self.aktuelle_pulsweite)
else:
print("Maximalposition erreicht!")
break
elif self.aktuelle_pulsweite > pulsweite:
self.aktuelle_pulsweite -= self.schrittweite
if (self.aktuelle_pulsweite > self.minimale_position):
self.pwm.set_servo_pulsewidth(
self.servo_pin, self.aktuelle_pulsweite)
else:
print("Minimalposition erreicht!")
break
else:
print("Fehler bei der Servoansteuerung!")
time.sleep(self.schrittverzoegerung)
[Doku] def servo_deaktivieren(self):
"""Deaktiviert den PWM-Ausgang am Pin GPIO23 und stoppt somit die
Bestromung des Servomotors.
Note:
Methode wird während der Abtastung eines Oberflächenprofiles
aufgerufen um *Servo-Flickering* zu vermeiden, welches sich negativ
auf die Abtastwerte auswirkt.
"""
self.pwm.set_PWM_dutycycle(self.servo_pin, 0)
self.pwm.set_PWM_frequency(self.servo_pin, 0)
[Doku] def servo_aktivieren(self):
"""Aktiviert den PWM Ausgang an GPIO23 und bestromt dadruch den
Servomotor.
"""
self.pwm.set_PWM_dutycycle(self.servo_pin, 255)
self.pwm.set_PWM_frequency(self.servo_pin, self.pwm_frequenz)
[Doku] def servo_horizontal_stellen(self):
"""Stellt den Reinigungskopf auf die Horizontalposition.
"""
self.stellen(self.horizontal)