Extender GPIO PCF8574 - Con Arduino e NodeMCU

Nel mio ultimo tutorial, ho parlato del MUX TCA9548A che può essere utilizzato per aggiungere al massimo Arduino / ESP8266 / ESP32 al massimo 64 sensori I2C o I²C.

In questo tutorial, parlerò del Port Extender GPIO a 8 bit PCF8574. È uno dei molti extender GPIO disponibili sul mercato.

Questa piccola piccola scheda diventa un salvavita quando finisci i pin sul tuo Arduino. Questo "extender pin GPIO (General Purpose Input Output)" fornisce 8 pin aggiuntivi (P0 ~ P7) che possono essere utilizzati per "emettere un segnale" o "leggere un segnale come input".

Questi moduli funzionano sul bus I2C e, se collegati in cascata, è possibile collegare fino a 8 di questi dispositivi in ​​un progetto. Ogni dispositivo ci fornirà un ulteriore 8 bit di GPIO abilitando 64 GPIO in totale.

Questi circuiti integrati sono ridicolmente economici e possono essere acquistati facilmente da eBay o AliExpress. Se non vuoi preoccuparti del cablaggio e vuoi semplicemente mantenere il tuo progetto davvero "semplice", puoi acquistare queste schede breakout completamente assemblate. Devi solo collegarli al bus I2C e sei pronto per partire.

Passaggio 1: Requisiti hardware

Per questo tutorial abbiamo bisogno di:

  • breadboard
  • PCF8574 IC GPIO Extender
  • PCF8574 Scheda breakout di estensione GPIO
  • Arduino UNO / Nano qualunque cosa sia utile
  • NodeMCU
  • Pochi LED e uguale quantità di resistori di limitazione della corrente da 220 Ohm
  • 2 resistori da 10K
  • Cavi jumper e
  • Cavo USB per caricare il codice

Passaggio 2: argomenti trattati

  • Panoramica della tecnologia I2C
  • Approfondimento del GPF Extender PCF8574 e della Breakout Board
  • Indirizzamento GPIO
  • Librerie da usare
  • Collegamento PCF8574 ad Arduino e NodeMCU
  • Ricerca dell'indirizzo tramite lo scanner I2C
  • Come programmare e utilizzare PCF8574 nel tuo progetto
  • Come usare il Pin di interruzione
  • Aree di applicazione

Passaggio 3: tecnologia I2C

Il circuito inter-integrato pronunciato I-squared-C (I²C) o I2C è una "breve distanza", "tecnologia a due fili bus" (ben 4 fili perché servono anche VCC e terra) che viene utilizzato per "comunicazione seriale" tra più processori e sensori.

Se vuoi saperne di più sulla tecnologia I2C, consulta il mio "Tutorial Number 09". Per ora tratteremo solo le basi di I2C e passeremo al nostro argomento principale. I due fili sono:

  • SDA - Dati seriali (linea dati) e
  • SCL - Orologio seriale (linea di clock)

Entrambe queste linee sono a drenaggio aperto e sono tirate su con resistori. Di solito c'è un master e uno o più slave sulla linea, tuttavia possono esserci anche più master. Sia i master che gli slave possono trasmettere o ricevere dati.

PCF8574 Extender GPIO eseguito sul bus I2C, estendendo i 'IO Pin' che possono essere controllati da un singolo bus I2C host. L'intervallo di indirizzi di PCF8574 va da 0x20 a 0x27 (modalità indirizzo 7 bit). al massimo 8 di questi dispositivi possono essere collegati in un progetto al bus I2C.

Step 4: Approfondimento / Pinouts

IC: (5 pezzi per AUD $ 2, 30)

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

