Rozszerzenie portu Arduino dla przycisków. Jak zwiększyć liczbę pinów cyfrowych w Arduino za pomocą ekspandera portów. Dobór modułu ekspandera dla Arduino

Trzynaście linii cyfrowych i sześć wejść analogowych to wszystko, co Arduino ma do zaoferowania jako urządzenia wejścia/wyjścia. Jednak w niektórych przypadkach (szczególnie w projektach z dużą liczbą urządzeń peryferyjnych) taki zestaw linii portów nie wystarczy.



W związku z tym pojawia się pytanie o możliwość zwiększenia liczby linii wejścia/wyjścia. W tym materiale pokazany zostanie przykład takiej rozbudowy z wykorzystaniem układu MCP23017.


Być może wiesz, że 6 pinów analogowych można również wykorzystać jako cyfrowe piny we/wy w następujący sposób:


Wejście analogowe 0 = linia 14
Wejście analogowe 1 = linia 15
Wejście analogowe 2 = linia 16
Wejście analogowe 3 = linia 17
Wejście analogowe 4 = linia 18
Wejście analogowe 5 = linia 19

Możemy więc nazwać wejście analogowe 5 linią cyfrową w następujący sposób: digitalWrite(19,HIGH). Taka komenda zapisze jedynkę logiczną na port 19, czyli linię analogową 5.


Technicznie rzecz biorąc, możemy używać linii portu szeregowego TX/RX. Jednak w niektórych przypadkach jest to niezwykle trudne, zwłaszcza gdy w kodzie używane są funkcje takie jak Serial.begin(), które są niezbędne do działania portu szeregowego. Zatem całkowita liczba styków dostępnych dla użytkownika nadal będzie wynosić 17. Ale czy przy siedemnastu pinach możliwe jest sterowanie dużą liczbą diod LED lub serwomotorów? W takim przypadku lepiej jest zastosować specjalne zewnętrzne mikroukłady. Często do tych celów używany jest rejestr przesuwny, taki jak 74HC595. Wymaga to jednak trzech dodatkowych linii do kontroli i nie pozwala na „rozszerzanie” wszystkich linii jednocześnie. Sterowniki wyświetlacza, takie jak MAX7219, również „zwiększają” liczbę pinów. Ale MAX7219 jest drogim chipem. Dlatego taniej i bardziej racjonalnie jest zastosować układ ekspandera portów MCP23017. Układ ten jest przeznaczony dla 16 linii, ma szeroki zakres napięć roboczych od 1,8 do 5,5 V i jest sterowany poprzez interfejs I2C.


MCP23017 użyje 2 pinów Arduino i zapewni 16 linii we/wy. Technicznie rzecz biorąc, możesz użyć 8 sztuk MCP23017, aby rozszerzyć jeden 16-pinowy Arduino do 16 x 8 = 128 pinów. Arduino posiada bibliotekę dla magistrali I2C o nazwie Wire.h, więc połączenie z MCP23017 będzie bardzo proste. Poniżej znajduje się schemat połączenia pomiędzy Arduino i MCP23017.




#include "Wire.h" void setup() ( Wire.begin(); // aktywuj magistralę I2C // ustaw linie na wyjście Wire.beginTransmission(0x20); Wire.write(0x00); // rejestr IODIRA Wire.write (0x00); // ustaw wszystkie linie portu A na wyjście Wire.endTransmission(); ) void pętli() ( Wire.beginTransmission(0x20); Wire.write(0x12); // bank adresów A Wire. write((byte )0xAA); // wysłana wartość - wszystkie linie logu. 1 Wire.endTransmission(); opóźnienie(500); Wire.beginTransmission(0x20); Wire.write(0x12); // bank adresów A Wire .write(( byte)0x55); // wysłana wartość - wszystkie linie logu. 1 Wire.endTransmission(); opóźnienie(500); )

Jedną z kluczowych zalet platformy Arduino jest jej popularność. Popularna platforma jest aktywnie wspierana przez producentów urządzeń elektronicznych, produkując specjalne wersje różnych płytek rozszerzających podstawową funkcjonalność sterownika. Takie płytki, całkiem logicznie zwane płytkami rozszerzeń (inna nazwa: arduino tarcza, tarcza), służą do wykonywania szerokiej gamy zadań i mogą znacznie ułatwić życie operatora arduino. W tym artykule dowiemy się, czym jest karta rozszerzeń Arduino i jak można ją wykorzystać do współpracy z różnymi urządzeniami Arduino: silnikami (osłonami sterowników silników), ekranami LCD (osłonami LCD), kartami SD (rejestratorem danych), czujnikami (osłona czujnika) i wiele innych.

Najpierw zrozummy warunki. Karta rozszerzeń Arduino to kompletne urządzenie przeznaczone do realizacji określonych funkcji, podłączane do sterownika głównego za pomocą standardowych złączy. Inną popularną nazwą karty rozszerzeń jest anglojęzyczna tarcza Arduino lub po prostu tarcza. Wszystkie niezbędne elementy elektroniczne instalowane są na płytce rozszerzeń, a interakcja z mikrokontrolerem i pozostałymi elementami płyty głównej odbywa się poprzez standardowe piny Arduino. Najczęściej zasilanie tarczy dostarczane jest również z płyty głównej Arduino, chociaż w wielu przypadkach istnieje możliwość zasilenia jej z innych źródeł. W każdej tarczy znajduje się kilka wolnych pinów, które możesz wykorzystać według własnego uznania, podłączając do nich dowolne inne komponenty.

Angielskie słowo Tarcza jest tłumaczone jako tarcza, ekran, ekran. W naszym kontekście należy przez to rozumieć coś, co zakrywa płytkę kontrolera, tworząc dodatkową warstwę urządzenia, ekran, za którym kryją się różne elementy.

Dlaczego potrzebujemy tarcz Arduino?

