bronson13 Napisano Lipiec 19, 2017 Udostępnij Napisano Lipiec 19, 2017 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 ?
deshipu Lipiec 19, 2017 Udostępnij Lipiec 19, 2017 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.
bronson13 Lipiec 19, 2017 Autor tematu Udostępnij Lipiec 19, 2017 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};
deshipu Lipiec 19, 2017 Udostępnij Lipiec 19, 2017 Chyba brakuje tu trochę kontekstu. Co próbujesz zrobić?
bronson13 Lipiec 19, 2017 Autor tematu Udostępnij Lipiec 19, 2017 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; } }
deshipu Lipiec 19, 2017 Udostępnij Lipiec 19, 2017 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?
bronson13 Lipiec 19, 2017 Autor tematu Udostępnij Lipiec 19, 2017 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ą ?
deshipu Lipiec 19, 2017 Udostępnij Lipiec 19, 2017 Trudno wywnioskować cokolwiek ze zdjęcia. Masz schemat?
bronson13 Lipiec 19, 2017 Autor tematu Udostępnij Lipiec 19, 2017 Tego co zbudowałem nie mam ale mam schemat samej płytki. Button_Pad_Breakout.pdf
deshipu Lipiec 19, 2017 Udostępnij Lipiec 19, 2017 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.
Pomocna odpowiedź
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ę »