I²C über Web

Raspberry Pi

Hier stelle ich euch eine Anleitung vom Steffen Hoffmann zur Verfügung, welcher eine Möglichkeit entwickelt hat den I²C über das Web zu steuern.
In diesem Beispiel werden vier LEDs mittels eines PCF8574 Portexpanders und der Bibliothek WebIOPi angesteuert.

-> Die Schaltung:

Die Schaltung ist recht einfach gehalten und kann problemlos auf einem Steckbrett nachgebaut werden:

Raspberry_WebI2C

Sobald die Schaltung aufgebaut ist, kann mit dem einrichten von dem Pi begonnen werden.

-> Vorbereiten des Raspberry Pi:

Nachdem die Schaltung aufgebaut ist, kann das Paket WebIOPi runter geladen und installiert werden:

Nach der Installation wird das Skript gestartet:

Für einen ersten Test gebt ihr einfach folgendes in den Browser ein:

http://IP-Adresse vom Pi:8000/
Login: webiopi
Passwort: raspberry

Jetzt sollte folgendes Bild erscheinen:

WebIOPi

Über diese Oberfläche könnt ihr die GPIOs auf Ein- und Ausgang stellen und ihren Status ändern.

-> Verwendung des I²C Buses:

Jetzt machen wir uns dran den I²C nutzen zu können.
Hierfür wird als erstes WebIOPi gestoppt:

Damit WebIOPi Websites und Skripte nutzen kann, müssen diese im Verzeichnis /usr/share/webiopi/htdocs gespeichert werden.
In diesem Verzeichnis erstellt ihr einen neuen Ordner

und in diesem Ordner speichert ihr das Python Programm I2C-Test.py und die HTML-Datei Index.html.
Die Website erstellt vier Buttons und weist ihnen Namen von Makros zu, welche ausgeführt werden sobald der Button betätigt wird.
Die Buttons werden durch die Funktion

direkt beim Aufruf der Seite erzeugt.
Die Funktion zum Erzeugen eines Buttons sieht so aus:

Diesem Button wird die Funktion set_one() zugewiesen, welche wie folgt aussieht:

Die angegebene Funktion ruft anschließend das Makro set_one auf, welches wir gleich definieren.

Die Definition der Makros geschieht in einem Python Programm, welches I2C-Test.py heißt.
Ein Makro wird wie eine Funktion definiert und sieht beispielhaft so aus:

GPIC ist dabei ein Verweis auf ein vorher erstelltes Objekt für den PCF8574, wobei 0x3F die Adresse des Bausteins darstellt:

Mit der Funktion digitalWrite(GPIO, Status) wird ein Pin mit der unter GPIO gespeicherten Nummer auf den unter GPICLow gespeicherten Status geschaltet.
Nach der Makrodefinintion wird eine Serverinstanz erzeugt

und anschließend wird mittels

jedes Makro der Serverinstanz zugewiesen und anschließend wird der Server gestartet:

Danach muss das Skript gestartet werden:

Jetzt kann die fertige Seite wie folgt aufgerufen werden:

http://IP-Adresse:Port

Für den Login müsst ihr die oben angegebenen Daten eingeben.
Jetzt seid ihr in der Lage den I2C per Web zu bedienen.
Das fertige Projekt und die Dokumentation findet ihr zusätzlich unter „Zusätzliche Infos“ am Ende der Seite als Download.

Noch mal vielen Dank an Steffen Hoffmann für das bereitstellen dieses Projektes!
Falls ihr weitere Fragen haben solltet, schreibt ruhig eine E-Mail an:

sthosi@web.de

Und wenn auch ihr interessante Projekte habt, könnt ihr sie mir gerne zusenden und ich veröffentliche sie dann.

 

Dokumentation:

 

-> Zurück zum I²C

