Rozšírenie portu Arduino pre tlačidlá. Ako zvýšiť počet digitálnych pinov na Arduine pomocou expandéra portov. Výber modulu expandéra pre Arduino

Trinásť digitálnych liniek a šesť analógových vstupov je všetko, čo Arduino ponúka ako vstupné/výstupné zariadenia. Ale v niektorých prípadoch (najmä v projektoch s veľkým počtom periférnych zariadení) takáto sada portových liniek nestačí.



V tejto súvislosti vyvstáva otázka o realizovateľnosti rozšírenia počtu vstupno/výstupných liniek. Tento materiál ukáže príklad takéhoto rozšírenia pomocou čipu MCP23017.


Možno viete, že 6 analógových kolíkov možno použiť aj ako digitálne vstupno-výstupné kolíky týmto spôsobom:


Analógový vstup 0 = riadok 14
Analógový vstup 1 = riadok 15
Analógový vstup 2 = riadok 16
Analógový vstup 3 = riadok 17
Analógový vstup 4 = riadok 18
Analógový vstup 5 = riadok 19

Takže vlastne môžeme označovať analógový vstup 5 ako digitálnu linku takto: digitalWrite(19,HIGH). Takýto príkaz zapíše logickú jednotku na port 19, teda analógovú linku 5.


Technicky môžeme použiť linky sériového portu TX/RX. V niektorých prípadoch je to však mimoriadne ťažké, najmä ak kód používa funkcie ako Serial.begin(), ktoré sú potrebné na fungovanie sériového portu. Celkový počet pinov, ktoré má používateľ k dispozícii, bude teda stále 17. Je však možné so sedemnástimi pinmi ovládať veľké množstvo LED alebo servomotorov? V tomto prípade je lepšie použiť špeciálne externé mikroobvody. Na tento účel sa často používa posuvný register ako 74HC595. Vyžaduje však tri ďalšie riadky na ovládanie a neumožňuje vám „roztiahnuť“ všetky riadky súčasne. Ovládače displeja, ako napríklad MAX7219, tiež v skutočnosti „rozširujú“ počet kolíkov. Ale MAX7219 je drahý čip. Preto je lacnejšie a racionálnejšie použiť čip expandéra portov MCP23017. Tento čip je určený pre 16 liniek, má široký rozsah prevádzkového napätia od 1,8 do 5,5 V a je riadený cez rozhranie I2C.


MCP23017 bude používať 2 piny Arduino a poskytne 16 I/O liniek. Takže technicky môžete použiť 8 kusov MCP23017 na rozšírenie jedného 16 pinového Arduina na 16 x 8 = 128 pinov. Arduino má knižnicu pre I2C zbernicu s názvom Wire.h, takže prepojenie s MCP23017 bude veľmi jednoduché. Nižšie je schéma pripojenia medzi Arduino a MCP23017.




#include "Wire.h" void setup() ( Wire.begin(); // aktivácia zbernice I2C // nastavenie liniek na výstup Wire.beginTransmission(0x20); Wire.write(0x00); // register IODIRA Wire.write (0x00); // nastavenie všetkých riadkov portu A na výstup Wire.endTransmission(); ) void loop() ( Wire.beginTransmission(0x20); Wire.write(0x12); // adresa banky A Wire. write((bajt )0xAA); // odoslaná hodnota – všetky riadky v protokole 1 Wire.endTransmission(); delay(500); Wire.beginTransmission(0x20); Wire.write(0x12); // adresa banky A Wire .write(( byte)0x55); // odoslaná hodnota – všetky riadky v protokole 1 Wire.endTransmission(); delay(500); )

Jednou z kľúčových výhod platformy Arduino je jej popularita. Populárna platforma je aktívne podporovaná výrobcami elektronických zariadení, ktorí vyrábajú špeciálne verzie rôznych dosiek, ktoré rozširujú základnú funkčnosť ovládača. Takéto dosky, celkom logicky nazývané rozširujúce dosky (iný názov: arduino shield, shield), slúžia na vykonávanie širokej škály úloh a môžu operátorovi arduina výrazne zjednodušiť život. V tomto článku sa dozvieme, čo je rozširujúca doska Arduino a ako ju možno použiť na prácu s rôznymi zariadeniami Arduino: motory (štíty ovládačov motora), obrazovky LCD (štíty LCD), karty SD (záznamník údajov), senzory (štít senzora) a mnoho ďalších.

Poďme najprv pochopiť pojmy. Rozširujúca doska Arduino je kompletné zariadenie určené na vykonávanie určitých funkcií a pripája sa k hlavnému ovládaču pomocou štandardných konektorov. Ďalším populárnym názvom pre rozširujúcu dosku je anglický štít Arduino štít alebo jednoducho štít. Všetky potrebné elektronické komponenty sú nainštalované na rozširujúcej doske a interakcia s mikrokontrolérom a ďalšími prvkami základnej dosky prebieha cez štandardné Arduino piny. Najčastejšie je napájanie štítu dodávané aj z hlavnej arduino dosky, aj keď v mnohých prípadoch je možné ho napájať aj z iných zdrojov. V každom štíte je niekoľko voľných kolíkov, ktoré môžete použiť podľa vlastného uváženia pripojením akýchkoľvek iných komponentov k nim.

Anglické slovo Shield sa prekladá ako štít, clona, ​​clona. V našom kontexte to treba chápať ako niečo, čo pokrýva dosku ovládača, čím vytvára ďalšiu vrstvu zariadenia, obrazovku, za ktorou sa skrývajú rôzne prvky.

Prečo potrebujeme arduino štíty?

Všetko je veľmi jednoduché: 1) aby sme ušetrili čas a 2) niekto na tom mohol zarobiť. Prečo strácať čas navrhovaním, umiestnením, spájkovaním a ladením niečoho, čo si môžete vziať už zmontované a začať ihneď používať? Dobre navrhnuté rozširujúce karty zostavené na kvalitnom zariadení sú zvyčajne spoľahlivejšie a zaberajú menej miesta vo finálnom zariadení. To neznamená, že musíte úplne opustiť vlastnú montáž a nemusíte pochopiť princíp fungovania určitých prvkov. Skutočný inžinier sa predsa vždy snaží pochopiť, ako to, čo používa, funguje. Ale budeme schopní vyrábať zložitejšie zariadenia, ak nebudeme zakaždým znovu objavovať koleso, ale zameriame svoju pozornosť na to, čo už málokto riešil.

Prirodzene, za príležitosti musíte platiť. Takmer vždy budú náklady na konečný štít vyššie ako cena jednotlivých komponentov, podobnú možnosť môžete vždy zlacniť. Tu je však na vás, aby ste sa rozhodli, nakoľko kritický je pre vás vynaložený čas alebo peniaze. Berúc do úvahy všetku možnú pomoc čínskeho priemyslu, náklady na dosky neustále klesajú, takže najčastejšie sa volí v prospech použitia hotových zariadení.

Najpopulárnejšími príkladmi štítov sú rozširujúce dosky pre prácu so snímačmi, motormi, LCD obrazovkami, SD kartami, sieťovými a GPS štítmi, štítmi so zabudovanými relé na pripojenie k záťaži.

Pripojenie Arduino Shields

Ak chcete pripojiť štít, stačí ho opatrne „položiť“ na hlavnú dosku. Typicky sa kontakty hrebeňového štítu (samec) ľahko zasúvajú do konektorov dosky Arduino. V niektorých prípadoch je potrebné opatrne nastaviť kolíky, ak samotná doska nie je správne spájkovaná. Hlavná vec je konať opatrne a nepoužívať nadmernú silu.

Spravidla je štít určený pre veľmi špecifickú verziu ovládača, aj keď napríklad veľa štítov pre Arduino Uno funguje celkom dobre s doskami Arduino Mega. Pinout na mega je vyrobený tak, že prvých 14 digitálnych pinov a piny na opačnej strane dosky sa zhodujú s pinom na UNO, takže sa do neho dá jednoducho vložiť Arduino shield.

Programovanie Arduino Shield

Programovanie obvodu s rozširujúcou doskou sa nijako nelíši od bežného programovania Arduina, pretože z pohľadu ovládača sme naše zariadenia jednoducho pripojili na jeho bežné piny. V náčrte musíte označiť tie kolíky, ktoré sú v tienidle spojené s príslušnými kontaktmi na doske. Výrobca spravidla uvádza zhodu kolíkov na samotnom štíte alebo v samostatnom návode na pripojenie. Ak si stiahnete náčrty odporúčané samotným výrobcom dosky, nemusíte to ani robiť.

Čítanie alebo zápis signálov štítu sa tiež vykonáva obvyklým spôsobom: pomocou funkcií a ďalších príkazov, ktoré pozná každý používateľ Arduina. V niektorých prípadoch sú možné kolízie, keď ste zvyknutí na konkrétnu schému pripojenia a výrobca zvolil inú (napríklad ste stiahli tlačidlo na zem a na štíte na napájanie). Tu si len treba dávať pozor.

Táto rozširujúca doska sa spravidla dodáva v súpravách Arduino a preto sa s ňou inžinieri Arduina stretávajú najčastejšie. Štít je pomerne jednoduchý - jeho hlavnou úlohou je poskytnúť pohodlnejšie možnosti pripojenia k doske Arduino. To sa vykonáva pomocou dodatočných napájacích a uzemňovacích konektorov umiestnených na doske ku každému z analógových a digitálnych kolíkov. Na doske nájdete aj konektory pre pripojenie externého zdroja napájania (pre prepnutie je potrebné osadiť jumpery), LED diódu a tlačidlo reštartu. Možnosti štítov a príklady použitia nájdete na obrázkoch.




Existuje niekoľko verzií dotykovej rozširovacej dosky. Všetky sa líšia počtom a typom konektorov. Najpopulárnejšie verzie sú dnes Sensor Shield v4 a v5.

Tento štít Arduino je veľmi dôležitý v robotických projektoch, pretože... umožňuje naraz pripojiť bežné a servomotory k doske Arduino. Hlavnou úlohou štítu je zabezpečiť ovládanie zariadení, ktoré spotrebúvajú prúd, ktorý je dostatočne vysoký pre bežnú dosku Arduino. Doplnkovou vlastnosťou dosky je funkcia ovládania výkonu motora (pomocou PWM) a zmeny smeru otáčania. Existuje mnoho typov dosiek na ochranu motora. Spoločné pre všetky z nich je prítomnosť výkonného tranzistora v obvode, cez ktorý je pripojená externá záťaž, tepelných prvkov (zvyčajne radiátor), obvodu na pripojenie externého napájania, konektorov na pripojenie motorov a kolíka na pripojenie k Arduino.



Organizácia práce so sieťou je jednou z najdôležitejších úloh v moderných projektoch. Na pripojenie k lokálnej sieti cez Ethernet je k dispozícii príslušná rozširujúca karta.




Rozširujúce dosky pre prototypovanie

Tieto dosky sú pomerne jednoduché - majú kontaktné podložky pre montážne prvky, resetovacie tlačidlo a možnosť pripojenia externého napájania. Účelom týchto štítov je zvýšiť kompaktnosť zariadenia, keď sú všetky potrebné komponenty umiestnené bezprostredne nad základnou doskou.





Arduino LCD štít a tft štít

Tento typ štítu sa používa na prácu s LCD obrazovkami v Arduine. Ako viete, pripojenie aj tej najjednoduchšej 2-riadkovej textovej obrazovky nie je ani zďaleka triviálna úloha: musíte správne pripojiť 6 kontaktov obrazovky naraz, nepočítajúc napájanie. Je oveľa jednoduchšie vložiť hotový modul do dosky Arduino a jednoducho nahrať zodpovedajúci náčrt. V populárnom LCD Keypad Shield je na doske okamžite nainštalovaných 4 až 8 tlačidiel, čo vám umožňuje okamžite organizovať externé rozhranie pre používateľa zariadenia. Pomáha aj TFT Shield



Arduino Data Logger Shield

Ďalšou úlohou, ktorú je dosť ťažké samostatne implementovať do vašich produktov, je ukladanie dát prijatých zo senzorov s časovou referenciou. Hotový štít umožňuje nielen ukladať dáta a získavať čas zo vstavaných hodín, ale aj pripojiť senzory pohodlnou formou spájkovaním alebo na doske plošných spojov.




Krátke zhrnutie

V tomto článku sme sa pozreli len na malú časť z obrovskej ponuky rôznych zariadení, ktoré rozširujú funkcionalitu Arduina. Rozširujúce karty vám umožňujú sústrediť sa na to najdôležitejšie – na logiku vášho programu. Tvorcovia štítov zabezpečili správnu a spoľahlivú inštaláciu a potrebné napájanie. Všetko, čo zostáva, je nájsť požadovanú dosku pomocou cenného anglického slova shield, pripojiť ju k Arduinu a nahrať náčrt. Každé programovanie štítu zvyčajne pozostáva z vykonávania jednoduchých akcií na premenovanie vnútorných premenných hotového programu. Vďaka tomu získame jednoduchosť používania a pripojenia, ako aj rýchlosť montáže hotových zariadení alebo prototypov.

Nevýhodou použitia rozširujúcich kariet je ich cena a možná strata účinnosti z dôvodu univerzálnosti štítov, ktorá spočíva v ich povahe. Pre vašu úzku úlohu alebo koncové zariadenie nemusia byť potrebné všetky funkcie štítu. V takom prípade by ste mali štít používať iba vo fáze prototypovania a testovania a pri vytváraní finálnej verzie vášho zariadenia myslite na jeho nahradenie dizajnom s vlastným obvodom a typom rozloženia. Je len na vás, ako sa rozhodnete, máte všetky možnosti, ako sa správne rozhodnúť.

Každý má rád lacné dosky Arduino, ale projekt často potrebuje jeden alebo dva voľné porty! A niekedy je dosť portov, ale nechcete ťahať veľa drôtov do inej časti konštrukcie. Povedzme, že na predný panel zariadenia potrebujete umiestniť niekoľko tlačidiel a LED diód. Je spoľahlivejšie a jednoduchšie ich pripojiť k základnej doske iba pomocou dvoch káblov dátovej zbernice a nie pomocou kábla alebo zväzku, však?

Pre takéto situácie sú určené rôzne expandéry portov Arduino.

Piny mikrokontroléra zvyčajne implementujú niekoľko rôznych funkcií, takže existujú rôzne expandéry:

  1. Štandardný expandér GPIO portov
  2. PWM výstupný expandér
  3. Expandéry analógových vstupov – multiplexory a externé ADC

Samostatne stojí za zmienku digitálno-analógové prevodníky (DAC) a expandéry adresného priestoru zbernice I2C. Tieto zariadenia priamo neduplikujú funkcie portov, ale rozširujú možnosti mikrokontrolérov.

V prvom článku série si povieme niečo o najjednoduchších a najužitočnejších expandéroch, ktoré fungujú ako digitálne I/O porty. Ide o mikroobvody a . Sú navrhnuté a fungujú úplne identicky a líšia sa iba počtom portov.

Výber modulu expandéra pre Arduino

Najpopulárnejší a najlacnejší modul je vyrobený na čipe PCF8574 (obr. 1)

Ryža. 1. Populárny modul rozšírenia portov PCF8574

Výhody:
  • Nízka cena.
  • Moduly možno reťazovo spájať jednoduchým zasunutím zástrčiek jedného modulu do zásuviek predchádzajúceho. Nezabudnite nastaviť prepojky na rôzne adresy modulov!
nedostatky:
  • Nedá sa vložiť priamo do doštičky (odporúčam prispájkovať konektor portu na opačnú stranu).
  • Celkom osem portov v jednom module.

Ak máte náladu na serióznejšie projekty, objednajte si 16-bitový modul PCF8575 na Aliexpress. Dôrazne odporúčam modul zobrazený na obr. 2.

Ryža. 2. Modul rozšírenia portov PCF8575

Výhody:
  • Dvakrát toľko portov.
  • Zabudovaný napájací zdroj 3,3 V môže napájať ďalšie moduly.
  • Zabudované prispôsobenie logickej úrovne pre zbernicu I2C pri rôznych napájacích napätiach.
  • Pohodlný formát na prototypovanie dosky.
nedostatky:
  • Vyššia cena.

Princíp činnosti expandéra GPIO portov PCF8574/PCF8575

Výmena dát prebieha cez I2C zbernicu. Pripojenie k Arduino doske vyžaduje iba štyri vodiče vrátane napájania. Adresa expandéra sa nastavuje tromi prepojkami na vstupoch A0...A2, takže na zbernicu môžete súčasne pripojiť osem rovnakých čipov a získať tak maximálne 8*8=64 ďalších portov s PCF8574 alebo 8*16=128 s PCF8575 čipom .

Na výstup dát na port zapíšte dátový bajt na adresu modulu na zbernici I2C. Ak chcete čítať údaje z portu, prečítajte si bajt na rovnakej adrese. Bajt sa vždy zapisuje a číta ako celok, jednotlivé bity sú spracované programovo.

Výstupy mikroobvodu sú tiež vstupmi a neexistuje žiadny servisný register, ktorý by určoval účel výstupu. Existuje len latch register, do ktorého sa zapisuje výstupný bajt. Ako je to možné?

Porty fungujú podobným spôsobom s otvoreným kolektorom a sú vybavené vnútornými pull-up odpormi. Ak sa na výstup zapíše logická nula, potom sa otvorí výstupný tranzistor, ktorý násilne pritiahne výstup k zemi. Čítanie z takéhoto portu vždy vráti nulu.

Buďte opatrní pri privádzaní priameho napájacieho napätia na kolík, ktorý je nízky alebo keď je prúd prekročený. 50 mA zničíš čip!

Ak chcete použiť port ako vstup, napíšte doň jedničku. V tomto prípade bude vnútorný tranzistor vypnutý a výsledok čítania bude určený externou logickou úrovňou aplikovanou na kolík. Voľný kolík je pripojený k zdroju pomocou vstavaného odporu.

Aby bolo možné súčasne použiť niektoré porty ako vstupy a niektoré ako výstupy, pred každým zápisom bajtu dát do expandéra je potrebné použiť masku jednotiek na tie bity, ktoré zodpovedajú vstupom pomocou „logického ALEBO“. To je všetko)))

Generovanie prerušenia

PCF857* Expandéry portov generujú prerušovací impulz nízky level na výstupe INT pre akúkoľvek zmenu vstupného signálu na ktoromkoľvek vstupe mikroobvodu. To je výhodné, ak expandér slúži ako klávesnica. Ale musíte sami určiť v obsluhe prerušenia, ktoré tlačidlo bolo stlačené alebo uvoľnené. Generátor prerušení je vybavený filtrom na potlačenie odskoku kontaktu.

Príklad 1: Použitie modulu PCF8574

Zostavme si jednoduchý obvod zo štyroch LED, modulu PCF8574 a dosky Arduino (obr. 3 a 4). S touto schémou zapojenia nepotrebujeme ani zhášacie odpory pre LED diódy. Prúd prechádza cez LED a vstavaný odpor pripojený k napájacej lište.

Ryža. 3. Schéma zapojenia modulu PCF8574

Ryža. 4. Usporiadanie obvodov s modulom PCF8574

Skopírujte a napíšte skicu 1 na dosku Arduino:

// Adresa modulu na zbernici (A0, A1, A2 = 0) int adresa = 0x38; // Dáta načítané z modulu uint8_t dataReceive; // Údaje na zápis do modulu uint8_t dataSend; void setup() ( Wire.begin(); Serial.begin(9600); // Vysoká úroveň pre všetky porty PCF8574 dataSend = B11111111; pcf8574_write(dataSend); ) void loop() ( // Čítanie bajtu z modulu dataReceive = pcf8574_read (); // Výstup na monitor v binárnom formáte Serial.println(dataReceive, BIN); // Posunutie bitov doľava o kúsoček 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()); }

Vysoká úroveň je spočiatku zapísaná do všetkých portov čipu, takže porty P0...P3 môžu fungovať ako vstupy.

Úrovne na pinoch portu sa čítajú každých 500 ms a výsledok čítania sa zobrazuje na monitore. Ak pripojíte jeden zo vstupov P0...P3 na spoločný vodič, v jeho bite sa objaví nula. Potom sa načítaná hodnota posunie doľava o štyri bity, výsledok sa odošle na port a jedna z LED zhasne. Napríklad, ak sa na kolíku P0 načíta nula, LED pripojená na kolík P4 zhasne.

Upozorňujeme, že pred každým zápisom do expandéra musíme použiť bitovú masku jednotiek na všetky bity, ktoré by mali byť vstupmi: dataSend |= B00001111;

Rutiny pre prácu so zbernicou I2C sú extrémne zjednodušené, nespracúvajú sa žiadne chyby.

Poradenstvo: Ak chcete nájsť a skontrolovať adresu modulu na zbernici I2C, môžete použiť . V termináli zobrazuje adresy všetkých zariadení, ktoré reagujú na požiadavku zbernice.

Príklad 2: Použitie modulu PCF8575

Zvláštnosťou modulu PCF8575 je, že má 16 portov, teda ono vždy píšte dva bajty a čítajte dva bajty. Toto pravidlo sa musí dodržiavať, aj keď druhý bajt nie je potrebný.

Trochu zmeníme schému. LED diódy pripojíme na porty P10…P13 a porty P00…P03 prepojkou na spoločný vodič (obr. 5 a 6).

Ryža. 5. Schéma zapojenia modulu PCF8575

Ryža. 6. Rozloženie obvodov s modulom PCF8575

V náčrte 2 sa najprv zapíšu 1 do všetkých portov, potom sa ich stav číta každých 500 ms. Rutina čítania vracia 16-bitové slovo, ktoré je rozdelené na bajty. Obsah dolného bajtu (piny P00...P07) sa skopíruje do horného bajtu a odošle sa späť do modulu. Ak pripojíte jeden z pinov P00...P03 na spoločný vodič, jedna z LED pripojených na P10...P13 zhasne.

// Knižnica pre prácu s I2C #include // Predvolená adresa modulu na zbernici int adresa = 0x20; // Dáta načítané z modulu uint8_t hi, lo; uint16_t dataReceive; uint8_t dataHighByte; // Vysoký bajt (P10...P17) uint8_t dataLowByte; // Nízky bajt (P00...P07) void setup() ( Wire.begin(); Serial.begin(9600); // Vysoká úroveň pre všetky porty PCF8575 dataHighByte = B11111111; dataLowByte = B11111111; pcf8575_dataByte,data ); ) void loop() ( // Čítanie bajtu z modulu dataReceive = pcf8575_read(); // Výstup na monitor v binárnom formáte Serial.println(dataReceive, BIN); // Výber nízkeho bajtu z dlhého slova dataLowByte = lowByte(dataReceive ); // Skopírujte nízky bajt do vysokého bajtu dataHighByte = dataLowByte; // Vložte masku na dolný bajt dataLowByte |= B11111111; // Zapíšte nové dáta do modulu, dva bajty pcf8575_write,dataL dataHighByte); delay(500); ) / / Postup zápisu bajtu do modulu void pcf8575_write(uint8_t dtl, int8_t dth) ( Wire.beginTransmission(address); Wire.write(dtl); // Zapíšte nízky bajt (P00...P07) Wire.write(dth); / / Zápis vysokého bajtu (P10...P17) Wire.endTransmission(); ) // Postup čítania bajtu z modulu int16_t pcf8575_read() ( Wire .beginPrenos(adresa); Wire.endTransmission(); Wire.requestFrom(adresa, 2); lo = Wire.read(); // Prečítanie dolného bajtu (P00...P07) hi = Wire.read(); // Čítanie vysokého bajtu (P10...P17) return (word(hi, lo)); // Vrátiť dlhé slovo )

Knižnica Arduino pre PCF8574/PCF8575

Knižnicu je možné stiahnuť z GitHub. Ako však vidíte, práca s expandérmi portov je veľmi jednoduchá a bez špeciálnej knižnice sa bez problémov zaobídete.

Popis Expander Shield

Expander Shield je originálny doplnkový modul určený na zvýšenie počtu vstupno/výstupných portov mikrokontrolérov založených na platforme Arduino, ale aj iných mikrokontrolérov, pomocou expandérov portov s rozhraním SPI alebo I2C.


Hlavnými prvkami prídavného modulu Expander Shield sú dva mikroobvody MCP23S17 alebo MCP23017 (dva 16-bitové expandéry I/O portov s rozhraním SPI, resp. I2C), ktoré umožňujú pridať štyri 8-bitové I/O porty, tzn. , 32 dodatočných „nohičiek“.

Vybavenie

Modul Expander Shield je dodávaný buď ako zostavená verzia SPI alebo I2C (s pridruženými čipmi), alebo ako kit bez čipov, ktorý je možné zakúpiť samostatne.

Svorky modulu môžu byť vybavené prepravnými zámkami, ktoré je potrebné pred začatím práce odstrániť.

Expander Shield SPI 1100 rub. 850 rubľov. Pridať do košíka

objednávka.

ExpanderShield na zbernicu SPI (s čipmi MCP23S17).

Expander Shield I2C 1100 rub. 850 rubľov. Pridať do košíka

Pozor! Máte zakázaný JavaScript. Bežná prevádzka objednávkového systému a nákupného košíka nie je možná. Ak z nejakého dôvodu nemôžete povoliť JavaScript, jednoducho uveďte položky, ktoré si objednávate, do objednávkového formulára.

ExpanderShield na zbernicu I2C (s čipmi MCP23017).

technické údaje

Tu sú najdôležitejšie funkčné vlastnosti modulu Expander Shield.

  • pohodlné prepínanie prevádzkového režimu modulu v závislosti od typu aktuálne nainštalovaných čipov expandéra portov;
  • pre každý z dvoch použitých 16-bitových čipov expandéra I/O portov sa pomocou prepojok nastavuje trojbitová adresa na zbernici, čo umožňuje umiestniť až 8 takýchto čipov na jednu zbernicu;
  • možnosť použiť prepojku na výber čísla zodpovedajúceho výstupu mikrokontroléra Freeduino/Arduino (digitálny kolík 8, 9 alebo 10) pre signál CS zbernice SPI;
  • modul používa „priechodné“ konektory, ktoré vám umožňujú ukotviť niekoľko modulov bez posunutia vzhľadom na dosku Arduino;
  • signály mikroobvodov sú vyvedené na štyri konektory PBD-10R s dodatočným uzemnením a +5V kontaktmi;
  • možnosť výberu samostatného alebo spoločného hardvérového resetu (tlačidlo RESET) 16-bitových čipov expandéra I/O portov a mikrokontroléra Freeduino/Arduino pomocou prepojok;
  • prídavný konektor JPIC s kolíkmi prerušenia (INTA, INTB), hardvérovým resetom (RST) a výberom čipu (CS);

Ostatné vlastnosti modulu sú určené predovšetkým charakteristikami mikroobvodov MCP23S17/MCP23017, ktorých technický popis je dostupný v dokumentácii výrobcu.

Okrem toho vám pred začatím práce s prídavným modulom Expander Shield odporúčame oboznámiť sa s jeho schémou zapojenia.

Prevádzkové režimy

Prevádzkový režim Expander Shield sa volí pomocou prepínača DIP a prepojok.

Výber rozhrania a ovládanie ťahom zbernice I2C

Pomocou prepínača DIP zvolíte buď režim SPI (zapnutím skupiny kontaktov 1-4) pre mikroobvody MCP23S17, alebo režim I2C (zapnutím skupiny kontaktov 5-6) pre mikroobvody MCP23017. Tiež v režime I2C, pomocou kolíkov 7 a 8, ak je to potrebné, je zbernica I2C ťahaná cez odpory obmedzujúce prúd na napájaciu zbernicu +5V. Ak je na zbernici I2C iba jedno zariadenie, mali by sa zvyčajne pripojiť pull-up odpory. Ak existuje niekoľko zariadení, potom sú odpory pripojené iba pre jedno zo zariadení.

Súčasná aktivácia zbernice SPI a I2C, ako aj zbernice SPI a 7, 8 pinovej skupiny nepovolené.

Kombinovaný prevádzkový režim, keď jeden z dvoch mikroobvodov v jednom module Expander Shield pracuje cez rozhranie SPI (MCP23S17) a druhý cez rozhranie I2C (MCP23017), nie je možný.

Ak potrebujete organizovať prácu súčasne cez rozhrania SPI a I2C, musíte použiť dva (niekoľko) prídavných modulov Expander Shield s príslušnými polohami prepínačov.

Výber čísla pinu na ovládanie CS signálu zbernice SPI

Pre zbernicu SPI musíte vybrať kolík mikrokontroléra Freeduino/Arduino, ktorý sa používa ako signál CS. Typicky sa používa kolík 10, ktorý zodpovedá polohe prepojky úplne vľavo na konektore SS1. Presunutím prepojky do jednej z ďalších dvoch polôh je možné zvoliť kolíky 9 a 8, resp.

Výber adresy mikroobvodov na zbernici

Najnižšie tri bity adresy mikroobvodov MCP23S17/MCP23017 sa vyberajú pomocou prepojok na konektoroch IC1_addr/IC2_addr vytiahnutím bitov 0, 1, 2 k zemi (Gnd) alebo +5V (5V).

Adresa každého čipu musí byť jedinečná.

Na jednu zbernicu tak možno umiestniť až 8 mikroobvodov (spojením napr. 4 Expander Shield).

Výber prevádzkového režimu hardvérového resetu (tlačidlo RESET)

Je možné organizovať jeden z množstva prevádzkových režimov tlačidla RESET

  • Tlačidlo RESET resetuje čipy Freeduino/Arduino a MCP23S17/MCP23017
  • Tlačidlo RESET resetuje iba Freeduino/Arduino
  • Tlačidlo RESET resetuje iba čipy MCP23S17/MCP23017

Zodpovedajúce polohy prepojok na konektore JRS (zľava doprava) sú zobrazené nižšie.

Knižnica MCP23xxx

Pre zjednodušenie práce s týmto a množstvom ďalších modulov bola vyvinutá knižnica MCP23xxx, ktorá poskytuje jednoduché rozhranie k funkcionalite mikroobvodov série MCP23xxx. Knižnica je k dispozícii na stiahnutie zadarmo: Knižnica je kompatibilná so softvérom Arduino verzie 1.0.5 (očakáva sa aj kompatibilita s novšími verziami).

V skutočnosti ide o sadu dvoch knižníc: MCP23xxx a LiquidCrystal_MCP23x17.

Inštalácia knižníc je podrobnejšie popísaná v časti pripájanie knižníc. Adresárová štruktúra priečinka knižnice po inštalácii by mala byť takáto:

/libraries/LiquidCrystal_MCP23x17
/libraries/MCP23xxx

Knižnica MCP23xxx implementuje šablóny tried, ktoré organizujú prácu s expandérmi portov MCP23017, MCP23S17, MCP23008 a MCP23S08. Knižnica LiquidCrystal_MCP23x17 je upravená štandardná knižnica LiquidCrystal, ktorá podporuje ruský jazyk a funguje cez expandér portov.

Knižnica prichádza s príkladmi, ktoré vysvetľujú, ako s ňou pracovať. Predchádzajúca verzia knižnice je tiež k dispozícii na stiahnutie:

Pozrime sa na príklad práce s modulom pre zbernicu I2C:

//V príklade je načítaný stav kolíkov 1. čipu a rovnaké hodnoty sú nastavené na 2.

//Pre verziu I2C pripojte Wire.h:
#include
//pripojenie knižnice
#include

//Vytvorte dva objekty triedy CMCP23017, ale neinicializujte ich, pretože I2C zbernica nie je pripravená
CMCP23017 mcp23_1;
CMCP23017 mcp23_2;

void setup()
{
//Inicializácia zbernice I2C...
Wire.begin();
//... a objekty MCP23* s adresami 0 a 1
mcp23_1.init(0);
mcp23_2.init(1);

//Všetky piny 1. čipu musia byť vstupy a 2. výstupy
//To sa dá urobiť v slučke
pre (int i= 0; i< 16 ; i++ ) {
mcp23_1.pinMode (i, INPUT) ;
mcp23_2.pinMode (i, OUTPUT) ;
}
//alebo naraz volaním metódy pinMode16
//mcp23_1.pinMode16(0x0ffff);
//mcp23_2.pinMode16(0x00000);
}

void loop()
{
//Môžete prečítať všetky vstupy 1. čipu a nastaviť to isté na 2. v slučke
pre (int i= 0; i< 16 ; i++ ) {
mcp23_2.digitalWrite (i, mcp23_1.digitalRead (i) );
}
//alebo naraz pomocou metód digitalRead16 a digitalWrite16
//mcp23_2.digitalWrite16(mcp23_1.digitalRead16());
}

Ako som už urobil, objednal som si tri viac-menej neprekrývajúce sa sady senzorov pre Arduino. V oboch setoch som dostal mikroobvod 74HC595, ktorý zatiaľ ostal v krabici. Zatiaľ som ani nevedel, aký druh mikroobvodu to bol, ani ako bol tento čierny šváb vôbec označený.

Ale prišli temné dni, keď som sa nemohol nabažiť výstupných signálov Arduino Nano, keď som zostavoval zariadenie na testovanie krokových motorov. (TODO: vložte odkaz na článok o SD testeri, keď bude pripravený). V dôsledku toho sa ukázalo, že moje zariadenie na testovanie krokových motorov je pomerne zložité - dvojriadkový displej 1602 so systémom menu ovládaným plnohodnotnou klávesnicou 4x4, 3 digitálne číslice na nastavenie hodnoty mikrokrokovania krokového motora, Step a signály Dir pre krokový motor atď. Zdalo by sa, že je čas prejsť na inú verziu Arduina. Ale proti tejto migrácii sa postavila moja prirodzená lenivosť. A lenivá hlava začala hľadať riešenie.

Bolo rozhodnuté hľadať riešenie na základe toho, čo už existuje. Pri triedení šatiek a súčiastok zo stavebníc som si všimol 16-kolíkového čierneho „chrobáka“. Najprv v jednom sete, potom v druhom. Rozhodol som sa opýtať, čo to bolo za diel a prečo bol pridaný do setov. Nechápem, prečo to dali do súprav, ale samotný čip som našiel na webovej stránke NXP.

Ukázalo sa, že ide o pomerne zaujímavý mikroobvod - posuvný register so sériovým vstupom a paralelným výstupom.

(z údajového listu)

Popis špendlíkov

Kontakt názov Popis a spojenie
10 ~MR Master Reset- reset, aktívna úroveň nízka. V ideálnom prípade by bolo dobré vytvoriť resetovací obvod, ktorý najprv zníži tento vstup na nízku úroveň a potom ho prevedie do jedného stavu. Nemusíte sa však motať a pripájať ho k +5V. V tomto prípade bude výstup pred prvým záznamom obsahovať náhodné hodnoty
13 ~OE Povoliť výstup- výstupné rozlíšenie, nízka aktívna úroveň. Pri použití 0 sa obsah registra privádza na výstupy, pri použití 1 sa výstupy vypnú a prenesú sa do stavu Z, čo umožňuje rôznym zariadeniam používať striedavo jednu zbernicu. Pripojte k zemi, ak nepotrebujete ovládať stav výstupov
14 D.S. Serial Data In- sériový vstup. Tento vstup musí byť nastavený na hodnotu vstupného signálu predtým, ako sa použijú hodiny posunu SHCP.
11 SHCP Vstupné hodiny posunového registra- hodinový vstup posuvného registra. Ak sa chcete posunúť o kúsok do registra, musíte použiť prechod z 0 na 1. Kedy sa vrátiť na 0 je na vašom uvážení. Môžete to urobiť hneď, môžete to urobiť tesne pred zasunutím. V prvom prípade môžeme predpokladať, že prepínanie nastáva pozdĺž okraja priameho signálu, v druhom - pozdĺž poklesu inverzného signálu. Pozri tiež poznámky k výkonu nižšie. Taktiež po príchode tohto signálu sa zmení hodnota sériového výstupu Q7/S
12 STCP Úložný register Vstup hodín- hodinový vstup západkového registra. Na hrane tohto impulzu sa hodnota prenesie z posuvného registra na paralelné výstupy Q0-Q7
9 Q7S Sériový výstup dát- sériový výstup. Je na ňom zobrazená hodnota najvýznamnejšieho bitu posuvného registra. Tento výstup možno použiť na škálovanie posuvného registra na 16-bit, 24-bit atď. schémy
15, 1-7 Q0, Q1-7 Výstupy západkového registra. Signál do nich sa prenáša z interného posuvného registra po príchode signálu STCP
8 GND Výživa- bežný drôt
16 VCC Výživa - +

Výživa

Verzia HC mikroobvodu vyžaduje napájanie od 2V do 6V, verzia HCT (kompatibilná s TTL) - od 4,5V do 5,5V. HCT - TTL - používa sa ešte? Zdá sa, že Arduino je samotné CMOS, takže HCT nie je potrebné, ale ak potrebujete koordinovať úrovne s externými spotrebiteľmi TTL, potom môžete napájať HC z 3,3 V, potom budú úrovne signálu kompatibilné s TTL. Vo všeobecnosti by HC aj HCT mali fungovať s 5-voltovým Arduinom. Toto píšu na internete.

Dôležitejšie sú blokovacie kondenzátory. Bez nich nemusí obvod fungovať podľa predstáv a navyše môže byť nepredvídateľný. Teoreticky by mal byť v napájacom obvode každého puzdra nainštalovaný kondenzátor 0,1 µF. Túto hodnotu kapacity som vypočítal ako priemer z internetu. Moja schéma fungovala dobre aj bez neho. Aby som to objasnil, šiel som do biblie dizajnéra obvodov, aby som to objasnil - Hill a Horowitz, „The Art of Circuit Design“ je takmer ako „Umenie programovania“ od Donalda Knutta, ale len pre hardvérových ľudí (mimochodom, Hill a Horowitz sú oveľa bližšie k ľuďom, cez Knutta - je príliš chytrý) - ale zdá sa, že blokovacie kondenzátory nazývajú oddeľovacími kondenzátormi na vstupoch. Je to škoda, je to dobrá kniha, ale už veľmi zaostáva za dobou. Mám druhé alebo tretie ruské vydanie z konca 90. alebo začiatku 0. rokov, originál je s najväčšou pravdepodobnosťou ešte o 10 rokov starší. Na treťom, ružovom zväzku som našiel nálepku - „14 rubľov“ - aké lacné bolo vtedy všetko podľa moderných štandardov. Uplynulo však iba 15 rokov alebo o niečo viac. Nostalgia bola ohromujúca.

Výkon

V názve datasheetu 74HC595 píšu, že pracuje na 100 MHz. Rýchly pohľad na grafy a tabuľky v datasheete hovorí, že najdlhšie časovania v teplotnom rozsahu od -40C do +85C s napájaním 4,5V sú 10-20ns (100-50MHz). S frekvenciami, na ktorých Arduino funguje, nepotrebujete vedieť nič iné. Je len možné, že štandardná knižnica digitalRead/digitalWrite sú obrovskou brzdou kvôli rôznym kontrolám a dajú sa (a mali by) prepísať na rýchlejšiu verziu. Mám v pláne sa v tom pohrabať a napísať podrobnejšie, ale momentálne to nepotrebujem.

Výkon Arduino Nano a knižnice Arduino z hľadiska rýchlosti prepínania výstupov a spracovania vstupov je podľa mojich pozorovaní niekde v strede od niekoľkých kilohertz až po desiatky kilohertzov. Pri písaní kódu na ovládanie posuvného registra 74HC595 sa teda podľa mňa netreba obávať žiadneho oneskorenia v nastavovaní riadiacich signálov.

Ďalšia vec je, že pre 8-bitový sériový expandér by ste mali rozdeliť maximálnu výstupnú spínaciu frekvenciu dostupnú na Arduine - nastaviť DS, nastaviť SHCP na 1, resetovať SHCP (na 0) - 8 krát a nastaviť/resetovať STCP. Celkom, na prvý pohľad, 3 * 8 + 2 = 26 operácií digitálneho zápisu. Celkovo sa ukazuje, že je asi 25-krát pomalší, než dokáže samotné Arduino.

Pri škálovaní na 16, 24 alebo 32 výstupov bude spomalenie približne 3*16 + 2 = 50, 3*24 + 2 = 74 a 3*32 + 2 = 98-krát.

Je zrejmé, že takýto expandér posuvného registra 74HC595 nie je vhodný na ovládanie niečoho skutočne rýchleho, ale v niektorých aplikáciách je celkom vhodný na špecifikáciu zriedkavo sa meniacich statických signálov. Tak som si napríklad takýmto expandérom nastavil 3-bitový mikrokrokový režim na nastavenie mikrokrokového režimu pre ovládač krokového motora DRV8825 v testeri pre krokové motory. Mimochodom, toto sa mi ešte nejako zvlášť nehodilo - steppery z ihličkových tlačiarní strašne fungujú v režime mikrokrokovania, aspoň pod kontrolou ovládača DRV8825 - napríklad v režime mikrokrokovania je 1/2 polovice kroku akosi pomalý a neistý, iba druhá polovica je optimistická a silná. Preto pri použití mikrokroku pri najmenšom úsilí o os krokového motora začal preskakovať prvé polovičné kroky. Potom som akosi neskúmal zostávajúce režimy mikrokrokovania na existujúcich SD tlačiarňach.

Škálovanie

Výstupný expandér Arduino založený na 74HC595 sa dá celkom jednoducho previesť z 8-bitovej verzie na obvod ľubovoľnej kapacity. Za týmto účelom musí byť sériový výstup nízkeho registra Q7S pripojený k vstupu DS vyššieho a linky SHCP a STCP musia byť zapojené paralelne. V závislosti od použitého obvodu a softvérového riešenia si musíte vybrať spôsob pripojenia liniek ~MR a ~OE.

Rozšírenie vstupu

Rozšírenie vstupných liniek pre Arduino je v princípe podobné ako predĺženie výstupu, berúc do úvahy fakt, že hodnotu DS netreba nastavovať na výstupe, ale čítať ju na vstupe a použiť čip typu 74HC597. V praxi to však ešte nemám odskúšané.

Multiplexovanie

Počet výstupných liniek ovládaných Arduinom môžete zvýšiť dvoma spôsobmi: 1) zvýšiť bitovú kapacitu jedného sériového výstupu, čo pri zvýšení bitovej kapacity o dva, tri alebo štyrikrát zodpovedajúcim spôsobom zníži rýchlosť expandéra o dva tri alebo štyrikrát; 2) paralelné pripojenie viacerých expandérov, pričom sa používa jeden ďalší výstup pre každý expandér, čo dokáže udržať výkon na prijateľnej úrovni, ale vyžaduje použitie aspoň jedného výstupu Arduino pre každý expandér.

Ak priamo neovládate signály registra 74HC595 - ~MR, ~OE s Arduinom, potom na ovládanie signálov posuvného registra DS, SHCP a STCP stačia iba tri výstupy Arduino, aby ste ich zmenili na 8 alebo 16 alebo viac výstupných signálov. pomocou čipu 74HC595.

Na multiplexovanie niekoľkých expandérov založených na 74HC595 môžete ísť dvoma spôsobmi: 1) pre každý expandér signálu vyberte samostatný signál blokovania - t.j. všetky registre na zbernici posúvajú prichádzajúce dáta paralelne a podľa toho posúvajú hodnoty na výstupoch interného posuvného registra, ale iba jeden prenáša hodnotu z interného posuvného registra na výstupy mikroobvodu; 2) signály posunu sa prenášajú iba do jedného z expandérov a prenos hodnôt signálu na výstup prebieha súčasne pre všetky rozširujúce moduly.

Viac sa prikláňam k použitiu možnosti, keď interné posuvné registre môžu obsahovať čokoľvek, čo chcete (možnosť 1), a niektoré z predchádzajúcich hodnôt sú na výstupe pevné, a tu je dôvod: pri prenose hodnôt z interného posunu registra na výstup môže dochádzať k nekontrolovaným prechodom z 0 na 1 a späť, k nejakému odskoku signálu, aj keď je počiatočná hodnota vo vnútornom registri a na výstupe rovnaká. A podla mna by sa mala co najmenej vyuzivat operacia prenosu stavu interneho posuvneho registra na vystupy 74HC595.

Softvérová podpora

Softvérová podpora tohto a podobných rozšírení spočíva v nepristupovaní k zariadeniam priamo cez špecifické piny pomocou digitalRead/digitalWrite použitého ovládača Arduino, ale cez piny abstraktného I/O zariadenia, ktoré je zase možné inicializovať ako viazané na špecifický typ Arduino a ďalšie podobné abstraktné zariadenie.
Pokračovanie v téme:
Počítač

„Tento typ komunikácie nie je k dispozícii pre predplatiteľov Beeline“ - takáto správa sa neobjavuje príliš často, ale jej vzhľad neveští nič dobré. A hlavný problém...