"""Modul zum Auslesen der Wägezelle.
Das Modul sensor.py verwendet die **HX711** Bibliothek als Grundlage und
ermöglicht es den auf die Optikoberfläche wirkenden Druck (ferner die Kraft) zu
messen. Mit der Bibliothek **RPi.GPIO** werden die GPIO Pins 20 und 16,
konfiguriert über welche eine 2-Wire Verbindung mit dem HX711 aufgebaut wird.
Note:
Mehr Informationen zur HX711 Bibliothek sind unter:
https://github.com/gandalf15/HX711 zu finden.
"""
import RPi.GPIO as GPIO # import GPIO
from hx711 import HX711 # import the class HX711
[Doku]class Drucksensor:
[Doku] def __init__(self, grundeinstellungen):
"""Wird aufgerufen, wenn ein Drucksensor-Objekt erzeugt wird.
Grundeinstellungen wie Pin-Konfiguration und Kalibrierwerte der
Wägezelle werden ausgelesen und in lokale Variabeln gespeichert.
Args:
grundeinstellungen (dict): Aus dem Config-File eingelesene
Grundeinstellungen des Roboters.
"""
# GPIO Mode setzen
GPIO.setmode(GPIO.BCM)
# Pinkonfiguration
self.dout_pin = int(grundeinstellungen['gpio_hx711_dout'])
self.pd_sck_pin = int(grundeinstellungen['gpio_hx711_sck'])
# Anzahl der zu erfassenden Samples für den Mittelwert
self.samples = int(grundeinstellungen['wz_samples'])
# Kalibrierwerte
self.tare_wert = 0
self.maximale_tare_abweichung = int(
grundeinstellungen['wz_tare_abweichung'])
self.kalibriergewicht_in_gramm = float(
grundeinstellungen['wz_kalibriergewicht_g'])
self.kalibriergewicht_rohwert = int(
grundeinstellungen['wz_kalibriergewicht_roh'])
# Druckvariablen initialisieren
self.aktueller_druck = 0.000
self.letzter_druck = 0.000
# Objekt zum Auslesen des HX711
self.hx = HX711(self.dout_pin, self.pd_sck_pin)
[Doku] def drucksensor_initialisieren(self):
"""Methode zur Initialisierung und Kalibrierung des HX711 bzw. der
Wägezelle.
Im ersten Schritt wird der Sensor-Rohwert auf Null (Tare) gesetzt.
Bei Erfolg wird im Anschluss noch überprüft, ob sich der Rohwert
innerhalb einer bestimmten Schranke (+/- ``wz_tare_abweichung``)
befindet.
Note:
Liegt der Tare-Rohwert außerhalb einer der definierten Schranken,
ist die Wägezelle belastet und eine Kalibrierung würde zu falschen
Messergebnissen führen.
Raises:
Löst aus wenn beim Nullen (Tare) der Wägezelle ein Fehler auftritt.
Returns:
str: Gibt zurück ob Tarewert OK oder nicht.
"""
try:
print("Initialisiere Drucksensor ...")
# Überprüfung ob ein Fehler aufgetreten ist
tare_fehler = self.hx.zero()
if tare_fehler:
raise ValueError('Tare nicht erfolgreich.')
self.tare_wert = self.hx.get_raw_data_mean()
# Überprüfen ob der Tarewert innerhalb des erwarteten Bereichs liegt
if self.tare_wert:
if (int(self.tare_wert) < self.maximale_tare_abweichung):
print('Tarewert OK.', self.tare_wert)
else:
print("Tare außerhalb des erlauben Bereiches")
print("Ist:", self.tare_wert)
print("Soll: <", self.maximale_tare_abweichung)
return "Tarewert nicht OK"
else:
print('Kein gültiger Tarewert:', self.tare_wert)
# Kalibrierung des Sensors anhand der Kalibrierwerte in
# den Grundeinsellungen
verhaeltnis = \
self.kalibriergewicht_rohwert / self.kalibriergewicht_in_gramm
self.hx.set_scale_ratio(verhaeltnis)
return "Tarewert OK"
except:
print("Fehler bei der Sensorkalibrierung!")
[Doku] def druck_auslesen(self):
"""Methode zum Auslesen des aktuellen Druckwertes.
Wird ein ungültiger Druckwert ausgegeben, sendet die Methode
``get_weight_mean()`` den Bool-Wert ``False`` zurück. In diesem Fall
wird der aufrufenden Methode der letzte gültige Wert des Sensors
zurückgegeben.
Note:
Zur leichteren Vergleichbarkeit wird der ausgelesene Sensorwert in
der GUI nicht als Druck in einer genormten Einheit, sondern in %
ausgegeben.
- 0% entsprechen dem unteren Anschlag der Aufnahme
- 102% entsprechen dem oberen Anschlag der Aufnahme
Raises:
Löst aus, wenn es beim Auslesen der Wägezelle zu einem Fehler kommt.
Returns:
float: Gibt den aktuellen Druck in % zurück.
"""
try:
druckwert = self.hx.get_weight_mean(self.samples)
if druckwert:
self.aktueller_druck = float("{:.4f}".format(druckwert))
self.letzter_druck = self.aktueller_druck
else:
self.aktueller_druck = self.letzter_druck
except:
print("Fehler beim Auslesen des Drucksensors!")
[Doku] def tareWert(self):
"""Methode zum Auslesen Tare-Rohwertes.
Returns:
int: Gibt den Tare-Rohwert zurück (einheitenlos).
"""
return self.tare_wert