====== [I2C] PCF8574: Módulo de expansión y código para Arduino ======
Existen en el mercado diferentes placas que integran este circuito y que nos permiten realizar proyectos de forma cómoda y rápida. Suelen disponer de la opción de configurar con A0, A1 y A2 la dirección final I2C del módulo mediante puentes o soldaduras.
{{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574_expansion2.png?nolink |}}
{{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574_expansion.png?nolink |}}
===== Ejemplos de código y librerías para Arduino =====
* [[https://youtu.be/wSoczBCGdFo|Creating Arduino Library for PCF8574 I/O Expander]] / [[https://www.youtube.com/redirect?event=video_description&redir_token=QUFFLUhqbHd1UkZubU1yOUs5UEthTlNIOWtFNkMtbjRtQXxBQ3Jtc0traUprRWxnNkZEaXZnMU5nSVdEN0ZWRXNOdGJDNXBuT0JmWXl0WTNpRC1adnRQVk01MXRMXzJmNVBsLWI4X2dOdG5nZ3gxRHFOMnhyZmtxcFl1c0lXZEJUTVZzTUcwck1JTWhyU2ppdU1tY25NYUEyMA&q=https%3A%2F%2Fgithub.com%2Fakuzechie%2FPCF8574-8-bit-I-O-Expander&v=wSoczBCGdFo|GitHub repository to access PCF8574 library]] => {{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574-8-bit-i-o-expander-main.zip |}} FIXME {{ doc:tec:lab:bus_i2c:pcf8574_modulo:creating_arduino_library_for_dht22_sensor.mp4 |}}
* {{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574-master.zip |}} FIXME => #include "PCF8574.h"
* [[https://www.arduinolibraries.info/libraries/pcf8574|pcf8574 Arduino Library List]] => {{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574-1.0.3.zip |}} FIXME
* Artículos
* [[https://victorventura.es/polaridad.es/pcf8574-expansor-i2c-de-8-bits-de-puertos-gpio-digitales-de-entrada-y-salida/|PCF8574. Expansor I2C de 8 bits de puertos GPIO digitales de entrada y salida.]]
* [[https://programarfacil.com/blog/arduino-blog/comunicacion-i2c-con-arduino/|Comunicación I2C con Arduino lo mejor de dos mundos]]
* [[https://www.luisllamas.es/mas-pines-digitales-con-arduino-y-el-expansor-es-i2c-pcf8574/|MÁS PINES DIGITALES CON ARDUINO Y EXPANSOR E/S I2C PCF8574]]
* Youtube
* [[https://youtu.be/6pFLdIC18P4|Expansor de puertos: 74HC595 + bit banging y PCF8574]]
* [[https://youtu.be/o3Dtc4W8fTw|Ampliación de pines digitales para Arduino con el expansor PCF8574]]
==== Ejemplos sin librería ====
- El siguiente código muestra el uso del PCF8574 como salida. En el ejemplo, encendemos y apagamos en bucle cada uno de los pines. Observar que la señal del canal se envía negada, porque el PCF8574 actúa como sumidero de corriente y el pin está activo cuando la salida es LOW.
#include
const int pcfAddress = 0x20;
void setup()
{
Wire.begin();
Serial.begin(9600);
}
void loop()
{
for (short channel = 0; channel < 8; channel++)
{
// Escribir dato en cada uno de los 8 canales
Wire.beginTransmission(pcfAddress);
Wire.write(~(1 << channel));
Wire.endTransmission();
// Leer dato del canal
delay(500);
}
}
- El siguiente código muestra el uso del PCF8574 como entrada. En el ejemplo realizamos la lectura progresiva de cada uno de los pines, y mostramos su valor por puerto serie.
#include
const int pcfAddress = 0x20;
void setup()
{
Wire.begin();
Serial.begin(9600);
}
void loop()
{
short channel = 1;
byte value = 0;
// Leer dato del canal
Wire.requestFrom(pcfAddress, 1 << channel);
if (Wire.available()) {
value = Wire.read();
}
Wire.endTransmission();
// Mostrar el valor por el monitor serie
Serial.println(value);
}
* **Interrupciones**. INTERRUPTOR OUT (INT); Es un pin de drenaje abierto por lo que se necesita conectar una resistencia de PULL-UP, esto se realizar para lograr un nivel alto (5V) constante. Este puerto funciona de la siguiente manera: Cuando detecta un flanco ya sea ascendente o descendente en cualquiera de los pines P1 a P7, este pin (INT) inmediatamente activa un mosfet interno de canal N, por ende tendremos un 0 V cada vez que se obtenga un cambio de estado en esos pines (P1 – P7).
* NOTA: si se usa un microcontrolador (ATmega) que sea programado a través del IDE de arduino ya no será necesario colocar una resistencia de PULL-UP, ya que internamente cuenta una resistencia de PULL-UP, dicha resistencia interna se podrá activar desde la programación.
int pin_INT =2;// INTERRUPTOR DEL CI PCF8574
pinMode( pin_INT, INPUT_PULLUP);
* [[https://www.electroallweb.com/index.php/2019/12/07/pcf8574-circuito-expansor-de-pines/|PCF8574 circuito expansor de pines]]
* si quieres definir varios pines al mismo tiempo es mas facil usar numero binarios.
pcf8574.pinMode(0b11111111, OUTPUT); //Define P0 a P7 como salida.
\\
==== Ejemplos con librería ====
* {{ doc:tec:lab:bus_i2c:pcf8574_modulo:pcf8574_arduino_library-master.zip |}}
- Alternativamente podemos emplear una librería como la desarrollada por SkyWood disponible en [[https://github.com/skywodd/pcf8574_arduino_library|]]. La librería proporciona códigos de ejemplo para ilustrar su uso. No obstante, aquí tenéis un ejemplo resumido que muestra su uso
#include
#include "PCF8574.h"
PCF8574 expander;
void setup()
{
Serial.begin(9600);
expander.begin(0x20);
/* Setup some PCF8574 pins for demo */
expander.pinMode(0, OUTPUT);
expander.pinMode(1, OUTPUT);
expander.pinMode(2, OUTPUT);
expander.pinMode(3, INPUT_PULLUP);
/* Blink hardware LED for debug */
digitalWrite(13, HIGH);
/* Toggle PCF8574 output 0 for demo */
expander.toggle();
/* Blink hardware LED for debug */
digitalWrite(13, LOW);
}
void loop()
{
}
*
// Juan A. Villalpando
// kio4.com
#include "Arduino.h"
#include "PCF8574.h"
PCF8574 pcf8574(0x20); // Dirección del módulo
int LED13 = 13;
void setup(){
pcf8574.begin();
pinMode(LED13,OUTPUT);
pcf8574.pinMode(P1, INPUT); // Pulsador en P1 del módulo
}
void loop(){
uint8_t P1_Read = pcf8574.digitalRead(P1);
if (P1_Read == HIGH){
digitalWrite(LED13, HIGH);
} else {digitalWrite(LED13, LOW);}
delay(50);
}