PCF8574 GPIO Extender - Con Arduino y NodeMCU

En mi último tutorial, hablé sobre el TCA9548A MUX que se puede usar para agregar un máximo de 64 sensores I2C o I²C a su Arduino / ESP8266 / ESP32.

En este tutorial, voy a hablar sobre el extensor de puerto GPIO PCF8574 de 8 bits. Es uno de los muchos extensores GPIO disponibles en el mercado.

Esta pequeña placa se convierte en un salvavidas cuando te quedas sin alfileres en tu Arduino. Este "extensor de pin GPIO (entrada de salida de propósito general)" proporciona 8 pines adicionales (P0 ~ P7) que se pueden usar para 'emitir una señal' o 'leer una señal como entrada'.

Estos módulos se ejecutan en el bus I2C y, si están conectados en cadena, puede conectar hasta 8 de estos dispositivos en un proyecto. Cada dispositivo nos dará 8 bits adicionales de GPIO que permiten 64 GPIO en total.

Estos circuitos integrados son ridículamente baratos y se pueden comprar fácilmente en eBay o AliExpress. Si no quiere preocuparse por el cableado y solo quiere mantener su proyecto realmente "simple", puede comprar estas placas desmontables completamente ensambladas. Solo necesita conectarlos al bus I2C y estará listo para comenzar.

Paso 1: requisito de hardware

Para este tutorial necesitamos:

  • Tablero de circuitos
  • PCF8574 GPIO Extender IC
  • PCF8574 GPIO Extender Breakout Board
  • Arduino UNO / Nano lo que sea útil
  • NodeMCU
  • Pocos LED y la misma cantidad de resistencias limitantes de corriente de 220 ohmios
  • 2 x 10K resistencias
  • Cables de puente, y
  • Cable USB para cargar el código

Paso 2: temas cubiertos

  • Descripción general de la tecnología I2C
  • Una mirada más cercana al PCF8574 GPIO Extender IC y la placa de conexión
  • Direccionamiento GPIO
  • Bibliotecas para usar
  • Conexión de PCF8574 a Arduino y NodeMCU
  • Encontrar dirección usando el escáner I2C
  • Cómo programar y usar PCF8574 en su proyecto
  • Cómo usar el pin de interrupción
  • Areas de aplicación

Paso 3: tecnología I2C

El circuito inter-integrado pronunciado I-cuadrado-C (I²C) o I2C es una 'distancia corta', 'tecnología de bus de dos cables' (bueno, en realidad 4 cables porque también necesita el VCC y tierra) que se usa para 'comunicación en serie' entre múltiples procesadores y sensores.

Si desea saber más sobre la tecnología I2C, consulte mi 'Tutorial número 09'. Por ahora solo cubriremos los conceptos básicos de I2C y saltaremos a nuestro tema principal. Los dos cables son:

  • SDA - Datos en serie (línea de datos) y
  • SCL - Reloj serie (línea de reloj)

Ambas líneas son de drenaje abierto y se levantan con resistencias. Por lo general, hay un maestro y uno o varios esclavos en la línea, sin embargo, también puede haber varios maestros. Tanto los maestros como los esclavos pueden transmitir o recibir datos.

PCF8574 GPIO Extender se ejecuta en el bus I2C, extendiendo los 'pines IO' que pueden ser controlados por un solo bus I2C host. El rango de direcciones de PCF8574 es de 0x20 a 0x27 (modo de dirección de 7 bits). Como máximo, 8 de estos dispositivos se pueden conectar en un proyecto al bus I2C.

Paso 4: Mirada más atenta / Pinouts

IC: (5 piezas por AUD $ 2.30)

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

Primero revisemos los pines del PCF8574 IC:

  1. El pin 16 de este IC es VCC que puede funcionar con 2.5V a 6V
  2. El pin 8 es GND
  3. Los pines 4 ~ 7 y 9 ~ 12 son P0 a P7 8-Paralelo (lo que significa que puede usar todos los 8 pines a la vez) pines de E / S. Cada uno de estos pines de E / S bidireccionales se puede usar como entrada o salida sin el uso de una señal de control de dirección de datos. Al encender, todos estos pines de E / S están en estado ALTO.
  4. El pin 15 es para la entrada o salida de datos en serie I2C (conectar a VCC a través de una resistencia pull-up) y
  5. El pin 14 es para la entrada de reloj I2C (se conecta a VCC a través de una resistencia pull-up)
  6. Los pines 1, 2 y 3 o A0, A1 y A2 nos permiten especificar la dirección en la que aparece el PCF8574 en el bus I2C girándolos ALTO. La dirección predeterminada es 0x20. Por defecto, todos estos pines están conectados a tierra o son BAJOS. No se necesitan resistencias pull-up para estos pines.
  7. El pin 13 es para la salida de interrupción. Conéctelo al VCC con una resistencia pull-up.
  • Estos circuitos integrados tienen un consumo de "corriente de espera baja" muy bajo de solo 10 μA.
  • Los pines SDA, SLC y de interrupción deben extraerse utilizando resistencias pull-up
  • Hay una segunda variante de este IC disponible en el mercado llamada PCF8574A. La principal diferencia es el esquema de direccionamiento. Los primeros cuatro bits de la dirección de 7 bits del PCF8574 son 0100, y los del PCF8574A son 0111. Los tres bits inferiores son las configuraciones en los pines A2, A1 y A0 del dispositivo.
  • El PCF8574 y PCF8574A tienen una corriente de hundimiento máxima de 25 mA. En aplicaciones que requieren una unidad adicional, se pueden conectar dos pines de puerto para absorber hasta 50 mA de corriente.

