Arduino ekspander PCF8574N


PCF8574

 

Arduino ekspander 

na przykładzie PCF8574N

Sterowanie LED za pomocą dwóch pinów?

Za parę złotych(lub dolarów) bardzo szybko możemy stać się właścicielem prostego układu zwiększającego ilość pinów naszego Arduino.

Jak to wygląda w teorii?

Ekspander wyprowadzeń mikro kontrolera – układ scalony lub gotowy moduł pozwalający zwiększyć ilość pinów np. przy obsłudze matrycy LED lub wyświetlacza LCD, wykorzystujący magistrale I2C. Przykładem może być ośmiobitowy układ z rodziny PCF8574, w moim wypadku – PCF8574N.

* Ośmiobitowe ekspandery zwiększają ilość pinów o 8, istnieją także inne np szesnastobitowe zwiększające ilość pinów o 16. Ekspandery można także łączyć ze sobą – istnieją jednak pewne ograniczenia dla pcf8574 maksymalnie możemy połączyć osiem układów co daje nam w sumie 128 pinów I/O.

Schematy (PCF8574N (pierwszy od lewej) lub inne z rodziny PCF8574 ):

 

Podstawowy sposób połączenia –  na przykładzie Arduino Uno:

PCF8574

SDA i SCL Arduino łączymy z SDA i SCL ekspandera, tak samo zasilanie 5V i GND.

Piny adresowe (zaznaczone kolorem niebieskim na schemacie i kolorem zielonym na zdjęciu ) ekspandera A0, A1, A2  łączymy z masą.

 

Pierwszy przykład – sprawdzanie adresu.

Każdy ekspander posiada tak zwane piny adresowe – służą one jak sama nazwa wskazuje do ustalanie adresu przy komunikacji z mikro kontrolerem.

Zapamiętaj. Podając stan niski (GND) otrzymasz zero, natomiast podając stan wysoki (+5V) uzyskasz jeden.

System bitowy a adresowanie

Dzięki odpowiedniemu ustawieniu zer i jedynek jesteśmy w stanie ustawić adres naszego modułu – posiadamy moduł ośmiobitowy czyli możliwe będzie ustawienie ośmiu różnych adresów. Wygląda to następująco:

A0

A2 A3 I2C Adres

0

0 0 0 x 20

0

0 1

0 x 21

0

1 0 0 x 22

0

1 1 0 x 23
1 0 0

0 x 24

1 0 1

0 x 25

1 1 0

0 x 26

1 1 1

0 x 27

Adres I2c możemy także sprawdzić przy pomocy odpowiedniego programu wgranego na Arduino:

