Jindra Fučík

Prostředí pro použití LocoNetu s Arduinem

Pro použití Arduina v prostředí digitálního kolejiště a LocoNetu budeme potřebovat nějaké minimální prostředky. A to jak hardwarové rozhraní, tak některé softwarové knihovny.

Hardware

Rozhodl jsem se vytvořit minimální avšak univerzální hardware, který bude možné použít pro všechny používané varianty LocoNetu. Loconet rozlišuje tyto typy zařízení:
  1. LocoNet klient (pasivní zařízení, nejčastěji ovladač nebo dekodér)
    1. Bez použití DCC (ovladač)
    2. S použitím DCC (booster, detektor obsazení)
  2. LocoNet master (centrála)
    1. LocoNetT master(Většinou komplexní centrály kombinující několik funkcí a několi sběrnic)
    2. LocoNetB master (plnohodnotný LocoNet) (Většinou centrála připravená pro velké kolejiště spoléhající výhradně na LocoNet rozvody)
  3. LocoNet zakončovač (Jedná se o pseudo zařízení, se kterým se setkáte především u extra dlouhých rozvodů)
  4. Master pro pasivní LocoNet (Zase se jedná o pseudo zařízení které se používá pro vytvoření napěťových úrovní sběrnice v případě že není přítomná žádná centrála)

Detailní popis

Ačkoli seznam vypadá celkem rozsáhle, tak se ve skutečnosti jedná především o způsob používání signálů RailSync(+/-) a také vytváření proudového zdroje pro zakončení sběrnice.

Zařízení prvního typu spoléhají na LocoNet který umožňuje aby se zařízení ze sítě napájelo, přičemž zařízení 1.a si vystačí s napájením a je jedno jakého typu toto napájení je. To jsou především ovladače, které emají jiný zdroj energie, nebo například počítačová rozhraní, často také dekodéry, které mají externí napájení, ale používají optické oddělení sběrnice, takže používají napájení ze sběrnice pro napájení těchto oddělovačů. Pro získání energie se používají právě signály RailSync(+/-), energie se získá pomocí dvojice diod, která vybírají kladnou část napájení. Je doporučeno používat rychlé diody, neboť signál RailSync má obsahovat obdélníkový DCC signál, takže jejich používání je efektivnější a méně zatěžuje sběrnici. Pochopitelně filtrační kondenzátor, jehož velikost by měla odpovídat spotřebovanému proudu. Zařízení typu 1.b jsou na tom v zásadě stejně, jen navíc odebírají a zpracovávají signály RailSync.

Zařízení druhého typu má v LocoNetu v zásadě dvě úlohy: Vytvářet signál RailSync a vytvářet proudové zakončení (Tedy zdroj proudu 15mA s maximálním napětím 12-15V na signálu loconet). Zařízení typu 2.a se spokojí s tím, že přivedou k signálům RailSync prosté stejnosměrné napětí o velikosti zhruba +12V až +15V, to je z pohledu LocoNetu legitimní stav, odpovídá tomu, kdy je DCC odpojeno protože například došlo ke zkratu. Stav je to tedy legitimní, ale pro některé případy je neužitečný. Nicméně třeba pro napájení ovladačů je naprosto v pořádku a nic neomezuje. Centrály typu 2.b jsou důslednější a přivádějí zde DCC nezesílený signál (Ten, který se v Lenz notaci označuje jako C,D). Slovo nezesílený si různí výrobci vysvětlují všelijak. Většina z nich si uvědomuje, že telefonní kabel (AWG28) není úplně vhodný pro velké proudové zátěže, takže není dobré do vedení posílat proud větší než cca 250mA maximálně 500mA pokud věříme na kvalitu použitého kabelu. Na druhou stranu je problematické toto napětí odpojovat při přetížení, neboť tím pádem připravíme ovladače o napájení a nemáme nikoho, kdo by poslal příkaz k obnovení provozu. Proto se často setkáme s tím, že jsou signály RailSync připojené přes rezistory 27Ω a nejsou nijak jinak jištěny. Na tuto konstrukci trochu pozor, protože se sběrnice může nacházet ve třech různých stavech:
  1. Signály RailSync obsahují diferenciální DCC signál, pak je vždy v jednom přítomné napětí (řekněme 14V) a ve druhém je 0V. Potom je maximální proud který je možné odebírat roven proudu v jednom vodiči I = (UMAX - UNOM)/R = (14 - 7) / 27 = 259mA
  2. Oba signály RailSync obsahují současně kladné napětí. K tomu dochází když je "odpojený" traťový DCC signál (třeba po zkratu). Potom je maximální proud který je možné odebírat roven dvojnásobku proudu v jednom vodiči, neboť se dá odebírat z každého z vodičů I = 2(UMAX - UNOM)/R = 2(14 - 7) / 27 = 518mA
  3. V případě, že odebíráme proud jako diferenciální (mezi RailSync+ a RailSync-) pro správnou detekci DCC signálu pomocí dvou optronů, pak proud který je možné odebírat roven polovině proudu v jednom vodiči, neboť se účastní oba rezistory v sérii I = (UMAX - UNOM)/2R = (14 - 7) / (2*27) = 129mA
