Quellcode für servo

"""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)