25 thoughts on “I²C über Web
  1. hallo kampi,
    bei dir heisst es: „GPIC = PCF8574(slave=0x3F)“; das gilt aber doch für den PCF8574A ? Muss hier nicht „GPIC = PCF8574(slave=0x27)“ stehen?
    liebe Grüsse, Wolfgang

    • Hallo Wolfgang,

      ja stimmt. Du hast Recht.
      Da habe ich wohl die falsche Zahl eingetippt. Werde es sofort korrigieren!
      Danke für den Hinweis.

      Gruß
      Daniel

  2. hallo Kampi, danke für die schnelle Antwort!
    Aber jetzt steht dort „GPIC = PCF8574(slave=0x2F)“ ; muss es nicht
    „GPIC = PCF8574(slave=0x27)“ heissen?

    Liebe Grüsse Wolfgang

  3. Hallo Kampi,
    vielen Dank für dieses hervorragende Tutorial! Die Schaltung funktioniert bei mir soweit; interessant wäre jetzt auch noch die umgekehrte Richtung, d.h. das Einlesen von Tastern am 8574 und die Darstellung als „Lampen“ auf der Webseite. Außerdem finde ich den Baustein PCF8591 (A/D bzw. D/A Wandler) in diesem Zusammenhang sehr interessant, um analoge Werte zu messen oder auszugeben.
    Wäre super, wenn Du hierzu Informationen hättest!

    Viele Grüße,

    Stefan

    • Hey Stefan,

      einlesen weiß ich leider nicht wie das geht. Die Anleitung zum WebIOPi kam auch nicht direkt von mir, aber ich denke mal schon, dass diese Methode das einlesen unterstützt (würde mich wundern, wenn sie es nicht tut). Da musst du mal nach suchen :).
      Der ADC ist kein Problem. Da kann ich dir gerne zu helfen, da dies auch nicht besonders schwer aussieht.
      Hast du den ADC schon zur Hand, oder musst du ihn erst noch bestellen?

      Gruß
      Daniel

      • Hallo Kampi,

        den PCF8591 hab ich, und auch schon damit experimentiert. Unter Windows und mit Profilab Expert konnte ich schon Analogspannungen ein- bzw. auslesen. Adressierung ist auch kein Problem. Nur wie das mit dem Python Script funktioniert hab ich nicht herausgefunden. Vielleicht kannst Du mir da weiterhelfen…?

        Grüße

        Stefan

        • Hallo Stefan,

          im Grunde ist es ganz simpel.
          Du musst als erstes ein Controlbyte senden, wo du den Channel auswählen und einstellen musst.
          Dann kannst du die Daten auslesen. Hast du schon mal was in I²C mit Python gemacht?

          Gruß
          Daniel

          • Hi,
            ich komme mehr aus der Elektronik-Ecke und hab mit Python noch nicht so viel gemacht. Mit einfachen Änderungen im Beispielscript ist es da wohl nicht getan?

            Stefan

  4. hab gerade im WebIOPi-Forum gelesen, daß der PCF8591 jetzt unterstützt wird! Also werd ich dort mal weitersuchen. Vielen Dank einstweilen!

    Stefan

  5. Hallo Kampi,
    tolle Seite, danke.

    Leider funktioniert bei mir nicht alles wie beschrieben. Der I2C-BUS ist nicht 0 sondern 1 und beim Ausführen von

    python ./usr/share/webiopi/htdocs/I2C-Test/i2c-test.py

    muss man folgendes eingeben.

    python /usr/share/webiopi/htdocs/I2C-Test/./i2c-test.py

    Bei Ausführung erhalte ich folgende Fehlermeldung, die ich nicht selber beheben kann:

    pi@raspberrypi ~ $ python /usr/share/webiopi/htdocs/I2C-Test/./i2c-test.py
    Traceback (most recent call last):
    File „/usr/share/webiopi/htdocs/I2C-Test/./i2c-test.py“, line 3, in
    from webiopi.devices.digital import PCF8574
    ImportError: cannot import name PCF8574

    Bei mir ist WebIOPi-0.7.0 installiert. Muss in der Config der PCF8574 parametriert werden???

    Über einen Tipp zur Lösung meines Problems würde ich mich freuen.

    Gruß Ralf

    • Hallo Ralf,

      das kann daran liegen, dass du eine neue Raspberry Pi Version hast. Dieses Tut habe ich mit der 256MB Version geschrieben und die hat den I2C 0.
      Sicher das du den richtigen Baustein dran hast? Meines Wissens nach gibt es bei den PCFs kleine Unterschiede in den Adressen.
      Poste mal die komplette Bausteinbezeichnung.

      Gruß
      Daniel

      • Hallo Daniel,

        der Baustein ist von NXP PCF8574P (A3T018.114 knG12063) er lässt sich manuell mit i2c-tools und der Adresse 0x20 ansteuern. Die Ausgänge können nach Wunsch gesetzt werden. Ich vermute das die „LIB“ mit den Bausteinen nicht gefunden wird. Leider kenne ich mich mit Python und der LINUX -Struktur nicht aus und kann den Fehler nicht finden. Ich habe im Python-Script ohne Erfolg PCF8574 durch PCF8574P ersetzt.

        Gruß Ralf

        • Hey Ralf,

          mmh da muss ich selber erst forschen. Du hast aber eine entsprechende Lib für den und brauchst nun einfach nur den Ort wo das Ding hin muss?

          Gruß
          Daniel

  6. Hallo Kampi,
    danke für die super Beschreibung.
    Soweit konnte ich alles auch nachvollziehn.
    Leider schaint aber bei mir etwas anders zu laufen.
    Am Port 3 des PCF8574 liegt dauernt Hight an.
    Beim drücken eines der vier Buttons auf der Webseite geht Port 3 auf Low und dann flackern die Ports 0-2 kurz auf und Port 3 geht wieder auf Hight.
    Schaut ganz so aus als ob er jedesmal binär hochzählt. Genau erkennen kann man das aber nicht da es zu schnell geht.
    Was muss ich anders machen?
    Ich habe nur die Adresse auf 38 geändert, was aus meiner Schaltung resultiert.

    Grüße
    Tobias

  7. Deine Home ist ja super. Mir geht es um die Steuerung des I2C-Bus und darüber Ansteuerung von Geräten. Habe Webiopi mit dem 8574 auf Adresse 0x3f in Betrieb. Die GPIO-Ports des Raspi direkt kann ich ohne Problem steuern, d.h. die ersten zwei Buttons Header und GPIO List ok, aber Serial Monitor ruft das script ab aber dann kann ich kein Device auswählen und der Device Monitor zeigt mir auch nur die Titelzeile. Direkt über den Befehl i2cset -y 1 0x3f .. kann ich den 8574 ja steuern. Was habe ich in welchen Scripts vergessen, bzw was nicht verstanden ?

  8. Hallo,

    tolle Anleitung hat auch alles geklappt.

    Ich wolle jetzt unterschiedlich große Button erstellen, aber das bekomme ich nicht hin.
    Hat da einer eine Idee dazu ?.

    Gruß
    Ulrich

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload CAPTCHA.