Du har sikkert hørt om PCF8574 IC, en brikke som kan kjøpes separat eller allerede montert på en modul som mange andre Elektroniske komponenter for å lette integrasjonen din med Arduino-kortet. I dette tilfellet er det en utvider av innganger og utganger for I2C-bussen.
Du tror kanskje at Arduino allerede har sin egen integrert I2C-buss, og det er sant. Men PCF8574 kan bidra til å utvide bussen utover grensene for utviklingskortet ditt, noe som kan være til stor hjelp for noen produsenter som trenger mer enn bare det Arduino gir.
Hva er I2C-bussen?
Navnet I2C kommer fra Interintegrert krets eller interintegrerte kretser. Versjonen 1.0 ble opprettet i 1992 av Philips. Deretter ville det komme en andre 2.1 i 2000, og i dag har den blitt en standard (med 100 kbit / s, selv om den tillater maksimalt 3.4 Mbit / s) når patentet utløp i 2006 og kan brukes fritt.
For tiden er det mye brukt i bransjen for kommunikasjon, og også veldig verdsatt av produsenter for deres prosjekter for å kommunisere forskjellige mikrokontrollere og eksterne enheter integrert i en IC.
El I2C er en buss godt kjent fra seriell kommunikasjon. Den bruker en synkron kommunikasjonsprotokoll med bare to kanaler (det er en tredje, men den er koblet til referanse eller GND), faktisk er den også kjent som TWI (Two Wire Interface):
- En for klokken (SCL).
- Annet for data (SDA).
Det innebærer at herre og slave de sender data over samme kabel eller spor, som styres av den første som genererer klokkesignalet. Hver av de perifere enhetene som er koblet til I2C-bussen vil ha en unik adresse tildelt for å dirigere overføringene. Men det er ikke nødvendig at læreren alltid er den samme (multilærer), det er alltid han som starter overføringen.
Som jeg allerede har forklart i artikkelen på Arduino I2C Jeg refererte til tidligere, hvert kort har disse I2C-tilkoblingene på forskjellige steder. Det er noe du må huske på for å kunne bruke det riktig i hver plateversjon:
- Arduino UNO: SDA er i A4 og SCK i A5
- ArduinoNano: det samme som det forrige.
- Arduino MiniPro: samme.
- arduino mega: SDA er på pin 20 og SCK på 21.
- Mer informasjon om plater.
Du vet allerede at du enkelt kan bruke I2C til skissene dine, siden Wire.h-biblioteket med forskjellige funksjoner for denne serielle kommunikasjonen:
- begynne (): start Wire-biblioteket og spesifiser om det er master eller slave
- requestFrom (): brukes av mesteren for å be om data fra slaven.
- beginTransmission (): start overføring med slave.
- endTransmission (): sluttoverføring.
- skrive()- Skriv data fra en slave som svar på en forespørsel fra mesteren, eller du kan stille en masters overføring i kø.
- tilgjengelig (): returnerer antall byte som skal leses.
- lese(): les en byte overført fra en slave til en mester eller omvendt.
- onReceive (): Kaller en funksjon når en slave mottar en overføring fra en mester.
- på forespørsel (): Kaller en funksjon når en slave ber om data fra en mester.
Til mer om Arduino programmering og funksjoner kan du laste ned vår PDF-veiledning.
Hva er PCF8574?
PCF8574 er en I2C buss digitale innganger og utganger (I / U) utvider. Den kan produseres av forskjellige produsenter, i tillegg til at den er tilgjengelig i IC-er og moduler. I alle fall er det veldig praktisk å koble den til Arduino-kortet og ha kapasitet til å kontrollere flere enheter enn hovedkortet tillater.
El PCF8574 pinout er enkelt, siden det bare inkluderer 8 furu kvasi-retningsbestemt (P0-P7 der sjetongene for å kommunisere er koblet til), og på den annen side har du SDA og SCL som du må koble til Arduino-kortet, samt VCC og GND for også å drive modulen. Og ikke glem de tre adressepinnene A0, A1, A2 for å velge hvilken av enhetene kommunikasjonen er rettet mot ...
Den eier andre funksjoner som du bør vite:
- Dens forbindelser, som et åpent avløp, kan være brukes både som innganger og utganger.
- La toppstrøm den er 25mA når den fungerer som en utgang (vask, når strømmen strømmer mot PCF8574) og 300 µA (kilde, strømmen strømmer fra PCF8574).
- La spenning strømforsyningen er 2.5 og 6v. Standby-forbruket er veldig lavt, bare 10 µA.
- Alle utganger har låser, for å opprettholde staten uten behov for eksterne handlinger. Du må bare handle når du vil endre tilstand.
- Du kan få 8 mulige retninger, det vil si opptil 8 enheter for å kommunisere med eller bruke 8 moduler for å utvide den til 64 enheter. Adressene (pinner A0, A1, A2) vil være:
- 000: adresse 0x20
- 001: adresse 0x21
- 010: adresse 0x22
- 011: adresse 0x23
- 100: adresse 0x24
- 101: adresse 0x25
- 110: adresse 0x26
- 111: adresse 0x27
- Innrømmer avbrudd (INT) ved en spesiell linje for å oppdage data uten konstant overvåking.
Integrasjon med Arduino
Forbindelsen med Arduino er veldig enkel, du må bare koble Vcc med 5v-pinnen på Arduino-kortet, og GND med GND av Arduino. På den annen side kan pinnene på PCF8574 SDA og SCL-modulen være koble til med pinner 14 (A5 SCL) og 15 (A4 SDA). Bare med det ville det begynne å fungere, selvfølgelig kan du bruke Px til å koble til enhetene du vil kommunisere ...
Da ville det bare mangle start med en eksempelskisse i Arduino IDE. Du kan gjøre det uten å bruke et ekstra 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 innspill:
#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 også bruk biblioteker, for eksempel PCF8574 som du kan Last ned her og bruk kode som ligner på dette fra selve eksemplet som følger med dette biblioteket:
#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() { }