Jindra Fučík

LocoNet rozhraní pro připojení počítače odpovídající LocoBuffer

Počítačové rozhraní je v prostředí LocoNet poměrně hodně triviální záležitost. Tím že je síť koncipována jako PtP (Point to Piont), tak je počítačové rozhraní zodpovědné pouze za přeposílání všech paketů z LocoNetu do sériového portu a naopak, ze všech dat které přijdou sériovým portem vytvořit LocoNet pakety.
V prostředí LocoNet jsou známé dva základní typy rozhraní. Jedno je jednodušší, reprezentované například Digitrax MS100. Toto rozhraní provádí jen přizpůsobení napěťových úrovní a počítač je zodpovědný za celé řízení komunikace. V takovém případě potřebuje počítač port schopný komunikovat s přenosovou rychlostí 16600baud a nebo v nejhorším případě 16457baud. Tato komunikace se považuje za poněkud zastaralou. Druhá metoda komunikace je komunikace s použitím bufferu na přenosové rychlosti pro PC mnohem přijatelnější (19200 nebo 57600baud). Takovéto rozhraní se pak stará o tvorbu vlastního LocoNet paketu.
Výhodou tohoto způsobu komunikace je, že na straně PC a ani LocoNet není vytvářená komplikovaná zátěž. Zároveň zůstává zachován plný přístup ke všem paketům, takže v prostředí LocoNet neexistují žádné složité sledovače sběrnice, protože tato funkcionalita je přirozenou vlastností počítačového rozhraní.

Logika fungování

Jedno drobné úskalí na které může takové rozhraní narazit je rozdílná rychlost komunikace. Tím, že LocoNet používá poměrně netradiční přenosovou rychlost přibližně 16666baud a navíc na sdíleném médiu, takže je možné, že v komunikaci vzniknou signifikantní časové úseky, kdy komunikuje jiné zařízení a naše rozhraní se nedostane k odeslání dat, není možné spoléhat na to, že pokud bude přenosová rychlost směrem k PC 19200baud, bude rozhraní schopno odeslat všechny pakety, které přijdou ze strany PC. Stejně tak pokud by bylo přenosová rychlost menší, řekněme 9600baud, tak hrozí, že rozhraní nebude schopno odeslat všechny pakety, které přijme z LocoNetu směrem k PC. Proto je nutné tuto asymetrii nějakým způsobem kompenzovat. Jako jedna z efektivních možností se ukazuje použít větší rychlost pro komunikaci mezi PC a rozhraním, ale zároveň použít hardwarové řízení toku dat s použitím CTS signálu na straně rozhraní. Takže pokud rozhraní má ve své paměti paket, který se snaží odeslat do LocoNetu, pak "shodí" signál CTS a PC mu nebude posílat další data. Až dojde k uvolnění bufferu, rozhraní uvolní komunikaci nastavením CTS signálu.
Vzhledem k tomu, že program pro Arduino je distribuován formou zdrojového kódu a každý uživatel si provádí překlad a nahrání kódu, je možné ponechat konfiguraci právě v rámci tohoto zdrojového kódu. Výchozí hodnota je 57600baud.

Hardware

