Graph-IT

ControlPi-Plugin für GPIO-Pins und I2C-I/O-Karten

Dieses Paket enthält Plugins für das ControlPi-System, mit denen die GPIO-Pins eines Raspberry Pi als Klienten am ControlPi-Bus angemeldet werden können, bei denen Ausgangs-Pins durch Kommandos gesetzt werden können und sowohl Ausgangs- als auch Eingangs-Pins Ereignisse senden, wenn sich ihr Zustand ändert. Desweiteren enthält es Plugins für I2C-I/O-Karten auf Basis des PCF-8574-Chips für die Klienten für alle Input- oder Output-Kanäle der Karten registriert werden können.

Installation

Eine ausführliche Dokumentation ist in der Dokumentation der ControlPi-Infrastruktur zu finden.

Der Code dieses Plugins kann mit git geclonet werden:

$ git clone git://git.graph-it.com/graphit/controlpi-pinio.git

(Falls Zugang zu diesem Server per SSH besteht und Änderungen gepusht werden sollen, sollte stattdessen die SSH-URL benutzt werden.)

Dann kann es editierbar in ein virtuelles Environment installiert werden:

(venv)$ pip install --editable <Pfad zum Code-Repository>

Auf dem Raspberry Pi (oder wenn keine Code-Änderungen gewünscht sind) kann es auch direkt, ohne einen git-Clone installiert werden:

(venv)$ pip install git+git://git.graph-it.com/graphit/controlpi-pinio.git

Benutzung

Für die Benutzung der GPIO-Pins des Pi selbst, gibt es die Plugins OutputPin, HackPin, InputPin und PWMPin.

OutputPin und HackPin werden einfach nur mit der Angabe des Pins (GPIO-Nummer zwischen 0 und 31) konfiguriert:

    "Aktor": {
        "plugin": "OutputPin",
        "pin": 23
    },
    "Relais": {
        "plugin": "HackPin",
        "pin": 24
    },

Diesen Plugins können dann Kommandos {"target": "Aktor", "command": "set state", "new state": true} bzw. {"target": "Relais", "command": "set state", "new state": false} gesendet werden. Der Unterschied zwischen OutputPin und HackPin ist, dass OutputPin die Versorgungsspannung des Pi auf den Pin legt, während HackPin den Pin auf Masse zieht, was für das Schalten einiger Arten von Relais notwendig ist. Außerdem kann beiden das Kommando {"target": "Aktor", "command": "get state"} gesendet werden, welches den momentanen Zustand als Nachricht auf den Bus legt. Die Nachrichten von den Plugins haben die Form {"sender": "Aktor", "event": "changed", "state": true} bzw. {"sender": "Relais", "state": false}. "event": "changed" wird nur aufgenommen, wenn sich der Zustand tatsächlich geändert hat.

Für InputPin kann zusätzlich zur Angabe des Pins optional der Glitch-Filter (zwischen 0 und 300 000 Mikrosekunden, Default sind 5000 Mikrosekunden) und der Pull-Up-Widerstand konfiguriert werden (Default ist Benutzung des Pull-Down-Widerstands):

    "Sensor": {
        "plugin": "InputPin",
        "pin": 25,
        "glitch filter": 10000,
        "pullup": true
    },

Ein InputPin-Plugin verarbeitet nur get state-Kommandos. Die Nachrichten, die das Plugin sendet, haben die gleiche Form wie bei OutputPin und HackPin.

Das PWMPin-Plugin ermöglicht es, auf den GPIO-Pins 12 und 13 bzw. 18 und 19 Pulse-Width-Modulation zu benutzen. Hierfür kann eine Frequenz zwischen 1 MHz und 125 MHz gewählt werden (wobei die pigpio-Dokumentation Werte kleiner als 30 MHz empfiehlt. Der aktive Anteil wird mit dem Parameter duty gewählt, der zwischen 0 (aus) und 1 000 000 (durchgehend an) liegen kann:

    "Dimmer": {
        "plugin": "PWMPin",
        "pin": 18,
        "freq": 10000000,
        "duty": 0
    },

Die initialen Werte können durch die Kommandos {"target": "Dimmer", "command": "set freq", "new freq": 20000000} und {"target": "Dimmer", "command": "set duty", "new duty": 500000} geändert werden. Die Kommandos get freq und get duty fragen die aktuellen Werte ab. Die Nachrichten vom Plugin haben die Form {"sender": "Dimmer", "freq": 10000000} bzw. {"sender": "Dimmer", "event": "changed", "duty": 500000}, wobei "event": "changed" wiederum nur enthalten ist, wenn es tatsächlich eine Änderung gab.

Für die Benutzung der I2C-I/O-Karten, gibt es die Plugins OutputCard und InputCard.

Eine OutputCard wird konfiguriert, indem die I2C-Adresse angegeben wird und einer Auswahl der Pins der Karte (diejenigen, die für die Anwendung interessant sind) Namen zugewiesen werden:

    "Ausgangskarte 1": {
        "plugin": "OutputCard",
        "address": 56,
        "pins": { "Aktor 1": 0, "Aktor 2": 2, "Aktor 3": 4 }
    },

Die Kommandos an und Nachrichten von "Aktor 1", "Aktor 2" und "Aktor 3" sind dann genau die gleichen wie für OutputPin oben.

Für eine InputCard wird zusätzlich ein "interrupt pin" (GPIO-Pin auf dem Pi selbst) konfiguriert, auf dem die Karte meldet, wenn sich einer der Karten-Pins geändert hat:

    "Eingangskarte 1": {
        "plugin": "InputCard",
        "address": 32,
        "interrupt pin": 4,
        "pins": { "Sensor 1": 0, "Sensor 2": 2, "Sensor 3": 4 }
    }

Kommandos und Nachrichten für "Sensor 1", "Sensor 2" und "Sensor 3" sind dann die gleichen wie für InputPin oben.