Czy możliwe jest posiadanie więcej niż 14 pinów wyjściowych na Arduino, pracuję nad projektem, w którym muszę osobno zapalić kilka diod LED. Mam tylko Arduino Uno i nie chcę mieć Mega.
pins
arduino-uno
JVarhol
źródło
źródło
Odpowiedzi:
Typowym sposobem na rozszerzenie zestawu dostępnych pinów wyjściowych w Arduino jest użycie rejestrów przesuwnych, takich jak 74HC595 IC ( link do arkusza danych ).
Potrzebujesz 3 piny do kontrolowania tych układów:
W programie dane są przesyłane pojedynczo po kolei do rejestru przesuwnego za pomocą polecenia shiftOut () , w taki sposób:
Za pomocą tego polecenia ustawiasz każde z 8 wyjść na 595 IC z 8 bitami w
data
zmiennej.Z jednym 595 zyskujesz 5 pinów (8 na IC, ale wydajesz 3 na rozmowę z nim). Aby uzyskać więcej wyjść, możesz połączyć szeregowo serię 595, łącząc jej pin wyjścia szeregowego z pinem danych następnego. Musisz także połączyć razem styki zegara i zatrzasku wszystkich 595 układów scalonych.
Powstały obwód (używając jednego 595) wyglądałby tak:
Powyższy rysunek pochodzi z tej strony codeproject.com :
Kołek zatrzaskowy służy do utrzymywania stabilnego poziomu wyjściowego 595 podczas przenoszenia danych, np .:
źródło
Istnieją dwa sposoby, aby uzyskać więcej szpilek z arduino.
Pierwszym sposobem jest użycie pinów analogowych jako cyfrowych pinów wyjściowych, co jest naprawdę łatwe do zrobienia. Wszystko, co musisz zrobić, to odnieść się do A0-A5 jako pinów 14, 15, 16, 17, 18, 19. Na przykład, aby zapisać high na pin A0, wystarczy użyć digitalWrite (14, HIGH).
Innym sposobem na uzyskanie większej liczby pinów z Arduino jest użycie rejestru Shift. W tym celu zalecam użycie EZ-Expander Shield , która pozwala na korzystanie z digitalWrite ([20-35], HIGH) podczas importowania biblioteki EZ-Expander. Ta tarcza pozwala jednak tylko na używanie pinów jako wyjść i używa pinów 8,12 i 13 do sterowania rejestrami przesuwnymi.
Wspaniałą rzeczą jest to, że możesz używać obu powyższych metod bez żadnych problemów.
źródło
A0
-A5
bezpośrednio identyfikatory zamiast korzystania z numerów 14-19. Na przykładdigitalWrite(A0, HIGH)
.digitalWrite(A0)
jest bardziej poprawne niżdigitalWrite(14)
ponieważ pierwsza z nich zawsze będzie mapować na właściwy fizyczny (analogowy) pin. Na innej płyciepin 14
może tak naprawdę nie byćA0
, np.pin 14
Na MEGA jest Serial3TX
i nie wpłynie na pin analogowy, którego szukasz. tzn. jeśli używaszdigitalWrite
na pinie analogowym, użyj odniesieniaA0
-A5
.Jeśli chcesz sterować diodami LED, możesz także użyć MAX7219, który może sterować 64 diodami LED, bez dodatkowych obwodów (nie ma potrzeby tranzystora w celu wzmocnienia sygnału).
Prowadzenie MAX7219 wymaga tylko 3 pinów wyjściowych na Arduino. Możesz również znaleźć dla niego kilka bibliotek Arduino .
Możesz także połączyć kilka z nich, jeśli chcesz zasilić więcej niż 64 diody LED.
Z powodzeniem wykorzystałem go do wielu 7-segmentowych wyświetlaczy LED.
Wada: jest drogi (około 10 USD).
źródło
Możesz użyć Charlieplexing . Dzięki tej technice możesz bezpośrednio sterować
n*(n-1)
diodami LED z n pinów. Tak więc za pomocą 3 pinów możesz sterować 6 diodami LED, 4 pinami - 12 diod LED, 5 pinów - 20 diod LED i tak dalej.Przykład:
Sześć diod LED na 3 piny
Można zobaczyć lepszy samouczek tutaj .
źródło
I 2 C (drut)
Za pomocą protokołu I 2 C (biblioteka Wire) można łączyć się z innymi urządzeniami, takimi jak ekspandery portów. Na przykład MCP23017.
Użyłem jednego z tych układów do podłączenia wyświetlacza LCD. MCP23017 ma 16 portów, które można skonfigurować jako wejścia lub wyjścia. Jako dane wejściowe mogą w razie potrzeby zgłaszać przerwania.
Przykład podłączenia 13 z tych 16 do LCD:
Teraz łączymy się z Arduino za pomocą tylko 2 przewodów (SDA / SCL) oraz zasilania i uziemienia:
Niektórzy producenci zewnętrzni stworzyli płyty z 4 x MCP23017, co daje 64 wejścia / wyjścia:
Multipleksery
Możesz użyć multiplekserów analogowych, takich jak 74HC4051 (8 portów) lub 74HC4067 (16 portów), aby podłączyć jeden pin do jednego z portów 8/16 (ale tylko jednego w danym momencie), w następujący sposób:
Są dwukierunkowe, więc mogą być używane jako ekspander wejść lub wyjść.
SPI z 74HC595
Za pomocą SPI można wysyłać szybkie dane szeregowe do rejestru przesuwnego, takiego jak 74HC595. Mogą być połączone ze sobą stokrotką. W tym przykładzie kontroluję 32 diody LED za pomocą tylko 3 pinów I / O (MOSI / MISO / SCK) oraz zasilania i uziemienia.
Znalazłem wewnątrz komercyjnego znaku LED, że 72 diody LED były napędzane przez układy 74HC595.
Miało to 9 układów napędzających kolumny (9 x 8 = 72 diody LED) i jeden układ napędzający rzędy, w konfiguracji multipleksowanej.
SPI z MAX7219
Jeśli chcesz tylko napędzać diody LED, zwykle możesz je multipleksować. MAX7219 upraszcza to, ponieważ jest przeznaczony do zasilania matryc LED, na przykład wyświetlaczy 7-segmentowych:
Lub matryce 64-LED:
W obu przypadkach można je połączyć łańcuchowo, na przykład:
Wszystkie te przykłady wykorzystują tylko 3 piny Arduino (MOSI / MISO / SCK) plus moc i uziemienie.
SPI z MCP23S17
Wspomniany wcześniej 16-portowy ekspander portów (MCP23017) występuje również w wariancie SPI (MCP23S17), który robi praktycznie identyczne rzeczy. Używa jeszcze jednego drutu, ale byłoby szybsze.
Inne protokoły
Taśmy LED (podobnie jak NeoPixel) mają własne protokoły. Na Youtube był post Josha Levine'a, w którym autor przejechał ponad 1000 pikseli Duemilanove!
Bibliografia
źródło
Rejestry Shift zostały wspomniane w innych odpowiedziach i są zdecydowanie doskonałym wyborem dla wielu projektów. Są tanie, proste, umiarkowanie szybkie i zwykle można je łączyć ze sobą, aby dodać więcej wyników. Mają jednak tę wadę, że zwykle wymagają wyłącznego użycia kilku pinów (od 2 do 4, w zależności od ich konfiguracji).
Alternatywą jest użycie bardziej zaawansowanych ekspanderów portów, takich jak 16-bitowy MCP23017 i MCP23S17 . Obsługują one odpowiednio I2C i SPI, co oznacza, że możesz umieścić je na magistrali z kilkoma innymi urządzeniami (potencjalnie różnych typów). Każde urządzenie w magistrali może być adresowane indywidualnie, co oznacza, że potrzebujesz tylko 2 lub 3 piny do rozmowy ze wszystkimi. Prędkości aktualizacji są zazwyczaj bardzo szybkie, więc nie jest prawdopodobne, aby wystąpiły znaczne opóźnienia (tj. Opóźnienia transmisji) w projekcie Arduino.
Na niskim poziomie używanie I2C lub SPI jest znacznie bardziej skomplikowane niż prosty rejestr przesuwny. Istnieje jednak kod biblioteczny dla Arduino, który zajmie się tym za Ciebie. Zobacz to pytanie, na przykład: Jak korzystać z urządzeń I2C w Arduino?
źródło
Oprócz odpowiedzi Ricardo , co Wikipedia podaje w rejestrach zmianowych :
W połączonym artykule Ricardo możesz zobaczyć schemat rejestru przesuwnego.
To, co się tutaj dzieje, polega na umieszczeniu danych 8 pinów w sekwencji i dla każdego tyknięcia zegara rejestr przesuwny będzie się przesuwał (przenosi dane binarne z każdego zatrzasku na następny), aż „zrobi okrąg”, tj. Pierwszy bit dociera do ostatniej szpilki. Rejestry Shift mają również wejście, w którym można włączyć / wyłączyć przesunięcie, dzięki czemu status można zachować po przesunięciu danych do pozycji. Aby zobaczyć prostą demonstrację, zobacz następującą animację.
Tutaj czerwone światło jest wejściem szeregowym, a zielone pokazują stan zatrzasków w tym uproszczonym rejestrze przesuwnym SIPO . Po przeniesieniu danych na miejsce przesuwanie można wyłączyć i można odczytać piny. W tym przykładzie wyprowadziłem się
10101011
.Z tych przykładów możesz zrozumieć, że transfer szeregowy będzie wolniejszy niż równoległy, ponieważ musisz poczekać, aż rejestr przesuwny przeniesie bity na swoje miejsce. Będziesz musiał poczekać tyle samo zegara, ile bitów chcesz załadować. Jest to jeden z wielu powodów, dla których nie można ich łączyć w nieskończoność, ponieważ ładowanie trwa wiecznie.
źródło
Jak już pisałeś, możesz używać wszystkich pinów, w tym TX i RX jako wyjścia cyfrowego. Zrobiłem to jakiś czas temu dla demonstratora i nagrałem wideo - 20 diod LED na 20 pinach - tego raczej bezsensownego projektu.
Jak opisano tutaj Peter R. Bloomfield , musisz odłączyć TX i RX w celu przesłania. Co więcej, brakuje Ci pinów do odczytu czujników pod kątem możliwej interaktywności i musisz upewnić się, że nie osiągnięto limitu całkowitego prądu. Nie zapominaj, że jesteś ograniczony do diod 5 V, jeśli prowadzisz je bezpośrednio za pomocą Arduino.
Dlatego też zaleca się stosowanie rejestrów przesuwnych ogólnie i 595, opisanych przez Ricardo .
Użyłem ich jakiś czas temu, kiedy zdałem sobie sprawę z lutowania i programowania części Kawaii me (tekst linku jest w języku niemieckim) artysty upcyklingu Dominika Jaisa .
Tutaj tylko kilka 595 użyto do sterowania wyświetlaczem diod LED 8x11. Ponieważ diody LED zostały wycięte z paska 12 diod SMD LED, konieczne było dodatkowe źródło zasilania i niektóre tablice Darlinga UDN2803A , podłączone do styków wyjściowych rejestrów przesuwnych.
Inne ogólne metody obejmują stosowanie ekspanderów portów 8-bitowych PCF8574 (A), które są kontrolowane przez magistralę I2C.
W każdym razie najpierw wypróbuję rejestry zmiany 595.
Jeśli jednak potrzebujesz kontrolować kilka diod RGB, możesz poszukać bardziej specjalistycznych rozwiązań. Niektóre diody RGB są dostarczane z własnym WS2812 . Te drobne elementy można kaskadowo (magistrala 1-Wire) i adresować poprzez ich położenie w łańcuchu.
źródło
Jeśli chodzi o diody LED, to co z taśmami LED WS2812B, czy tylko z samymi chipami sterownika? Możesz kontrolować praktycznie nieograniczoną liczbę diod LED za pomocą tylko jednego pinu!
Chociaż ludzie są przyzwyczajeni do nich w paskach, są one dostępne jako samodzielne diody LED (znane jako neo-piksele w Adafruit). Lub jeśli prowadzisz tylko jeden kolor, każdy układ WS2811 może sterować 3 diodami LED, używając każdego z wyjść RGB dla jednej diody LED.
Niedawno właśnie stworzyłem projekt, który wykorzystuje 5 takich diod LED: drzwi 1 otwarte / zamknięte, drzwi 2 otwarte / zamknięte, silnik 1 aktywny, silnik 2 aktywny i moc. „Aktywne” diody LED mają podwójne zastosowanie, ponieważ mam czerwony jako sygnał wejściowy z aktywnego silnika i zielony będący flagą aktywną wewnątrz Arduino.
Chodzi o to, że z 1 pinem i zainstalowaną biblioteką możesz kontrolować dowolną liczbę diod LED
źródło
Nie twierdzę, że mam taką metodę, ale tę fajną sztuczkę znalazłem na stronie MUX-DEMUX: CD4051 Parlor Tricks
Niezależnie od wybranej metody sterowania wyjściami lub odczytu wejść (rejestry przesuwne, multipleksery lub proste bezpośrednie użycie samych pinów Arduino) można PODWÓJNIE liczbę wyjść lub wejść dzięki sprytnemu zastosowaniu równoległych par obwodów (aby utworzyć podwójny bank wejściowy lub wyjściowy ), wykorzystując diody w przeciwnych zmysłach na każdej gałęzi równoległej i przełączając wejścia / wyjścia na wysokie i niskie.
Aby zilustrować metodę wyjść (diody LED w tym przypadku, należy pamiętać, że dodatkowe diody nie są wymagane):
Aby zilustrować metodę wprowadzania (w tym przypadku CdS, należy pamiętać, że wymagane są dodatkowe diody):
Tak więc, jeśli masz 8-portowy multiplekser CD4051, używając 5 pinów na Arduino (zamiast zwykłych 3), możesz uzyskać 16 wejść lub wyjść lub mieszankę tych dwóch.
Podobnie, jeśli masz multiplekser 4067 z 16 portami, możesz uzyskać 32 wejścia lub wyjścia lub mieszankę tych dwóch.
Przykładowy szkic to:
Jak powiedziałem w pierwszym wierszu, pełne wyjaśnienie można znaleźć w MUX-DEMUX: CD4051 Parlor Tricks
źródło
Do projektu klasowego użyłem CD4024 i dwóch pinów Arduino do sterowania 7-segmentowym wyświetlaczem.
Istnieją pewne zastrzeżenia dotyczące tego podejścia. Na przykład, aby zapisać
high
wartość na pierwszym wyjściu licznika tętnień, wystarczy areset
i dwukrotne przełączenie pinu zegara. Ale jeśli chcesz napisaćhigh
do wszystkich n pinów, musisz przełączać pin nn 2 razy i w tym czasie wszystkie pozostałe piny ciągle się włączają i wyłączają.Jeśli Twoja aplikacja poradzi sobie z tymi ograniczeniami i brakuje Ci szpilek, jest to inna opcja.
Bonus odpowiedź: istnieje wiele przykładów multipleksowania wejść tutaj , z których wiele również zastosowanie do multipleksowanie wyjścia.
źródło
Przy odrobinie pracy (instalowanie innego programu ładującego) dostępnych jest siedem dodatkowych linii we / wy w Uno, na nagłówkach ICSP1 i JP2. Zamienny bootloader nazywa się HoodLoader2 . Pozwala zainstalować szkice zarówno na Atmega328, jak i Atmega16U2 na Uno. Radzenie sobie z wieloma procesorami byłoby główną komplikacją przy użyciu tej metody.
W Uno nagłówki ICSP1 i JP2 łączą się ze stykami PB1 ... PB7 Atmega16U2. Ponadto Atmega16U2 ma około 9 styków we / wy bez połączenia z płytką drukowaną. Osoba pracująca pod mikroskopem może być w stanie podłączyć przewody do 18 styków we / wy 16U2, pozostawiając trzy inne styki we / wy przymocowane do swoich zwykłych połączeń.
HoodLoader2 działa również na tablicach Mega.
źródło
Istnieje wiele dobrych odpowiedzi, ale jeśli poświęciłeś swój czas, taniej byłoby kupić Mega.
Moja wartość 3/2.
źródło