Pifacedigital2 auf Pi B+ - listener (interrupt) geht nicht

  • Hallo,
    seit längerer Zeit quäle ich mich mit folgendem Problem:
    Die Piface-Platine hat 8 digitale Eingänge. An mehreren dieser Eingänge sollen Schalter (reed-kontakte) angeschlossen werden, die an Türen und Fenstern befestigt sind und im geschlossenen Zustand eine Verbindung von GND nach den Eingängen des Piface herstellen. Daher müssen die Eingänge überwacht werden. Prozessorschonend geht das mit einem sogenannten InputEventListener, der in der zum Piface gehörigen Bibliothek Pifacedigitalio enthalten ist.
    Dieser Listener wird in der Dokumentation zum Piface "PiFace Digital I/O Documentation Release 3.1.0"
    unter 3.2 Interrupts beschrieben und ein Anwendungsbeispiel gegeben:
    https://piface.github.io/pifacedigitali…html#interrupts

    Mit IDLE Python 3 aufgerufen müsste nun nach dem Aufruf des scripts beim Druck auf Taste0 etwas passieren. Leider tut sich bei mir nichts. Der Listener wartet, aber es erfolgt keine Reaktion auf den Tastendruck. Ich habe auch ein anderes Beispiel (Kofler, Raspberry Pi, 2.Ausgabe, S 566 ) versucht zum Laufen zu bringen, leider ohne Erfolg.
    Diesen Mißerfolg hatten auch andere, dazu lassen sich mehrere Threads (einer auch in diesem Forum) finden. Eine Lösung, wie man das Beispiel zum Laufen bekommt, fehlt.
    Kann mir da jemand helfen?
    Martin

  • Pifacedigital2 auf Pi B+ - listener (interrupt) geht nicht? Schau mal ob du hier fündig wirst!

  • Hallo Hyle,
    vielen Dank für deine Antwort. Ein PiFaceDigital ist ein Zusatzboard, das auf die GPIO-Leiste des Pi gesteckt wird und im Wesentlichen 8 digitale Eingänge, 8 digitale Ausgänge und zwei Lastrelais bietet. Es dient als etwas stabilere Verbindung zwischen der wirklichen Welt und einem Pi. Parallel zu 4 der Eingänge sind auf dem Board noch 4 Taster geschaltet, mit denen man eine Verbindung zwischen der Masse (GND) und den ersten vier Eingängen herstellen kann. Damit kann man je einen kurzgeschlossenen Eingang simulieren. An den Ausgängen liegen 8 LEDs, die anzeigen, ob die Ausgänge auf High- oder Lowlevel geschaltet sind. Zusätzlich liegen an den ersten beiden Ausgängen noch die beiden Relais an. Es werden die nötigen Anweisungen mitgeliefert, mit denen man die Ein- und Ausgänge - und damit auch die verbundenen LEDs und Relais mit Python schalten kann. Das alles funktioniert, das habe ich mehrfach überprüft.
    Für mein Projekt muss ich ständig zur Zeit sieben der acht Eingänge auf Veränderung überwachen. Das kann ich mit einer Endlosschleife machen, in der ich alle benötigten Eingänge der Reihe nach auf ihren Zustand abfrage. Wenn ich das für alle Eingänge mache und in annehmbarer Zeit von einer Veränderung erfahren oder darauf reagieren will, dann muss ich in jeder Sekunde alle Eingänge abfragen. So eine Endlossschleife ist aber eine starke Belastung für die CPU. Besser wäre eine Funktion wie den InputListener, der einfach darauf wartet, dass sich aneinem oder mehreren Eingängen eine Veränderung zeigt, ohne große Prozessorleistung zu benötigen - WENN DIESE FUNKTION FUNKTIONIERT, was sie leider NICHT tut. Daher meine Suche nach Hilfe.
    Martin

  • Ich haette ein PiFace da, aber der PI ist gerade auf ein UniPi geschraubt.
    (Weil ich glaube dass das eine deutlich bessere Eingangskarte ist)

    > Es dient als etwas stabilere Verbindung zwischen der wirklichen Welt und einem Pi.
    Sicher?? Die Eingaenge scheinen mir nicht sehr "Real World"-tauglich zu sein.

    # An mehreren dieser Eingänge sollen Schalter (reed-kontakte) angeschlossen werden,
    # die an Türen und Fenstern befestigt sind und im geschlossenen Zustand eine Verbindung
    # von GND nach den Eingängen des Piface herstellen.
    Nach dem Datenblatt von Microchip und meiner Messung betraegt der Pullup 100kOhm!
    Wenn auch nur kleinste elektrischen Stoerungen im Bereich der Anlage auftreten dann
    duerfte es viele Fehlalarme geben.

    Gut, ein normalerweise geschlossener Kontakt ist natuerlich sehr niederohmig, so dass
    das Problem bei dieser Applikation moeglicherweise nicht aufaellt.

    > Das kann ich mit einer Endlosschleife machen, in der ich alle benötigten Eingänge der Reihe
    > nach auf ihren Zustand abfrage. Wenn ich das für alle Eingänge mache und in annehmbarer
    > Zeit von einer Veränderung erfahren oder darauf reagieren will, dann muss ich in jeder Sekunde
    > alle Eingänge abfragen. So eine Endlossschleife ist aber eine starke Belastung für die CPU.
    Mal im Ernst: wie hoch ist die CPU-Last wenn alle Eingaenge einmal pro Sekunde abgefragt
    werden? Ich vermute mal so ungefaehr 0.001%.

    Wenn das noch zu hoch ist, dann kann man alle Eingange auf einmal lesen, was die Last
    um den Faktor 7 senkt :lol:

  • Hallo,
    alsoich habe auch ein Pi mit piface.
    bei mir funktioniert es einwandfrei.
    Hier mal mein script:


    oder:
    (0, pifacedigitalio.IODIR_FALING_EDGE, mycallback)
    (0, pifacedigitalio.IODIR_RISING_EDGE, mycallback)

    in script in etc/rc.local eintragen.

    gruss
    gwaag

    Einmal editiert, zuletzt von gwaag (20. Mai 2017 um 16:01)


  • > Es dient als etwas stabilere Verbindung zwischen der wirklichen Welt und einem Pi.

    Sicher?? Die Eingaenge scheinen mir nicht sehr "Real World"-tauglich zu sein.


    Immerhin kann ich die Ein-und Ausgänge stärker belasten, als die Pins des Pi, dazu kommen noch die Relais, die ich mit je ca 100W belasten kann. Darüber würde ich zwar keine Elektrokochplatte betreiben, aber für einen einfachen Alarmheuler reicht das.

    > Das kann ich mit einer Endlosschleife machen, in der ich alle benötigten Eingänge der Reihe

    > nach auf ihren Zustand abfrage. Wenn ich das für alle Eingänge mache und in annehmbarer
    > Zeit von einer Veränderung erfahren oder darauf reagieren will, dann muss ich in jeder Sekunde
    > alle Eingänge abfragen. So eine Endlossschleife ist aber eine starke Belastung für die CPU.
    Mal im Ernst: wie hoch ist die CPU-Last wenn alle Eingaenge einmal pro Sekunde abgefragt
    werden? Ich vermute mal so ungefaehr 0.001%.


    Im Ernst: ich bin kein geübter Linux-oder Python- Nutzer, sondern hangele mich mühsam durch einen Urwald von Syntax-Fallstricken, um mein Projekt Alarmanlage zu verwirklichen. Daher benutze ich - wo es geht - das Grafische User Interface, das mir von Raspian geboten wird. In dessen Oberfläche finde ich rechts oben ein kleines Fenster, das mir die aktuelle CPU-Auslastung in % anzeigt.
    In IDLE, Python3, habe ich eine Endlosschleife geschrieben, die nur die 8 Eingänge auf offen/geschlossen untersucht und mir das Ergebnis anzeigt. Solange das Skript nicht läuft liegt die CPU-Belastung im Grafikmodus bei etwa 40%. Lasse ich das Skript laufen, steigt sie auf 80% bis 100%, nur in den Wartepausen, die ich eingebaut habe, damit die Ausgabe beim Skrollen mal anhält und lesbar wird, sinkt sie auf niedrigere Werte. Diese Lasterhöhung 40% bis 60% auf bis zur Vollast halte ich nicht für "Dauerlastfähig" und frage mich, wie lange der Pi das wohl ohne Schäden durchhält. Daher meine Suche nach sparsameren Möglichkeiten der Abfrage mit dem InputEventListener.
    Übrigens, wie ich alle 7 benutzten Eingänge zugleich auslese und dabei noch je nach Eingang unterschiedlich auswerte, das darfst du mir gerne näher erläutern. Ich freue mich immer etwas zu lernen, mit dem ich etwas anfangen kann.
    Vielen Dank für deinen Kommentar, das hilft manchmal die Gedanken zu ordnen.
    Gruß
    Martin
    Automatisch zusammengefügt:


    Hallo,
    alsoich habe auch ein Pi mit piface.
    bei mir funktioniert es einwandfrei.
    Hier mal mein script:

    #!/usr/bin/env python3

    Hallo gwaag,
    deine erste Zeile mit dem shabang hat mich auf eine Idee gebracht: Ich habe mein Skript, an dem ich lernen will, wie ich meine Pläne verwirklichen kann, mal anders gestartet, nicht über IDLE. Siehe da, große Freude, das läuft. Damit ist zwar nicht das Problem gelöst, warum das Skript in IDLE NICHT funktioniert, aber beim Starten über den Dateimanager doch funktioniert. Immerhin habe ich nun einen Weg gefunden, den InputEventListener doch zu nutzen. Vielen Dank!
    Gruß
    Martin
    Automatisch zusammengefügt:
    Damit wäre das Thema teilweise erledigt, aber ich möchte die "Weisen" des forums-raspberrypi.de doch nochmal bitten, sich diese merkwürdige Sachlage mal anzuschauen und vielleicht auf Abhilfe zu untersuchen. Ich könnte mir vorstellen, dass sicher auch andere Anfänger verzweifelt nach Fehlern suchen.

    Einmal editiert, zuletzt von carillon (21. Mai 2017 um 13:31)

  • [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]> Lasse ich das Skript laufen, steigt sie auf 80% bis 100%[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Dann ist das Script nicht in Ordnung.[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Auf einem Raspberry hier laeuft ein Programm das alle 100ms die GPIOs abfragt.[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Also zehnmal pro Sekunde.[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Ich hab eben nochmal mit top nachgesehen: das Programm ist in den ersten[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]61 Zeilen nicht zu sehen. Und weit vor Zeile 61 zeigen die Prozesse schon 0% CPU-[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Last an.[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Mit der graphischen Oberflaeche und einem Terminal drauf bin ich bei maximal 10%.[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Die GPIOs zu lesen ist sicher weniger aufwendig als die Eingaenge vom PiFace, aber[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]so viel Unterschied wird das auch nicht machen.[/font]

    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]Naechste Woche packe ich den Neuron an. Da muss ich die Eingaenge ueber SPI[/font]
    [font="Source Sans Pro, Tahoma, Helvetica Neue, Arial, sans-serif"]abfragen. Wenn das eine signifikante Last erzeugt, werde ich die Resultate hier posten.[/font]


  • Gruß
    Martin

  • Hier ist das Resultat vom Neuron:

    Pollen alle 100ms -> 0.3% CPU

    Der Neuron ist deutlich komplexer als das PiFace. Da ist ein eigener Prozessor fuer die Eingaenge drin, und den anzusteurn ist aufwendiger als einfach einen Chip auszulesen.

    Das PiFace muesste also unter diesen Wert kommen.

    Bei mir laeuft aber C-Code, und der ist sicher effizienter als Python. Wieviel das ausmacht, kann ich nicht abschaetzen.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!