Paso 5:

Módulo: (1 tablero por AUD $ 1.34)

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

  • Ahora echemos un vistazo al PCF8574 Break-outboard:
  • Mirando de izquierda a derecha podemos ver que el módulo tiene 4 pines: VCC, GND, SDA y SCL
  • Luego tenemos las dos resistencias pull-up SMD de 10kΩ para los buses SDA y SCL.
  • A continuación tenemos el PCF8574 SMD IC seguido de los 3 puentes para A0, A1 y A2 con posiciones altas y bajas. Luego tenemos estos puertos que se pueden usar para llevar a cuestas otra de estas placas.
  • Luego tenemos los 8 pines de E / S más un pin de interrupción. Si miramos la parte posterior del tablero, todos los pines están etiquetados comenzando desde P0 hasta P7 y luego terminando con el pin INTrupt.

Cuando está utilizando varios de estos, puede cambiar la dirección ajustando estas barras de dirección de puente.

Paso 6: direccionamiento

Al conectar los tres bits de dirección A0, A1 y A2 a VIN o HIGH, puede obtener una combinación diferente de las direcciones.

Así es como se ve un byte de dirección del PCF8574. Los primeros 7 bits se combinan para formar la dirección del esclavo. El último bit de la dirección esclava define la operación (lectura o escritura) a realizar. Cuando es alta (1), se selecciona una lectura, mientras que baja (0) selecciona una operación de escritura.

Paso 7: Biblioteca para usar

La 'Biblioteca de cables' incluida permite la comunicación a través del bus I2C / TWI de Arduino, sin embargo, si lo desea, también puede descargar y usar el 'PCF8574_library' desde github: //github.com/xreef/PCF8574_library

El enlace está en la descripción a continuación. Haga clic en el botón DESCARGAS en la esquina superior derecha de la página, una vez descargado, cambie el nombre de la carpeta sin comprimir a PCF8574.

Asegúrese de que la carpeta PCF8574 contenga PCF8574.cpp y PCF8574.h.

Coloque la carpeta de la biblioteca PCF8574 en su carpeta Arduino / bibliotecas /.

Es posible que deba crear la subcarpeta de bibliotecas si esta es su primera biblioteca. Reinicie el IDE y luego podrá usar la biblioteca en su código. Esta biblioteca también viene con muy buenos ejemplos que lo ayudarán a tener en sus manos el IO Expander.

#include "Arduino.h"

#include "PCF8574.h"

Archivos adjuntos

  • PCF8574_library-master.zip Descargar

Paso 8: Cómo conectarse a Arduino / NodeMCU

Comencemos conectando el IC a un Arduino. Conectar:

VCC a 3.3v

GND a GND

También necesitamos conectar los tres pines de selección de dirección A0, A1 y A2 a GND para usar la dirección 0x20 predeterminada Luego conecte el pin SCL a A5 de Arduino y

SDA a A4

Finalmente, necesitamos extraer los buses SCL y SDA con resistencias de 10K respectivamente.

Para NodeMCU conectar:

VCC a 3.3v

GND a GND

Pines A0, A1 y A2 a GND

SCL a D1

SDA a D2

Y finalmente, levante los buses SDA y SCL usando resistencias de 10K respectivamente

Una vez que el IC está conectado al microcontrolador, solo necesita conectar los sensores a los pines 4 ~ 7/9 ~ 12 o, en otras palabras, a los pines P0 a P7 del IC.

Paso 9: escáner I2C

Como sabemos, al conectar los tres bits de dirección A0, A1 y A2 a VIN o HIGH podemos obtener diferentes combinaciones de direcciones. Por lo tanto, a veces se hace difícil determinar qué dirección se ha asignado al expansor. Además, si hay dos o más dispositivos en el bus I2C, siempre es una buena idea verificar si alguno de ellos está en conflicto con el otro.

Al ejecutar este 'Escáner I2C', puede encontrar fácilmente la dirección hexadecimal de su dispositivo. Cuando se carga en un Arduino, el boceto escanea la red I2C y muestra las direcciones que responden.

Archivos adjuntos

  • I2CScanner.zip Descargar

Paso 10: el código

Una vez que sepa la dirección de IO Expander, puede usarla fácilmente en su código.

Primero debe incluir la biblioteca "PCF8574.h" en su código.

Luego debe pasar la dirección de IO Expander al constructor:

PCF8574 (dirección uint8_t);

para esp8266 si desea especificar el pin SDA y SCL use esto:

PCF8574 (dirección uint8_t, uint8_t sda, uint8_t scl);

Luego debe especificar los modos de los pines IO:

pcf8574.pinMode (P0, SALIDA);

