stránky radioamatérské stanice
OK2PPK » Texty » Technika a provoz » Poznámky a schémata k různým modulům | ---
Poznámky a schémata k různým modulům
Stalo se již běžnou praxí skládat elektronická zařízení dohromady z různých dostupných a levných modulů, obvykle čínského původu. Také se tomu někdy nevyhnu. Dokumentace k těmto modulům bývá na eshopech obvykle dost skoupá na podrobnosti, a pokud potřebujete udělat na modulu nějakou úpravu nebo znát podrobnější informace o funkci jednotlivých vývodů, apod., tak často nezbývá, než si zapojení modulu z jeho plošného spoje vykreslit.
Na tuto stránku jsem shromáždil schémata a poznámky k některým modulům, které mi prošly rukama. Nejsem výrobcem dotyčných modulů a nemám od nich tedy ani žádnou výrobní dokumentaci, takže schémata jsou nakreslená jen podle toho, co se mi o modulech podařilo vlastním úsilím zjistit a netvrdím tedy ani, že jsou schémata správně a že jsou kompletní. Číslování součástek ve schématech nemusí odpovídat předtištěnému značení na plošném spoji.
Modul se dvěma 4-místnými LED displeji, který může současně měřit napětí v rozsahu 0.00-33.00V a proud v rozsahu 0.000-3.000A. Při jeho použití je potřeba vzít v úvahu tři věci. První je, že okruhy měření napětí, proudu a napájení samotného měřiče mají společnou zem. Druhá je, že lze měřit pouze kladné napětí a proud tekoucí v jednom směru. A třetí je, že v okruhu napájení měřiče je zařazený stabilizátor snižující napětí na interně používanou hodnotu 3.3V, takže vnější napájecí napětí musí být vyšší, než je tato hodnota, a současně nesmí překročit mezní hodnotu vstupního napětí dotyčného stabilizátoru, která je 12V.
Modul neizolovaného měniče zvyšujícího i snižujícího stejnosměrné napětí s funkcí nabíječky, tj. s nastavitelnou limitací a signalizací velikosti výstupního proudu. Udávaný rozsah je u vstupního napětí 5-35V (resp. 4-35), u výstupního napětí 1.2-25V (resp. 1.25-2V) a maximální výstupní proud 2A.
Možnosti měniče zvyšovat i snižovat napětí je dosaženo zapojením dvou měničů zasebou. První je zvyšující s obvodem LM2577, který zvedá napětí na pevně nastavenou hodnotu 27.4V, a za ním je zařazený snižující měnič s LM2596, který má trimrem nastavitelné výstupní napětí a současně má i zavedenou zápornou zpětnou vazbu ze snímače proudu. Proud se měří jako úbytek napětí na bočníku v záporné větvi a vyhodnocuje se pomocí dvojice OZ v LM358. Napájení pro LM358 je získáváno z +5V stabilizátoru 78M05, který je napájený z výstupu prvního měniče, tj. z 27.4V. Trimrem lze nastavit maximální velikost výstupního proudu, jejíž dosažení je signalizováno i LED diodou, a dalším trimrem lze nastavit minimální velikost proudu, při kterém se přepínají diody signalizující stavy nabíjení a nabito.
Při použití tohoto měniče je potřeba pamatovat na dvě věci. Jednak je to snímání proudu v záporné větvi, kdy při jeho případném spojování s dalšími moduly a obvody nesmíte případným nevhodným propojením zemí proudový bočník přemostit, jinak by vám přestala pracovat správně limitace proudu. Druhá věc je rozsah provozních napětí a proudů, kdy je potřeba pamatovat na to, že oba řídicí obvody nemají chladiče a modul se tak nedoporučuje trvale zatěžovat přenášeným výkonem více než asi 10W. Při větším zatížení je potřeba nainstalovat na obvody chladiče. Spodní mez vstupního napětí je omezena tím, zda při požadovaném proudovém zatížení dokáže obvod LM2577 na svém výstupu udržet potřebnou velikost napětí, horní mez je pak dána tím, že z pevně nastaveného výstupu 27.4V prvního měniče je napájen i stabilizátor 5V, který má na vstupu limit kolem 35V. První měnič je v zapojení step-up, tj. pokud napětí na jeho vstupu překročí pevně nastavených 27.4V (plus související úbytky napětí dané topologií měniče), tak již nedokáže regulovat a celé vstupní napětí se dostává přes pracovní tlumivku a diodu měniče na jeho výstup. Vstupní napětí prvního měniče tedy nesmí přerůst maximální vstupní napětí stabilizátoru 78M05. Horní mez výstupního napětí druhého měniče je omezena jeho vstupním napětím a minimálním úbytkem napětí na něm, tj. bude nižší než 27.4V. Nejnižší nastavitelná hodnota výstupního napětí je pak dána referenčním napětím LM2596, které je 1.23V
Pokud potřebujete tento modul použít při nižších vstupních i výstupních napětích, tak můžete úpravou děliče na vývodu 2 obvodu LM2577 v prvním zvyšujícím stupni snížit i mezinapětí, ze kterého pracuje druhý snižující stupeň.
Jednoduchá USB nabíječka (vstup USB B micro, +5V) s obvodem TP4056A pro jeden článek Li-Ion s nabíjecím napětím 4.25V a proudem maximálně 1000mA. Proud se dá nastavit změnou odporu zapojeného mezi vývod 2 (PROG) a zem. Řídicí obvod není spínaný, ale jen lineární regulátor. Na vývod 1 (TEMP) TP4056 lze zapojit termistor a obvod pak může hlídat i teplotu akumulátoru, ale tento modul nemá vývod TEMP vyvedený a je zde natvrdo uzemněn.
Klon Arduino Nano s ATmega328P na 16MHz s napájením +5V a konektorem USB B mini. Zajímavý byl použitý převodník USB/RS232 - podle zapojení se jednalo o nějaký mně neznámý klon CH340, způsob použití jednotlivých signálů i ovladač, se kterým to spolupracovalo, odpovídal CH340, ale zapojení vývodů mělo odlišné uspořádání než cokoliv, co jsem našel v datasheetech. Obvod neměl na pouzdru žádné označení typu.
Napájení je buď z +5V z USB vstupu nebo přes +5V LDO stabilizátor 1117C50 z vývodu VIN. Na desce je i stabilizátor +3.3V napájený z interních +5V, ale v reálu na desce nic nenapájí, pouze je z něj napětí +3.3V vyvedeno na výstup 3V3. Samotný CPU pracuje s napětím +5V, tj. na této napěťové úrovni jsou i jeho porty.
Při napájení přes vstup VIN je potřeba pamatovat na to, že +12V je udávané maximání napětí na vstupu stabilizátoru +5V. O obvodech 1117C jsou nalezitelné zmínky, že je u nich důležité dodržet katalogové údaje o vstupních a výstupních filtračních kondezátorech, jinak se obvody při nevhodé kapacitě mohou i rozkmitat a napětím, které se pak dostane na jejich výstup, zničí obvody z nich napájené. U tohoto modulu je zřejmé, že stabilizátor nemá na vstupu VIN dokonce žádný kondenzátor. Modul také nemá vyřešený případný souběh napájení z +5V USB a z VIN. Pokud použijete vývod 3V3 na napájení nějakých dalších obvodů, je potřeba vzít v úvahu váš odběr proudu z tohoto vývodu a reálné možnosti stabilizátoru +3.3V (a v případě napájení z VIN i stabilizátoru +5V) požadovaný proud dodat a uchladit výkonovou ztrátu na sobě.
Pro kompilaci programu pod Arduino IDE vybrat desku Arduino Nano a Processor ATmega328P (Old Bootloader) nebo Processor ATmega328P podle toho, zda deska má, či nemá starý zavaděč.
Klon Arduino Pro Mini ve variantě s ATmega168 na 8MHz a s napájením +3.3V. Minimalistická varianta Arduina bez převodníku USB/RS232, takže pro programování je nutné použít externí převodník nebo programátor. CPU pracuje s napěťovými úrovněmi 3.3V na svých vstupech a výstupech. Při napájení přes vývod RAW se použije interní LDO stabilizátor +3.3V a je nutné pak počítat s tím, že maximální napětí na vstupu stabilizátoru je +12V.
Pro kompilaci programu pod Arduino IDE vybrat desku Arduino Pro or Pro Mini a Processor ATmega168 (3.3V, 8 MHz).
Vývojová deska s obvodem Espressif ESP8266EX s externí 16MB SPI Flash. Obvod je postavený na jednojádrovém 32bit jádře Tensilica L106 s 64kB instrukční RAM a 96kB datové RAM, obsahuje zabudovaný Wi-Fi modem pro pásmo 2.4GHz, používá napájecí napětí 3.3V a takt 80MHz (výchozí nastavení)/160MHz . Polovina instrukční RAM se používá jako cache. Vývojová deska je osazená USB/RS232 převodníkem CH340C, krystalem 26MHz pro obvod ESP8266EX, stabilizátorem +3.3V a napájí se buď přímo +5V z USB nebo z externího zdroje +5 nebo +3.3V. Na desce je ve výchozím stavu k modemu Wi-Fi připojena integrovaná anténa, ale je možné konfiguraci změnit a použít i na PCB osazený konektor pro připojení externí antény.
Při použití napájení z USB nebo z externího zdroje +5V je potřeba si vyzkoušet, že stabilizátor +3.3V utáhne celkovou spotřebu včetně vámi případných externě přidaných obvodů - někdy bývá na místě stabilizátoru osazený typ, který pracuje na hranici přetížení a stačí pak jen zvýšit spotřebu třeba zapnutím modemu Wi-Fi a modul už je nestabilní.
Způsob řešení napájení +3.3V kolem převodníku CH340 je u této vývojové desky chybný. CH340 se liší od dříve obvykle používaných FT232 v tom, že nemá možnost přivést samostatně napájení 3.3V na budiče rozhraní RS232. Rozhraní RS232 u něho vždy pracuje s napěťovými úrovněmi odvozenými od výše napájení na vývodu Vcc. Interní stabilizátor +3.3V v CH340 slouží pouze pro získání správných napěťových úrovní na datových linkách VD+ a VD- na straně rozhraní USB, a narozdíl od FT232 specifikace CH340 dokonce ani nepřipouští z jeho výstupu vyvedeného na vývod V3 odebírat do externích obvodů nějaký proud. Vývod V3 se při napětí Vcc +5V pouze zablokuje kondenzátorem nebo se při napájení Vcc +3.3V spojí s Vcc.
Při napájení z +5V jsou tedy na rozhraní RS232 napěťové úrovně odpovídající +5V a signály TXD, RXD, RTS a DTR, které jsou dále přes rezistory 470R nebo dvojici bipolárních tranzistorů přivedeny na obvod ESP8266ES, překračují povolené mezní hodnoty napětí na jeho portech. Dvojice tranzistorů vytvářejících ze signálů RTS a DTR signály GPIO0 a RESET pro spuštění buď bootloadru nebo nahraného programu pracuje i v inverzním režimu, takže při stavu signálů RTS a DTR v úrovni H tranzistory propustí do linek GPIO0 a RESET proti zemi proud řádově i několik miliampérů.
Nakonec jsem si pro své použití na desce provedl jednoduchou úpravu (jeden spoj se přeškrábnul a druhý přidal) a přepojil jsem vývod Vcc obvodu CH340 na napájecí napětí +3.3V. Tím jsou nyní úrovně napětí na rozhraní RS232 též 3.3V. Jen upozorňuji, že tím se ale zvýší zatížení stabilizátoru +3.3V i o spotřebu obvodu CH340. Je zajímavé, jak podivně je na desce zapojena i pojistka 0.5A ve větvi +5V, kdy je vložena pouze v přívodu napájení k obvodu CH340.
Obvod ESP8266EX vypadá, že má k dispozici velké množství portů, ale ve skutečnosti jich máte pro své využití plně k dispozici minimum, protože řada z nich se používá na komunikaci s SPI Flash nebo nastavené úrovně na těchto vývodech mají vliv při bootování obvodu na jeho následné chování. Pouze dva vývody, a to GPIO5 a GPIO4, které se typicky používají jako linky SCL a SDA, mají definovanou úroveň (L) při bootu. Ostatní vývody mají během bootování úrovně proměnné a to po dobu u některých přesahující i 110ms od restartu. U digitálních portů pro vstup je potřeba pamatovat na to, že zatímco GPIO0 až 15 mají zapnutelný interní odpor pull-up, tak u GPIO16 je naopak pull-down.
Obvod ESP8266EX nemá nonvolatile paměť pro uchování programu. Program se načítá přes seriové rozhraní z externí paměti SPI Flash do interní instrukční RAM. Program může být delší, než je velikost instrukční RAM, a bude pak během svého chodu dle potřeby načítán do cache, ale je nutné počítat s tím, že některé části programu, jako např. přerušovací rutiny, musí být během chodu programu umístěny v RAM trvale, což se u nich musí explicitně vyznačit k tomu určenou direktivou. Potkal jsem se ale i s podivnou nestabilitou při zapnuté komunikaci Wi-Fi a současně zapnuté komunikaci přes seriový port, kdy dokud jsem neumístil část obslužného kódu komunikace přes seriový port do vyhrazené části IRAM, tak padalo připojení přes Wi-Fi, ačkoliv součástí dotyčného kódu žádné přerušení nebylo. Proměnná data jsou během vykonávání programu umístěna v datové části RAM. Program lze v paměti Flash aktualizovat nejen přes UART, ale i dálkově přes Wi-Fi pomocí rozhraní OTA (Over the Air), nicméně musí se na to předem v paměti Flash vyhradit k tomuto určená její část.
ESP8266EX nemá, narozdíl třeba od obvodů ATmega, žádnou interní paměť EEPROM, kam by bylo možné uložit data, která se mají uchovat i po vypnutí napájení. Pokud modul používáte v prostředí Arduino IDE, tak je k dispozici emulace paměti EEPROM, která se interně provádí tak, že se data ukládají do posledního sektoru v externí paměti SPI Flash. Je pak potřeba počítat při návrhu programu s tím, že při změně dat se pokaždé přepisuje celý dotyčný sektor, který je navíc stále stejný, takže teoreticky může dojít časem k jeho poškození. Interně si jádro systému také do paměti Flash zapisuje při každé aktivaci Wi-Fi připojovací údaje, takže i zde může dojít opakovanými zápisy k poškození Flash, nicméně nyní je možné tomuto zapisování údajů při aktivaci Wi-Fi už zamezit nastavením patřičných parametrů v programu. Alternativně si lze vybrat i ukládání dat do paměti Flash v podobě, kdy je v ní emulován celý filesystém (SPIFFS, LittleFS).
Pro kompilaci programu pod Arduino IDE vybrat desku Generic ESP8266 Module. Je důležité správně nastavit flash size dle skutečně osazené paměti, tj. v tomto případě 16MB. Nedoporučuji snažit se příliš zvednout upload speed, zdánlivě to sice šlo zrychlit, ale program se pak stal po nahrání nestabilní a zasekával se.
Vývojová deska s obvodem Espressif ESP8285EX, což je ESP8266EX, který má ve svém pouzdru integrovánu i SPI Flash 1MB. Základní popis modulu je tedy shodný s již výše popsaným modulem RSP8266EX a najdete ho tam. Odlišností je tedy jen menší paměť 1MB a modul má pouze integrovanou anténu Wi-Fi (na desce není konektor pro externí anténu). Modul má oproti vývojové desce ESP8266EX částečně odlišné uspořádání součástek a spojů, např. pojistka ve větvi +5V je zde zapojená už i do přívodu k stabilizátoru +3.3V a k pinům 5V na liště portů, nicméně podivné řešení se zapojením CH340, kdy jeho rozhranní RS232 má napěťové úrovně 5V a přetěžuje tak porty obvodu ESP8285, zde zůstalo, a lze to opět vyřešit přepojením vývodu Vcc obvodu CH340 na větev +3.3V. Porty ESP8285, přes které je vyvedeno rozhraní SPI pro připojení Flash, zde opět nejdou použít, protože interně je na ně použitá Flash 1MB zapojena. Určitou nevýhodou tohoto modulu by mohlo být, že pokud vám zde Flash odejde, tak u tohoto modulu ji nevyměníte.
Pro kompilaci programu pod Arduino IDE vybrat desku Generic ESP8285 Module a flash size nastavit na 1MB.
Malá deska s obvodem Espressif ESP8266EX s externí SPI Flash bez rozhraní pro připojení a programování přes USB. Obvod ESP8266EX je zde pod plechovým krytem (osazen je jako modul ESP8266MOD) a na PCB je tak vpodstatě už jen integrovaná anténa Wi-Fi a builtin LED. Kryt jsem nesundával a schéma jsem si kreslil podle fotek modulů, který někdo jiný rozebral, a tam jsem podle označení obvodu viděl 128Mbit Flash, tj. takto je to uvedeno i zde ve schématu. Nicméně když jsme se známým náš modul programovali, tak nám to udávalo velikost paměti nikoliv 16MB, ale pouze 4MB. Tj. je možné, že se tyto moduly vyrábí s více velikostmi Flash. Základní popis obvodu je shodný s tím, co je výše uvedeno u vývojové desky s ESP8266EX, akorát obvod se napájí přímo přes vývod desky +3.3 a není zde žádný stabilizátor snižující napájecí napětí, a díky absenci rozhraní USB zde nejsou ani žádné z výše popsaných problému s napěťovými úrovněmi na straně RS232 převodníku.
Pro kompilaci programu pod Arduino IDE vybrat desku Generic ESP8266 Module a flash size nastavit na správnou velikost dle skutečnosti (zřejmě 4MB).
Vývojová deska osazená modulem Espressif ESP-WROOM-32, který obsahuje obvod ESP32-D0WDQ6 s externí SPI Flash 4MB, modemem Wi-Fi 2.4GHz a Bluetooth s integrovanou anténou a dvěma 32bit jádry Tensilica Xtensa LX6 s taktem 240MHz. Obvod má 520kB RAM a 16kB RTC RAM. Na vývojové desce je pak obvod rozhraní USB/RS232 CH9102F a stabilizátor +3.3V. Napájení je buď z +5V USB nebo z externího zdroje +5V a pro současný provoz z obou těchto zdrojů napájení není na desce obvodové řešení umožňující jejich oddělení.
Použitý obvod ESP32 je výkonnější než výše popsaný ESP8266, nicméně základní principy práce s ním jsou podobné. Program je uložen v externí SPI Flash, ze které se načítá do interní RAM. Přerušovací rutiny se musí explicitně umístit trvale do RAM, jinak obvod při jejich vykonávání havaruje. Část portů slouží pro komunikaci s externí SPI Flash anebo na nich nastavené úrovně mají vliv na způsob bootování obvodu, takže ne všechny vývody můžete použít libovolně ke svým účelům. Porty GPIO34, 35, 36 a 39 jsou jen vstupní a nemají k dispozici interní pull up/down. Pokud je aktivní Wi-Fi, tak současně s ní nejde používat ADC2. Obvod má sice dvě jádra, ale na platformě Arduino bude ve výchozím uspořádání jádro 0 používat jen samotný systém např. pro komunikaci přes Wi-Fi, a vaše smyčka Loop() bude běhat na jádru 1. Pokud budete chtít nějakou svoji rutinu přehodit na druhé jádro, budete se o to muset sami postarat.
Pro kompilaci programu pod Arduino IDE vybrat desku ESP32 Dev Module.
Znakový LCD displej v uspořádání 16x2 znaky, ve výchozím uspořádání určený pro ovládání přes paralelní sběrnici 8/4bit, s LED podsvícením a pro napájení +5V. Tento má ale na PCB i přípravu na osazení zdroje záporného předpětí VO pro řízení kontrastu. Na fotce níže je modul LCD zachycen s nainstalovaným modulem převodníku I2C.
Displej bude pracovat i při napájení +3.3V, ale kromě případné nutnosti upravit pak podsvícení dipleje, bude pravděpodobně větší problém s nastavením kontrastu. Pro nastavení optimálního kontrastu je potřeba mezi vývody VDD a V5 displeje dosáhnout rozdíl napětí až cca 4.5V. V5 je s VO spojený přes nulový odpor. Při VDD +5V stačí na VO nastavit cca +0.5V, ale při VDD +3.3V by již bylo potřeba cca -1.2V. Příprava na desce umožňuje osadit měnič se spínanými kapacitory ICL7660, který invertuje napájecí napětí a vytvoří zdroj záporného předpětí pro LCD displej.
Znakový LCD displej v uspořádání 20x4 znaky, ve výchozím stavu určený pro ovládádní přes paralelní sběrnici 8/4bit, s LED podsvícením a pro napájení +5V. Tento má na sobě také přípravu pro osazení zdroje záporného předpětí VO pro nastavení kontrastu při sníženém napájecím napětí +3.3V, ale navíc má i přípravu pro osazení I2C expandéru portů PCF8574 včetně spínání podsvícení displeje.
Pro nastavení kontrastu platí totéž, co je už uvedeno výše v popisu u LCD1602A. A poznámky k I2C převodníku najedete zase níže v popisu smostatného modulu s tímto I2C převodníkem. Na fotkách níže je PCB displeje jak ve stavu, jak je prodáván, tak i poté, co si ho můj známý podle mých poznámek doosazoval, a získal tak displej pracující na +3.3V s I2C rozhraním.
Převodník pro připojení znakového displeje typu 0801, 1602, 2004 apod. s paralelní ovládací sběrnicí 8/4bit na I2C sběrnici. Tento modul je dodáván samostatně nebo někdy už i přímo nasazený na LCD displeji.
Základ převodníku tvoří 8bitový I2C expandér portů PCF8574. Směrem k LCD displeji se na jeho výstupech vytváří signály D4 až D7, E, RS a RW, tj. displej je potřeba při inicializaci přepnout do režimu komunikace po 4bitové sběrnici. Kromě samotného I2C expandéru je na desce modulu ještě osazen trimr pro nastavení kontrastu, jumper pro odpojení napájení podsvícení a jedním bitem expandéru ovládaný tranzistor spínající zem podsvícení displeje. Obvod expandéru jsem potkal osazený ve verzi 8574 i 8574A, které se lišily bázovou adresou I2C. 8bitový port expandéru je tzv. kvazibidirekcionální, v úrovni H jsou jeho výstupy napájeny proudem pouze 0.1mA, který se po dobu zapisovacího impulsu WRITE sběrnice I2C zvýší na 1mA.
Dvojitý obousměrný převodník úrovní signálů mezi obvody s napájecím napětím +3.3V a +5V, používaný typicky jako převodník u sběrnice I2C pro linky SDA a SCL.
Realizace tohoto obousměrného převodníku je velmi jednoduchá a využívá obyčejný n-kanálový FET se dvěma odpory pro jednu datovou linku. Na fotce je tento modul použitý pro přenos signálů SDA a SCL mezi CPU s napájecím napětím +3.3V a LCD displejem napájeným z +5V.
Malý modul RTC s obvodem DS3231 a napevno naletovanou malou baterií 3V. Kvůli rozměrům je zapojení velmi zjednodušeno a na dutinkovou lištu je vyvedena pouze zem, napájení a datové linky SDA a SCL. Ostatní signály, které jsou u obvodu DS3231 dostupné na pinech jeho pouzdra, nejsou nikam připojeny.
Pokud chcete snížit odběr obvodu na úplné minimum např. kvůli následnému skladování obvodu, který byl předtím používán, tak lze zastavit i interní čítače času tak, že se nastaví bit EOSC v registru 0Eh na 1 a pak se vypne napájení Vcc. Jakmile obvod přejde na napájení z Vbat, tak se zastaví. Po následném zapnutí napájení se obvod sám zase rozjede.
Modul RTC prodávaný pod označením ZS-042, obsahující RTC obvod DS3231M, EEPROM AT24C32, pouzdro na nabíjecí baterii LIR2032 a propojky pro nastavení I2C adresy paměti EEPROM.
Tento modul je prodáván s levnějším provedením M obvodu RTC s papírově asi o polovinu horší přesností času, než má jeho dražší varianta. Je potřeba si dát pozor na zjednodušený nabíjecí obvod baterie, tvořený odporem a diodou v sérii. Při použití nabíjecí LIR2032 bude při +5V baterie dobíjena (ale může dojít i k překročení jejího maximálního nabíjecího napětí +4.2V), při +3.3V se baterie nebude dobíjet vůbec. Při použití nenabíjecí CR2032 bude při +3.3V nabíjecí obvod uzavřen (dokud napětí baterie nepoklesne), při napájení z +5V bude baterie nabíjena a zničí se. Pro použití s CR2032 by tak bylo nejlepší nabíjecí obvod z PCB odstranit.
Levný modul rotačního enkodéru. Tlačítko i oba kontakty vlastního enkodéru mají jednu stranu spojenou s pinem označeným jako zem a druhou stranu vyvedenou na piny označené CLK, DT a SW a současně připojenou přes odpor 10k na pin označený jako plus.
Při použití tohoto enkodéru narazíte asi na dva problémy. První je směr otáčení - pokud váš program reaguje na otáčení enkodéru obrácený směrem, než potřebujete, tak stačí prohodit vývody CLK a DT.
Druhý problém jsou zákmity kontaktů, kdy program při otáčení enkodéru může chaoticky poskakovat mezi hodnotami oběma směry nebo jde obtížně nastavit požadovanou hodnotu nebo po stisknutí tlačítka enkodéru je nakonec vybrána jiná hodnota, než ta, co byla vybrána před stisknutím. Tento problém nemá jednoduché řešení a je daný tím, že se jedná o velmi levné provedení enkodéru - osa není uložena v ložisku, časem se vychodí a může se tedy i trochu naklánět, a subtilní kontakty běhající ve vazelíně neskýtají záruku, že se rychle neopotřebí a nebudou ztrácet spojení s kolečkem kodéru. Záleží na tom, na jak moc nekvalitní provedení enkodéru při nákupu natrefíte.
Na platformě Arduino se pro obsluhu enkodéru používá jedna hojně rozšířená knihovna, která bohužel ve skutečnosti problém se zákmity nijak úspěšně neřeší, a navíc ještě obsluhuje stavy tlačítka enkodéru způsobem blokujícím hlavní smyčku. A pokus o hardwarové řešení, kdy na výstup enkodéru někdo napojí kondenzátory o hodnotě několik mikrofaradů, je nesprávný.
Samotné blokování vývodů kondenzátory je samozřejmě opatření vhodné. Zákmity mohou nastávat rychle po sobě a změny na kontaktech se obvykle vyhodnocují přes přerušení procesoru. Pokud hardwarově odfiltrujete kratké sekvence impulsů, tak přerušení bude vyvoláváno ve větších časových odstupech od sebe. Takto ale nejde odfiltrovat veškeré zákmity. Ty jsou produkovány po celou dobu, kdy se kontakt pohybuje po kontaktní plošce kodéru, a filtrační kondenzátor 100% spolehlivě řešící zákmity, mohoucí dosáhout až takovéto délky, by už odfiltrovával i skutečný signál enkodéru a navíc by při jeho prostém připojení paralelně ke kontaktům byly tyto namáhány nadměrným proudem při vybíjení kondenzátorů. V datasheetu výrobců těchto enkodérů lze najít přímo filtrační obvod, který by se měl s enkodérem použít, viz obrázek níže.
Filtr zákmitů rotačního enkodéru.
Měli bychom tedy k enkodéru přidat výše uvedené hardwarový filtr, který bude řešit některé kratké zákmity. Nicméně dále je potřeba softwarově ošetřit i zákmity, které RC filtr neodstraní. Stačí se zamyslet nad principem, na jakém enkodér pracuje:
Princip činnosti rotačního enkodéru.
V klidové poloze vymezené řehtačkou jsou oba kontakty rozpojené. Při otáčení enkodéru se uvnitř otáčí kolečko se soustavou kontaktních plošek, které jsou spojené se zemí. Pokud se otáčí kolečko na jednu stranu, řekněme, že podle obrázku výše ve směru hodinových ručiček, tak se zemnicí plošky nejprve dotkne kontakt a, následně se s ní spojí i kontakt b, po nějakou dobu jsou s ní spojeny oba kontakty, pak se od plošky odpojí kontakt a, za chvíli pak i b a nakonec se kolečko s ploškami ocitne opět v poloze, kdy jsou od ní oba kontakty odpojené. Pokud budeme otáčet obráceným směrem, tak celá sekvence probíhá stejně, akorát pořadí spínání kontaktů bude obrácené, tj. napřed spíná kontakt b a jako poslední rozpíná kontakt a.
Pro vyhodnocení v programu tedy vyjdeme z toho, že stabilní stav je, když jsou oba kontakty rozpojené. V době, kdy se oba kontakty nacházejí mimo zemnicí plošku, nemůže dojít k jejich zákmitům. Pro vyhodocení stavu, že enkodér udělal 1 krok, nám tedy stačí získat informaci, že se některý kontakt poprvé spojil se zemí. A směr, kterým je otáčeno, pak jednoznačně získáme z informace, který kontakt se poprvé se zemí spojil. Nyní už jen hledáme další stabilní stav s rozpojenými kontakty. Protože oba kontakty mohou nad zemní ploškou kmitat a může tedy nastat i stav, že se od ní oba krátce odpojí, ačkoliv se kolečko ještě nedotočilo do následující stabilní polohy, tak se nejprve odměří časový interval, kdy je pravděpodobné, že může docházet k zákmitům, a během něj se nebude změna stavu kontaktů brát v úvahu. Po jeho uběhnutí se pak bude čekat, až budou oba dva kontakty očekávanou dobu ve stabilní poloze, tj. odpojené od země. Výsledkem tohoto postupu je nyní informace, že enkodér udělal 1 krok na jednu nebo druhou stranu, a nyní je možné opět čekat na další krok enkodéru. Pro vyhodnocení prvotního spojení kontaktu se zemí jsem použil přerušovací rutiny reagující na sestupnou hranu kontaktů enkodéru. Přerušovací rutina pak nastavila příznak, oznamující který kontakt se spojil se zemí, a nastavením příznaku současně zamezila sobě i přerušovací rutině od druhého kontaktu provádět změny, dokud nebude příznak vynulován. Pravidelně volaná obslužná rutina v hlavní smyčce, napsaná neblokujícím způsobem, pak zajistila zpracování těchto příznaků, odměření potřebných časových intervalů, finální odblokování přerušovacích rutin a inkrementaci nebo dekrementaci enkodérem ovládané proměnné včetně dynamické změny kroku podle akcelerace enkodéru. Součástí také bylo neblokující zpracování tlačítka enkodéru, založené opět na odměřování doby trvání jeho stavů pro odstranění vlivu jeho zákmitů.
Součástí SW řešení zákmitů enkodéru by měla být i správná reakce na stisk tlačítka uživatelem. Je dost nepříjemné, když máte vybranou nějakou hodnotu nebo položku menu a při stisknutí enkodéru se vám najednou vybere jiná, než kterou jste stiskem potvrzovali (běžný stav, který mě den co den štve u 3D tiskáren, co používám, dělá to FW Marlin jak originál, tak i jeho klon v tiskárnách od Průši). Uživatel by měl tlačítkem potvrzovat hodnotu, kterou viděl před stiskem stabilně na displeji, nikoliv nějakou změnu enkodéru na poslední chvíli až během jeho stisku.
K výše popsanému řešení zákmitů enkodéru musím doplnit jednu nepříjemnost. Řešení jsem reálně použil a obsluha enkodéru s ním byla bez problémů se zákmity, ale toto řešení předpokládá, že stabilní poloha kontaktů je díky řehtačce v místě, kde jsou oba rozpojené. Náš oblíbený východní dodavatel takovýchto laciných propriet dodává už i enkodéry, které mají papírově vyšší rozlišení, jenže je toho dosaženo ve skutečnosti tím, že je přidána druhá stabilní poloha i v místě, kde jsou oba kontakty se zemí spojeny. Viz fotky dále.
Rozebral jsem dva enkodéry a nafotil jejich vnitřní uspořádání. První enkodér byl 20 impulsů na otáčku se stabilními polohami v místech, kde jsou oba kontakty rozpojeny. Konstrukce enkodéru je jednoduchá. Na spodku enkodéru jsou po obvodu dvě dvojice tenkých kontaktů. Vnitřní jsou oba spojeny se zemí a spojují střed kolečka kontaktních plošek se zemí, vnější, o něco silnější, jsou každý vyveden jako jeden výstup enkodéru, a běhají nad nimi kontaktní plošky na kolečku nasazeném na osu enkodéru. Z druhé strany kolečka než jsou kontaktní plošky, jsou vybrání tvořící řehtačku, do které z horního krytu enkodéru zapadají dva zoubky kovového pásku tvořícího pružinu. Ve středu spodní části jsou pak dva kontaktní pásky tlačítka a nad nimi je umístěn vypouklý plíšek, na jehož střed doléhá osa enkodéru. Při stlačení osy se plíšek prohne a spojí kontakty pod sebou. Kódovacím kolečkem prochází osa tak, že se vůči němu může svisle pohybovat. Celý spodek enkodéru je silně namazán vazelínou, včetně prostoru kontaktů. Kódovací kolečko má 20 plošek a řehtačka má 20 mezer a zajišťuje, že osa je v klidu bez vnějšího mechanického působení aretovaná v poloze, kdy jsou oba kontakty enkodéru umístěny v mezeře mezi kontaktními ploškami.
Druhý enkodér byl 30 impulsů na otáčku. Konstrukce je stejná jako u výše uvedeného 20imp./otáčku, ale je vidět jedna zásadní odlišnost. Kolečko nemá 30, ale pouze 15 kontaktních plošek, ale řehtačka má 30 mezer a aretuje osu střídavě ve stabilních stavech, kdy jsou oba kontakty se zemí sepnuté nebo od země rozepnuté.