Aus Raspberry Pi Geek 04/2020

Pixtend-eIO-Erweiterung steuert Fischertechnik-Kugelbahn (Seite 2)

Analoger Drucksensor

Um den Luftdruck im System zu messen und den Druck konstant zu halten, verwenden wir in unserem Testaufbau den auf 1 Bar Betriebsdruck ausgelegten Drucksensor MXP2100AP. Seine Ausgangsspannung verändert sich bei 1 Bar Druckunterschied um 40 Millivolt. Allerdings fällt diese Spannungsdifferenz zu gering für die Eingänge des eIO-Analogmoduls aus. Entsprechend gilt es, die Ausgangsspannung des Sensors zu verstärken.

Erschwerend kommt hinzu, dass der Sensor eine Betriebsspannung von 10 Volt benötigt, die der Versuchsaufbau von Haus aus nicht anbietet. Diese zwei Probleme treten so oder ähnlich bei vielen analogen Sensoren auf. Deswegen gibt es spezielle Halbleiter, die dazu dienen, die Ausgangssignale von Sensoren so anzupassen, dass sie sich weiterverarbeiten lassen.

Der Baustein INA125 [10] enthält neben einem Messverstärker zusätzlich eine Referenzspannungsquelle, die unterschiedliche Ausgangsspannungen bereitstellt. Dazu zählen auch die 10 Volt, die wir für unseren Drucksensor benötigen. Den Verstärkungsfaktor des INA125 stellen wir über einen Widerstand zwischen den Pins 8 und 9 ein. Die Widerstandswerte ermitteln wir mithilfe des Datenblatts.

In unserem Fall wählen wir eine Verstärkung um den Faktor 100, was einem Widerstand von 625 Ohm entspricht. Diesen Wert basteln wir uns aus zwei handelsüblichen Widerständen mit 560 und 68 Ohm. Die 3 Ohm Unterschied beeinflussen den Verstärkungsfaktor kaum.

Eine Kleinigkeit müssen Sie noch über den Sensor wissen: Bei 0 Bar beträgt seine Ausgangsspannung nicht 0 Volt, sondern liegt auf jeden Fall höher. Wir müssen später in unserem Programm diese konstante Spannung vom Eingangswert des eIO-Moduls subtrahieren, um den korrekten Druck zu ermitteln. Alternativ ließe sich auch der Analogverstärker so anpassen, dass er diesen Spannungsoffset abzieht. Die Software-Lösung bietet aber den einfacheren Weg.

Erster Test

Bevor Sie die Anlage in Betrieb nehmen, terminieren Sie den RS-485-Bus an beiden Enden. Üblicherweise ist im Stecker des USB-zu-RS-485-Dongles die Terminierung schon aktiv. Sie müssen also nur noch am anderen Ende des Busses die Terminierung aktivieren. Bei den eIO-Modulen ist sie ab Werk inaktiv, lässt sich jedoch mit einem der DIP-Schalter auf der Rückseite der Module einschalten.

Die Datenübertragungsrate der Module ist auf 19 200 Baud eingestellt. Das eIO Digital One hat ab Werk die Modbus-Adresse 0x03h, das eIO Analog One die 0x01h. Das in Python geschriebene Testprogramm benötigt die Modbus-Bibliotheken, die Sie wie in Listing 1 gezeigt auf dem RasPi installieren.

Listing 1

$ sudo apt install python-pip
$ sudo pip install -U pymodbus

Das Testprogramm mbus.py sehen Sie in Listing 2; Sie rufen es mit python mbus.py auf. Am Anfang importiert es die benötigten Bibliotheken, danach stellt es die Verbindung zum Bus her. Mit den Parametern des Kommandos lässt sich jede nur erdenkliche Konfiguration einstellen. Die hier verwendete entspricht der Standardeinstellung der Pixtend-eIO-Module.

