PCF8574: Acerca do I2C I / O Expander para Arduino

PCF8574 TI CHIP

Seguramente escoitou falar do IC PCF8574, un chip que se pode mercar por separado ou xa montado nun módulo como moitos outros Compoñentes electrónicos para facilitar a túa integración coa túa placa Arduino. Neste caso, é un extensor das entradas e saídas para o autobús I2C.

Podes pensar que Arduino xa ten o seu bus I2C integrado, e é certo. Pero o PCF8574 pode axudar a estender ese bus máis alá dos límites da súa placa de desenvolvemento, o que pode ser de gran axuda para algúns fabricantes que precisan algo máis que o que proporciona Arduino.

Que é o bus I2C?

Arduino UNO funcións millis

O nome I2C vén de Circuíto inter-integrado ou circuítos interintegrados. A súa versión 1.0 foi creada en 1992 por Philips. Despois chegaría un segundo 2.1 no 2000 e hoxe converteuse nun estándar (a 100 kbit / s, aínda que permite ata 3.4 Mbit / s como máximo) cando a patente caducou no 2006 e pódese usar libremente.

Na actualidade é moi utilizado na industria para a comunicación, e tamén moi apreciado polos fabricantes polos seus proxectos para comunicar diferentes microcontroladores e periféricos integrados nun CI.

El I2C é un autobús moi coñecido pola comunicación en serie. Utiliza un protocolo de comunicación síncrono con só 2 canles (hai un terceiro, pero está acoplado á referencia ou GND), de feito tamén se coñece como TWI (Two Wire Interface):

  • Un para o reloxo (SCL).
  • Outro para datos (SDA).
Ambos son conexións CMOS de drenaje aberto e requiren resistencias de extracción. Ademais, se un dispositivo transmite un 0 e outro un 1, pode haber problemas, polo que a liña sempre está establecida en 1 (nivel alto) e os dispositivos sempre transmiten 0 (nivel baixo).

Isto implica que o amo e escravo envían datos a través do mesmo cable ou pista, que é controlado polo primeiro que xera o sinal de reloxo. Cada un dos dispositivos periféricos conectados ao bus I2C terá asignada unha dirección única, co fin de dirixir as transmisións. Pero non é necesario que o profesor sexa sempre o mesmo (multi-profesor), sempre é el quen inicia a transferencia.

Como xa expliquei no artigo sobre Arduino I2C Fixen referencia anteriormente, cada placa ten estas conexións I2C en lugares diferentes. É algo que debes ter en conta para poder usalo correctamente en cada versión de placa:

  • Arduino UNO: SDA está en A4 e SCK en A5
  • Arduino Nano: o mesmo que o anterior.
  • Arduino Mini Pro: mesmo.
  • Mega Arduino: SDA está no pin 20 e SCK no 21.
  • Máis información sobre placas.

Xa sabes que podes usar o I2C para os teus bosquexos facilmente, dende o Biblioteca Wire.h con varias funcións para esta comunicación en serie:

  • begin (): inicia a biblioteca Wire e especifica se é mestra ou escrava
  • requestFrom (): usado polo mestre para solicitar datos do escravo.
  • beginTransmission (): iniciar a transmisión con escravo.
  • endTransmission (): transmisión final.
  • write ()- Escriba datos dun escravo en resposta a unha solicitude do mestre ou pode colar a transmisión dun mestre.
  • dispoñible (): devolverá o número de bytes para ler.
  • ler (): ler un byte transmitido dun escravo a un mestre ou viceversa.
  • onReceive (): Chama a unha función cando un escravo recibe unha transmisión dun mestre.
  • onRequest (): Chama a unha función cando un escravo solicita datos dun mestre.

para Máis información sobre a programación e funcións de Arduino pode descargar o noso Titorial PDF.

Que é o PCF8574?

Módulo PCF8574

O PCF8574 é un Ampliador de entradas e saídas (E / S) dixitais do bus I2C. Pode ser fabricado por varios fabricantes, ademais de telo dispoñible en circuítos integrados e módulos. En calquera caso, é moi práctico conectalo á placa Arduino e ter a capacidade de controlar máis dispositivos dos que permite a placa base.

