Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
| doc:tec:lab:bus_i2c:pcf8574_modulo:inicio [2026/03/28 18:34] – borrado - editor externo (Fecha desconocida) 127.0.0.1 | doc:tec:lab:bus_i2c:pcf8574_modulo:inicio [2026/03/28 18:42] (actual) – [Ejemplos con librería] fepg | ||
|---|---|---|---|
| Línea 1: | Línea 1: | ||
| + | ====== [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. | ||
| + | |||
| + | < | ||
| + | <col xs=" | ||
| + | {{ doc: | ||
| + | </ | ||
| + | {{ doc: | ||
| + | </ | ||
| + | |||
| + | ===== Ejemplos de código y librerías para Arduino ===== | ||
| + | |||
| + | <WRAP center round download> | ||
| + | |||
| + | * [[https:// | ||
| + | * {{ doc: | ||
| + | * [[https:// | ||
| + | |||
| + | </ | ||
| + | |||
| + | <WRAP center round help> | ||
| + | |||
| + | * Artículos | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | * Youtube | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ==== 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. <code c pcf8574_salida.ino> | ||
| + | #include < | ||
| + | |||
| + | const int pcfAddress = 0x20; | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | 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. <code c pcf8574_entrada.ino> | ||
| + | |||
| + | #include < | ||
| + | |||
| + | const int pcfAddress = 0x20; | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | | ||
| + | | ||
| + | } | ||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | short channel = 1; | ||
| + | byte value = 0; | ||
| + | |||
| + | // Leer dato del canal | ||
| + | | ||
| + | if (Wire.available()) { | ||
| + | value = Wire.read(); | ||
| + | } | ||
| + | | ||
| + | |||
| + | // Mostrar el valor por el monitor serie | ||
| + | | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * **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. <code c interrupcion.ino> | ||
| + | |||
| + | int pin_INT =2;// INTERRUPTOR DEL CI PCF8574 | ||
| + | pinMode( pin_INT, INPUT_PULLUP); | ||
| + | |||
| + | </ | ||
| + | |||
| + | <WRAP center round help> | ||
| + | * [[https:// | ||
| + | * si quieres definir varios pines al mismo tiempo es mas facil usar numero binarios. < | ||
| + | pcf8574.pinMode(0b11111111, | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | \\ | ||
| + | ==== Ejemplos con librería ==== | ||
| + | |||
| + | <WRAP center round download> | ||
| + | * {{ doc: | ||
| + | </ | ||
| + | |||
| + | - Alternativamente podemos emplear una librería como la desarrollada por SkyWood disponible en [[https:// | ||
| + | |||
| + | #include < | ||
| + | #include " | ||
| + | |||
| + | PCF8574 expander; | ||
| + | |||
| + | void setup() | ||
| + | { | ||
| + | Serial.begin(9600); | ||
| + | | ||
| + | expander.begin(0x20); | ||
| + | | ||
| + | /* Setup some PCF8574 pins for demo */ | ||
| + | expander.pinMode(0, | ||
| + | expander.pinMode(1, | ||
| + | expander.pinMode(2, | ||
| + | expander.pinMode(3, | ||
| + | |||
| + | /* Blink hardware LED for debug */ | ||
| + | digitalWrite(13, | ||
| + | | ||
| + | /* Toggle PCF8574 output 0 for demo */ | ||
| + | expander.toggle(); | ||
| + | | ||
| + | /* Blink hardware LED for debug */ | ||
| + | digitalWrite(13, | ||
| + | } | ||
| + | |||
| + | |||
| + | |||
| + | void loop() | ||
| + | { | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * <code c pulsador.ino> | ||
| + | |||
| + | // Juan A. Villalpando | ||
| + | // kio4.com | ||
| + | |||
| + | #include " | ||
| + | #include " | ||
| + | |||
| + | PCF8574 pcf8574(0x20); | ||
| + | int LED13 = 13; | ||
| + | |||
| + | void setup(){ | ||
| + | pcf8574.begin(); | ||
| + | pinMode(LED13, | ||
| + | pcf8574.pinMode(P1, | ||
| + | } | ||
| + | void loop(){ | ||
| + | uint8_t P1_Read = pcf8574.digitalRead(P1); | ||
| + | if (P1_Read == HIGH){ | ||
| + | | ||
| + | } else {digitalWrite(LED13, | ||
| + | | ||
| + | delay(50); | ||
| + | } | ||
| + | </ | ||