Per prima cosa controlla i pin-out del PCF8574 IC:

  1. Il pin 16 di questo IC è VCC che può funzionare da 2, 5 V a 6 V.
  2. Il pin 8 è GND
  3. I pin 4 ~ 7 e 9 ~ 12 sono i pin I / O da P0 a P7 8-Parallel (il che significa che è possibile utilizzare tutti gli 8 pin contemporaneamente). Ognuno di questi pin I / O bidirezionali può essere utilizzato come input o output senza l'uso di un segnale di controllo della direzione dei dati. All'accensione, tutti questi pin I / O sono nello stato ALTO.
  4. Il pin 15 è per l'ingresso o l'uscita dei dati seriali I2C (collegare a VCC tramite una resistenza di pull-up) e
  5. Il pin 14 è per l'ingresso del clock I2C (collegare a VCC tramite una resistenza pull-up)
  6. I pin 1, 2 e 3 o A0, A1 e A2 ci consentono di specificare l'indirizzo che il PCF8574 appare come sul bus I2C ruotandoli ALTO. L'indirizzo predefinito è 0x20. Per impostazione predefinita, tutti questi pin sono collegati a terra o BASSI. Le resistenze pull-up non sono necessarie per questi pin.
  7. Il pin 13 è per l'uscita di interruzione. Collegalo al VCC usando una resistenza pull-up.
  • Questi circuiti integrati hanno un consumo molto "bassa corrente di standby" di soli 10 μA.
  • I pin SDA, SLC e Interrupt devono essere tirati su usando resistori pull-up
  • Esiste una seconda variante di questo IC disponibile sul mercato chiamata PCF8574A. La differenza principale è lo schema di indirizzamento. I primi quattro bit dell'indirizzo a 7 bit del PCF8574 sono 0100 e quelli per il PCF8574A sono 0111. I tre bit inferiori sono le impostazioni sui pin del dispositivo A2, A1 e A0.
  • PCF8574 e PCF8574A hanno una corrente di assorbimento massima di 25 mA. In applicazioni che richiedono unità aggiuntive, è possibile collegare tra loro due pin per assorbire fino a 50 mA di corrente.

Passaggio 5:

Modulo: (1 scheda per AUD $ 1, 34)

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

  • Ora diamo un'occhiata al Break-out PCF8574:
  • Guardando da sinistra a destra possiamo vedere che il modulo ha 4 pin: VCC, GND, SDA e SCL
  • Quindi abbiamo i due resistori pull-up SMD da 10kΩ per i bus SDA e SCL.
  • Successivamente abbiamo l'IC SMD PCF8574 seguito dai 3 jumper per A0, A1 e A2 con posizioni alte e basse. Quindi abbiamo queste porte che possono essere utilizzate per trasferire sulle spalle un'altra di queste schede.
  • Quindi abbiamo gli 8 pin I / O più un pin di interruzione. Se osserviamo il retro della scheda, i pin sono tutti etichettati a partire da P0 a P7 e terminando con il pin INTrupt.

Quando si utilizzano più di questi, è possibile cambiare l'indirizzo regolando queste barre jumperAddress.

Passaggio 6: indirizzamento

Collegando i tre bit di indirizzo A0, A1 e A2 a VIN o HIGH è possibile ottenere una diversa combinazione degli indirizzi.

Ecco come appare un byte di indirizzo del PCF8574. I primi 7 bit si combinano per formare l'indirizzo slave. L'ultimo bit dell'indirizzo slave definisce l'operazione (lettura o scrittura) da eseguire. Quando è alto (1), viene selezionata una lettura, mentre un valore basso (0) seleziona un'operazione di scrittura.

Passaggio 7: libreria da utilizzare

La "Wire Library" inclusa consente la comunicazione tramite il bus I2C / TWI di Arduino, tuttavia, se lo desideri, puoi anche scaricare e utilizzare il "PCF8574_library" da github: //github.com/xreef/PCF8574_library

Il link è nella descrizione qui sotto. Fare clic sul pulsante DOWNLOAD nell'angolo in alto a destra della pagina, una volta scaricato rinominare la cartella non compressa in PCF8574.

Assicurarsi che la cartella PCF8574 contenga PCF8574.cpp e PCF8574.h.

Posiziona la cartella della libreria PCF8574 nella cartella Arduino / libraries /.

