PCF8574: sobre l'expansor E / S I2C per Arduino

PCF8574 XIP de TI

Segur que has escoltat parlar de l' IC PCF8574, Un xip que pot comprar-se per separat o ja muntat en mòdul com molts altres components electrònics per facilitar la teva integració amb la teva placa Arduino. En aquest cas, es tracta d'un extensor de les entrades i sortides per el bus I2C.

Pots pensar que Arduino ja compta amb el seu propi bus I2C integrat, I és cert. Però el PCF8574 pot ajudar a ampliar aquest bus més enllà dels límits de la teva placa de desenvolupament, la qual cosa pot ser de gran ajuda per a alguns makers que necessiten alguna cosa més que l'aportat per Arduino.

Què és el bus I2C?

Arduino UNO funcions Millis

El nom I2C prové de Circuit inter-integrat o inter-circuits integrats. La seva versió 1.0 va ser creada el 1992 per Philips. Després vindria una segona 2.1 en 2000 i en l'actualitat s'ha transformat en un estàndard (a 100 kbit / s, encara que permet fins a 3.4 Mbit / s màxim) quan el 2006 va caducar la patent i es pot usar de forma lliure.

En l'actualitat és molt usat en la indústria per comunicació, I també els makers l'aprecien molt per als seus projectes per comunicar diferents microcontroladors i perifèrics integrats en un IC.

El I2C és un bus força conegut de comunicació sèrie. Usa un protocol síncron de comunicació amb només 2 canals (hi ha una tercera, però està acoblada a referència o GND), de fet també se li coneix com TWI (Two Wire Interface):

  • Un per al clock o rellotge (SCL).
  • Un altre per a dades (SDA).
Tots dos són connexions CMOS de drenador obert i necessiten resistències pull-up. A més, si un dispositiu transmet un 0 i altre un 1 podria haver-hi problemes, per això es posa sempre a 1 (nivell alt) la línia i els dispositius transmeten sempre 0 (nivell baix).

Això implica que el mestre i esclau envien dades pel mateix cable o pista, que és controlada pel primer que és el que genera el senyal de rellotge. Cadascun dels dispositius perifèrics connectats a l'bus I2C tindrà una direcció única assignada, per així poder adreçar les transmissions. Però no es necessita que el mestre sempre sigui el mateix (multimaestro), sí que sempre sigui ell qui iniciï la transferència.

Com ja vaig explicar en l'article de Arduino I2C a què abans vaig fer referència, cada placa té aquestes connexions de l'I2C en llocs diferents. És una cosa que has de tenir present per poder-lo utilitzar adequadament en cada versió de placa:

  • Arduino UNO: El SDA està en A4 i el SCK a A5
  • Arduino Nano: Igual que l'anterior.
  • Arduino Mini Pro: Igual.
  • Arduino Mega: SDA està al pin 20 i SCK al 21.
  • Més informació sobre les plaques.

Ja saps que pots fer servir el I2C per als teus esquetxos de forma fàcil, ja que s'inclou la biblioteca Wire.h amb diverses funcions per a aquesta comunicació sèrie:

  • begin (): S'inicia la biblioteca Wire i especifica si és màster o slave
  • requestFrom (): Usat pel mestre per a sol·licitar dades a l'esclau.
  • beginTransmission (): Començar la transmissió amb esclau.
  • endTransmission (): Finalitzar la transmissió.
  • write (): Escriu dades des d'un esclau com a resposta a una petició de l'mestre o pot posar en cua la transmissió d'un mestre.
  • available (): Tornarà el nombre de bytes per llegir.
  • llegir (): Llegeix un byte transmès des d'un esclau a un mestre o viceversa.
  • onReceive (): Crida a una funció quan un esclau rep una transmissió d'un mestre.
  • onRequest (): Crida a una funció quan un esclau sol·licita dades d'un mestre.

Per a la Més informació sobre la programació d'Arduino i funcions pots descarregar el nostre tutorial en PDF.

Què és el PCF8574?

mòdul PCF8574

El PCF8574 és un expansor d'entrades i sortides (I / S) digitals per bus I2C. Pot estar fabricat per diversos fabricants, a més de tenir-lo disponible a IC i mòduls. En qualsevol cas, és molt pràctic per connectar-lo a la teva placa Arduino i tenir capacitat per controlar més dispositius que els que permet la placa base.

El pinout de l'PCF8574 és senzill, ja que només inclou Pins 8 cuasidireccionales (P0-P7 on es connecten els xips a comunicar), i d'altra banda tens els SDA i SCL que has de connectar a la placa d'Arduino, així com VCC i GND per alimentar també el mòdul. I no oblidis els tres pins d'adreçament A0, A1, A2 per triar a quin dels dispositius es dirigeix ​​la comunicació ...

PCF8574 pinout

posseeix altres característiques que has de conèixer:

  • Les seves connexions, a l'ésser drenador obert, poden ser usades tant com entrades com per sortides.
  • La corrent màxim és de 25mA quan actua com a sortida (embornal, quan el corrent flueix direcció PCF8574) i de 300 μA (font, el corrent flueix des del PCF8574).
  • La tensió d'alimentació és de 2.5 i 6v. El consum en stand-by és molt baix, només 10 μA.
  • Totes les sortides disposen de latches, Per mantenir l'estat sense necessitat d'accions externes. Només s'ha d'actuar quan es vol canviar l'estat.
  • Es poden obtenir 8 direccions possibles, és a dir, fins a 8 dispositius amb els quals comunicar-se o usant 8 mòduls ampliar-lo fins a 64 dispositius. Les adreces (pins A0, A1, A2) seran:
    • 000: direcció 0x20
    • 001: direcció 0x21
    • 010: direcció 0x22
    • 011: direcció 0x23
    • 100: direcció 0x24
    • 101: direcció 0x25
    • 110: direcció 0x26
    • 111: direcció 0x27
  • admet interrupció (INT) per una línia especial per detectar dades sense monitoritzar constantment.

Integració amb Arduino

Captura d'Arduino IDE

La connexió amb Arduino és molt senzilla, només has de connectar Vcc amb el pin 5v de la placa Arduino, i GND amb GND d'Arduino. D'altra banda, els pins de la lliçó PCF8574 SDA i SCL els pots connectar amb els pins 14 (A5 SCL) i 15 (A4 SDA). Només amb això ja començaria a funcionar, evidentment pots fer servir els Px per connectar els dispositius que vols comunicar ...

Després només faltaria començar amb un sketch d'exemple en Arduino IDE. Ho pots fer sense fer servir biblioteca addicional com ara ...

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

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

O també utilitzar biblioteques, Com ara la PCF8574 que pots descarregar aquí i usar un codi similar a aquest de l'propi exemple que ve juntament amb aquesta 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() 
{
}


Sigues el primer a comentar

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.