PCF8574 GPIO Extender - Mit Arduino und NodeMCU

In meinem letzten Tutorial habe ich über den TCA9548A MUX gesprochen, mit dem Sie Ihrem Arduino / ESP8266 / ESP32 maximal 64 I2C- oder I²C-Sensoren hinzufügen können.

In diesem Tutorial werde ich über den 8-Bit-GPIO-Port-Extender PCF8574 sprechen. Es ist einer der vielen GPIO-Extender, die auf dem Markt erhältlich sind.

Dieses winzige kleine Brett wird zum Lebensretter, wenn Ihnen auf Ihrem Arduino die Stifte ausgehen. Dieser "GPIO-Pin-Extender (General Purpose Input Output)" bietet zusätzliche 8 Pins (P0 ~ P7), mit denen ein Signal ausgegeben oder ein Signal als Eingang gelesen werden kann.

Diese Module werden auf dem I2C-Bus ausgeführt. Wenn sie in Reihe geschaltet sind, können Sie bis zu 8 dieser Geräte in einem Projekt anschließen. Jedes Gerät gibt uns zusätzliche 8-Bit-GPIO, die insgesamt 64 GPIOs ermöglichen.

Diese ICs sind lächerlich billig und können problemlos bei eBay oder AliExpress gekauft werden. Wenn Sie sich keine Sorgen um die Verkabelung machen und Ihr Projekt nur "einfach" halten möchten, können Sie diese vollständig montierten Breakout-Boards kaufen. Sie müssen sie nur an den I2C-Bus anschließen und schon können Sie loslegen.

Schritt 1: Hardwareanforderung

Für dieses Tutorial benötigen wir:

  • Steckbrett
  • PCF8574 GPIO Extender IC
  • PCF8574 GPIO Extender Breakout Board
  • Arduino UNO / Nano, was auch immer praktisch ist
  • NodeMCU
  • Nur wenige LEDs und gleich viele Strombegrenzungswiderstände von 220 Ohm
  • 2 x 10K Widerstände
  • Überbrückungskabel und
  • USB-Kabel zum Hochladen des Codes

Schritt 2: Behandelte Themen

  • Überblick über die I2C-Technologie
  • Schauen Sie sich den PCF8574 GPIO Extender IC und das Breakout Board genauer an
  • GPIO-Adressierung
  • Zu verwendende Bibliotheken
  • PCF8574 an Arduino und NodeMCU anschließen
  • Adresse mit dem I2C-Scanner suchen
  • So programmieren und verwenden Sie PCF8574 in Ihrem Projekt
  • Verwendung des Interrupt-Pins
  • Anwendungsbereiche

Schritt 3: I2C-Technologie

Interintegrierte Schaltung, ausgesprochen I-Quadrat-C (I²C) oder I2C, ist eine "Kurzstrecken" -Technologie mit zwei Drähten (eigentlich 4 Drähte, da Sie auch VCC und Masse benötigen), die für die "serielle Kommunikation" verwendet wird. zwischen mehreren Prozessoren und Sensoren.

Wenn Sie mehr über die I2C-Technologie erfahren möchten, lesen Sie bitte mein 'Tutorial Nummer 09'. Im Moment werden wir nur die Grundlagen von I2C behandeln und zu unserem Hauptthema springen. Die zwei Drähte sind:

  • SDA - Serielle Daten (Datenleitung) und
  • SCL - Serielle Uhr (Taktleitung)

Beide Leitungen sind Open-Drain-Leitungen und werden mit Widerständen hochgezogen. Normalerweise gibt es einen Master und einen oder mehrere Slaves in der Leitung, es können jedoch auch mehrere Master vorhanden sein. Sowohl Master als auch Slaves können Daten senden oder empfangen.

Der PCF8574 GPIO Extender wird auf dem I2C-Bus ausgeführt und erweitert die 'IO-Pins', die von einem einzelnen Host-I2C-Bus gesteuert werden können. Der Adressbereich von PCF8574 reicht von 0x20 bis 0x27 (7-Bit-Adressmodus). Maximal 8 dieser Geräte können in einem Projekt an den I2C-Bus angeschlossen werden.

Schritt 4: Genauere Betrachtung / Pinbelegung

IC: (5 Stück für 2, 30 AUD)

****************************

Schauen wir uns zuerst die Pinbelegung des PCF8574-IC an:

  1. Pin 16 dieses IC ist VCC, der mit 2, 5 V bis 6 V betrieben werden kann
  2. Pin 8 ist GND
  3. Die Pins 4 ~ 7 und 9 ~ 12 sind die E / A-Pins P0 bis P7 8-Parallel (dh Sie können alle 8 Pins gleichzeitig verwenden). Jeder dieser bidirektionalen E / A-Pins kann ohne Verwendung eines Datenrichtungssteuersignals als Eingang oder Ausgang verwendet werden. Beim Einschalten befinden sich alle diese E / A-Pins im Zustand HIGH.
  4. Pin 15 ist für den seriellen I2C-Dateneingang oder -ausgang (über einen Pull-up-Widerstand mit VCC verbinden) und
  5. Pin 14 ist für den I2C-Takteingang vorgesehen (über einen Pull-up-Widerstand mit VCC verbinden).
  6. Mit den Pins 1, 2 und 3 oder A0, A1 und A2 können wir die Adresse angeben, unter der der PCF8574 auf dem I2C-Bus angezeigt wird, indem wir sie auf HIGH drehen. Die Standardadresse ist 0x20. Standardmäßig sind alle diese Pins geerdet oder NIEDRIG. Pull-up-Widerstände werden für diese Pins nicht benötigt.
  7. Pin 13 ist für den Interrupt-Ausgang. Schließen Sie es mit einem Pull-up-Widerstand an den VCC an.
  • Diese ICs haben einen sehr "niedrigen Standby-Strom" -Verbrauch von nur 10 μA.
  • Die SDA-, SLC- und Interrupt-Pins müssen alle mit Pull-Up-Widerständen hochgezogen werden
  • Es gibt eine zweite Variante dieses ICs auf dem Markt, die PCF8574A. Der Hauptunterschied ist das Adressierungsschema. Die ersten vier Bits der 7-Bit-Adresse des PCF8574 sind 0100, und die für den PCF8574A sind 0111. Die unteren drei Bits sind die Einstellungen an den Gerätepins A2, A1 und A0.
  • Der PCF8574 und der PCF8574A haben einen maximalen Sinkstrom von 25 mA. In Anwendungen, die einen zusätzlichen Antrieb erfordern, können zwei Anschlussstifte miteinander verbunden werden, um einen Strom von bis zu 50 mA abzusenken.

Schritt 5:

Modul: (1 Board für 1, 34 AUD)

*******************************

  • Schauen wir uns nun den PCF8574 Break-Outboard an:
  • Wenn wir von links nach rechts schauen, sehen wir, dass das Modul 4 Pins hat: VCC, GND, SDA und SCL
  • Dann haben wir die beiden 10kΩ SMD-Pull-up-Widerstände für die SDA- und SCL-Busse.
  • Als nächstes haben wir den PCF8574 SMD IC, gefolgt von den 3 Jumpern für A0, A1 und A2 mit hohen und niedrigen Positionen. Dann haben wir diese Ports, mit denen wir eine andere dieser Karten huckepack nehmen können.
  • Dann haben wir die 8 E / A-Pins plus einen Interrupt-Pin. Wenn wir uns die Rückseite der Platine ansehen, sind alle Pins von P0 bis P7 beschriftet und enden dann mit dem INTrupt-Pin.

Wenn Sie mehrere davon verwenden, können Sie die Adresse ändern, indem Sie diese JumperAddress-Leisten anpassen.

Schritt 6: Adressierung

Durch Verbinden der drei Adressbits A0, A1 und A2 mit VIN oder HIGH können Sie eine unterschiedliche Kombination der Adressen erhalten.

So sieht ein Adressbyte des PCF8574 aus. Die ersten 7 Bits bilden zusammen die Slave-Adresse. Das letzte Bit der Slave-Adresse definiert die auszuführende Operation (Lesen oder Schreiben). Wenn es hoch (1) ist, wird ein Lesevorgang ausgewählt, während ein niedriger Wert (0) eine Schreiboperation auswählt.

Schritt 7: Zu verwendende Bibliothek

Die mitgelieferte 'Wire Library' ermöglicht die Kommunikation über den I2C / TWI-Bus von Arduino. Wenn Sie möchten, können Sie jedoch auch die 'PCF8574_library' von github herunterladen und verwenden: //github.com/xreef/PCF8574_library

Der Link befindet sich in der folgenden Beschreibung. Klicken Sie oben rechts auf der Seite auf die Schaltfläche DOWNLOADS. Benennen Sie den unkomprimierten Ordner nach dem Herunterladen in PCF8574 um.

Stellen Sie sicher, dass der Ordner PCF8574 PCF8574.cpp und PCF8574.h enthält.

Legen Sie den PCF8574-Bibliotheksordner in Ihren Arduino / library / -Ordner.

