Raspberry Pi GPIOs mittels I2C Port Expander erweitern – Teil 2

8. Februar 2016
1503 Views
11 Comments

Im zweiten Teil des Tutorials wird gezeigt, wie man mittels eines Skripts die GPIO Pins des I2C auslesen kann und Signale sendet. Außerdem wird ein Skript gezeigt, dass auf einfache User Interaktionen reagiert.

Python Skript zur Ein- und Ausgabe

Also erstellen wir ein Skript

sudo nano i2c_input_output.py

mit folgendem Inhalt:

Mit STRG + O und STRG + X speichern und beenden.

Um das Skript nun zu starten, geben wir

sudo python i2c_input_output.py

ein. Sobald du den Taster drückst fangen die LEDs an zu leuchten. Mit STRG + C kannst du das Skript abbrechen und zur Konsole zurückkehren.

Wie du siehst ist die Benutzung recht einfach und damit hat man sich weitere 16 GPIO Pins geschaffen.

11 Kommentare

  1. Hallo Felix,

    sehr gute Anleitung! Könntest du den Punkt mit dem Taster noch in die Anleitung mit aufnehmen (3,3V -> 10kOhm -> GPA7 <- Taster <-GND)? War zwar schnell gegoogelt aber der Vollständigkeit :)?

    Antworten
    • Hallo Felix,

      danke für den Hinweis, habe das nicht im ersten Teil gefunden, daher die Anmerkung 🙂

      Gibt es denn eine Möglichkeit den Status einer Reihe abzufragen?
      Also den Hex Wert ob die Pins als Input oder Output definiert sind?

      Ich versuche gerade ein paar Funktionen zu schreiben die mir das Umrechnen etc. erleichtern.

      Antworten
  2. Moin moin,

    ich habe in dem Script ein kleines Verständnisproblem. In Zeile 14 steht:
    # Binaer: 0 bedeutet Output, 1 bedeutet Input
    In Zeile 15 wird dann PIN 7 als Input definiert mit
    bus.write_byte_data(DEVICE,IODIRA,0x80)
    IODIRA hat den Wert 0x00 was ich denke auch Input aussagt.
    Ist in der Erklärung dann nur ein kleiner Fehler und müsste heißen
    # Binaer: 1 bedeutet Output, 0 bedeutet Input
    oder versteh ich das vollkommen falsch und bin auf dem Holzweg?

    Gruß
    Holger

    Antworten
    • IODIRA und IODIRB haben jeweils 8 IO Pins. Bei IODIRB setzen wir alle als Output, sprich 00000000 (binär = 0x00). Bei IODIRA allerdings setzen wir einen Pin als Input und alle anderen als Output: 10000000 (binär = 0x80).

      Antworten
  3. Nachdem ich mir jetzt noch mal das Datenblatt aus Teil 1 hinzugenommen habe, habe ich es endlich gerafft. 🙂 Danke

    Antworten
  4. Hallo, vorab erstmal ein Lob zu der guten Anleitung.
    Allerdings habe ich immer Verständnisprobleme, wenn es um das Einlesen von Daten geht. Also die verwendung der Pins als Inputs. Ich lese ja immer ein Ganzes Byte ein. Besp.(00101010) wenn ich nun alle Pins als Eingang deklariert habe, wie kann ich nun differenzieren welches Bit auf „1“ ist? Ich möchte hinter jedes Bit eine Bedingung hängen. Also wenn Bit 2 „1“ ist machhe dies und wenn Bit 5 „1“ ist mache das.
    Du hast hier diese Bedingung abgefragt: if Taster & 0b10000000 == 0b10000000
    Wenn ich also alle Pins als Eingang dklariert habe,so ist die Abfrage so gut wie nie erfüllt. Wenn ich Beispielsweise Bit 7 & 8 auf „1“ habe, ist die Bedingung ja Falsch, aber mein Bit ist ja trotzdem „1“.
    Ich hoffe man kann meine Verwirrung verstehen. Vielleicht drehe ich mich ja auch nur irgendwo im Kreis. Vielleicht könnt Ihr mir ja helfen

    Antworten
    • Hallo Christian,
      mit dem & Operator verbindest du zwei Bits. D.h nur wenn beide Eins sind, kommt als Ergebnis eine 1. Bsp:
      10000011 &
      10001010
      ——–
      10000010

      Antworten
  5. Hallo!
    Klasse Beitrag!

    Wie schaut es aus, wenn man zwei oder mehr von den MCP23017 verwendet? Wie muss man die verdrahten? Alle parallel an den gleichen GPIO des RPi und dann nur über die Adresse ansprechen?
    Ändert sich am Programmcode was, wenn ein Pi3B eingesetzt wird? Läuft der auch über SMBus(1)? Initialisierung, Programmmodule usw. – ändert sich da viel?

    Laut Datenblatt verkraftet der MCP23017 125 mA Eingangsstrom/150 mA Ausgangsstrom. Wenn man 16 LEDs à 20 mA (=320 mA) an die Ausgänge schaltet, raucht der wohl ab… Selbst bei 10 mA low current LEDs wirds eng. Man könnte alle LEDs über Transistoren oder Optokoppler ansteuern. Oder gibt’s eine einfachere Lösung? Abgesehen davon gibt der Pi ja auch nicht beliebig viel her

    Bei mehreren MCP23017 kommt man wohl um eine extra Stromversorgung nicht herum. 3,3 V Netzteile sind offenbar nicht verbreitet – bei 5 V schaltet aber der GPIO des Pi nicht mehr sicher, weil der MCP23017 80% seiner Versorgungsspannung braucht, um zu schalten (also 4 V) der Pi aber nur 3,3 V liefert. Wie löst man das am besten? Kann man einen 3,3 V / 800 mA Spannungsregler nehmen und dann direkt auf die Anschlüsse gehen?

    Antworten
    • Du musst darauf achten, dass alle eine andere ID bekommen. Daher können bis zu 8 (2^3) angeschlossen werden. Ich habe es zwar damals mit einem Pi1B getestet, aber daran sollte sich nichts geändert haben.
      Um LEDs oder höheres zu schalten, würde ich generell immer Transistoren verwenden. Da reichen wenige mA und du kannst das Endgerät / LED auch extern mit Strom versorgen.
      Falls du eine extere Versorgung nimmst, kannst du ein 5V Netzteil nehmen und dann einen 3.3V Konverter nutzen, wie ich es hier getan habe.

      Antworten

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!