"""Modul zur Steuerung des Pumpen-Schrittmotors.
Das Modul schrittmotor.py verwendet die **RpiMotorLib** Bibliothek als Grundlage
und ermöglicht es den Schrittmotor der Spritzenpumpe anzusteuern. Mit der
Bibliothek **RPi.GPIO** werden die GPIO-Pins für Richtung (GPIO22), Schritte
(GPIO17) und Aktivierung (GPIO27) konfiguriert.
Note:
Mehr Informationen zur Bibliothek **RpiMotorLib** sind unter:
https://github.com/gavinlyonsrepo/RpiMotorLib zu finden.
"""
import RPi.GPIO as GPIO
from RpiMotorLib import RpiMotorLib
import time
[Doku]class Spritzenpumpe():
[Doku] def __init__(self, grundeinstellungen):
"""Wird aufgerufen, wenn ein Spritzenpumpe-Objekt erzeugt wird.
Grundeinstellungen wie Pin-Konfiguration und Timingparameter werden
ausgelesen und in lokale Variabeln gespeichert. Der Konstruktor
konfiguriert außerdem den Eingangs-Pin des Endschalters, welcher
auslöst wenn sich der Inhalt des Spritzenkolbens dem Ende neigt.
Args:
grundeinstellungen (dict): Aus dem Config-File eingelesene
Grundeinstellungen des Roboters.
"""
print("Initialisiere Spritzenpumpe ...")
# Pinkonfiguration einlesen
self.richtungs_pin = int(grundeinstellungen
['gpio_motor_richtung'])
self.schritt_pin = int(grundeinstellungen['gpio_motor_schritte'])
self.aktivierungs_pin = int(
grundeinstellungen
['gpio_motor_aktivierung']) # LOW to enable
self.endschalter_pin = int(grundeinstellungen['gpio_pumpe_endschalter'])
self.nachfuellschritte = int(
grundeinstellungen['pumpe_nachfuell_schritte'])
self.schrittverzoegerung = float(
grundeinstellungen['pumpe_schritt_delay'])
# GPIO Mode auf BCM setzten
GPIO.setmode(GPIO.BCM)
# Aktivierungspin als Ausgang setzten
GPIO.setup(self.aktivierungs_pin, GPIO.OUT)
# Motor Aktivierungspin auf HIGH setzten (Deaktivierung)
GPIO.output(self.aktivierungs_pin, GPIO.HIGH)
# RpiMotorLib objekt erzeugen
self.schrittmotor = RpiMotorLib.A4988Nema(
self.richtungs_pin, self.schritt_pin, (-1, -1, -1), "DRV8825")
# Ensschalter der Spritzenpumpe als Eingang konfigurieren und Pull-Up
# Widerstand aktivieren
GPIO.setup(self.endschalter_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
[Doku] def motor_bewegen(self, drehrichtung, schrittanzahl, verzoegerung):
"""Verstellt den Servo in die gewünschte Position.
Note:
Der verbaute Schrittmotortreiber **DRV8825** ist hardwaremäßig so
konfigueriert das ein Schritt in weiterere 32 Microsteps unterteilt
wird.
Args:
drehrichtung (bool): ``True`` lässt den Schrittmotor im
Uhrzeigersinn und ``False`` gegen den Uhrzeigersinn drehen.
schrittanzahl (int): Anzahl der Mikroschritte die der Motor fahren
soll.
verzoegerung (int): Verzögerung zwischen den einzelnen Schritten in
Sekunden. Wirkt sich auf die Rotationsgeschwindigkeit aus.
Raises:
Schmeisst eine Exception, wenn während er Ansteuerung des
Schrittmotors ein Fehler auftritt.
"""
try:
# Den Aktivierungspin (EN) auf LOW ziehen um den Motor zu aktivieren
GPIO.output(self.aktivierungs_pin, GPIO.LOW)
# Schritte fahren
self.schrittmotor.motor_go(
drehrichtung, "Full", schrittanzahl, verzoegerung, False, 0.05)
# Motorbestromung abschalten, da nichts gehalten werden muss.
time.sleep(0.1)
GPIO.output(self.aktivierungs_pin, GPIO.HIGH)
except:
print("Fehler bei der Ansteuerung des Schrittmotors!")
[Doku] def status_endschalter(self):
"""Liest den Status des Endschalters der Spritzenpumpe aus.
Returns:
bool: Gibt ``True`` zurück, wenn Enschalter offen sonst ``False``.
"""
if GPIO.input(self.endschalter_pin):
return True
else:
return False
[Doku] def spritze_aufziehen(self):
"""Zieht die Spritzenpumpe zur Wiederbefüllung mit Lösungsmittel auf.
Note:
Zu fahrende Schritte sind in den Grundeinstellungen als
``pumpe_nachfuell_schritte`` festgelegt.
"""
print("Spritzenpumpe wird aufgezogen.")
self.motor_bewegen(False, self.nachfuellschritte,
self.schrittverzoegerung)