El Pinout PCF8574 é sinxelo, xa que só inclúe Piñeiros 8 cuasi-direccional (P0-P7 onde están conectados os chips para comunicarse), e por outra banda tes o SDA e o SCL que debes conectar á placa Arduino, así como VCC e GND para tamén alimentar o módulo. E non esquezas os tres pines de dirección A0, A1, A2 para escoller a cal dos dispositivos vai dirixida a comunicación ...

Pinout PCF8574

Propios outras características que debes saber:

  • As súas conexións, ao ser un dreno aberto, poden ser empregados tanto como entradas como saídas.
  • La pico de corrente é de 25 mA cando actúa como saída (sumidoiro, cando a corrente flúe cara a PCF8574) e 300 µA (fonte, a corrente flúe desde PCF8574).
  • La tension a fonte de alimentación é de 2.5 e 6v. O consumo en espera é moi baixo, só 10 µA.
  • Todas as saídas teñen pestillos, para manter o Estado sen necesidade de accións externas. Só tes que actuar cando queres cambiar de estado.
  • Podes obter 8 posibles indicacións, é dicir, ata 8 dispositivos para comunicarse ou usar 8 módulos para amplialo ata 64 dispositivos. Os enderezos (pins A0, A1, A2) serán:
    • 000: enderezo 0x20
    • 001: enderezo 0x21
    • 010: enderezo 0x22
    • 011: enderezo 0x23
    • 100: enderezo 0x24
    • 101: enderezo 0x25
    • 110: enderezo 0x26
    • 111: enderezo 0x27
  • Admite interrupción (INT) por unha liña especial para detectar datos sen supervisar constantemente.

Integración con Arduino

Captura de pantalla IDE Arduino

A conexión con Arduino é moi sinxela, só tes que conectar Vcc co pin de 5v da placa Arduino e GND con GND de Arduino. Por outra banda, os pines do módulo PCF8574 SDA e SCL poden ser conectar con pinos 14 (A5 SCL) e 15 (A4 SDA). Só con iso comezaría a funcionar, obviamente pode usar o Px para conectar os dispositivos que quere comunicar ...

Daquela só faltaría comeza cun boceto de exemplo en IDE Arduino. Podes facelo sen usar unha biblioteca adicional como ...

#include <Wire.h>
 
const int address = 0x38;
 
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(address);
      Wire.write(~(1 << channel));
      Wire.endTransmission();
      
      // Lee dato del canal
      delay(500);
   }
}

Como entrada:

#include <Wire.h>
 
const int address = 0x38;
 
void setup()
{
   Wire.begin();
   Serial.begin(9600);
}
 
void loop()
{
   short channel = 1;
   byte value = 0;
 
   // Leer el dato del canal
   Wire.requestFrom(pcfAddress, 1 << channel);
   if (Wire.available())
   {
      value = Wire.read();
   }
   Wire.endTransmission();
 
   // Mostrar el valor leido por el monitor serie
   Serial.println(value);
}

Ou tamén utilizar bibliotecas, como o PCF8574 que pode descarga aquí e use un código similar a este do propio exemplo que vén xunto con esta biblioteca:

#include <Wire.h>
#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() 
{
}


O contido do artigo adhírese aos nosos principios de ética editorial. Para informar dun erro faga clic en aquí.

Sexa o primeiro en opinar sobre

Deixa o teu comentario

Enderezo de correo electrónico non será publicado. Os campos obrigatorios están marcados con *

*

*

  1. Responsable dos datos: Miguel Ángel Gatón
  2. Finalidade dos datos: controlar SPAM, xestión de comentarios.
  3. Lexitimación: o seu consentimento
  4. Comunicación dos datos: os datos non serán comunicados a terceiros salvo obrigación legal.
  5. Almacenamento de datos: base de datos aloxada por Occentus Networks (UE)
  6. Dereitos: en calquera momento pode limitar, recuperar e eliminar a súa información.