====== [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); }