pcf8574.pinMode (P1, INPUT);

y finalmente "comienza" la transmisión antes de recorrer el resto del código.

Paso 11: Escribir valor

Ahora, para escribir un valor, solo necesita llamar a la función "digitalWrite" y pasar el número pin seguido del modo:

PCF8574.digitalWrite (P1, ALTO);

o:

PCF8574.digitalWrite (P1, BAJO);

Muy bien, así que subamos el código a un Arduino. Según el código, los LED conectados a P0 y P1 del expansor deben alternar y parpadear, y eso es exactamente lo que está sucediendo aquí, bingo.

Archivos adjuntos

  • WriteValue.zip Descargar

Paso 12: Leer valor

Ahora, para leer los valores del expansor, vamos a utilizar cualquiera de las dos funciones "digitalReadAll ()" o "digitalRead (Pin_Number)".

La función digitalReadAll () lee 'todos los pines de entrada' en una transmisión:

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

Si desea leer una sola entrada, puede usar la función "digitalRead (Pin_Number)":

int p1 = PCF8574.digitalRead (P1); // lee el pin P1

Ahora, carguemos este código en un Arduino. El código es muy simple y solo lee el valor del pin P1 en un bucle. Si el valor es ALTO, se encenderá el LED conectado al pin P0. Estoy usando este botón para cambiar el estado del pin P1. Cuando se presiona el botón, el valor de P1 pasa a ALTO y el LED se ilumina, y cuando se suelta el botón, el LED se apaga, eso es simple.

Archivos adjuntos

  • ReadValue.zip Descargar

Paso 13: Pin de interrupción

En los complejos sistemas de comunicación de datos, integrados y complejos, las interrupciones se utilizan ampliamente para dar servicio a dispositivos periféricos. Sin embargo, debido a la limitación del número de pines en los paquetes, la mayoría de los microprocesadores tienen solo una o dos líneas de interrupción.

En consecuencia, varios dispositivos generalmente están conectados a la misma línea de interrupción. El inconveniente de esta configuración es que el tiempo de procesamiento general para identificar el dispositivo que solicitó el servicio de interrupción puede ser demasiado largo (en el orden de microsegundos).

El expansor de E / S remoto puede informar al microprocesador si hay datos entrantes en el puerto o si hay un cambio en los datos del puerto, sin tener que comunicarse a través del bus I2C.

El PCF8574 proporciona una salida de interrupción de drenaje abierto (INT) que se puede alimentar a una entrada correspondiente del microprocesador. Para obtener más información sobre las interrupciones, lea la hoja de datos adjunta.

Para usar las interrupciones, debe inicializar el pin y la función para llamar cuando PCF8574 genera una interrupción; una vez hecho esto, puede usar la rutina de interrupción en su programa.

// Interrupción de funciones

tecla nulaPressedOnPCF8574 ();

// Establecer la dirección i2c HEX

PCF8574 pcf8574 (0x20, ARDUINO_UNO_INTERRUPT_PIN, keyPressedOnPCF8574);

Archivos adjuntos

  • KeyPressed_withInterrupt.zip Descargar
  • DataSheet.zip Descargar

Paso 14: áreas de aplicación

Los extensores GPIO PCF8574 se utilizan en:

  1. Procesadores con pines GPIO limitados
  2. Puede crear un teclado basado en I2C con ellos
  3. Se pueden usar cuando se trabaja con múltiples relés
  4. Se pueden usar para hacer circuitos de LED Chaser
  5. Estos circuitos integrados también se utilizan para controlar los protectores LCD y muchos más ...

De hecho, estoy diseñando una placa de conexión con 8 de estos circuitos integrados preinstalados para extender los pines GPIO de mi Arduino. En otro intento, voy a acoplar estos circuitos integrados con el TCA9548A I2C MUX para ver si puedo obtener 512 pines GPIO en total. El TCA9548A Breakout permite la comunicación con múltiples dispositivos I2C que tienen la misma dirección, lo que facilita la interfaz con ellos. Obviamente, NANO llorará controlando esa cantidad de pines, pero puede ser que MEGA pueda manejarlo. Sin embargo, aún no lo he probado.

Se puede agregar un máximo de 8 MUX a un Arduino, cada uno de los cuales proporciona 8 puertos I2C adicionales. Entonces:

8 x 8 = 64 puertos I2C

Ahora, si conectamos 64 de estos expansores de E / S obtendremos:

64 x 8 = 512 pines IO

¿Entonces, Qué esperas? Adelante, usa tu imaginación y conecta 64 sensores a tu Arduino para crear un sorprendente proyecto de automatización que sorprenderá a tus amigos.

Archivos adjuntos

  • Schematic.zip Descargar

Paso 15: Descargar enlaces

  • Biblioteca: //github.com/xreef/PCF8574_library
  • Códigos
  • Escáner I2C:
  • Hojas de datos:
  • Esquema:

Gracias de nuevo por leer el tutorial. Espero que te ayude.

Si quieres apoyarme, puedes suscribirte a mi canal y ver mis otros videos. Gracias de nuevo en mi próximo video, adiós ahora.

Artículos Relacionados