[pastacode lang=”cpp” manual=”%23include%20%3CWire.h%3E%0A%C2%A0%0A%C2%A0%0Avoid%C2%A0setup()%0A%7B%0A%C2%A0%20Wire.begin()%3B%0A%C2%A0%0A%C2%A0%20Serial.begin(9600)%3B%0A%C2%A0%C2%A0while%C2%A0(!Serial)%3B%C2%A0%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%C2%A0%2F%2F%20Leonardo%3A%20wait%20for%20serial%20monitor%0A%C2%A0%20Serial.println(%22%5CnI2C%20Scanner%22)%3B%0A%7D%0A%C2%A0%0A%C2%A0%0Avoid%C2%A0loop()%0A%7B%0A%C2%A0%20byte%20error%2C%20address%3B%0A%C2%A0%C2%A0int%C2%A0nDevices%3B%0A%C2%A0%0A%C2%A0%20Serial.println(%22Scanning…%22)%3B%0A%C2%A0%0A%C2%A0%20nDevices%C2%A0%3D%C2%A00%3B%0A%C2%A0%C2%A0for(address%C2%A0%3D%C2%A01%3B%C2%A0address%C2%A0%3C%C2%A0127%3B%C2%A0address%2B%2B%C2%A0)%0A%C2%A0%C2%A0%7B%0A%C2%A0%20%C2%A0%C2%A0%2F%2F%20The%20i2c_scanner%20uses%20the%20return%20value%20of%0A%C2%A0%20%C2%A0%C2%A0%2F%2F%20the%20Write.endTransmisstion%20to%20see%20if%0A%C2%A0%20%C2%A0%C2%A0%2F%2F%20a%20device%20did%20acknowledge%20to%20the%20address.%0A%C2%A0%20%C2%A0%20Wire.beginTransmission(address)%3B%0A%C2%A0%20%C2%A0%20error%C2%A0%3D%C2%A0Wire.endTransmission()%3B%0A%C2%A0%0A%C2%A0%20%C2%A0%C2%A0if%C2%A0(error%C2%A0%3D%3D%C2%A00)%0A%C2%A0%20%C2%A0%C2%A0%7B%0A%C2%A0%20%C2%A0%20%C2%A0%20Serial.print(%22I2C%20device%20found%20at%20address%200x%22)%3B%0A%C2%A0%20%C2%A0%20%C2%A0%C2%A0if%C2%A0(address%3C16)%0A%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20Serial.print(%220%22)%3B%0A%C2%A0%20%C2%A0%20%C2%A0%20Serial.print(address%2CHEX)%3B%0A%C2%A0%20%C2%A0%20%C2%A0%20Serial.println(%22%20%C2%A0!%22)%3B%0A%C2%A0%0A%C2%A0%20%C2%A0%20%C2%A0%20nDevices%2B%2B%3B%0A%C2%A0%20%C2%A0%C2%A0%7D%0A%C2%A0%20%C2%A0%C2%A0else%C2%A0if%C2%A0(error%3D%3D4)%0A%C2%A0%20%C2%A0%C2%A0%7B%0A%C2%A0%20%C2%A0%20%C2%A0%20Serial.print(%22Unknow%20error%20at%20address%200x%22)%3B%0A%C2%A0%20%C2%A0%20%C2%A0%C2%A0if%C2%A0(address%3C16)%0A%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20Serial.print(%220%22)%3B%0A%C2%A0%20%C2%A0%20%C2%A0%20Serial.println(address%2CHEX)%3B%0A%C2%A0%20%C2%A0%C2%A0%7D%C2%A0%C2%A0%20%C2%A0%0A%C2%A0%C2%A0%7D%0A%C2%A0%C2%A0if%C2%A0(nDevices%C2%A0%3D%3D%C2%A00)%0A%C2%A0%20%C2%A0%20Serial.println(%22No%20I2C%20devices%20found%5Cn%22)%3B%0A%C2%A0%C2%A0else%0A%C2%A0%20%C2%A0%20Serial.println(%22done%5Cn%22)%3B%0A%C2%A0%0A%C2%A0%20delay(5000)%3B%C2%A0%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%C2%A0%2F%2F%20wait%205%20seconds%20for%20next%20scan%0A%7D” message=”” highlight=”” provider=”manual”/]

Wgrywamy gotową funkcję do Arduino. Następnie  serial monitor powinien wyświetlić nam odpowiedni adres. Śmiało można go zmieniać podając stan wysoki lub niski na piny adresowe. Domyślnie skorzystam z adresu 0x20 czyli ustawiamy stan niski na wszystkich pinach.

 

Drugi przykład – diody.

 

Anody (+) do pinów ekspandera, katody (-) do masy (GND).

Program do wgrania na Arduino:

