Arduino ekspander PCF8574N

 

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:

#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknow error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

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:

#include <PCF8574.h>
 
PCF8574 expander;
 
void setup()
{
    expander.begin(0x20);
 
    expander.pinMode(0, OUTPUT);
    expander.pinMode(7, OUTPUT);
 
    expander.digitalWrite(0, HIGH);
    expander.digitalWrite(7, HIGH);
}
 
void loop()
{
 
}

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:

#include <PCF8574.h>
 
PCF8574 expander;
 
void setup()
{
    expander.begin(0x20);
 
    expander.pinMode(0, INPUT_PULLUP);
    expander.pinMode(7, OUTPUT);
 
}
 
void loop()
{
    if (expander.digitalRead(0) == LOW)
    {
        expander.digitalWrite(7, HIGH);
    }
    else
    {
        expander.digitalWrite(7, LOW);
    }
 
    delay(200);
 
}

Efekt przed i po naciśnięciu.

 

 

 

 

 

 

Maciej Szostak

Create Account



Log In Your Account