PCF8574: Om I2C I / O-expander för Arduino

PCF8574 TI CHIP

Du har säkert hört talas om IC PCF8574, ett chip som kan köpas separat eller redan monterat på en modul som många andra Elektroniska komponenter för att underlätta din integration med ditt Arduino-kort. I det här fallet är det en förlängare av in- och utgångar för I2C-bussen.

Du kanske tror att Arduino redan har sin egen integrerad I2C-buss, och det är sant. Men PCF8574 kan hjälpa till att förlänga den bussen utanför gränserna för ditt utvecklingskort, vilket kan vara till stor hjälp för vissa tillverkare som behöver mer än bara vad Arduino tillhandahåller.

Vad är I2C-bussen?

Arduino UNO millis funktioner

Namnet I2C kommer från Interintegrerad krets eller interintegrerade kretsar. Version 1.0 skapades 1992 av Philips. Sedan skulle en andra 2.1 komma 2000 och idag har den blivit en standard (vid 100 kbit / s, även om den tillåter upp till 3.4 Mbit / s) när patentet löpte ut 2006 och kan användas fritt.

För närvarande används den ofta i branschen för kommunikation, och också mycket uppskattade av tillverkare för deras projekt för att kommunicera olika mikrokontroller och kringutrustning integrerade i en IC.

El I2C är en buss välkänd från seriekommunikation. Den använder ett synkron kommunikationsprotokoll med endast två kanaler (det finns en tredje, men den är kopplad till referens eller GND), i själva verket är den också känd som TWI (Two Wire Interface):

  • En för klockan (SCL).
  • Övrigt för data (SDA).
Båda är öppna CMOS-anslutningar och kräver pull-up-motstånd. Om en enhet sänder en O och en annan a 0 kan det också vara problem, det är därför linjen alltid är inställd på 1 (hög nivå) och enheterna sänder alltid 1 (låg nivå).

Det innebär att herre och slav de skickar data över samma kabel eller spår, som styrs av den första som genererar klocksignalen. Var och en av de perifera enheterna som är anslutna till I2C-bussen kommer att ha en unik adress tilldelad för att styra sändningarna. Men det är inte nödvändigt att mästaren alltid är densamma (multi-master), det är alltid han som initierar överföringen.

Som jag redan förklarade i artikeln om Arduino I2C Jag refererade tidigare, varje kort har dessa I2C-anslutningar på olika platser. Det är något du måste tänka på för att kunna använda det ordentligt i varje plattversion:

  • Arduino UNO: SDA finns i A4 och SCK i A5
  • Arduino Nano: samma som föregående.
  • Arduino Mini Pro: samma.
  • Arduino Mega: SDA är på stift 20 och SCK på 21.
  • Mer information om tallrikar.

Du vet redan att du enkelt kan använda I2C för dina skisser, eftersom Wire.h-biblioteket med olika funktioner för denna seriekommunikation:

  • Börja (): starta Wire-biblioteket och ange om det är master eller slav
  • förfrågan från (): används av mastern för att begära data från slaven.
  • beginTransmission (): starta överföring med slav.
  • endTransmission (): slutöverföring.
  • skriva()- Skriv data från en slav som svar på en förfrågan från mastern, eller så kan du köa en masters överföring.
  • tillgängligt (): returnerar antalet byte som ska läsas.
  • läsa(): läs en byte som överförs från en slav till en mästare eller vice versa.
  • onReceive (): Anropar en funktion när en slav tar emot en sändning från en mästare.
  • på förfrågan (): Anropar en funktion när en slav begär data från en master.

till mer om Arduino programmering och funktioner kan du ladda ner vår PDF-handledning.

Vad är PCF8574?

PCF8574-modul

PCF8574 är en I2C-buss digitala in- och utgångar (I / O) expander. Den kan tillverkas av olika tillverkare, förutom att den finns tillgänglig i IC och moduler. I vilket fall som helst är det mycket praktiskt att ansluta det till ditt Arduino-kort och ha kapacitet att styra fler enheter än moderkortet tillåter.

El PCF8574 pinout Det är enkelt, eftersom det bara innehåller 8 tallar kvasiriktad (P0-P7 där chipsen för att kommunicera är anslutna), och å andra sidan har du SDA och SCL som du måste ansluta till Arduino-kortet, liksom VCC och GND för att också driva modulen. Och glöm inte de tre adressstiften A0, A1, A2 för att välja vilken av enheterna kommunikationen riktar sig till ...

PCF8574 pinout

Det äger andra funktioner att du borde veta:

  • Dess anslutningar, som en öppen dränering, kan vara används både som in- och utgångar.
  • La toppström den är 25mA när den fungerar som en utgång (sjunker, när ström flyter mot PCF8574) och 300 µA (källa, ström strömmar från PCF8574).
  • La spänning strömförsörjningen är 2.5 och 6v. Standby-förbrukningen är mycket låg, endast 10 µA.
  • Alla utgångar har spärrar, för att upprätthålla staten utan behov av externa åtgärder. Du behöver bara agera när du vill ändra tillstånd.
  • Du kan få 8 möjliga vägbeskrivningar, det vill säga upp till 8 enheter för att kommunicera med eller använda 8 moduler för att utöka den till 64 enheter. Adresserna (stift A0, A1, A2) kommer att vara:
    • 000: adress 0x20
    • 001: adress 0x21
    • 010: adress 0x22
    • 011: adress 0x23
    • 100: adress 0x24
    • 101: adress 0x25
    • 110: adress 0x26
    • 111: adress 0x27
  • Medger avbrott (INT) med en speciell linje för att upptäcka data utan att ständigt övervaka.

Integration med Arduino

Skärmdump av Arduino IDE

Anslutningen med Arduino är väldigt enkel, du behöver bara ansluta Vcc med 5v-stiftet på Arduino-kortet och GND med GND of Arduino. Å andra sidan kan stiften på PCF8574 SDA och SCL-modulen vara anslut med stift 14 (A5 SCL) och 15 (A4 SDA). Bara med det skulle det börja fungera, självklart kan du använda Px för att ansluta de enheter du vill kommunicera ...

Då skulle det bara saknas börja med en exempelskiss i Arduino IDE. Du kan göra det utan att använda ett extra bibliotek som ...

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

Som ingång:

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

Eller också använda bibliotek, till exempel PCF8574 som du kan ladda ner här och använd kod som liknar detta från själva exemplet som följer med detta bibliotek:

#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() 
{
}


Innehållet i artikeln följer våra principer om redaktionell etik. Klicka på för att rapportera ett fel här.

Bli först att kommentera

Lämna din kommentar

Din e-postadress kommer inte att publiceras. Obligatoriska fält är markerade med *

*

*

  1. Ansvarig för uppgifterna: Miguel Ángel Gatón
  2. Syftet med uppgifterna: Kontrollera skräppost, kommentarhantering.
  3. Legitimering: Ditt samtycke
  4. Kommunikation av uppgifterna: Uppgifterna kommer inte att kommuniceras till tredje part förutom enligt laglig skyldighet.
  5. Datalagring: databas värd för Occentus Networks (EU)
  6. Rättigheter: När som helst kan du begränsa, återställa och radera din information.