Modul zur Nutzung der Raspberry Pi GPIO

Sorry Philipp, hatte deine Nachricht übersehen…

Also in deiner Unit sehe ich zwei Ungereimtheiten.

  1. Dein After steht zwar an der richtigen Stelle, aber sollte nicht multi-user.target lauten sondern After=systemd-networkd.service. Alternativ Requires=systemd-networkd.service. Habe ich bei mir obwohl es auch so geht noch einmal eingebaut und läuft auch damit.
  2. Außerdem ist Type einmal ‚idle‘ und einmal ‚forking‘. Entferne mal die Zeile mit ‚idle‘.

Hast du die neue ‚Unit‘ (Startdatei) nach /etc/systemd/system kopiert? Und die Rechte mit sudo chmod 755 pigpiod.service angepasst? Hast du alle anderen evtl. vorhandenen Dateien und Pfade, die irgendwie ‚pigpiod‘ im Namen enthalten aus /usr/systemd/system herausgelöscht? Und ganz zum Schluss sudo systemctl daemon-reload ausgeführt?

…ach Mist, ich hatte noch etwas vergessen…
sudo systemctl enable pigpiod.service (Erst dadurch wird dem SystemD System gesagt, dass es diese Unit Autostarten soll…, Mist hoffentlich war es nicht das…:banghead: )

Weitere Tests…
Manueller Start mit sudo systemctl start pigpiod.service geht?
Was sagt sudo systemctl status pigpiod.service?

Ich hoffe das hilft…

Gruß

Ralf

Hallo Wladi,

das mit den 2xoff war ein klassischer Copy&Paste-Fehler und ist korrigiert.:smiley:

Denn anderen Fehler schaue ich mir heute nachmittag mal an…:wink:

Joachim

Hallo Wladi,

ich habe den Fehler bei der Nutzung aus dem Webfront - hoffentlich - auch korrigiert (konnte leider noch nicht testen!).

Joachim

Kuckuck, hier noch ein paar Tips zu den ams iaq Miefsensoren. Es gibt derer 2, einen aktuellen mit 3.3V Logik und einen etwas äteren mit 5V Logik.

Am Raspi lässt sich ohne weiteres natürlich nur der neue 3.3V verwenden, ansonsten Pegelwandler

Am Bus 0 habe ich meine iaQ auch nicht zum Laufen bekommen - da sie alle aber verschiedene Adressen haben, war mir das wurscht. Vielleicht muss man irgendwo das Timing justieren ? Die BME280 funktionierten klaglos am bus 0 und am bus 1

Gerade die älteren 5V Modelle sind sehr empfinglich gegenüber Schreibbefehlen: Meistens hängen die sich einfach weg, Die neuen sind da etwas gnädiger - aber Adressen konnte ich nie ändern.

Der Hersteller hat mir auf Nachfrage einfach die Adressen umgestellt. Der Support ist da super. Auch gebrickte Sensoren haben die wieder zurückgesetzt.

Danke für die info, ich hab jetzt mal ein relai bestellt mit dem ich dann vor dem messen den bus von modul ein auf modul zwei umschalten…mal schauen ob es so funktioniert. Wenn nicht muss ich einen wohl zum hersteller schicken zum adresse ändern

Gesendet von meinem SM-G935F mit Tapatalk

@Ralf, ich hab mal noch die Sachen ergänzt und zusätzlich in den crontab den Eintrag hinzugefügt, jetzt funktioniert es :slight_smile: danke :slight_smile:

@reboot sudo service pigpiod start

…ziemlich am Anfang hatten wir ja auch mal über einen I²C-Multiplexer philosophiert. Da habe ich aber Befürchtungen, dass dieses im Timing ein Problem werden könnte.
Daten anzufragen - quasi mit einer „Vorwahl“ - sehe ich nicht als Herausforderung, jedoch sicherzustellen, dass alle Daten vollständig eingetroffen sind bevor die Umschaltung zum nächsten erfolgt sehe ich als kritisch…

Joachim

Hallo Joachim ,

Das ging ja schnell, Danke.

Die Steuerung an sich ist nun korrekt.
Steuerung per APP - Ok. Im Browser Farbe über Kreis einstellen - Ok.
Nur bei Schieberegler kommt die Fehlermeldung, die Werte werden aber korrekt eingestellt.

Wladimir

…die gleiche Fehlermeldung?
Magst Du sie noch mal posten?

Joachim

Nachtrag: Sehe den Fehler schon…

Nachtrag 2: Habe den „sichtbaren“ Fehler korrigiert - bitte noch mal testen! (Kann ich hier leider nicht)

nun läuft alles, Perfekt.:wink:

Danke noch mal Joachim.

Wladimir

Hallo Joachin,

hier mal ein klein wenig praktische Rückmeldung zu deinem tollen Modul…, vielleicht auch für andere interessant…

Ich habe zum Testen zwei Jessie Raspis verwendet und jeweils mit der Instanz IPS2GPIO_IO im IPS bekannt gemacht. An den einen Raspi habe ich vier PCF8574A angeschlossen und die vier nötigen Instanzen IPS2GPIO_PCF8574 angelegt. (Das entspricht nebenbei auch meinem künftigen Maximalbedarf je Raspi)

Zwei der Raspis sollten, bei diesem Test, komplett als Eingänge fungieren und zwei komplett als Ausgänge. Bei den beiden deren Ports als Eingänge wirken sollen, habe ich auf deiner Konfigurationsseite unter ‚Definition der Ein-und Ausgänge‘ die Kästchen angehackt und den Wiederholungszyklus auf eine Sekunde gesetzt. (Sie sollen später mal Rolladen Schalter abfragen)
Das hat soweit auch einwandfrei geklappt. Nur zwei Anmerkungen habe ich dazu noch.

  1. Eine Kleinigkeit nur. Oben über Device Adresse steht eine Anmerkung ‚Die GPIO-Nummer (Broadcom-Number)…‘ Diese Anmerkung ist an dieser Stelle ein wenig verwirrend, da man sie unwillkürlich mit der Device Adresse direkt darunter in Verbindung bringt, was aber nichts miteinander zutun hat. Sie könnte dort auch entfallen, da du unten bei den Hinweisen das gleiche in anderen Worten angemerkt hast.
  2. Die Ports die ich als Eingänge gekennzeichnet habe, bekommen keinen 1 Wert hinein geschrieben. Aber nur so ist es ja bei dem PCF 8574 möglich sie auszulesen. War es Absicht von dir, das uns zu überlassen? Oder kannst du das noch für die Eingänge hinzufügen. Wenn dann am besten so, dass bei jedem Netzwerk Reconnect erneut alle Eingänge auf 1 gesetzt werden…

Zu den zwei PCF8574 die als Ausgänge gedacht waren.
Konfiguration ohne Anhacken von P0 - P7 und Wiederholungszyklus auf 0 gesetzt. -> Funktioniert einwandfrei.
Dennoch ist mir auch hier eine Kleinigkeit aufgefallen. In der logischen Objektbaum Ansicht, steht dann als Messzyklus (Ereignis: Täglich alle 60 Sekunden) Nicht schlimm…, aber wenn du es einfach fixen könntest…

Bis hier hin erst mal… und vielen Dank noch einmal…

Gruß

Ralf

Hallo Ralf,

vielen Dank für Dein Feedback!

Deinen ersten Hinweis sowie Deinen Nachsatz habe ich bereits umgesetzt. Die Hinweiszeile im in der Instanz-Konfiguration ist (in allen I²C-Instanzen) entfernt und der Timer wird auf 0 gesetzt (Timer wird deaktiviert, auch wenn das noch die Zeit steht), wenn alle Ports auf Ausgang gestellt sind.

Was ich noch nicht verstanden habe ist Dein zweiter Hinweis. Magst Du mir das bitte noch mal erläutern?

Joachim

Hallo Joachim,

mit dem zweiten Hinweis meinst Du die Sache mit den Eingängen!?
Wenn ich dazu einen Ausschnitt von ‚http://www.mikrocontroller.net/articles/Port-Expander_PCF8574‘ zitieren darf:

Stellt sich nur noch die Frage: Wie regelt man nun, ob ein Pin als Ein- oder Ausgang arbeiten soll? Soviel gleich vorweg: So etwas wie die Datenrichtungsregister des AVRs gibt es hier nicht, man muss ohne sie auskommen. Den Ausgangspegel der Pins definiert man über einen Schreibzugriff. Sendet man beispielsweise nach der Adresse gefolgt vom ACK des Bausteins 0xF0, so bedeutet das, dass P0:3 nun L-Pegel haben und P4:7 H-Pegel. Will man einige IOs als Eingänge verwenden, muss man die entsprechenden Ausgänge zunächst auf H-Pegel setzen, da es sich um Open Collektor Ausgänge handelt sind die Ausgänge somit inaktiv. Führt man nun einen Lesezugriff durch, so stehen im gelesenen Byte die Pegel der Pins.

