Zagotovo ste že slišali za PCF8574 IC, čip, ki ga lahko kupite ločeno ali ga že namestite na modul, kot mnogi drugi Elektronske komponente za lažjo integracijo z vašo ploščo Arduino. V tem primeru gre za razširitev vhodov in izhodov za vodilo I2C.
Morda mislite, da Arduino že ima svojega integrirano vodilo I2Cin res je. Toda PCF8574 lahko pomaga razširiti to vodilo preko meja vaše razvojne plošče, kar je lahko v veliko pomoč nekaterim proizvajalcem, ki potrebujejo več kot le tisto, kar ponuja Arduino.
Kaj je vodilo I2C?
Ime I2C prihaja iz Vgrajeno vezje ali medintegrirana vezja. Njeno različico 1.0 je leta 1992 ustvaril Philips. Potem bi leta 2.1 prišel drugi 2000, danes pa je postal standard (s hitrostjo 100 kbit / s, čeprav omogoča največ 3.4 Mbit / s), ko je patent potekel leta 2006 in ga je mogoče prosto uporabljati.
Trenutno se pogosto uporablja v industriji za komunikacijo, izdelovalci pa jih tudi zelo cenijo za njihove projekte komuniciranja različnih mikrokrmilnikov in zunanjih naprav, integriranih v eno IC.
El I2C je avtobus dobro znano iz serijske komunikacije. Uporablja sinhroni komunikacijski protokol s samo dvema kanaloma (obstaja še tretji, vendar je povezan z referenco ali GND), pravzaprav je znan tudi kot TWI (dvožični vmesnik):
- Ena za uro (SCL).
- Drugo za podatke (SDA).
To pomeni, da gospodar in suženj podatke pošiljajo po istem kablu ali tiru, ki ga nadzira prvi, ki generira signal ure. Vsaka periferna naprava, priključena na vodilo I2C, bo imela dodeljen edinstven naslov za usmerjanje prenosov. Ni pa nujno, da je mojster vedno isti (multi-master), vedno je on tisti, ki sproži prenos.
Kot sem že razložil v članku o Arduino I2C Prej sem omenil, vsaka plošča ima te povezave I2C na različnih mestih. Nekaj morate imeti v mislih, da ga lahko pravilno uporabljate v vsaki različici plošče:
- Arduino UNO: SDA je v A4 in SCK v A5
- ArduinoNano: enako kot prejšnji.
- Arduino MiniPro: enako.
- arduino mega: SDA je na pin 20 in SCK na 21.
- Več informacij o ploščah.
Že veste, da lahko I2C enostavno uporabljate za svoje skice, saj Knjižnica Wire.h z različnimi funkcijami za to serijsko komunikacijo:
- začeti (): zaženite knjižnico Wire in določite, ali je glavna ali pomožna
- requestFrom (): uporablja poveljnik za zahtevanje podatkov od podrejenega.
- beginTransmission (): zagon prenosa s pomožnim.
- endTransmission (): končni prenos.
- piši ()- Zapišite podatke iz podrejenega kot odgovor na zahtevo glavne enote ali pa pošljete glavno vrsto v čakalno vrsto.
- na voljo (): vrne število bajtov za branje.
- preberi (): prebere bajt, ki se prenese iz pomožnega v glavni ali obratno.
- onReceive (): Pokliče funkcijo, ko podrejeni prejme prenos od glavne enote.
- na zahtevo (): Pokliče funkcijo, ko podrejeni zahteva podatke od glavne enote.
za más información o programiranju in funkcijah Arduino lahko prenesete naše Vadnica za PDF.
Kaj je PCF8574?
PCF8574 je Razširjevalnik digitalnih vhodov in izhodov vodila I2C (I / O). Izdelujejo ga lahko različni proizvajalci, poleg tega pa je na voljo v IC in modulih. V vsakem primeru je zelo praktično, da ga povežete s svojo ploščo Arduino in imate zmožnost nadzora več naprav, kot to omogoča matična plošča.
El PCF8574 pinout je preprost, saj vključuje samo 8 borovci kvazi smer (P0-P7, kjer so povezani čipi za komunikacijo), na drugi strani pa imate SDA in SCL, ki ju morate priključiti na ploščo Arduino, pa tudi VCC in GND za napajanje modula. In ne pozabite na tri naslovni zatiči A0, A1, A2, da izberete, v katero od naprav bo komunikacija usmerjena ...
Lastniki druge lastnosti da bi morali vedeti:
- Njegove povezave so lahko odprt odtok uporablja kot vhode in izhode.
- La maksimalni tok znaša 25 mA, ko deluje kot izhod (ponor, ko tok teče proti PCF8574), in 300 µA (vir, tok teče iz PCF8574).
- La napetost napajanje je 2.5 in 6v. Poraba v stanju pripravljenosti je zelo nizka, le 10 µA.
- Vsi izhodi imajo zapahe, za ohranitev stanja brez zunanjih ukrepov. Ukrepati morate le, če želite spremeniti stanje.
- Lahko dobite 8 možna navodila, to je do 8 naprav za komunikacijo z 8 moduli ali razširitev do 64 naprav. Naslovi (nožice A0, A1, A2) bodo:
- 000: naslov 0x20
- 001: naslov 0x21
- 010: naslov 0x22
- 011: naslov 0x23
- 100: naslov 0x24
- 101: naslov 0x25
- 110: naslov 0x26
- 111: naslov 0x27
- Priznava prekinitev (INT) s posebno vrstico za zaznavanje podatkov brez nenehnega spremljanja.
Integracija z Arduinom
Povezava z Arduinom je zelo preprosta, le Vcc morate povezati s 5v zatičem plošče Arduino, GND pa z GND Arduina. Po drugi strani pa so lahko zatiči modula PCF8574 SDA in SCL povežite z zatiči 14 (A5 SCL) in 15 (A4 SDA). Šele s tem bi začelo delovati, očitno lahko s Px povežete naprave, s katerimi želite komunicirati ...
Potem bi le manjkal začnite s primerno skico v Arduino IDE. To lahko storite brez uporabe dodatne knjižnice, kot je ...
#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); } }
Kot vhod:
#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); }
Ali tudi uporabljati knjižnice, kot je PCF8574, ki ga lahko prenesite tukaj in uporabite kodo, podobno tej iz primera samega, ki je priložen tej knjižnici:
#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() { }