Pro vytvoření proudového zakončení (Pull up) potřebujeme jednoznačně vytvořit zdroj proudu cca 15mA. Já mám celkem rád zdroje proudu založené na dvou tranzistorech a k nim dvou rezistorech. Někdo preferuje integrované zdroje proudu, ty se mi v minulosti neosvědčili, ale asi to není objektivní. Aby bylo možné se rozhodnout, v jaké aplikaci se náš přípravek nachází, potřebujeme tento být schopni tento zakončovací zdroj odpojit. Já jsem na přípravku zvolil jednoduchý pinový jumper. Propojením dvou nožiček připojíme zdroj proudu k LocoNetu. Je také potřeba přivést napájení na vstup tohoto zdroje proudu.

Třetí zařízení je spíše praktická obezlička pro instalace s velmi dlouhým rozvodem, kdy maximální napětí vytvořené pomocí Pull Up poklesne pod přípustnou hranici a zařízení pak nejsou schopna komunikovat. Proto se na koncích sběrnice extrémně vzdálených od centrály instalují pomocné destičky, které využívají napájení z vodičů Rail Sync stejně, jako bylo popsáno u zařízení prvního typu, ale toto napětí pak používají pouze pro zdroj proudu připojený k vodičům loconet. Takové zařízení je pak naprosto pasivní, jen zvedá úroveň pull up.

Poslední čtvrtý typ zařízení je užitečný pokud vytváříme LocoNet bez centrály (někdy označovaný jako pasivní LocoNet). S pasivním LocoNetem se setkáváme například u modulových kolejišť, kdy je samostatná centrála a samostatný LocoNet pro řízení lokomotiv (trakce) a pak si modelář vytvoří ještě menší rozvod řekněme v rozsahu jedné stanice, který používá pro ovládání návěstidel, výhybek a ostatního příslušenství. V takovém případě si vystačí například jen s moduly LocoIO které jsou použité jak v režimu vstup (tlačítko) tak v režimu výstup (přestavník). Potom není úplně nutné do systému zahrnovat centrálu. Jenže bez centrály nemáme k dispozici napájení na vodičích Rail Sync a také nemáme k dispozici Pull Up. Proto lze připojit jeden z přípravků, který nemá žádnou ovládací logiku, ale právě zprostředkovává DC napájení Rail Sync a zprostředkovává napájení Pull Up.

LocoNet na telefonním konektoru 6P6C LocoNet na 6,3mm stereo jack konektoru


Pro úplnost uvádím rozložení pinů v obou přípustných typech konektorů. Telefonní konektor je u nás běžnější, proto se mu věnují všechny popisy. U 6,3mm stereo jack konektoru je dobré si všimnout, že místo Rail Sync je rovnou uváděn Power Source, přitom norma upozorňuje na nutnost omezení tohoto zdroje energie na maximálně 20mA při napětí 12-15V, neboť při zastrkování konektoru dochází k propojení se signálem loconet.
Označení signálu jako loconet+ a loconet- u telefonního konektoru je trochu zavádějící, ve skutečnosti se jedná o jeden signál a vodiče jsou propojeny.

Schéma a deska tištěných spojů

Jak již mnohokrát zaznělo, LocoNet používá sdílené komunikační médium, kde každé zařízení které odesílá data, tak zároveň sleduje, jestli přijímá stejná data a nebo jestli došlo k jejich poškození (díky tomu, že dvě zařízení začala komunikovat ve stejný čas). Komunikace je definovaná tak, že zakončovač sběrnice vytváří v klidovém stavu na sběrnici napětí (ideálně 12V, maximálně 24V) s proudovou zatížitelností 15mA. Jako logická 1 (Mark) se považuje napětí větší než +4,0V proti signálu GND. Jako logická 0 (Space) se považuje hodnota napětí menší než +4,0V proti signálu GND. Data mají být přijímána s hysterezí větší než 1,0V se středem v hodnotě +4,0V. Minimální vstupní impedance přijímače je 47kΩ. Pro dodržení těchto parametrů většina běžných rozhraní začíná vstupním rezistorem právě 47kΩ a následně se dělí na dvě skupiny - buď spoléhají na kvalitu vstupního pinu na procesoru takže pomocí prostého děliče provedou posun požadované zlomové hodnoty 4,0V směrem k hodnotám pro daný procesor, nebo používají komparátor, který porovnává napětí na sběrnici s referenční hodnotou. Já jsem zvolil právě tuto druhou variantu. Jako komparátor jsem použil LM311. Pro zápis do sběrnice se používá jednoduchý tranzistor, který stahuje pull up napětí k nule. Požadavky sběrnice nejsou příliš rozsáhlé, takže lze použít v podstatě každý běžný tranzistor. Pro snažší diagnostiku jsem přidal ještě dvě LED diody a nějaké filtrační kondenzátory. Také jsem osadil dva konektory pro připojení sběrnice, které jsem jak je zvykem označil nesprávným značením "LocoNet in" a "LocoNet out", ačkoli jsou rovnocenné.


Na obrázku desky je u konektoru vyznačeno číslování pinů. Pokud se vám obrázek nezobrazuje dost velký, klidně si jej zvětšte s použitím kláves "Ctrl +" a "Ctrl -", obrázek je vektorový a tak nedojde k jeho poškození (pokud používáte Micro$oft explorer, tak vám obrázek uteče do pravého horního rohu). Význam pinů je následující:
PinVýznam
1+12V_pull-up Vstup napájení pro pull up napětí (v případě použití nezapomeňte propojit jumper JP1)
2Pwr_LN_out Výstup napětí ze zběrnice (je možné použít k napájení ovladače, max 15mA)
3GND - signálová zem
4Vcc - vstup napájení pro komponenty převodníku (+5V stabilizované)
5Rail_Sync+ - přímé propojení se signálem Rail Sync+ na konektoru (lze použít jako vstup i výstup)
6Rail_Sync- - přímé propojení se signálem Rail Sync- na konektoru (lze použít jako vstup i výstup)
7LN_out - vstup dat, která tečou od procesoru do sběrnice
8LN_in - výstup dat, která tečou od sběrnice do procesoru

Modul je postaven tak, aby bylo dobře pasoval do univerzální desky nepájivého pole a přitom byl zachován přístup ke konektorům.

Příklady použití

Nyní je čas si popsat příklady zapojení destičky k Arduinu v různých kombinacích popsaných v první kapitole. Příklady připojení používají oblíbené Arduino UNO, ačkoli v praxi používám mnohem častěji menší desky, například Arduino Pro Mini. Příklady respektují použití LocoNet knihoven pro Arduino popsaných v následujících kapitolách.
Podivný symbol uprostřed destičky znamená piny pro připojení Pull up, a pokud je přes ně namalovaný čtvereček, znamená to propojení jumperem. Také jsem nerozkresloval silovou část zesilovače DCC signálu v obrázku 2.b.

Příklad 1.a - Ovladač LocoNet napájený ze sběrnice


Příklad 1.b - Zesilovač LocoNet používající signály Rail Sync pro čtení DCC


Příklad 2.a - Jednoduchá LocoNet centrála, která vytváří LocoNetT (pouze napájení v signálech RailSync)


Příklad 2.b - LocoNet centrála, která vytnáří plnohodnotný LocoNet


Příklad 3 - LocoNet zakončovač


Příklad 4 - Master zařízení pasivního LocoNetu


Poznámka: zapojení z příkladu 3 a 4 jsou opravdu okrajová a nebudu je dále rozvíjet. Vzhledem k tomu, že není připojeno napájení 5V pro komparátor, je mnohem lepší jej neosazovat a nebo vyjmout z patice.

Software

Otázka software je celkem jednoduchá, všechny příklady se opírají o knihovny EmbededLocoNet, které je možné stáhnout na GitHubu jako součást projektu MRRwA - Model RailRoading With Arduino. Tyto knihovny používají TIMER1 & ICP1 (na deskách UNO a ostatních s procesorem ATmega328) a/nebo TIMER5 a ICP5 (na deskách MEGA s procesorem ATmega2560). Proto je vždy vstup dat z LocoNetu (LN_in) připojen na deskách s procesorem ATmega328 na vstup 8 (někdy značený jako D8) a na deskách s procesorem ATmega2560 bude přiveden na vstup 48 (někdy značený jako D48)
Tyto knihovny, stejně jako vše kolem LocoNetu upozorňují na to, že formát některých zpráv podléhá autorskému právu Digitrax, Inc. a/nebo Elektronik GmbH a jsou používány s povolením pro MRRwA projekt. Proto si včas přečtěte přiložený soubor LICENSE, jestli je můžete používat.

Pozor na jednu drobnost - knihovny se vyvíjejí poněkud živelně a často si v nich autoři odkládají různé debug výpisy na sériový port a občas se v nich objevují né zcela přesné implementace či chyby. Například v používání LNCV byla donedávna poměrně fatální chyba.