Ein- und Ausgänge in Python ansprechen

Rund um die Software von Revolution Pi
Post Reply
Börni
Posts: 2
Joined: 03 Mar 2018, 15:32
Answers: 0

Ein- und Ausgänge in Python ansprechen

Post by Börni »

Hallo,

ich habe einen Revolution Pi Core mit einem DIO und DO Module und möchte damit einige Relais schalten, das anlegen in PiCtory (Hardwarekonfiguration) und Ansteuern über PiTest hat alles geklappt. Jetzt möchte ich mit Python3 eine grafische Oberfläche erstellen und über einen Button einen Ausgang setzen und so ein Relais ansteuern. Ich stehe noch ganz am Anfang was Python betrifft und arbeite mich noch ein, aber alles was ich probiere will einfach nicht klappen und ich finde im Internet nichts was mir weiterhilft. Das einzige was ich im Internet gefunden habe, waren die Programme RevPiModIO2, RevPiLoad und RevPiControl. Diese Programme habe ich auf dem RevPi installiert und weis jetzt nicht wie diese mir helfen können. Ich hoffe ihr könnt mir mit einem kleinen Beispielprogramm helfen auf das ich aufbauen kann.

Danke im Voraus
Börni
User avatar
volker
Posts: 1046
Joined: 09 Nov 2016, 15:41
Answers: 1

Re: Ein- und Ausgänge in Python ansprechen

Post by volker »

Hallo Börni,
hol Dir bitte das Python Beispiel aus den Downloads (passend zum Videotutorial). Es zeigt Dir die Möglichkeiten mit Python DIO Ausgänge zu setzen oder Eingänge zu lesen. Für eine GUI empfehle ich Dir einfach eines der vielen, vielen Tutorials im Internat zu diesem Thema. Es gibt da verschiedene Bibliotheken, die alle kostenlos zu bekommen sind. Einfach mal nach GUI mit Python googeln und dann auf Youtube eines der vielen Tutorials durcharbeiten. Oder mal ein Buch dazu kaufen. Auf Amzon gibt es eine Menge gute Bücher zu dem Thema. Wenn Du Python verwenden willst, wird Dir nichts anderes übrig bleiben, als Dir das mit Büchern und Tutorials oder Kursen bei verschiedenen Anbietern (Volkshochschulen etc.) beizubringen und dafür die Zeit zu investieren.
Wenn Du lieber mit Drag und Drop zum Ziel kommen möchtest empfehle ich Dir einfach mal mit Node.Red zu beginnen. Dort kannst Du ganz einfach eine GUI bauen, die dann sogar auf jedem Browser läuft, der auf einem PC oder Smartphone über LAN mit Deinem RevPi verbunden ist. Da es aktuell noch keine speziellen Nodes für den Zugriff auf das revPi Prozessabbild gibt, musst Du an der Stelle einfach den "execute" Node nehmen und damit piTest -r ... ausführen (mit der Option -1 für "nur eine Ausgabe" ). Beim Schrieben musst Du das dann auch so machen. Aber damit kommst Du sicher an einem Wochenende klar.
Viel Erfolg,
Volker.
Unser RevPi Motto: Don't just claim it - make it!
Börni
Posts: 2
Joined: 03 Mar 2018, 15:32
Answers: 0

Re: Ein- und Ausgänge in Python ansprechen

Post by Börni »

Hallo,

danke für die schnelle Antwort.
Die Tutorials habe ich alle angesehen und die Programme dazu heruntergeladen. Mit dem GUI habe ich schon Fortschritte gemacht. Über Tkinter kann ich Fenster mit meinen Buttons öffnen. Leider schaffe ich es nicht die Ausgänge über mein Python Programm zu setzen. Gibt es eine einfache Möglichkeit/Befehl z. B. meinen ersten Ausgang am DIO Modul zu setzen? Und muss ich dafür noch spezielle Funktionen importieren? Ich habe bis jetzt nur tkinter importiert.

Danke im Voraus

Börni
User avatar
volker
Posts: 1046
Joined: 09 Nov 2016, 15:41
Answers: 1

Re: Ein- und Ausgänge in Python ansprechen

Post by volker »

Der einfache Befehl besteht in einem "write" in das Prozessabbild mit picontrol nachdem mit "seek" die Adresse zum Schreiben festgelegt wird.
Steht doch in dem Python Programm mit dem "Running light". Du musst mit piControl den Wert in das Prozessabbild schreiben.
Da Du nur ein Bit schreiben willst, der Treiber aber byte-orientiert ist, musst Du eben erst lesen, dann maskieren und wieder schreiben. Bit-Jonliererei eben...

Mal ganz simpel:
Offsetliste im PiCtory anzeigen lassen und den Offset von O_1 merken (sagen wir mal der ist 70.0, also an Byte-Offset 70 das Bit nr. 0)
Den Zustand des Schalters schreibst Du mit 1 oder 0 nach Variable "Switch"

Dann wäre das in Python

f=open("/dev/piControl0","wb+",0)
MASK[0]=1
MASK[1]=2
MASK[3]=4
...
MASK[13]= 0x2000

def setout1(f,switch):
f.seek(70)
x = f.read(1) # get current state of all outputs
s = struct.unpack('B',x)
i = s[0] & ~MASK[0] # this resets bit 0
f.seek(70)
if (switch==1):
i=i+MASK[0] # this sets bit 0
x = struct.pack('B',i)
self.f.write(x)
return

Wenn Dir solche boolschen Operationen fremd sind, dann solltest Du es erst gar nicht mit dem Aufruf der ioctl-Funktion versuchen. Die ermöglicht zwar auch ein bit-weises Schreiben, braucht aber Parameter in einer C-Struktur. Genaueres steht in dem Beispiel drinnen. Es geht dann halt schon deutlich einfacher mit der Bibliothek von Sven, die Du installiert hast. Wenn Dir das dann auch zu kompliziert ist, um die Beispiele zu verstehen, dann musst Du wirklich erst mal Python und die Grundprinzipien von Filezugriffen und ioctls aus Tutorials und Büchern erarbeiten. Ode mach's halt mit Drag & drop unter Node.Red...
Unser RevPi Motto: Don't just claim it - make it!
User avatar
RevPiModIO
KUNBUS
Posts: 322
Joined: 20 Jan 2017, 08:44
Answers: 0
Contact:

Re: Ein- und Ausgänge in Python ansprechen

Post by RevPiModIO »

Hi!

Also mit RevPiModIO2 bist du schon auf einem guten Weg :D

Hier mal ein kleines TK Programm um den Ausgang O_1 zu schalten (muss mit dem Namen in piCtory übereinstimmen):

Code: Select all

#!/usr/bin/python3
# -*- coding: utf-8 -*-
#
u"""Kleines Fenster mit 2 Buttons.

Ein Button schaltet den Ausgang O_1 beim Klick an und der andere Button beim
Klick wieder aus.

"""
import tkinter
import revpimodio2


class MyApp(tkinter.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        self.pack()
        
        # RevPiModIO verwenden mit autorefresh=True!
        self.rpi = revpimodio2.RevPiModIO(autorefresh=True)

        # Button erstellen und "click_an" als Event binden
        self.btn_an = tkinter.Button(self)
        self.btn_an["text"] = "anschalten"
        self.btn_an["command"] = self.click_an
        self.btn_an.pack()

        # Button erstellen und "click_aus" als Event binden
        self.btn_aus = tkinter.Button(self)
        self.btn_aus["text"] = "ausschalten"
        self.btn_aus["command"] = self.click_aus
        self.btn_aus.pack()

    def click_an(self):
        # Ausgang O_1 auf True setzen
        self.rpi.io.O_1.value = True

    def click_aus(self):
        # Ausgang O_1 auf False setzen
        self.rpi.io.O_1.value = False


if __name__ == "__main__":
    root = tkinter.Tk()
    myapp = MyApp(root)
    root.mainloop()
Wenn du RevPiModIO benutzt, muss es einmal instantiiert werden (hier als self.rpi) und dann kannst du mit den piCtory Namen direkt auf die IOs zugreifen.

Gruß, Sven
python3-RevPiModIO - https://revpimodio.org/ || Der RevPi ist das Beste, was passieren konnte!
Post Reply