Möglicherweise müssen Sie den Unterordner "Bibliotheken" erstellen, wenn dies Ihre erste Bibliothek ist. Starten Sie die IDE neu und dann sollten Sie in der Lage sein, die Bibliothek in Ihrem Code zu verwenden. Diese Bibliothek enthält auch sehr gute Beispiele, die Ihnen helfen, den IO Expander in die Hände zu bekommen.

#include "Arduino.h"

#include "PCF8574.h"

Anhänge

  • PCF8574_library-master.zip herunterladen

Schritt 8: So stellen Sie eine Verbindung zu Arduino / NodeMCU her

Beginnen wir mit dem Verbinden des IC mit einem Arduino. Verbinden:

VCC bis 3.3v

GND zu GND

Wir müssen auch die drei Adressauswahlstifte A0, A1 und A2 mit GND verbinden, um die Standardadresse 0x20 zu verwenden. Verbinden Sie dann den SCL-Stift mit A5 von Arduino und

SDA bis A4

Schließlich müssen wir sowohl den SCL- als auch den SDA-Bus mit 10K-Widerständen hochziehen.

Für NodeMCU verbinden:

VCC bis 3.3v

GND zu GND

Stifte A0, A1 und A2 an GND

SCL bis D1

SDA bis D2

Und schließlich ziehen Sie sowohl den SDA- als auch den SCL-Bus mit 10K-Widerständen hoch

Sobald der IC an den Mikrocontroller angeschlossen ist, müssen Sie nur noch die Sensoren an die Pins 4 ~ 7/9 ~ 12 oder mit anderen Worten an die Pins P0 bis P7 des IC anschließen.

Schritt 9: I2C-Scanner

Wie wir wissen, können wir durch Verbinden der drei Adressbits A0, A1 und A2 mit VIN oder HIGH unterschiedliche Adressenkombinationen erhalten. Daher ist es manchmal schwierig herauszufinden, welche Adresse dem Expander zugewiesen wurde. Wenn sich zwei oder mehr Geräte auf dem I2C-Bus befinden, ist es immer eine gute Idee, zu überprüfen, ob eines davon mit einem anderen in Konflikt steht.

Wenn Sie diesen 'I2C-Scanner' ausführen, können Sie leicht die Hex-Adresse Ihres Geräts finden. Beim Laden in ein Arduino durchsucht die Skizze das I2C-Netzwerk und zeigt die Adressen an, die antworten.

Anhänge

  • I2CScanner.zip herunterladen

Schritt 10: Der Code

Sobald Sie die Adresse des IO Expander kennen, können Sie diese problemlos in Ihrem Code verwenden.

Zuerst müssen Sie die Bibliothek "PCF8574.h" in Ihren Code aufnehmen.

Dann müssen Sie die Adresse von IO Expander an den Konstruktor übergeben:

PCF8574 (uint8_t-Adresse);

Für esp8266, wenn Sie SDA und SCL-Pin angeben möchten, verwenden Sie Folgendes:

PCF8574 (uint8_t-Adresse, uint8_t sda, uint8_t scl);

Dann müssen Sie die Modi der E / A-Pins angeben:

pcf8574.pinMode (P0, OUTPUT);

pcf8574.pinMode (P1, INPUT);

und schließlich "beginne" die Übertragung, bevor der Rest des Codes durchlaufen wird.

Schritt 11: Wert schreiben

Um einen Wert zu schreiben, müssen Sie nur noch die Funktion "digitalWrite" aufrufen und die PIN-Nummer gefolgt vom Modus übergeben:

PCF8574.digitalWrite (P1, HIGH);

oder:

PCF8574.digitalWrite (P1, LOW);

Okay, also lass uns den Code auf ein Arduino hochladen. Gemäß dem Code sollten sich die an P0 und P1 des Expanders angebrachten LEDs abwechseln und blinken, und genau das passiert hier, Bingo.

Anhänge

  • WriteValue.zip herunterladen

Schritt 12: Wert lesen

Um nun Werte aus dem Expander zu lesen, verwenden wir eine der beiden Funktionen "digitalReadAll ()" oder "digitalRead (Pin_Number)".

Die Funktion digitalReadAll () liest 'alle Eingangspins' in einer Übertragung:

PCF8574 :: DigitalInput di = PCF8574.digitalReadAll ();

Serial.print (di.p0); Serial.print ("-");

Serial.print (di.p1); Serial.print ("-");

Serial.print (di.p2); Serial.print ("-");

Serial.println (di.p3);

Wenn Sie einen einzelnen Eingang lesen möchten, können Sie die Funktion "digitalRead (Pin_Number)" verwenden:

int p1 = PCF8574.digitalRead (P1); // liest Pin P1