Allerdings habe ich meinen Vorschlag, dass setzen des 1 Pegels beim Reconnect der Netzwerk Verbindung schon wieder revidiert. Noch besser wäre es vor dem Auslesen des Eingangsports, diesen einfach jedesmal vorher auf 1 zu setzen. Das wäre wahrscheinlich sehr viel einfacher zu realisieren sein und wäre zudem noch weniger Fehleranfällig.

Noch etwas anderes…
Die normalen Ports erlauben ja eine Notification in IPS ohne ständiges Pollen !? Wie wäre es wenn ich den Wiederholungszyklus der Eingänge ebenso auf 0 setze und den Interrupt Ausgang des PCF8574 an einen normalen Raspi Porteingang anschalte und so über eine Änderung eines Eingangspegels an den PCF8574 sofort informiert werden würde. Ich müßte als Reaktion auf die Notifikatiion dann nur den aktuellen Zustand der Eingänge lesen. Dadurch würde ich mir das ständige Pollen der Ports ersparen. Evtl. könnte ich ja trotzdem zyklisch alle 10, 20 Sekunden den Portstatus abfragen. Insgesamt aber würde ich vermutlich die Latenz unter die 1 Sekunde drücken , die als Minimum des Wiederholungszyklusses einstellbar sind. Und ich würde nebenbei gegenüber meiner jetzigen Konfiguration die IPS Last vermindern. Was meinst Du dazu?

Ralf

jo es funktioniert, ist zwar keine schöne Lösung aber es funktioniert.
Mit dem relai schalte ich jetzt eine Ader des I2C Bus zwischen den zwei I2C Sensoren hin und her nach jeden auslesen und dann bekomme ich den wert des sensors zurück der gerade aktiv ist und schreibe ihn weg in die variablen.

jetzt kann ich bei meiner Lüftungsanlage Zu und Ablauf auslesen und die Lüftung entsprechend steuern.
Wenn Zuluft schlecht --> Lüftung aus
Wenn Abluft schlecht --> Lüftung stärker

Bin ich mal gespannt wieviele schalt zyklen so ein relai aushält wenn ich alle 30 sekunden schalten :slight_smile:

Hallo Ralf,

warum nimmst Du nicht gleich die GPIO für die Eingänge?? Das andere würde ja vielleicht auch funktionieren, aber wo wäre der Vorteil?

Ich habe es jetzt mal so gemacht, da alle Eingänge auf eins gesetzt werden, auch beim reconnect sollte das so sein.
Ich kann es aber leider hier nicht prüfen, daher bitte ich Dich mal ein Modul-Update zu machen und mir zu sagen was wie passiert…

Joachim

Hallo Joachim,

Unter „Erweiterungswünsche“ sind nur die vorhandene Module gemeint oder auch Neue?
Würde mich über ein Neues Modul für 1-Wire freuen :wink:
Mein Ziel mehrere Temperatursensoren (DS1820) auf entferntem RPI auslesen.
Sensoren hängen an GPIO_4 (Pin7).

Was sagst Du dazu?

Wladimir

Hallo Joachim,

ich kann mich den vielen Vorrednern nur anschliessen. Klasse Modul vor dir. Das erspart wohl vielen bei RasPi Projekten Pyhton-Scripte zu schreiben oder mühsam im Filesystem herum zu wühlen um mit IPS zu interagieren. Folgendes habe ich bereits ausprobiert, bzw. ist in Umsetzung:

[ul]
[li]
[/li][li]BME280 Einbindung lief problemlos. An dem Sensor gefällt mir besonders seine hohe Auflösung (bedeutet nicht zwangsläufig Genauigkeit) für Temperatur, Luftdruck und Feuchte. Damit kann man sehr schnell Tendenzen feststellen.
[/li]