Wszystko jest bardzo proste: 1) abyśmy zaoszczędzili czas i 2) ktoś mógł na tym zarobić. Po co tracić czas na projektowanie, umieszczanie, lutowanie i debugowanie czegoś, co można wziąć już zmontowanego i od razu zacząć używać? Dobrze zaprojektowane karty rozszerzeń montowane na sprzęcie wysokiej jakości są z reguły bardziej niezawodne i zajmują mniej miejsca w urządzeniu końcowym. Nie oznacza to jednak, że trzeba całkowicie zrezygnować z samodzielnego montażu i nie trzeba rozumieć zasady działania poszczególnych elementów. W końcu prawdziwy inżynier zawsze stara się zrozumieć, jak działa to, czego używa. Ale będziemy w stanie tworzyć bardziej złożone urządzenia, jeśli nie będziemy za każdym razem wymyślać koła na nowo, ale skupimy naszą uwagę na tym, co niewielu ludzi rozwiązało wcześniej.

Za możliwości trzeba oczywiście zapłacić. Prawie zawsze koszt ostatecznej tarczy będzie wyższy niż cena poszczególnych elementów, zawsze możesz zrobić podobną opcję taniej. Ale tutaj to Ty decydujesz, jak ważny jest dla Ciebie wydany czas lub pieniądze. Biorąc pod uwagę wszelką możliwą pomoc ze strony chińskiego przemysłu, koszt desek stale maleje, dlatego najczęściej decyduje się na korzystanie z gotowych urządzeń.

Najpopularniejszymi przykładami osłon są karty rozszerzeń do współpracy z czujnikami, silnikami, ekranami LCD, kartami SD, osłony sieciowe i GPS, osłony z wbudowanymi przekaźnikami do podłączenia do obciążenia.

Podłączanie nakładek Arduino

Aby podłączyć tarczę, wystarczy ostrożnie „położyć” ją na płycie głównej. Zazwyczaj styki osłony grzebieniowej (męskiej) można łatwo włożyć w złącza płytki Arduino. W niektórych przypadkach konieczne jest dokładne wyregulowanie pinów, jeśli sama płytka nie jest prawidłowo przylutowana. Najważniejsze jest, aby działać ostrożnie i nie używać nadmiernej siły.

Z reguły nakładka przeznaczona jest dla bardzo konkretnej wersji kontrolera, chociaż np. wiele nakładki dla Arduino Uno całkiem dobrze współpracuje z płytkami Arduino Mega. Pinout na mega jest wykonany w taki sposób, że pierwsze 14 pinów cyfrowych oraz piny po przeciwnej stronie płytki pokrywają się z pinami na UNO, dzięki czemu bez problemu można w niego włożyć nakładkę Arduino.

Programowanie Arduino Shield

Programowanie obwodu z płytką rozszerzeń nie różni się od zwykłego programowania Arduino, gdyż z punktu widzenia sterownika po prostu podpinaliśmy nasze urządzenia do jego zwykłych pinów. Na szkicu musisz wskazać te piny, które są podłączone w tarczy do odpowiednich styków na płytce. Z reguły producent wskazuje zgodność pinów na samym ekranie lub w osobnej instrukcji podłączenia. Jeśli pobierzesz szkice zalecane przez samego producenta płyty, nie będziesz nawet musiał tego robić.

Odczyt lub zapis sygnałów tarczy odbywa się również w zwykły sposób: za pomocą funkcji i innych poleceń znanych każdemu użytkownikowi Arduino. W niektórych przypadkach możliwe są kolizje, gdy przyzwyczaisz się do określonego schematu połączeń, a producent wybrał inny (na przykład przycisk do ziemi, a na ekranie do zasilacza). Tutaj po prostu trzeba zachować ostrożność.

Z reguły ta karta rozszerzeń występuje w zestawach Arduino i dlatego to właśnie z nią inżynierowie Arduino spotykają się z nią najczęściej. Tarcza jest dość prosta – jej głównym zadaniem jest zapewnienie wygodniejszych możliwości podłączenia do płytki Arduino. Odbywa się to poprzez dodatkowe złącza zasilania i masy umieszczone na płytce do każdego z pinów analogowych i cyfrowych. Również na płytce znajdują się złącza do podłączenia zewnętrznego źródła zasilania (w celu przełączenia należy założyć zworki), dioda LED oraz przycisk restartu. Opcje osłon i przykłady zastosowania znajdziesz na ilustracjach.




Istnieje kilka wersji karty rozszerzeń dotykowych. Wszystkie różnią się liczbą i rodzajem złączy. Najpopularniejsze obecnie wersje to Sensor Shield v4 i v5.

Ta tarcza Arduino jest bardzo ważna w projektach robotycznych, ponieważ... pozwala na jednoczesne podłączenie silników zwykłych i serwo do płytki Arduino. Głównym zadaniem nakładki jest zapewnienie kontroli urządzeń pobierających prąd o wartości wystarczającej dla zwykłej płytki Arduino. Dodatkową funkcją płytki jest funkcja sterowania mocą silnika (za pomocą PWM) oraz zmiany kierunku obrotów. Istnieje wiele rodzajów płytek osłon silnika. Wspólne dla nich wszystkich jest obecność w obwodzie mocnego tranzystora, przez który podłączone jest obciążenie zewnętrzne, elementy odprowadzające ciepło (zwykle grzejnik), obwód do podłączenia zewnętrznego zasilania, złącza do podłączenia silników i pin do podłączenia do Arduino.



Organizacja pracy z siecią to jedno z najważniejszych zadań współczesnych projektów. Dostępna jest odpowiednia karta rozszerzeń umożliwiająca podłączenie do sieci lokalnej poprzez Ethernet.




Płytki rozszerzeń do prototypowania

Płytki te są dość proste - posiadają styki do mocowania elementów, przycisk reset oraz możliwość podłączenia zewnętrznego zasilania. Celem tych osłon jest zwiększenie zwartości urządzenia, gdy wszystkie niezbędne komponenty znajdują się bezpośrednio nad płytą główną.





Tarcza Arduino LCD i tarcza TFT

Ten rodzaj nakładki służy do współpracy z ekranami LCD w Arduino. Jak wiadomo, podłączenie nawet najprostszego 2-wierszowego ekranu tekstowego nie jest zadaniem trywialnym: trzeba poprawnie podłączyć 6 styków ekranowych na raz, nie licząc zasilania. Znacznie łatwiej jest włożyć gotowy moduł do płytki Arduino i po prostu wgrać odpowiedni szkic. W popularnej osłonie klawiatury LCD na płytce od razu instaluje się od 4 do 8 przycisków, co pozwala na błyskawiczne zorganizowanie zewnętrznego interfejsu dla użytkownika urządzenia. Tarcza TFT również pomaga



Tarcza rejestratora danych Arduino

Kolejnym zadaniem, które dość trudno jest samodzielnie wdrożyć w swoich produktach, jest zapisywanie danych otrzymanych z czujników z odniesieniem czasowym. Gotowa osłona pozwala nie tylko na zapisanie danych i uzyskanie czasu z wbudowanego zegara, ale także na podłączenie czujników w wygodnej formie poprzez lutowanie lub na płytce drukowanej.




Krótkie podsumowanie

W tym artykule przyjrzeliśmy się tylko niewielkiej części ogromnej gamy różnych urządzeń rozszerzających funkcjonalność Arduino. Karty rozszerzeń pozwalają skupić się na tym, co najważniejsze – logice programu. Twórcy osłon przewidzieli prawidłowy i niezawodny montaż oraz niezbędne zasilanie. Pozostaje Ci tylko znaleźć wymaganą płytkę za pomocą cennego angielskiego słowa „tarcza”, podłączyć ją do Arduino i przesłać szkic. Zazwyczaj dowolne programowanie tarczy polega na wykonaniu prostych czynności polegających na zmianie nazw wewnętrznych zmiennych gotowego programu. Dzięki temu uzyskujemy łatwość obsługi i podłączenia, a także szybkość montażu gotowych urządzeń lub prototypów.

Wadą stosowania kart rozszerzeń jest ich koszt i możliwa utrata wydajności ze względu na uniwersalność osłon, która leży w ich naturze. W przypadku wąskiego zadania lub urządzenia końcowego wszystkie funkcje tarczy mogą nie być potrzebne. W takim przypadku nakładkę należy stosować jedynie na etapie prototypowania i testów, a podczas tworzenia ostatecznej wersji urządzenia pomyśleć o zastąpieniu jej projektem z własnym obwodem i typem układu. Decyzja należy do Ciebie, masz wszelkie możliwości dokonania właściwego wyboru.

Wszyscy uwielbiają niedrogie płytki Arduino, ale często projekt wymaga tylko jednego lub dwóch wolnych portów! Czasami portów jest wystarczająco dużo, ale nie chcesz ciągnąć wiązki przewodów do innej części konstrukcji. Załóżmy, że musisz umieścić kilka przycisków i diod LED na przednim panelu urządzenia. Bardziej niezawodne i łatwiejsze jest podłączenie ich do płyty głównej za pomocą zaledwie dwóch przewodów magistrali danych niż kabla lub wiązki przewodów, prawda?

Z myślą o takich sytuacjach przeznaczone są różne ekspandery portów Arduino.

Zazwyczaj piny mikrokontrolera realizują kilka różnych funkcji, dlatego istnieją różne ekspandery:

  1. Standardowy ekspander portów GPIO
  2. Ekspander wyjść PWM
  3. Ekspandery wejść analogowych – multipleksery i zewnętrzne przetworniki ADC

Osobno warto wspomnieć o przetwornikach cyfrowo-analogowych (DAC) i ekspanderach przestrzeni adresowej magistrali I2C. Urządzenia te nie powielają bezpośrednio funkcji portów, lecz rozszerzają możliwości mikrokontrolerów.

W pierwszym artykule z serii omówimy najprostsze i najbardziej przydatne ekspandery pracujące jako cyfrowe porty I/O. Są to mikroukłady i . Są zaprojektowane i działają absolutnie identycznie, różnią się jedynie liczbą portów.

Dobór modułu ekspandera dla Arduino

Najpopularniejszy i najtańszy moduł wykonany jest na chipie PCF8574 (ryc. 1)

Ryż. 1. Popularny moduł ekspandera portów PCF8574

Zalety:
  • Niska cena.
  • Moduły można łączyć w łańcuch, po prostu wkładając wtyczki jednego modułu do gniazd poprzedniego. Nie zapomnij ustawić zworek na różne adresy modułów!
Wady:
  • Nie można go włożyć bezpośrednio do płytki prototypowej (polecam przylutować złącze portu odwrotną stroną).
  • Łącznie osiem portów w jednym module.

Jeśli masz ochotę na poważniejsze projekty, zamów na Aliexpress 16-bitowy moduł PCF8575. Gorąco polecam moduł pokazany na rys. 2.

Ryż. 2. Moduł ekspandera portów PCF8575

Zalety:
  • Dwa razy więcej portów.
  • Wbudowany zasilacz 3,3 V, może zasilać inne moduły.
  • Wbudowane dopasowanie poziomów logicznych dla magistrali I2C przy różnych napięciach zasilania.
  • Wygodny format płytki prototypowej.
Wady:
  • Wyższa cena.

Zasada działania ekspandera portów GPIO PCF8574/PCF8575

Wymiana danych odbywa się poprzez magistralę I2C. Podłączenie do płytki Arduino wymaga tylko czterech przewodów, łącznie z zasilaniem. Adres ekspandera ustalany jest trzema zworkami na wejściach A0...A2, dzięki czemu można jednocześnie podłączyć do magistrali osiem identycznych układów i uzyskać maksymalnie 8*8=64 dodatkowych portów z PCF8574 lub 8*16=128 z układem PCF8575 .

Aby wyprowadzić dane do portu, należy zapisać bajt danych pod adresem modułu na magistrali I2C. Aby odczytać dane z portu, należy przeczytać bajt pod tym samym adresem. Bajt jest zawsze zapisywany i odczytywany jako całość; poszczególne bity są obsługiwane programowo.

Wyjścia mikroukładu są również wejściami i nie ma rejestru usługowego określającego cel wyjścia. Istnieje tylko rejestr zatrzaskowy, do którego zapisywany jest bajt wyjściowy. Jak to jest możliwe?