Laden wir diesen Code nun in ein Arduino. Der Code ist sehr einfach und liest nur den Wert des Pins P1 in einer Schleife. Wenn der Wert HIGH ist, leuchtet die an Pin P0 angeschlossene LED auf. Ich benutze diesen Druckknopf, um den Zustand des Pins P1 zu ändern. Wenn die Taste gedrückt wird, geht der Wert von P1 auf HIGH und die LED leuchtet auf. Wenn die Taste losgelassen wird, erlischt die LED. Das ist ganz einfach.

Anhänge

  • ReadValue.zip herunterladen

Schritt 13: Pin unterbrechen

In heutigen komplexen eingebetteten Computer- und Datenkommunikationssystemen werden Interrupts häufig zur Wartung von Peripheriegeräten verwendet. Aufgrund der Beschränkung der Pin-Nummer bei Paketen haben die meisten Mikroprozessoren jedoch nur eine oder zwei Interrupt-Leitungen.

Folglich sind normalerweise mehrere Geräte an dieselbe Interruptleitung angeschlossen. Der Nachteil dieser Konfiguration besteht darin, dass die Overhead-Verarbeitungszeit zum Identifizieren des Geräts, das den Interrupt-Dienst angefordert hat, möglicherweise zu lang ist (in der Größenordnung von Mikrosekunden).

Der Remote-E / A-Expander kann den Mikroprozessor informieren, wenn am Port eingehende Daten vorliegen oder wenn sich die Portdaten ändern, ohne über den I2C-Bus kommunizieren zu müssen.

Der PCF8574 bietet einen INT-Ausgang (Open-Drain Interrupt), der einem entsprechenden Eingang des Mikroprozessors zugeführt werden kann. Weitere Informationen zu Interrupts finden Sie im beigefügten Datenblatt.

Um Interrupts zu verwenden, müssen Sie den Pin und die aufzurufende Funktion initialisieren, wenn PCF8574 einen Interrupt auslöst. Sobald dies erledigt ist, können Sie die Interruptroutine in Ihrem Programm verwenden.

// Funktionsunterbrechung

void keyPressedOnPCF8574 ();

// i2c HEX Adresse einstellen

PCF8574 pcf8574 (0x20, ARDUINO_UNO_INTERRUPT_PIN, keyPressedOnPCF8574);

Anhänge

  • KeyPressed_withInterrupt.zip herunterladen
  • DataSheet.zip herunterladen

Schritt 14: Anwendungsbereiche

PCF8574 GPIO Extender werden verwendet in:

  1. Prozessoren mit begrenzten GPIO-Pins
  2. Mit ihnen können Sie eine I2C-basierte Tastatur erstellen
  3. Sie können bei der Arbeit mit mehreren Relais verwendet werden
  4. Sie können zur Herstellung von LED-Chaser-Schaltungen verwendet werden
  5. Diese ICs werden auch zum Ansteuern der LCD-Abschirmungen und vieler weiterer ...

Ich entwerfe gerade ein Breakout-Board mit 8 dieser ICs, um die GPIO-Pins meines Arduino zu verlängern. In einem weiteren Versuch werde ich diese ICs mit dem TCA9548A I2C MUX koppeln, um zu sehen, ob ich insgesamt 512 GPIO-Pins erhalten kann. Der TCA9548A Breakout ermöglicht die Kommunikation mit mehreren I2C-Geräten mit derselben Adresse, sodass die Schnittstelle zu ihnen einfach ist. Offensichtlich wird NANO weinen und so viele Pins kontrollieren, aber möglicherweise ist MEGA in der Lage, damit umzugehen. Ich habe es jedoch noch nicht ausprobiert.

Zu einem Arduino können maximal 8 MUX hinzugefügt werden, die jeweils zusätzliche 8 I2C-Ports bereitstellen. So:

8 x 8 = 64 I2C-Ports

Wenn wir nun 64 dieser E / A-Expander verbinden, erhalten wir:

64 x 8 = 512 E / A-Pins

Also, worauf wartest Du? Verwenden Sie Ihre Fantasie und bringen Sie 64 Sensoren an Ihrem Arduino an, um ein erstaunliches Automatisierungsprojekt zu erstellen, das Ihre Freunde in Erstaunen versetzt.

Anhänge

  • Schematic.zip herunterladen

Schritt 15: Links herunterladen

  • Bibliothek: //github.com/xreef/PCF8574_library
  • Codes:
  • I2C-Scanner:
  • Datenblätter :
  • Schema:

Nochmals vielen Dank für das Lesen des Tutorials. Ich hoffe es hilft dir.

Wenn du mich unterstützen willst, kannst du meinen Kanal abonnieren und meine anderen Videos ansehen. Nochmals vielen Dank in meinem nächsten Video, tschüss.

Ähnlicher Artikel