[li]
[/li][li]iAQ-core ist bestellt (nicht ganz billig). Ich habe schon lange nach einem anständigen Sensor für Luftgüte (CO2 und TVOC) gesucht und nie was Anständiges gefunden. Von den Datenblättern und Berichten im Internet schaut vielversprechend aus.
[/li]

[li]
[/li][li]Den HC‐SR04 konnte ich über dein GPIO-Modul auch problemlos in IPS einbinden. Bei den Messungen entstehen manchmal aber ziemlich große Ausreiser (siehe Anlage). Ich wollte ihn schon seit längerem für Ölstandsmessungen einsetzen (besser den DYP‐ME007Y), aber ohne nachgeschaltete Median- oder getrimmte Mittelwertberechnung sollte man das sein lassen. Ich habe das vor längerer Zeit so auch im IPS-Stammtisch in Erlangen vorgestellt (PDF-Anlage).
[/li]
[li]
[/li][/ul]
Folgende zwei Komponenten nutze ich aktuell am RasPi, die wohl auch in deinem Modul gut reinpassen würden:

[ul]
[li]Direkter Anschluss von 1-Wire-Temperatursensoren (z.B. DS18B20) an einem GPIO. Hatte ich auch in Erlangen gezeigt (PDF-Anlage) und wurde ja gerade auch noch von Wladimir im Forum angesprochen.
[/li]

[li]
[/li][li]Richtig cool finde ich aber PiFace Digital 2 (PiFace – PiFace Digital 2). Hat zwei Wechslerrelais, je 8 mal Input/Output/LEDs und vier Taster. Wird über SPI / MCP23S17 angebunden. Kostet etwas über 30 €.
[/li]
[li]
[/li][/ul]
Was meinst du dazu.

Gruss
Bernd

PifaceDigital2.jpgIPS_Stammtisch_Erlangen.pdf (401 KB)

Hallo Joachin,

habe Dein Modul aktualisiert und weitergetestet.

  1. Das Konfigurationsformular für die PCF8574 Instanz sieht jetzt, ohne den Hinweis verständlicher aus.

  2. Wenn eine Wiederholungszykluszeit angegeben wurde, zum Beispiel 1 Sekunde und dieser Wert später auf 0 Sekunden geändert wird, dann bleibt in der logischen Objektansicht, die Angabe ‚Messzyklus (Ereignis: Täglich alle 1 Sekunden)‘ bestehen, genauer gesagt es bleibt immer der letzte Wert > 0 stehen. ‚Gemessen‘ wird aber nicht mehr, dass funktioniert wie gewünscht. Und wenn ich dagegen von 1 auf 10 ändere, wird korrekt ‚…Täglich alle 10 Sekunden‘ ausgegeben.

  3. Wenn bei der ersten Instanz Konfiguration, als Wiederholungszykluszeit gleich 0 eingegeben wird, dann lautet die Ausgabe ‚Messzyklus (Ereignis: Täglich um 00:00:00)‘.
    Mal schauen ob er tatsächlich um 00:00:00 aktualisiert. :slight_smile: ==> nein wird nicht, gerade Mitternacht durch…

  4. Unter Kontextmenü ‚Befehl testen‘ werden nun alle möglichen Befehle (I2GIO1_*) doppelt aufgeführt. Ich bin mir ziemlich sicher, dass das gestern nicht der Fall war.

  5. Das Schreiben einer 1 bei den Eingangsports scheint sehr gut zu funktionieren. Auch nach einem Raspi Reboot wurden alle Eingänge offensichtlich wieder mit einer ‚1‘ vorbelegt.

Zu Deiner Frage warum ich nicht die gleich die Raspi Ports nutzen. Natürlich wegen der Anzahl der von mir benötigten Port Pins. 16 * 8 Port Pins, dass hat schon was. Wenn ich auch nicht so viele benötige, aber 20 werden es sicher werden. Außerdem werde ich mir eine Interface Platine erstellen müssen und möchte nicht jedesmal bei einem neuen Raspi mit der Gefahr leben, dass irgendwann nicht mehr genügend Ports frei sind. So brauche ich 2 Ports für I2C und entweder 1 für alle PCF8574 Interrupts, oder je PCF8574 einen freien Port Pin. Somit bleibt genügend Spielraum für andere Aktivitäten des Raspis, damit er sich nicht allzusehr langweilt.