Po stránce hardware je před námi trochu oříšek. Arduino samo o sobě nepoužívá pro svou komunikaci signál CTS. Proto ani desky, které jsou přímo vybavené pro připojení k PC tento vývod nepřipojují a konec konců ani není nijak pevně definováno, jaký vývod pro tuto funkci vyhradit.
V našem kódu je použitý pin 9 (definice #define RX_CTS_PIN 9), ale lze použít jakýkoli jiný digitální pin podle potřeby.
Převodníky USB <=> Serial které se pro komunikaci používají, tak tento signál nemají nikam připojený.

Tato situace se dá řešit dvěmi způsoby. První je řekněme levnější, ale o něco pracnější. Je vhodný pro případy, kdy očekáváme, že budeme rozhraní používat delší dobu, respektive že Arduino nebudeme používat pro nic jiného. Je založen na tom, že si vezmeme extrémně levnou desku Arduino Nano a chybějící spoj si vytvoříme pomocí tenkého drátku. Je výhodné si pořídit Arduino, které se dodává s nepřipájenými pinovými lištami. Podle katalogového listu k použitému USB převodníku si najdeme vstup CTS. Pro ty nejlevnější obvody CH340G v pouzdře SOP-16 je vstup CTS na pinu 9. Na tento pin stačí připájet tenký drátek a druhou stranu drátku prostrčit dírkou pro pinový hřebínek u správného pinu. Pak zastrčit vlastní hřebínek a vše spojit pájením. Není to složitá operace a díky tomu že pin se na převodníku nachází na posledním vývodu, není nikterak pracné jej připájet. Příslušný pin D9 je také velmi blízko, takže není nutné používat lakované (izolované) drátky, ale stačí použít kousek papírové a nebo kaptonové pásky pro podlepení a izolaci (spoléhat na izolační vlastnosti nepájivé masky je riziko; pozor na plastové pásky, které se deformují při pájení).

Rozložení vývodů obvodu CH340G

Postup připájení vstupu CTS k vývodu D9

Druhý způsob více odpovídá používání Arduina jako stavebnice. Je založen na použití menšího modelu Arduino Pro Mini a k němu externí převodník USB <=> Serial. Obě tyto desky se často dají koupit v setu, já používám desku s převodníkem CP2102, která má tu výhodu, že se dá použít přímo v nepájivém poli a má celkem vhodně vyvedené všechny potřebné signály (a tu nevýhodu, že je osazená USB A konektorem, takže se neustále připojuje "USB prodlužovačkou").

Celé zapojení pak tedy představuje připojení sériové linky (u modelu Arduino Nano již máme) k pinům Rx <== Tx, Tx ==> Rx, CTS <== D9 a vzájemné propojení signálových zemí GND == GND. Dále pak musíme připojit modul rozhraní LocoNetu podle příkladu 1.a, tedy výstup napětí (2)Pwr_LN_out ==> Vin (RAW pro model Arduino Pro Mini), výstup napájení (4)Vcc <== +5V, (7)LN_out ==> D8, (8)LN_in <== D7 a zase propojení signálových zemí GND == GND.

Zapojení celého zařízení při použití externího převodníku, Arduino Pro Mini a LocoNet rozhraní

Za zvážení stojí vytvoření galvanického oddělení alespoň jedné sběrnice. To je velice jednoduchá úloha, například pomocí tří optočlenů 6N137 oddělit sériovou linku mezi USB převodníkem a Arduinem (to je celkem jednoduché v případě použití Arduino Pro Mini) a nebo pomocí dvou optočlenů oddělit LocoNet od Arduina, tady ale bude nutné vytvořit druhé napájení pro Arduino (asi z USB) a také vytvořit 5V napájení pro LocoNet. Také pozor na to, že LN_out je výstup s otevřeným kolektorem.

Software

Software prakticky nic nedělá - přijme paket, zkontroluje jeho validitu a odešle jej na druhou stranu. Snad jen sledování velikosti volného bufferu.

Jako dobrý základ se mi zdá použití příkladu John Plocher a který je rovnou součástí LocoNet knihoven. Ono je prakticky jedno, jaký program vezmete, prakticky pokaždé se jedná o velice podobnou funkcionalitu. Proto také nemá cenu, abych tady někomu vnucoval nějaký vlastní software, protože by vypadal úplně stejně.

Realizace

Hodně lidí očekává, že zda nalezne kompletní stavební návod na modul produktu, tal ale svět Arduino nefunguje, naleznete pouze propojovací obrázky a nikoli schémata, které si můžete přetavit do stavu drátového hnízda na univerzální desce tištěných spojů. Mohu vám dát pár užitečných rad jako je ta, že pokud chcete stavět nějaký modul, tak je docela dobré použít třeba TYTO desky vyrobené z cuprexcartu, nebo TYTO vyrobené z cuprextitu (cuprexcart = laminovaný kartón, dá se stříhat nůžkama, při ohnutí se zlomí jako krabice od bot, pokud je dlouho (několik let) na vlhku, tak začne nasávat vodu; cuprextit = sklo-laminát, dá se stříhat nůžkama na plech, při stříhání dělá skleněné chlupy ze kterých svědí ruce, v ohybu je pevnější, nemá snahu nasákávat vodu). Arduino Pro Mini se dobře vkládá do patice SOKL 24, zatímco Arduino Nano se dobře dává do patice SOKL-32, která je o jeden řádek větší, takže vždy vymáčknu poslední dvě nožičky (před zapájením jdou nožičky vymáčknout tlakem ve směru od desky nahoru) a na jejich místo provleču drátek, abych neměl snahu zapíchnout Arduino posunuté.
V mnoha případech pokud použijete desku Arduino Nano a doplníte jí o desku LocoNet headeru, pak stojí za úvahu vůbec neosazovat pinové lišty ale rovnou na jejich místo připájet vodiče a desky propojit přímo.