Porty działają w podobny sposób z otwartym kolektorem i są wyposażone w wewnętrzne rezystory podciągające. Jeśli na wyjściu zostanie zapisane zero logiczne, wówczas tranzystor wyjściowy otwiera się, co wymusza zwarcie wyjścia do masy. Odczyt z takiego portu zawsze zwróci zero.

Zachowaj ostrożność podczas przykładania bezpośredniego napięcia zasilania do styku, który jest niski lub gdy prąd zostanie przekroczony. 50 mA zniszczysz chip!

Aby użyć portu jako wejścia, wpisz do niego jedynkę. W takim przypadku wewnętrzny tranzystor zostanie wyłączony, a wynik odczytu zostanie określony przez zewnętrzny poziom logiczny przyłożony do pinu. Wolny pin podłączony jest do zasilacza za pomocą wbudowanego rezystora.

Aby jednocześnie część portów wykorzystać jako wejścia, a część jako wyjścia, przed każdym zapisem bajtu danych do ekspandera należy nałożyć maskę jedynek na bity odpowiadające wejściom za pomocą „logicznego LUB” operacja. To wszystko)))

Generowanie przerwań

Ekspandery portów PCF857* generują impuls przerwania niski poziom na wyjściu INT dla dowolnej zmiany sygnału wejściowego na dowolnym wejściu mikroukładu. Jest to wygodne, jeśli ekspander obsługuje klawiaturę. Ale musisz sam określić w procedurze obsługi przerwań, który przycisk został naciśnięty, a który zwolniony. Generator przerwań jest wyposażony w filtr tłumiący odbicia stykowe.

Przykład 1: Użycie modułu PCF8574

Złóżmy prosty obwód składający się z czterech diod LED, modułu PCF8574 i płytki Arduino (rys. 3 i 4). Dzięki temu schematowi połączeń nie potrzebujemy nawet rezystorów gaszących dla diod LED. Prąd przepływa przez diodę LED i wbudowany rezystor podłączony do szyny zasilającej.

Ryż. 3. Schemat podłączenia modułu PCF8574

Ryż. 4. Układ obwodu z modułem PCF8574

Skopiuj i zapisz szkic 1 na płytce Arduino:

// Adres modułu na magistrali (A0, A1, A2 = 0) int adres = 0x38; // Dane odczytane z modułu uint8_t dataReceive; // Dane do zapisu do modułu uint8_t dataSend; void setup() ( Wire.begin(); Serial.begin(9600); // Wysoki poziom do wszystkich portów PCF8574 dataSend = B11111111; pcf8574_write(dataSend); ) void pętli() ( // Odczytaj bajt z modułu dataReceive = pcf8574_read (); // Wyjście do monitora w formacie binarnym Serial.println(dataReceive, BIN); // Przesuń bity w lewo za pomocą półbajta dataSend = dataReceive<< 4; // Накладываем битовую маску dataSend |= B00001111; // Записываем байт в модуль pcf8574_write(dataSend); delay(500); } // Процедура записи байта в модуль void pcf8574_write(uint8_t dt) { Wire.beginTransmission(address); Wire.write(dt); Wire.endTransmission(); } // Процедура чтения байта из модуля int8_t pcf8574_read() { Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(address, 1); return (Wire.read()); }

Wysoki poziom jest początkowo zapisywany do wszystkich portów chipa, więc porty P0...P3 mogą działać jako wejścia.

Poziomy na pinach portu odczytywane są co 500 ms, a wynik odczytu wyświetlany jest na monitorze. Jeżeli podłączymy jedno z wejść P0...P3 do wspólnego przewodu, na jego bicie pojawi się zero. Następnie odczytana wartość jest przesuwana w lewo o cztery bity, wynik jest wyprowadzany do portu i jedna z diod gaśnie. Na przykład, jeśli na pinie P0 zostanie odczytane zero, dioda LED podłączona do pinu P4 zgaśnie.

Należy pamiętać, że przed każdym zapisem do ekspandera musimy nałożyć maskę bitową jedynek na wszystkie bity, które powinny być wprowadzone: dataSend |= B00001111;

Procedury pracy z magistralą I2C są niezwykle uproszczone, nie są przetwarzane żadne błędy.

Rada: Aby znaleźć i sprawdzić adres modułu na magistrali I2C, możesz użyć . Wyświetla w terminalu adresy wszystkich urządzeń, które odpowiadają na żądanie magistrali.

Przykład 2: Użycie modułu PCF8575

Osobliwością modułu PCF8575 jest to, że ma 16 portów, więc tak zawsze zapisuj dwa bajty i czytaj dwa bajty. Zasady tej należy przestrzegać nawet wtedy, gdy drugi bajt nie jest potrzebny.

Zmieńmy trochę schemat. Diody LED podłączymy do portów P10…P13, a porty P00…P03 połączymy zworką ze wspólnym przewodem (rys. 5 i 6).

Ryż. 5. Schemat podłączenia modułu PCF8575

Ryż. 6. Układ obwodu z modułem PCF8575

Na szkicu 2 do wszystkich portów zapisywane są najpierw cyfry 1, a następnie co 500 ms odczytywany jest ich stan. Procedura odczytu zwraca 16-bitowe słowo podzielone na bajty. Zawartość młodszego bajtu (piny P00...P07) jest kopiowana do starszego bajtu i przesyłana z powrotem do modułu. Jeżeli podłączymy jeden z pinów P00...P03 do przewodu wspólnego, jedna z diod LED podłączonych do P10...P13 zgaśnie.

// Biblioteka do pracy z I2C #include // Domyślny adres modułu na magistrali int adres = 0x20; // Dane odczytane z modułu uint8_t hi, lo; uint16_t odbiór danych; uint8_t dataHighByte; // Wysoki bajt (P10...P17) uint8_t dataLowByte; // Młodszy bajt (P00...P07) void setup() ( Wire.begin(); Serial.begin(9600); // Wysoki poziom do wszystkich portów PCF8575 dataHighByte = B11111111; dataLowByte = B11111111; pcf8575_write(dataLowByte, dataHighByte ); ) void pętli() ( // Odczytaj bajt z modułu dataReceive = pcf8575_read(); // Wyjście do monitora w formacie binarnym Serial.println(dataReceive, BIN); // Wybierz młodszy bajt z długiego słowa dataLowByte = lowByte(dataReceive ); // Skopiuj młodszy bajt do starszego bajtu dataHighByte = dataLowByte; // Umieść maskę na młodszym bajcie dataLowByte |= B11111111; // Zapisz nowe dane do modułu, dwa bajty pcf8575_write(dataLowByte, dataHighByte); opóźnienie(500); ) // Procedura zapisu bajtu do modułu void pcf8575_write(uint8_t dtl, int8_t dth) ( Wire.beginTransmission(adres); Wire.write(dtl); // Zapisz młodszy bajt (P00...P07) Wire.write(dth); // Zapisz starszy bajt (P10...P17) Wire.endTransmission(); ) // Procedura odczytu bajtu z modułu int16_t pcf8575_read() ( Wire .beginTransmission(adres); Wire.endTransmission(); Wire.requestFrom(adres, 2); lo = Wire.read(); // Przeczytaj młodszy bajt (P00...P07) hi = Wire.read(); // Odczytaj starszy bajt (P10...P17) return (word(hi, lo)); // Zwróć długie słowo)

Biblioteka Arduino dla PCF8574/PCF8575

Bibliotekę można pobrać z GitHuba. Ale, jak widać, praca z ekspanderami portów jest bardzo prosta i można łatwo obejść się bez specjalnej biblioteki.

Opis osłony ekspandera

Expander Shield to oryginalny moduł dodatkowy przeznaczony do zwiększania liczby portów wejścia/wyjścia mikrokontrolerów opartych na platformie Arduino, a także innych mikrokontrolerów, wykorzystujących ekspandery portów z interfejsem SPI lub I2C.


Głównymi elementami modułu dodatkowego Expander Shield są dwa mikroukłady MCP23S17 lub MCP23017 (dwa 16-bitowe ekspandery portów I/O z interfejsem odpowiednio SPI lub I2C), które umożliwiają dodanie czterech 8-bitowych portów I/O, czyli , 32 dodatkowe „nogi”.

Sprzęt

Moduł Expander Shield jest dostarczany w postaci zmontowanej wersji SPI lub I2C (z powiązanymi chipami) lub jako zestaw bez chipów, który można kupić osobno.

Zaciski modułu mogą być wyposażone w blokady transportowe, które należy zdjąć przed przystąpieniem do pracy.

Ekspander Tarcza SPI 1100 rub. 850 rubli. Dodaj do koszyka

formularz zamówienia.

ExpanderShield na magistralę SPI (z chipami MCP23S17).

Ekspander Shield I2C 1100 rub. 850 rubli. Dodaj do koszyka

Uwaga! Masz wyłączoną obsługę JavaScript. Nie jest możliwa normalna praca systemu zamówień i koszyka. Jeśli z jakiegoś powodu nie możesz włączyć JavaScript, po prostu wypisz zamawiane produkty w formularzu zamówienia.

ExpanderShield na magistralę I2C (z chipami MCP23017).

Dane techniczne

Oto najważniejsze cechy funkcjonalne modułu Expander Shield.

  • wygodny przełącznik trybu pracy modułu w zależności od rodzaju aktualnie zainstalowanych ekspanderów portów;
  • dla każdego z dwóch zastosowanych 16-bitowych układów ekspanderów portów I/O za pomocą zworek ustawiany jest trzybitowy adres na magistrali, co pozwala na umieszczenie do 8 takich układów na jednej magistrali;
  • możliwość wykorzystania zworki do wyboru numeru odpowiedniego wyjścia mikrokontrolera Freeduino/Arduino (cyfrowy pin 8, 9 lub 10) dla sygnału CS magistrali SPI;
  • w module zastosowano złącza „przejściowe”, co pozwala na dokowanie kilku modułów bez przesuwania względem płytki Arduino;
  • sygnały z mikroukładów wyprowadzone są na cztery złącza PBD-10R z dodatkowymi stykami masy i +5V;
  • możliwość wyboru osobnego lub wspólnego resetu sprzętowego (przycisk RESET) 16-bitowych układów ekspandera portów I/O i mikrokontrolera Freeduino/Arduino za pomocą zworek;
  • dodatkowe złącze JPIC z pinami przerwań (INTA, INTB), resetem sprzętowym (RST) i wyborem chipa (CS);

O pozostałych charakterystykach modułu decydują przede wszystkim charakterystyki mikroukładów MCP23S17/MCP23017, których opis techniczny znajduje się w dokumentacji producenta.

Dodatkowo przed przystąpieniem do pracy z dodatkowym modułem Expander Shield zalecamy zapoznanie się ze schematem jego podłączenia.

Tryby pracy

Wybór trybu pracy Expander Shield odbywa się za pomocą przełącznika DIP i zworek.

Wybór interfejsu i sterowanie podciąganiem magistrali I2C

Za pomocą przełącznika DIP można wybrać tryb SPI (włączając grupę styków 1-4) dla mikroukładów MCP23S17 lub tryb I2C (włączając grupę styków 5-6) dla mikroukładów MCP23017. Ponadto w trybie I2C, za pomocą pinów 7 i 8, jeśli to konieczne, magistrala I2C jest przeciągana przez rezystory ograniczające prąd do szyny zasilającej +5 V. Zwykle rezystory podciągające należy podłączyć, jeśli na magistrali I2C znajduje się tylko jedno urządzenie. Jeśli jest kilka urządzeń, rezystory są podłączone tylko dla jednego z urządzeń.

Jednoczesna aktywacja magistrali SPI i I2C, a także magistrali SPI i grupy 7, 8 pinów niedozwolony.

Łączony tryb pracy, w którym jeden z dwóch mikroukładów w jednym module Expander Shield pracuje poprzez interfejs SPI (MCP23S17), a drugi poprzez interfejs I2C (MCP23017), jest niemożliwy.

Jeśli chcesz zorganizować pracę jednocześnie poprzez interfejsy SPI i I2C, musisz zastosować dwa (kilka) dodatkowych modułów Expander Shield z odpowiednimi pozycjami przełączników.

Wybór numeru pinu do sterowania sygnałem CS magistrali SPI

Dla magistrali SPI należy wybrać pin mikrokontrolera Freeduino/Arduino używany jako sygnał CS. Zwykle używany jest pin 10, który odpowiada skrajnej lewej pozycji zworki na złączu SS1. Przesuwając zworkę w jedną z dwóch pozostałych pozycji, można wybrać odpowiednio piny 9 i 8.

Wybór adresu mikroukładów na magistrali

Trzy najniższe bity adresu mikroukładów MCP23S17/MCP23017 wybiera się za pomocą zworek na złączach IC1_addr/IC2_addr poprzez połączenie bitów 0, 1, 2 z masą (Gnd) lub +5 V (5 V).

Adres każdego chipa musi być unikalny.

Tym samym na jednej magistrali można umieścić do 8 mikroukładów (poprzez połączenie np. 4 Expander Shields).

Wybór trybu pracy z resetem sprzętowym (przycisk RESET)

Istnieje możliwość zorganizowania jednego z wielu trybów pracy przycisku RESET

  • Przycisk RESET resetuje układy Freeduino/Arduino i MCP23S17/MCP23017
  • Przycisk RESET resetuje tylko Freeduino/Arduino
  • Przycisk RESET resetuje tylko chipy MCP23S17/MCP23017

Odpowiednie pozycje zworek na złączu JRS (od lewej do prawej) pokazano poniżej.

Biblioteka MCP23xxx

Aby uprościć pracę z tym i wieloma innymi modułami, opracowano bibliotekę MCP23xxx, która zapewnia prosty interfejs do funkcjonalności mikroukładów serii MCP23xxx. Biblioteka jest dostępna do bezpłatnego pobrania: Biblioteka jest kompatybilna z oprogramowaniem Arduino w wersji 1.0.5 (przewidywana jest także kompatybilność z nowszymi wersjami).

W rzeczywistości jest to zestaw dwóch bibliotek: MCP23xxx i LiquidCrystal_MCP23x17.

Instalacja bibliotek została opisana bardziej szczegółowo w rozdziale łączenie bibliotek. Struktura katalogów folderu bibliotek po instalacji powinna wyglądać następująco:

/libraries/LiquidCrystal_MCP23x17
/biblioteki/MCP23xxx

Biblioteka MCP23xxx implementuje szablony klas organizujące pracę z ekspanderami portów MCP23017, MCP23S17, MCP23008 i MCP23S08. Biblioteka LiquidCrystal_MCP23x17 to zmodyfikowana standardowa biblioteka LiquidCrystal obsługująca język rosyjski i działająca poprzez ekspander portów.

Biblioteka zawiera przykłady wyjaśniające, jak z nią pracować. Do pobrania dostępna jest także poprzednia wersja biblioteki:

Spójrzmy na przykład pracy z modułem dla magistrali I2C:

//W przykładzie odczytywany jest stan pinów 1. chipa, a na 2. chipie ustawiane są te same wartości

//W przypadku wersji I2C podłącz Wire.h:
#włączać
//podłącz bibliotekę
#włączać

//Utwórz dwa obiekty klasy CMCP23017, ale nie inicjuj ich, ponieważ Magistrala I2C nie jest gotowa
CMCP23017 mcp23_1;
CMCP23017 mcp23_2;

unieważnij konfigurację()
{
//Zainicjuj magistralę I2C...
Przewód.rozpocznij();
//... i obiekty MCP23* o adresach 0 i 1
mcp23_1.init(0);
mcp23_2.init(1);

//Wszystkie piny pierwszego układu muszą być wejściami, a drugie wyjściami
//Można to zrobić w pętli
for (int i= 0 ; tj< 16 ; i++ ) {
mcp23_1.pinMode (i, WEJŚCIE) ;
mcp23_2.pinMode (i, WYJŚCIE) ;
}
//lub jednorazowo, wywołując metodę pinMode16
//mcp23_1.pinMode16(0x0ffff);
//mcp23_2.pinMode16(0x00000);
}

pusta pętla()
{
//Możesz odczytać wszystkie wejścia pierwszego układu i ustawić to samo w drugim układzie w pętli
for (int i= 0 ; tj< 16 ; i++ ) {
mcp23_2.digitalWrite (i, mcp23_1.digitalRead (i) ) ;
}
//lub jednocześnie, używając metod digitalRead16 i digitalWrite16
//mcp23_2.digitalWrite16(mcp23_1.digitalRead16());
}

Tak jak już to zrobiłem, zamówiłem trzy mniej więcej nie nakładające się na siebie zestawy czujników do Arduino. W obu zestawach otrzymałem mikroukład 74HC595, który na razie pozostał w pudełku. Na razie nawet nie wiedziałem, co to za mikroukład i jak w ogóle oznaczono tego czarnego karalucha.

Ale nadeszły mroczne dni, kiedy nie mogłem uzyskać wystarczającej ilości sygnałów wyjściowych Arduino Nano, gdy budowałem urządzenie do testowania silników krokowych. (DO ZROBIENIA: wstaw link do artykułu o testerze SD, gdy będzie gotowy). W rezultacie moje urządzenie do testowania silników krokowych okazało się dość skomplikowane - dwuwierszowy wyświetlacz 1602 z systemem menu sterowanym za pomocą pełnofunkcyjnej klawiatury 4x4, 3 cyfry do ustawiania wartości mikrokroku silnika krokowego, Step i sygnały Dir dla silnika krokowego itp. Wydawać by się mogło, że przyszedł czas na migrację na inną wersję Arduino. Jednak moje wrodzone lenistwo sprzeciwiło się tej migracji. A leniwa głowa zaczęła szukać rozwiązania.

Postanowiono poszukać rozwiązania w oparciu o to, co już istnieje. Przeglądając szaliki i części z zestawów, zauważyłem 16-pinowego czarnego „żuka”. Najpierw w jednym zestawie, potem w drugim. Postanowiłem zapytać co to za część i dlaczego została dodana do zestawów. Nie rozumiem, dlaczego umieścili go w zestawach, ale sam chip znalazłem na stronie NXP.

Okazało się, że jest to dość interesujący mikroukład - rejestr przesuwny z wejściem szeregowym i wyjściem równoległym.

(z arkusza danych)

Opis pinów

Kontakt Nazwa Opis i połączenie
10 ~MR Główny reset- reset, poziom aktywny niski. W idealnym przypadku dobrym pomysłem byłoby utworzenie obwodu resetującego, który najpierw obniży poziom tego wejścia, a następnie doprowadzi je do pojedynczego stanu. Ale nie musisz się bawić i podłączać go do + 5 V. W tym przypadku wynik przed pierwszym rekordem będzie zawierał wartości losowe
13 ~OE Wyjście włączone- rozdzielczość wyjściowa, poziom aktywny niski. Po zastosowaniu 0 zawartość rejestru jest dostarczana na wyjścia, po zastosowaniu 1 wyjścia są wyłączane i przekazywane do stanu Z, co pozwala różnym urządzeniom na naprzemienne korzystanie z jednej magistrali. Podłącz do masy, jeśli nie musisz kontrolować stanu wyjść
14 DS Wejście danych szeregowych- wejście szeregowe. To wejście musi być ustawione na wartość sygnału wejściowego przed zastosowaniem zegara zmiany biegów SHCP.
11 SHCP Rejestr przesuwny Zegar wejściowy- wejście zegarowe rejestru przesuwnego. Aby przenieść bit do rejestru, należy zastosować przejście z 0 na 1. Kiedy wrócić do 0, zależy od twojego uznania. Można to zrobić od razu, można to zrobić tuż przed wciśnięciem. W pierwszym przypadku możemy założyć, że przełączanie następuje wzdłuż zbocza sygnału bezpośredniego, w drugim – wraz ze spadkiem sygnału odwrotnego. Zobacz także uwagi dotyczące wydajności poniżej. Również po nadejściu tego sygnału zmienia się wartość wyjścia szeregowego Q7/S
12 STCP Wejście zegara rejestru pamięci- wejście zegarowe rejestru zatrzaskowego. Na zboczu tego impulsu wartość jest przekazywana z rejestru przesuwnego na wyjścia równoległe Q0-Q7
9 Q7S Szeregowe wyjście danych- wyjście szeregowe. Wyświetlana jest na nim wartość najbardziej znaczącego bitu rejestru przesuwnego. To wyjście może być użyte do skalowania rejestru przesuwnego do 16-bitowego, 24-bitowego itd. schemat
15, 1-7 K0, K1-7 Wyjścia rejestru zatrzaskowego. Sygnał do nich przekazywany jest z wewnętrznego rejestru przesuwnego po nadejściu sygnału STCP
8 GND Odżywianie- przewód wspólny
16 VCC Odżywianie - +

Odżywianie

Wersja HC mikroukładu wymaga zasilania od 2 V do 6 V, wersja HCT (kompatybilna z TTL) - od 4,5 V do 5,5 V. HCT - TTL - czy jest nadal używany? Arduino wydaje się być samym CMOS, więc HCT nie jest potrzebne, ale jeśli chcesz skoordynować poziomy z zewnętrznymi odbiornikami TTL, możesz zasilić HC z 3,3 V, wtedy poziomy sygnału będą kompatybilne z TTL. Ogólnie rzecz biorąc, zarówno HC, jak i HCT powinny współpracować z 5-woltowym Arduino. Tak piszą w internecie.

Ważniejsze są kondensatory blokujące. Bez nich obwód może nie działać zgodnie z przeznaczeniem, a w dodatku może być nieprzewidywalny. Teoretycznie w każdym przypadku w obwodzie zasilającym należy zamontować kondensator 0,1 µF. Wartość tę obliczyłem jako średnią z Internetu. Mój plan działał dobrze bez niego. Aby to wyjaśnić, sięgnąłem do Biblii projektanta obwodów, aby to wyjaśnić - Hill i Horowitz: „Sztuka projektowania obwodów” jest prawie jak „Sztuka programowania” Donalda Knutta, ale tylko dla ludzi zajmujących się sprzętem (nawiasem mówiąc, Hill i Horowitz są znacznie bliżej ludzi, łącznie z Knuttem – jest zbyt sprytny) – ale tam wydają się nazywać kondensatory blokujące kondensatorami odsprzęgającymi na wejściach. Szkoda, to dobra książka, ale już mocno spóźniona. Mam drugie lub trzecie wydanie rosyjskie z końca lat 90. lub początku 0., oryginał jest najprawdopodobniej jeszcze 10 lat starszy. Na trzecim, różowym tomie znalazłem naklejkę „14 rubli” - jak wszystko było wtedy tanie, według współczesnych standardów. Ale minęło dopiero 15 lat albo trochę więcej. Nostalgia była przytłaczająca.

Wydajność

W tytule arkusza danych 74HC595 piszą, że działa z częstotliwością 100 MHz. Szybkie spojrzenie na wykresy i tabele w arkuszu danych pokazuje, że najdłuższe czasy w zakresie temperatur od -40C do +85C przy zasilaniu 4,5V wynoszą 10-20ns (100-50MHz). Biorąc pod uwagę częstotliwości, na jakich działa Arduino, nie musisz wiedzieć nic więcej. Jest tylko możliwe, że standardowe biblioteki digitalRead/digitalWrite są ogromnymi hamulcami z powodu różnych kontroli i można je (i należy) przepisać jako szybszą wersję. Mam zamiar zgłębić ten temat i napisać bardziej szczegółowo, ale na razie nie mam szczególnej potrzeby.

Wydajność Arduino Nano i biblioteki Arduino pod względem szybkości przełączania wyjść i przetwarzania wejść według moich obserwacji plasuje się gdzieś pośrodku od kilku kiloherców do kilkudziesięciu kiloherców. Zatem moim zdaniem pisząc kod sterujący rejestrem przesuwnym 74HC595 nie trzeba się martwić o jakiekolwiek opóźnienia w ustawianiu sygnałów sterujących.

Inną rzeczą jest to, że dla 8-bitowego ekspandera szeregowego należy podzielić maksymalną częstotliwość przełączania wyjścia dostępną w Arduino - ustaw DS, ustaw SHCP na 1, zresetuj SHCP (na 0) - 8 razy i ustaw/zresetuj STCP. Łącznie, w skrócie, 3 * 8 + 2 = 26 operacji digitalWrite. W sumie okazuje się, że działa około 25 razy wolniej niż potrafi sam Arduino.

Podczas skalowania do 16, 24 lub 32 wyjść, spowolnienie wyniesie odpowiednio około 3*16 + 2 = 50, 3*24 + 2 = 74 i 3*32 + 2 = 98 razy.

Oczywiście taki ekspander rejestru przesuwnego 74HC595 nie nadaje się do sterowania czymś naprawdę szybkim, ale w niektórych zastosowaniach całkiem nadaje się do ustawiania rzadko zmieniających się sygnałów statycznych. Tak więc przykładowo użyłem takiego ekspandera do ustawienia 3-bitowego trybu mikrokroku, aby ustawić tryb mikrokroku dla sterownika silnika krokowego DRV8825 w testerze silników krokowych. Swoją drogą nie przydało mi się to jeszcze szczególnie - steppery z drukarek igłowych strasznie działają w trybie mikrokroku, przynajmniej pod kontrolą sterownika DRV8825 - np. w trybie mikrokroku 1/2 połowy kroku jakoś jest powolny i niepewny, tylko druga połowa jest optymistyczna i mocna. Dlatego przy zastosowaniu mikrokroku przy najmniejszym wysiłku na osi silnika krokowego zaczęło pomijać pierwsze półkroki. Potem jakoś nie zbadałem pozostałych trybów mikrokroku na istniejących kartach SD drukarek.

skalowanie

Ekspander wyjść Arduino oparty na układzie 74HC595 można w prosty sposób przekonwertować z wersji 8-bitowej na układ o dowolnej pojemności. W tym celu należy połączyć wyjście szeregowe dolnego rejestru Q7S z wejściem DS wyższego rejestru, a linie SHCP i STCP połączyć równolegle. Cóż, w zależności od przyjętego obwodu i rozwiązania programowego, musisz wybrać sposób podłączenia linii ~MR i ~OE.

Rozszerzenie wejścia

Rozszerzanie linii wejściowych dla Arduino w zasadzie przypomina przedłużanie wyjść, biorąc pod uwagę fakt, że nie trzeba ustawiać wartości DS na wyjściu, lecz odczytać ją na wejściu i zastosować układ typu 74HC597. Jednak jeszcze tego nie sprawdzałem w praktyce.

Multipleksowanie

Ilość linii wyjściowych sterowanych przez Arduino można zwiększyć na dwa sposoby: 1) zwiększyć pojemność bitową jednego wyjścia szeregowego, co przy dwu, trzy lub czterokrotnym zwiększeniu pojemności bitowej odpowiednio zmniejsza prędkość ekspandera o dwa , trzy lub cztery razy; 2) równoległe połączenie kilku ekspanderów, przy wykorzystaniu jednego dodatkowego wyjścia dla każdego ekspandera, co pozwala na utrzymanie wydajności na akceptowalnym poziomie, ale wymaga użycia co najmniej jednego wyjścia Arduino dla każdego ekspandera.

Jeśli nie sterujesz bezpośrednio sygnałami rejestrów 74HC595 - ~MR, ~OE za pomocą Arduino, to wystarczą tylko trzy wyjścia Arduino do sterowania sygnałami rejestru przesuwnego DS, SHCP i STCP, aby zamienić je na 8 lub 16 lub więcej sygnałów wyjściowych przy użyciu układu 74HC595.

Aby multipleksować kilka ekspanderów opartych na układzie 74HC595, można postępować na dwa sposoby: 1) dla każdego ekspandera sygnału wybrać osobny sygnał zatrzaskowy - tj. wszystkie rejestry na magistrali przesuwają przychodzące dane równolegle i odpowiednio przesuwają wartości na wyjściach wewnętrznego rejestru przesuwnego, ale tylko jeden przesyła wartość z wewnętrznego rejestru przesuwnego na wyjścia mikroukładu; 2) sygnały przesunięcia przesyłane są tylko do jednego z ekspanderów, a przekazanie wartości sygnałów na wyjście następuje jednocześnie dla wszystkich modułów rozszerzeń.

Bardziej skłaniam się do korzystania z opcji, gdy wewnętrzne rejestry przesuwne mogą zawierać wszystko, co chcesz (opcja 1), a niektóre z poprzednich wartości są stałe na wyjściu, a oto dlaczego: podczas przesyłania wartości z wewnętrznego przesunięcia rejestru na wyjście, mogą wystąpić niekontrolowane przejścia z 0 na 1 i z powrotem, pewnego rodzaju odbicie sygnału, nawet jeśli wartość początkowa w rejestrze wewnętrznym i na wyjściu jest taka sama. I moim zdaniem operację przeniesienia stanu wewnętrznego rejestru przesuwnego na wyjścia 74HC595 należy stosować jak najrzadziej.

Wsparcie oprogramowania

Obsługa oprogramowania dla tego i podobnych rozszerzeń polega na tym, że nie uzyskuje się dostępu do urządzeń bezpośrednio przez określone piny za pomocą digitalRead/digitalWrite używanego kontrolera Arduino, ale poprzez piny abstrakcyjnego urządzenia I/O, które z kolei można zainicjować jako powiązane z określonego typu Arduino i do innego podobnego abstrakcyjnego urządzenia.
Kontynuując temat:
Sieci

Bezpieczeństwo urządzeń iPhone jest znacznie lepsze niż w przypadku Androida. Twórcy zapewniają, że możliwe jest znalezienie iPhone'a według numeru telefonu w Internecie, jeśli jesteś jego pierwotnym właścicielem....