Ich habe dann noch meine Idee verfolgt und den Wiederholungszyklus auf 0 gesetzt und den Interrupt Ausgang auf einen Raspi Port gepatcht. Die Einstellungen unter IPS2GPIO_Input habe ich folgendermaßen ausgeführt:

  • Richtigen Port ausgewählt.
  • Aktions Wert leer gelassen, da der Interruptausgang aktiv low ist.
  • Glitchfilter auf Standard 10ms belassen. (Was aber eigentlich ja auch keine Auswirkungen haben sollte…)
  • Widerstand auf Pull Up gesetzt (wegen aktiv low)
  • Triggerimpuls mit Hello_world belegt ( Hello_world == >Nur der Befehl den einen PCF8574 auszulesen, mit I2GI01_Read_Status…)

Generell gesagt es funktioniert! Durch den Interrupt wird tatsächlich Hello_World aufgerufen. Und im ersten Augenblick erscheint die Latenz wirklich kürzer als eine Sekunde.
Aber drei Dinge erscheinen mir merkwürdig.

  1. Alle 10 Sekunden wird die Toggle Variable umgeschaltet, sichtbar in der Objektansicht, ohne das ein Interrupt dafür verantwortlich wäre. (Oszi angeschlossen)

  2. Die Toggle Änderung löst auch das Script Hello_World aus, obwohl ich unter Toggle Status gar kein Script zugeordnet habe, nur unter Triggerimpuls!
    Die Variable ‚Status‘ steht dabei immer auf ‚An‘ und ‚Trigger‘ ständig auf ‚Aus‘, auch wenn ein Interrupt ausgelöst wird.

(Kurze Frage, was ist eigentlich der Unterschied zwischen Triggerimpuls und Toggle Status? Oder was ist überhaupt die Bedeutung oder Funktion?)

  1. Weiterhin musste ich trotz das ich einen Pull Up ausgewählt hatte, einen weiteren Einfügen sonst ging es gar nicht.
    Und messen konnte ich auch keine 3,3 Volt an dem Pin. Könnte die Pullup Auswahl auf der Konfigseite evtl. fehlerhaft sein, oder anderweitig wirkungslos?

…ich hoffe ich konnte mich verständlich machen…

Ralf

Hallo Joachim,

genau das dürfte doch mit den Semaphores gut zu regeln sein - die sind ja genau dafür gedacht, dass zwischen Auswahl und Auswertung der Daten keiner reinquatschen kann.

Ich persönlich brauche das aber dank des 2.ten Bus nicht mehr, kann aber so einen Multiplexer gerne zur Verfügung stellen (wer ihn denn brauchen kann…)

…ich versuche das mal der Reihe nach zu beantworten::slight_smile:

  1. 1-Wire: Daran hätte ich selbst auch Interesse. Bisher habe ich es verworfen, weil PIGPIO eigentlich nur die Dateien des 1-Wire-Servers abfragt. Die Idee des moduls beruht ja darauf, dass der Nutzer möglichst wenig auf dem Raspberry Pi einrichten muss. Ich werde es mir aber noch mal anschauen.

  2. „Befehl testen“: Das ist bei mir sogar vierfach vorhanden!:confused: Da muss ich noch mal schauen (oder wohl eher fragen) was da die Ursache sein könnte. Habe ich selbst nie vorher genutzt…

  3. Trigger-Impuls: Der Trigger-Impuls ist so kurz, so dass die Änderung nicht einmal in der Konsole angezeigt wird. Wenn Du aber ein Skript damit triggerst wird dieses auch ausgeführt. (Trigger-Impuls: Ein kurzer Impuls bei dem „gesuchten“ Status)

  4. Toggle-Umschaltung: Schau mal bitte bei den Meldungen ob dort ein Eingangs-Impuls angezeigt wird. Zum anderen sendet PIGPIO selbst alle 60 sekunden ein Status der GPIO, das sollte aber nichts ändern am Status. (Toggle: Wechselt nach jedem „gesuchten“ Status den Zustand).

  5. Multiplexer: Es ist ja jetzt eine 1 zu n-Beziehung. Wenn ich den Multiplexer anschließe, dann ist das ja schon eine 1-zu-n-Beziehung, werden daran noch n-Devices angeschlossen wird es schnell in der Strukturabbildung schwierig. Oder irre ich da??

Joachim

Nachtrag:Pi-Face muss ich mich erst einmal mit beschäftigen…