Potrebbe essere necessario creare la sottocartella delle librerie se questa è la tua prima libreria. Riavvia l'IDE e quindi dovresti essere in grado di utilizzare la libreria nel tuo codice. Questa libreria contiene anche ottimi esempi che ti aiuteranno a mettere le mani su IO Expander.

#include "Arduino.h"

#include "PCF8574.h"

allegati

  • Download di PCF8574_library-master.zip

Passaggio 8: come connettersi ad Arduino / NodeMCU

Iniziamo collegando l'IC ad un Arduino. Collegare:

VCC a 3, 3 v

Da GND a GND

Dobbiamo anche collegare i tre pin di selezione dell'indirizzo A0, A1 e A2 a GND per utilizzare l'indirizzo 0x20 predefinito Quindi collegare il pin SCL a A5 di Arduino e

SDA a A4

Infine, dobbiamo eseguire il pull up dei bus SCL e SDA rispettivamente con resistori da 10K.

Per la connessione NodeMCU:

VCC a 3, 3 v

Da GND a GND

Pin A0, A1 e A2 su GND

SCL a D1

SDA a D2

Infine, esegui il pull up dei bus SDA e SCL utilizzando rispettivamente resistori da 10K

Una volta collegato l'IC al microcontrollore, è sufficiente collegare i sensori ai pin 4 ~ 7/9 ~ 12 o, in altre parole, ai pin da P0 a P7 dell'IC.

Passaggio 9: scanner I2C

Come sappiamo, collegando i tre bit di indirizzo A0, A1 e A2 a VIN o HIGH possiamo ottenere diverse combinazioni di indirizzi. Pertanto, a volte diventa difficile capire quale indirizzo è stato assegnato all'espansore. Inoltre, se sul bus I2C sono presenti due o più dispositivi, è sempre consigliabile verificare se uno di essi è in conflitto con l'altro.

Eseguendo questo "scanner I2C" puoi facilmente trovare l'indirizzo esadecimale del tuo dispositivo. Quando caricato su un Arduino, lo schizzo esegue la scansione della rete I2C, mostrando gli indirizzi che rispondono.

allegati

  • Download I2CScanner.zip

Passaggio 10: il codice

Una volta che conosci l'indirizzo di IO Expander puoi facilmente usarlo nel tuo codice.

Per prima cosa devi includere la libreria "PCF8574.h" nel tuo codice.

Quindi è necessario passare l'indirizzo di IO Expander al costruttore:

PCF8574 (indirizzo uint8_t);

per esp8266 se si desidera specificare i pin SDA e SCL, utilizzare questo:

PCF8574 (indirizzo uint8_t, uint8_t sda, uint8_t scl);

Quindi è necessario specificare le modalità dei pin IO:

pcf8574.pinMode (P0, OUTPUT);

pcf8574.pinMode (P1, INPUT);

e infine "inizia" la trasmissione prima di scorrere il resto del codice.

Passaggio 11: Scrivi valore

Ora, per scrivere un valore, devi solo chiamare la funzione "digitalWrite" e passare il numero pin seguito dalla modalità:

PCF8574.digitalWrite (P1, HIGH);

o:

PCF8574.digitalWrite (P1, LOW);

Bene, quindi cariciamo il codice su un Arduino. Secondo il codice, i LED collegati a P0 e P1 dell'espansore dovrebbero alternarsi e lampeggiare, e questo è esattamente ciò che sta accadendo qui, il bingo.

allegati

  • Scarica WriteValue.zip

Passaggio 12: leggere il valore

Ora, per leggere i valori dall'espansore utilizzeremo una delle due funzioni "digitalReadAll ()" o "digitalRead (Pin_Number)".

La funzione digitalReadAll () legge "tutti i pin di input" in una trasmissione:

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);

Se vuoi leggere un singolo input puoi usare la funzione "digitalRead (Pin_Number)":

int p1 = PCF8574.digitalRead (P1); // legge il pin P1