Listing 2

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import time
client= ModbusClient(method = "rtu", port="/dev/ttyUSB0",stopbits = 1, bytesize = 8, parity = 'E', baudrate= 19200)
connection = client.connect()
overlay_voltage=370
# Z1 und Z2 einfahren Startzustand
client.write_coil(0x01,1, unit= 0x01) # Z1 einfahren
client.write_coil(0x03,1, unit= 0x01) # Z2 einfahren
client.write_coil(0x00,0, unit= 0x01) # Z1 ausfahen
client.write_coil(0x02,0, unit= 0x01) # Z2 ausfahen
client.write_coil(0x04,1, unit= 0x01) # Z3 einfahren
client.write_coil(0x05,0, unit= 0x01) # Z3 ausfahren
client.write_coil(0x06,1, unit= 0x01) # Kompressor an
time.sleep(1)
way=0
for i in range(1,40,1):
    reg=client.read_input_registers(0x00,1,unit=0x03)
    analog_value=reg.registers[0]
    pressure=float((analog_value-overlay_voltage))/400
    print("A0="+str(analog_value)+" Pressure="+str(pressure))
    if pressure < 0.7:
        client.write_coil(0x06,1, unit= 0x01) # Kompressor an
    if pressure > 0.8:
        client.write_coil(0x06,0, unit= 0x01) # Kompressor aus
    time.sleep(0.5)
    client.write_coil(0x00,1, unit= 0x01) # Z1 ausfahen
    client.write_coil(0x01,0, unit= 0x01) # Z1 einfahren
    time.sleep(0.5)
    client.write_coil(0x02,1, unit= 0x01) # Z2 ausfahren
    client.write_coil(0x03,0, unit= 0x01) # Z2 einfahren
    time.sleep(0.5)
    client.write_coil(0x01,1, unit= 0x01) # Z1 einfahren
    client.write_coil(0x00,0, unit= 0x01) # Z1 ausfahen
    time.sleep(0.5)
    client.write_coil(0x03,1, unit= 0x01) # Z2 einfahren
    client.write_coil(0x02,0, unit= 0x01) # Z2 ausfahren
    time.sleep(0.5)
    if way==0:
        way=1
        client.write_coil(0x04,1, unit= 0x01) # Z3 einfahren
        client.write_coil(0x05,0, unit= 0x01) # Z3 ausfahren
    else:
        way=0
        client.write_coil(0x04,0, unit= 0x01) # Z3 einfahren
        client.write_coil(0x05,1, unit= 0x01) # Z3 ausfahren
    time.sleep(0.5)
# alles ausschalten
for i in range (0,7,1):
    client.write_coil(i,0, unit= 0x01)

Den Wert der Variablen overlay_voltage in Zeile 5 müssen Sie an den konkreten Aufbau anpassen. Um den Wert zu ermitteln, muss der Sensor druckfrei sein; starten sie danach das Programm aus Listing 3. Das Programm liest den Sensor aus und zeigt die Werte an, die er bei 0 Bar ausgibt. Arbeitet der Messverstärker inklusive Sensor einwandfrei, sollten alle Messwerte in etwa gleich ausfallen. Die angezeigten Werte entsprechen der Spannung am Analogeingang A0, multipliziert mit dem Faktor 100.

Listing 3

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
import time
client= ModbusClient(method = "rtu", port="/dev/ttyUSB0",stopbits = 1, bytesize = 8, parity = 'E', baudrate= 19200)
connection = client.connect()
for i in range(1,10,1):
    result=client.read_input_registers(0x00,1,unit=0x03)
    value=result.registers[0]
    print("overlay_voltage="+str(value))
    time.sleep(.5)

Kommen wir nun zum nächsten wichtigen Teil des Programms aus Listing 2, der Initialisierung (Zeilen 7 bis 13). Sie bringt alle Pneumatikzylinder in ihre Ausgangsposition. Die Variable way (Zeile 15) steuert den dritten Zylinder. Sie wird bei jedem Schleifendurchlauf zwischen 0 und 1 umgeschaltet. Die zentrale For-Schleife (Zeile 16 bis 46) gibt an, wie oft der Zylinder eine Kugel nach oben befördern soll, in unserem Beispiel 40-mal. An ihrem Ende steht der Programmcode zum Steuern des dritten Zylinders (Zeile 38 bis 45).

Sehen wir uns nun den Teil an, der den Luftdruck im System regelt – er beginnt direkt am Anfang der For-Schleife. Hier liest die Routine zuerst den Messwert des analogen Eingangs aus dem Register aus, danach zieht sie das Spannungsoverlay von dem gemessenen Wert ab (Zeile 19). Nun entsprechen 0 Volt einem Druck von 0 Bar, eine Spannung von 4 Volt signalisiert einen Druck von 1 Bar. Wie erwähnt wird das Hundertfache der Spannung aus den Analogwertregistern gelesen. Daher müssen wir nun diesen Wert durch 400 teilen, um auf den realen Luftdruck zu kommen.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben