4.1 Sériová komunikácia MCU
Sériové rozhrania a zbernice
Aj keď nechceme prehnane teoretizovať, patrí sa rozlíšiť význam pojmov a poznať aspoň základné rozdelenie.
Rozhranie vs. zbernica
Tieto pojmy často v bežnej komunikácii nadšencov IT zamieňame, no je medzi nimi určitý rozdiel.
Rozhranie (interface) je širší pojem. Je to akýkoľvek spôsob, ktorým sa zariadenia prepájajú a komunikujú. Rozhranie definuje aj fyzické prvky (napríklad konektory), aj elektronické podmienky (hlavne napäťové úrovne), ale aj komunikačný protokol. Rozhranie vo všeobecnosti nemusí umožňovať prepojenie viac ako dvoch zariadení. Mimochodom, i v počítačových sieťach sme sa stretli s rôznymi sieťovými rozhraniami.
Zbernica (bus) je špecifický typ rozhrania, ktorý zdieľa komunikačné médium (vodiče) medzi viacerými zariadeniami. Zbernice rozlišujú jedno ovládacie zariadenie (Master / Controller / Host) - typicky MCU a viaceré ovládané zariadenia (Slave / Peripheral / Device) - typicky senzory a iné periférne zariadenia.
V dnešnej dobe politickej korektnosti sa pomaly upúšťa od pojmov Master/Slave a sú nahrádzané pojmami Host/Device, prípadne Controller/Peripheral.
Synchrónna a asynchrónna komunikácia
Niektoré sériové rozhrania používajú taktovací (hodinový) signál pre synchronizáciu komunikácie - nazývame ich synchrónne. K tomu využívajú samostatný vodič, ktorý udáva tempo komunikácie - riadiace zariadenie do neho posiela „tikanie hodín“ a určuje tempo (môžeme ho chápať ako metronóm), podľa ktorého si všetky zariadenia načasujú posielanie jednotlivých bitov.
Existujú však aj sériové rozhrania, ktoré nemajú hodinový signál - nazývame ich asynchrónne. Ako potom zariadenia vedia, kedy prichádza nový bit? Komunikácia prebieha v nepravidelných intervaloch, zariadenia si musia oznámiť začiatok vysielania, mať nastavenú rovnakú rýchlosť prenosu (udáva sa v bitoch za sekundu, napríklad 9600 b/s) a dostatočne presne odpočítavať čas, prípadne sa priebežne zlaďovať (synchronizovať), napríklad štartovacím pulzom.
Duplex prenosu
Už z počítačových sietí vieme, že obojsmerný prenos údajov cez rozhranie môže byť:
- plne duplexný (full-duplex) - oba smery prenosu môžu bežať súbežne na samostatných vodičoch;
- poloduplexný (half-duplex) - strieda sa odosielanie a príjem po rovnakom vodiči.
Okrem toho môže byť prenos i jednosmerný (simplex).
Sériové rozhrania MCU
Pri používaní mikrokontrolérov sa môžeme stretnúť s viacerými sériovými rozhraniami, najčastejšie:
- SPI - synchrónna full-duplex zbernica, napríklad pre pripojenie farebného displeja;
- I²C - synchrónna half-duplex zbernica pre pripojenie rôznych digitálnych senzorov, ale i čierno-bieleho displeja;
- I²S - synchrónne rozhranie pre prenos digitálneho zvuku, obvykle jednosmerné;
- One-Wire - asynchrónna half-duplex zbernica pre pripojenie Dallas senzorov;
- RS-232 - asynchrónne full-duplex rozhranie pre vzájomné prepojenie práve dvoch zariadení, napríklad dvoch MCU;
- RS-485 - asynchrónna zbernica podobná rozhraniu RS-232, umožňuje prepojiť aj viaceré zariadenia, bežne half-duplex.
Zbernica SPI
Zbernica SPI (Serial Peripheral Interface) vyšla z dielne Motorola v 80. rokoch, no používa sa dodnes. Poskytuje relatívne vysoké rýchlosti komunikácie - v prípade ESP32 až 80 Mb/s, čo príde vhod hlavne pri komunikácii s displejom. Navyše je táto komunikácia plne duplexná (full-duplex). Hoci samotná zbernica používa len 3 vodiče, pre pripojenie ovládaného zariadenia (modulu) je typicky potrebných 6 vodičov, z toho prvých 5 (vrátane 2 napájacích) je zdieľaných a posledný je samostatný pre každé ovládané zariadenie - slúži na výber komunikujúceho zariadenia:
- VIN/VCC: napájanie zariadenia (3,3 V);
- GND: zem;
- SCL / SCK: hodinový signál pre synchronizáciu;
- MOSI (Master Out, Slave In) / COPI (Controller Out, Peripheral In): odosielanie údajov do ovládaného zariadenia;
- MISO (Master In, Slave Out) / CIPO (Controller In, Peripheral Out): príjem údajov z ovládaného zariadenia;
- SS (Slave Select) / CS (Chip Select): oznámenie zariadeniu, že s ním bude vedená komunikácia.
Koľko vodičov teda bude potrebných pre pripojenie 2 alebo viacerých ovládaných zariadení?
Vychádzajme z toho, že 5 vodičov (3 SPI + 2 napájacie) sú zdieľané a každé ďalšie zariadenie potrebuje 1 vlastný vodič. Teda pre pripojenie 2 zariadení postačí 7 vodičov a každé ďalšie zariadenie pridá len 1 ďalší vodič.
Zbernica I²C
Zbernica I²C (Inter-Integrated Circuit) je dielom spoločnosti Philips a ide o ochrannú známku, preto ju niektorí výrobcovia označujú inak, napríklad TWI (Two Wire Interface). Poskytuje nižšie rýchlosti (na ESP32 do 1,25 Mb/s) a pracuje v režime half-duplex. Výber komunikujúceho zariadenia sa realizuje uvedením jeho adresy.
V našich končinách sa I²C najčastejšie číta foneticky ako „í-dva-cé“, v angličtine je častejšie „I squared C“.
Samotná zbernica používa len 2 vodiče (oba v zapojení pull-up), no keď pridáme napájanie, pre pripojenie ovládaných zariadení sú typicky potrebné 4 spoločné vodiče:
- VIN/VCC: napájanie zariadenia (3,3 V);
- GND: zem;
- SCL / SCK: hodinový signál pre synchronizáciu;
- SDA / SDI: obojsmerný prenos údajov.
Tieto 4 vodiče by teoreticky stačili na pripojenie ľubovoľného počtu ovládaných zariadení, no len za predpokladu, že každé zariadenie má inú adresu.
Realita však nie je veľmi priaznivá: samotná adresa má len 7 bitov, teda teoreticky umožňuje rozlíšiť 128 zariadení, no prakticky nie sú adresou rozlíšené jednotlivé kusy, ale rôzne modely. Žiaľ, ani toto nie je celkom jednoznačné a rovnakú adresu môžu používať aj úplne odlišné ovládané zariadenia. V lepšom prípade je napríklad na senzorovom module možné spojiť pripravené kontakty a tým si zvoliť adresu z dvoch alebo i štyroch možností.
Koľko vodičov teda bude potrebných pre pripojenie 2 alebo viacerých rovnakých senzorov?
Pokiaľ im nie je možné zmeniť adresu na ich rozlíšenie, tak dvojicu vodičov zbernice nie je možné zdieľať a každý senzor ju bude musieť mať samostatnú. Pre pripojenie 2 senzorov teda bude treba 6 vodičov, každý ďalší senzor bude potrebovať ďalšie 2 vodiče.
Zbernica One-Wire
Zbernica One-Wire používa len 1 vodič pre údaje (nepoužíva sa hodinový signál), no typicky je tiež treba aj zem a napájanie zariadenia, teda 3 vodiče. Každé periférne zariadenie má svoju unikátnu adresu. Túto zbernicu používajú senzory Dallas, napríklad obľúbený senzor teploty DS18B20.
Rozhrania RS-232 a RS-485
Týmito rozhraniami sa nebudeme zaoberať po praktickej stránke, ale mali by sme o nich aspoň vedieť.
Rozhranie RS-232 poznáme aj v podobe sériového portu (COM) z PC, pochádza ešte z počiatkov éry počítačov v 60. rokoch. Nezvykne sa používať pre senzory, skôr ňou navzájom komunikuje dvojica MCU. Pre komunikáciu sú potrebné len 3 vodiče - jeden na vysielanie (TX), druhý na príjem údajov (RX) a tretí prepája uzemnenie. Podporuje aj ďalšie riadiace signály v samostatných vodičoch (napríklad pre „zvonenie“), tie však nie sú nevyhnutné.
Z dnešného pohľadu môžu byť na RS-232 problematické napäťové úrovne - používajú sa kladné a záporné hodnoty (pôvodne až +12 V a -12 V), teda toto rozhranie nemôžeme nikdy priamo prepájať do MCU a nutný je špeciálny prevodník.
RS-485 je vylepšený priemyselný štandard, ktorý umožňuje komunikáciu viacerých zariadení, ide teda o zbernicu. V bežnej forme s 3 vodičmi umožňuje len half-duplex prenosy. Zásadným rozdielom oproti RS-232 je využitie rozdielového (diferenciálneho) signálu - nerieši sa teda úroveň signálov TX a RX voči zemi, ale tieto dva vodiče majú neutrálne označenie A a B, pričom sa pracuje s rozdielom ich napätia. Výhoda je, že pri rušení prenosu (napríklad z elektromotora) sa posunú napäťové úrovne oboch vodičov, ale ich rozdiel sa výrazne nezmení, teda samotný signál bude stále čitateľný. Na prepojenie s MCU používame prevodníky, ktoré pracujú s bezpečným napätím 3,3 V, pričom samotný prenos po dlhom kábli prebieha rozdielovo.
Výrazný praktický rozdiel medzi týmito rozhraniami je v dosahu - RS-485 zvládne prenos aj cez kilometrový kábel!
Napájacie napätie
Samostatnú sekciu si určite zaslúži napájacie napätie, pretože nik si nechce dobrovoľne „odpáliť“ svoj mikrokontrolér. Už vieme, že všetky GPIO na ESP32 pracujú s napätím 3,3 V a v žiadnom prípadne na ne nesmieme priviesť vyššie napätie, napríklad 5 V.
Externé I²C moduly cez GROVE
Pozornému oku neunikne, že I²C moduly od M5Stack sa pripájajú GROVE káblikom, ktorý do modulu privádza napätie 5 V. Ako to, že sa nič zlé nestane? Je napájanie senzora nezávislé od komunikačných pinov?
Všetko záleží od zapojenia. Zbernica I²C funguje na princípe otvoreného kolektora (open-drain). To znamená, že zariadenie (modul) linku len „sťahuje“ na nulu (GND). Do jednotky ju ťahajú pull-up rezistory. Záleží na tom, či sa využijú len interné rezistory ESP32 (tie prepájajú na 3,3 V) alebo je externý pull-up rezistor integrovaný v module senzoru (kde by prepájal na 5 V).
Nepripájajme cez GROVE káblik neoficiálne alebo vlastné moduly priamo! Hrozí nám privedenie napätia 5 V späť na GPIO. Moduly s I²C by sme mohli pripojiť len v prípade, že neobsahujú vlastné pull-up rezistory.
Samozrejme, že výrobca použije také zapojenie, ktoré bude bezpečné pre MCU a nie také, ktoré by nám späť na GPIO priviedlo nebezpečné napájanie. Moduly M5Stack sú navrhnuté tak, aby napájanie (5 V) bolo oddelené od logiky komunikácie (3,3 V).
Pokiaľ teda používame oficiálne M5Stack moduly, nič nášmu MCU nehrozí.
Napájanie SPI modulov
Ešte väčšie riziko je pri akýchkoľvek SPI moduloch. Tie nepoužívajú otvorený kolektor, teda modul bude posielať údaje s takým napätím, ktoré mu dodáme. Ak mu dodáme 5 V, nastane problém!
Do SPI modulov neprivádzajme napätie 5 V! Hrozí poškodenie MCU. Výnimkou sú moduly, ktoré obsahujú prevodník logických úrovní (level shifter).