Skocz do zawartości

Definiowanie pinów ekspandera pcf8574


Pomocna odpowiedź

Napisano

Witam

Jestem posiadaczem Arduino Uno i realizuję projekt, który wymaga dużej ilości pinów. W tym celu zaopatrzyłem się w ekspandery pcf8574. Problem w tym, że nie wiem co należy zrobić by numery pinów w ekspanderach jak i w samym Arduino były rozróżniane. Dla przykładu do dwóch ekspanderów mam podłaczoną płytkę. Na ekspanderze pierwszym mam zajęte piny 1 i 6, i na ekspanderze drugim mam zajęte piny 1 i 6. Nie ma możliwości podłączenia tego do jednego pcf8574. Czy jest możliwość zdefiniowania tych wejść tak by się wzajemnie nie wykluczały ?

Jasne. Jak zajrzysz do noty katalogowej (http://www.ti.com/lit/ds/symlink/pcf8574.pdf ) to przeczytasz tam, że możesz ustawić za pomocą nóżek A0, A1 i A2 adres I2Ć, którego dany chip ma używać. Jeśli ustawisz im różne adresy, to możesz wtedy wysyłać (i odbierać) dane z/do tego chipa, którego adres podasz.

Tak wiem. pierwszy ekspander mam ustawiony na 000, drugi na 001 tylko jak chce wybrać pin 1 i 6 z ekspandera pierwszego i pin 1 i 6 z ekspandera drugiego to raczej nie moge wpisać

static const uint8_t colorpins[NUM_LED_ROWS] = {1,6,1,6}; 
Chyba brakuje tu trochę kontekstu. Co próbujesz zrobić?

Zamierzam zrobić płytkę z diodami rgb. Na stronie producenta płytki jest kod, z tym że był on pisany pod arduino mega, które posiada duzo pinów. Ja tylu nie mam więc kupiłem ekspandery. Teraz chciałbym ten program jakoś przerobić by chodził on u mnie. Problem w tym, że jestem słaby jeśli chodzi o pisanie kodu.

Strona producenta: https://learn.sparkfun.com/tutorials/button-pad-hookup-guide

To jest ten kod :


//config variables
#define NUM_LED_COLUMNS (4)
#define NUM_LED_ROWS (4)
#define NUM_COLORS (1)

// Global variables
static bool LED_buffer[NUM_LED_COLUMNS][NUM_LED_ROWS];
static int32_t next_advance;
static uint8_t led_index;

static const uint8_t ledcolumnpins[NUM_LED_COLUMNS]   = {42,43,44,45};
static const uint8_t colorpins[NUM_LED_ROWS] = {22,30,33,36};

static void setuppins()
{
 uint8_t i;

 // initialize all of the output pins

 // LED column lines
 for(i = 0; i < NUM_LED_COLUMNS; i++)
 {
   pinMode(ledcolumnpins[i], OUTPUT);

   // with nothing selected by default
   digitalWrite(ledcolumnpins[i], HIGH);
 }

 // LED row lines
 for(i = 0; i < NUM_LED_ROWS; i++)
 {
   pinMode(colorpins[i], OUTPUT);

   // with nothing driven by default
   digitalWrite(colorpins[i], LOW);
 }

}

static void scan()
{
 static uint8_t current = 0;
 uint8_t val;
 uint8_t i, j;

 // Select a column
 digitalWrite(ledcolumnpins[current], LOW);

 // write the row pins
 for(i = 0; i < NUM_LED_ROWS; i++)
 {
   if(LED_buffer[current][i])
   {
     digitalWrite(colorpins[i], HIGH);
   }
 }

 delay(1);

 digitalWrite(ledcolumnpins[current], HIGH);

 for(i = 0; i < NUM_LED_ROWS; i++)
 {
   digitalWrite(colorpins[i], LOW);
 }

 // Move on to the next column
 current++;
 if (current >= NUM_LED_COLUMNS)
 {
   current = 0;
 }

}

void setup() 
{
 // put your setup code here, to run once:
 Serial.begin(115200);
 Serial.print("Starting Setup...");

 // setup hardware
 setuppins();

 // init global variables
 next_advance = millis() + 1000;
 led_index = 0;

 // Initialize the LED display array
 for(uint8_t i = 0; i < NUM_LED_COLUMNS; i++)
 {
   for(uint8_t j = 0; j < NUM_LED_ROWS; j++)
   {
     LED_buffer[i][j] = false;
   }
 }
 // Set the first LED in the buffer on
 LED_buffer[0][0] = true;

 Serial.println("Setup Complete.");

}

void loop() 
{
 // put your main code here, to run repeatedly:

 scan();

 if(millis() >= next_advance)
 {
   next_advance = millis()+1000;

   LED_buffer[led_index/NUM_LED_COLUMNS][led_index%NUM_LED_COLUMNS] = false;
   led_index++;
   led_index %= (NUM_LED_COLUMNS * NUM_LED_ROWS);
   LED_buffer[led_index/NUM_LED_COLUMNS][led_index%NUM_LED_COLUMNS] = true;
 }
}

Obawiam się, że żeby to działało, to musiałbyś zamienić wszystkie digitalWrite() w tym kodzie na swoją własną funkcję, która wysyła dane do ekspandera. To może wymagać trochę więcej pracy, niż oczekiwałeś.

A myślałeś może o użyciu czipu dedykowanego do sterowania ledami, na przykład takiego HT16K33?

Szczerze mówiąc nie wiedziałem, że takie coś istnieje 🙂 Dopiero się uczę tego wszystkiego. Sądzisz, że to by było lepsze rozwiązanie niż zabawa z tymi ekspanderami pcf8574 ? Rozumiem, że to by było kompatybilne z tą płytką ?

No to dalej jest prosto — porównaj sobie ten schemat z przykładowym schematem w nocie katalogowej od HT16K33 i wszystko będziesz wiedzieć.

Ten chip ci przy okazji też obsłuży te przyciski.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...