Ora, consente di caricare questo codice su un Arduino. Il codice è molto semplice e legge semplicemente il valore del pin P1 in un ciclo. Se il valore è ALTO, si accende il LED collegato al pin P0. Sto usando questo pulsante per cambiare lo stato del pin P1. Quando si preme il pulsante, il valore di P1 diventa ALTO e il LED si illumina, e quando il pulsante viene rilasciato il LED si spegne, è semplice.

allegati

  • Scarica ReadValue.zip

Passaggio 13: Pin di interruzione

Negli odierni sistemi complessi, integrati, informatici e di comunicazione dati, gli interrupt sono ampiamente utilizzati per servire i dispositivi periferici. Tuttavia, a causa della limitazione del numero pin sui pacchetti, la maggior parte dei microprocessori ha solo una o due linee di interruzione.

Di conseguenza, diversi dispositivi sono generalmente collegati alla stessa linea di interrupt. Lo svantaggio di questa configurazione è che il tempo di elaborazione del sovraccarico per identificare il dispositivo che ha richiesto il servizio di interruzione potrebbe essere troppo lungo (nell'ordine dei microsecondi).

L'espansore I / O remoto può informare il microprocessore se sono presenti dati in entrata sulla porta o se vi è una modifica dei dati della porta, senza la necessità di comunicare tramite il bus I2C.

Il PCF8574 fornisce un'uscita di interruzione open-drain (INT) che può essere alimentata a un ingresso corrispondente del microprocessore. Per ulteriori informazioni sugli interrupt, leggi la scheda tecnica allegata.

Per utilizzare gli interrupt è necessario inizializzare il pin e la funzione da chiamare quando PCF8574 genera un interrupt, una volta fatto è possibile utilizzare la routine di interrupt nel programma.

// Interruzione funzione

tasto voidPressedOnPCF8574 ();

// Imposta l'indirizzo esadecimale i2c

PCF8574 pcf8574 (0x20, ARDUINO_UNO_INTERRUPT_PIN, tasto premuto su PCPC8574);

allegati

  • KeyPressed_withInterrupt.zip Download
  • Scarica DataSheet.zip

Step 14: Aree di applicazione

Gli extender GPIO PCF8574 sono utilizzati in:

  1. Processori con pin GPIO limitati
  2. È possibile creare una tastiera basata su I2C utilizzandoli
  3. Possono essere utilizzati quando si lavora con più relè
  4. Possono essere utilizzati per realizzare circuiti Chaser a LED
  5. Questi circuiti integrati vengono utilizzati anche per pilotare gli schermi LCD e molti altri ...

In realtà sto progettando una breakout board con 8 di questi circuiti integrati preinstallati per estendere i pin GPIO del mio Arduino. In un altro tentativo, accoppierò questi circuiti integrati con il TCA9548A I2C MUX per vedere se riesco a ottenere 512 pin GPIO in totale. Il Breakout TCA9548A consente la comunicazione con più dispositivi I2C con lo stesso indirizzo, semplificando l'interfaccia con essi. Ovviamente, NANO piangerà controllando che molti pin, ma potrebbe essere MEGA, sarà in grado di gestirlo. Tuttavia, non l'ho ancora provato.

È possibile aggiungere un massimo di 8 MUX a un Arduino ciascuno con 8 porte I2C aggiuntive. Così:

8 x 8 = 64 porte I2C

Ora, se colleghiamo 64 di questi espansori IO otterremo:

64 x 8 = 512 pin IO

Allora, cosa stai aspettando? Vai avanti usa la tua immaginazione e collega 64 sensori al tuo Arduino per realizzare un fantastico progetto di automazione per stupire i tuoi amici.

allegati

  • Scarica Schematic.zip

Passaggio 15: download dei collegamenti

  • Biblioteca: //github.com/xreef/PCF8574_library
  • Codici:
  • Scanner I2C:
  • Schede tecniche :
  • Schema:

Grazie ancora per aver letto il tutorial. Spero che ti aiuti.

Se vuoi supportarmi puoi iscriverti al mio canale e guardare i miei altri video. Grazie ancora nel mio prossimo video, ciao ora.

Articoli Correlati