[pastacode lang=”cpp” manual=”%23include%20%3CPCF8574.h%3E%0A%C2%A0%0APCF8574%20expander%3B%0A%C2%A0%0Avoid%C2%A0setup()%0A%7B%0A%C2%A0%20%C2%A0%20expander.begin(0x20)%3B%0A%C2%A0%0A%C2%A0%20%C2%A0%20expander.pinMode(0%2C%20OUTPUT)%3B%0A%C2%A0%20%C2%A0%20expander.pinMode(7%2C%20OUTPUT)%3B%0A%C2%A0%0A%C2%A0%20%C2%A0%20expander.digitalWrite(0%2C%20HIGH)%3B%0A%C2%A0%20%C2%A0%20expander.digitalWrite(7%2C%20HIGH)%3B%0A%7D%0A%C2%A0%0Avoid%C2%A0loop()%0A%7B%0A%C2%A0%0A%7D” message=”” highlight=”” provider=”manual”/]

Program jest bardzo prosty – omówię go jednym zdaniem.


Najważniejszą częścią jest biblioteka oraz utworzenie obiektu (PCF8574 expander;), następnie w ustawianiach (setup) podajemy adres, później możemy już dowolnie zmieniać i ustawiać stany na naszych pinach.

Po wgraniu programu, pomimo braku oporników diody jednak nie do końca świecą jak powinny (bardzo, bardzo słabo – polecam sprawdzić w ciemnościach).

Wyjaśnieniem jest poniższa tabela:

 

W stanie wysokim (Ioh) natężenie wynosi ok -1 mA natomiast w stanie niskim (Iol) ok 25 mA.
Podsumowując – otrzymujemy poprawne napięcie, problem jest jednak z natężeniem.

Rozwiązaniem w tym wypadku są tranzystory npn lub pnp.

 

Szczegóły połączenia:

SDA & SCL łączymy z pinami Arduino,

NPN – emiter do masy (GND), kolektor z katodą (-) diody, bazę z pinem 0.

PNP – emiter z zasilaniem (+5V), kolektor z anodą (+) diody, bazę z pinem 7.


Tranzystor PNP (prze diodzie czerwonej) załączony jest sygnałem niskim –
tranzystor NPN (przy diodzie zielonej) załączony jest stanem wysokim.

Pamiętaj o zastosowaniu odpowiednich rezystorów przy bazie tranzystora i diodach.

 

Trzeci przykład – input & tack switch

Kolejny prosty przykład, sprawdzimy w nim czy wejścia ekspandera mogą zastąpić porty wejścia Arduino.

 

Schemat:

Kod:

[pastacode lang=”cpp” manual=”%23include%20%3CPCF8574.h%3E%0A%C2%A0%0APCF8574%20expander%3B%0A%C2%A0%0Avoid%C2%A0setup()%0A%7B%0A%C2%A0%20%C2%A0%20expander.begin(0x20)%3B%0A%C2%A0%0A%C2%A0%20%C2%A0%20expander.pinMode(0%2C%20INPUT_PULLUP)%3B%0A%C2%A0%20%C2%A0%20expander.pinMode(7%2C%20OUTPUT)%3B%0A%C2%A0%0A%7D%0A%C2%A0%0Avoid%C2%A0loop()%0A%7B%0A%C2%A0%20%C2%A0%C2%A0if%C2%A0(expander.digitalRead(0)%C2%A0%3D%3D%C2%A0LOW)%0A%C2%A0%20%C2%A0%C2%A0%7B%0A%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20expander.digitalWrite(7%2C%20HIGH)%3B%0A%C2%A0%20%C2%A0%C2%A0%7D%0A%C2%A0%20%C2%A0%C2%A0else%0A%C2%A0%20%C2%A0%C2%A0%7B%0A%C2%A0%20%C2%A0%20%C2%A0%20%C2%A0%20expander.digitalWrite(7%2C%20LOW)%3B%0A%C2%A0%20%C2%A0%C2%A0%7D%0A%C2%A0%0A%C2%A0%20%C2%A0%20delay(200)%3B%0A%C2%A0%0A%7D” message=”” highlight=”” provider=”manual”/]

Efekt przed i po naciśnięciu.

 

Poprzednia informacja Klony Arduino - czyli jak zainstalować sterownik CH340
Kolejna informacja Zmienne

Brak komentarzy

Zostaw odpowiedź

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *