Po delší době jsem zase na podnět kamaráda z Povážské Bystrice vymyslel ovladač serva, kde jsem se snažil omezit různé nešvary, které se při použití serva vyskytují. Při debatě a odlaďování jsme zkoušeli přidávat různé vychytávky, které nás napadli. Původně to měl byt jen ovladač serva a při zjištění, že máme dost prostoru v paměti a pinů na ovládání návěstidla a detekce, tak jsme to tam přidali. Ovladač je řízen přes Loconet, protože ovládání přes DCC je bez zpětné vazby a nedalo by se to využít na závislé ovládání spolupracujících prvků. Tato trojkombinace je vlastně základní stavební prvek při návrhu a stavbě jakéhokoli nádraží. Pokud se nad tím zamyslíte, tak na každou přidanou kolej do nádraží potřebujete dva ovladače, z obou stran. Je poměrně výhodné je použít, i když hned nepoužijete detekci a návěstidla. Ono po čase přijdete na to, že návěstidla a detekce jsou velice užitečné věci a pokud máte předpřípravu, tak to ničemu neuškodí.
Myslím, že jednodušší to být nemůže.
Srdcem ovladače je procesor Attina 2313, který se nám zdál být celkem vhodný na daný účel.
Vstup Loconetu je přes optočleny, které zajišťují odolnost proti rušení přes zem a napájení. Vstup a výstup Loconetu je tradiční, odzkoušený a bezproblémový. Diody D1 a D2, které usměrňují DCC, musí být rychlé, tím myslím čas Tr aspoň 10nS a lepší. Používám staré teslácké KA222, Tr < 3nS. Je to proto, ze pomalé diody jsou zdrojem rušení. Jen pro zajímavost, těmito diodami nahrazuji BAT46 ve Fredovi a zatím bez reklamace. Zatím opraveno asi 14 kusů Fred.
Napájení může byt dvojité a to buď od DCC nebo externí rozvod 12-15V stejnosměrných nebo střídavých. Je to úplně rovnocenné a záleží jen na zhotoviteli, jak si to udělá. Pokud si někdo myslí, že odběr z DCC může dělat problémy, tak my jsme to nezaregistrovali. Má to však jednu podmínku. Procesor MUSÍ mít napájení oddělené diodou (D11), která zabezpečuje udržení napájení procesoru v případě mikroskratu.
Návěstidla jsou zapojena na jumpery na pinech PB.0 až PB.7. Je to osm pinů, přes které může být ovládáno jedno pětiznakové návěstidlo a dvojznaková předzvěst anebo dvě čtyřznakové návěstidla. Ono je to dost univerzální a vlastně se dá naprogramovat vše, co daná konfigurace 8 výstupních pinů umožňuje. Jsou tam natvrdo zapojeny odpory 2k7Ω, jako ochrana portů v procesoru. Je nutné s nimi počítat při výpočtu a nastavování svitu LED diod. Dále je tam propojka na volbu, či chceme napájení do +5V nebo do země. Potom se ale musí invertovat výstup portů B.0 až B.7 přes bit D6.1 v EEPROM, kdy hodnota D6.1 = 1, způsobí převrácení fáze ovládání na celém portu B.
Detekce je umožněna na pinech D.3 a D.4, přitom D.3 je INT1 a tak je to řešeno přes přerušení. Druhý pin se musí obsluhovat programově. Protože je obvod napájen z DCC, tak případná detekce je možná napřímo, třeba drátkem (nejtenčí struna od kytary) vedle koleje, která se spojí přes okolek s kolejnicí a tak je umožněna bodová detekce. Pokud se použije malé trafo, přes které by se napájela kolej, tak přes výstup sekundáru trafa se může detekovat liniová detekce obsazení. Obě řešení jsou volitelná, realizovatelná a odzkoušená. První detekce se používá na zhození návěstidla do červené projetím vlaku a je úplně jedno, či je to bodová nebo liniová detekce obsazení. Je to chráněné zenerkami, proti plus i minus přepětí.
První detekce má adresu stejnou jako ovladač, jen se použije paket s Opcode B2. Pokud je nulový bit D6.2 v EEPROM, tak je povoleno vysílání do Loconetu. Tato detekce shazuje červenou, bez ohledu na stav bitu D6.2. Druhá detekce je volitelná bitem D6.3 v EEPROM . Pokud je bit D6.3 = 0, tak při detekci posílá paket B2 s adresou ovladače +1. Je trošku od věci spojovat adresy pro pakety B0, taky pro B1, B2, ale připadalo mi to logické, než tomu přiřazovat extra adresy. Ničemu to vlastně nepřekáží.
Ovládání serva je realizováno impulsy 1-2mS v intervalech po 20mS. To zajišťuje s dostatečnou přesností procesor. Pro bezproblémové ovládání je vystup proveden jako emitorový sledovač, který zabezpečuje nízkoimpendanční připojení serva. Toto řešení je naprosto klíčové, protože velmi účinně likviduje indukované hazardy. Pokud se servo ovládá přímo z procesoru, tak při vlastnostech tranzistorů ve výstupech procesorů, není možné zabezpečit stabilitu při délce přívodů, nad asi 25cm k servu. Je to dané tím, že střídavý odpor výstupních tranzistorů v procesoru je hodně vysoký a nedokáže zatlumit naindukované hazardy. Čím nižší hodnotu má pracovní odpor v emitoru tranzistoru BC337(nebo podobný), tím je zapojení stabilnější. Byla zvolena kompromisní hodnota 110Ω, aby to zase moc nepapkalo proud. Pokud by se tahaly kabely hodně daleko, tak je možné jít na mezní hodnoty tranzistoru BC 337 (500mA) a osadit hodnotu 10Ω/3W. Ale to už je extrém a musel by se tomu přizpůsobit chladič stabilizátoru 78T05. Při pokusech se 110Ω jsme testovali kabely ku servu asi 15m a nezjistili jsme žádné problémy. Stabilita serva je naprosto vyhovující a spolehlivá. Servo se nechvěje a perfektně drží pozici a chladič stabilizátoru 7805 je skoro studený. Teda odpor 110Ω je kompromis mezi odběrem a stabilitou, která je stejně i tak vynikající. Nedoporučuji tuto hodnotu měnit.
Další velmi důležitá věc pro stabilitu serva je použití Brown detekce v procesoru, kdy jakýkoli pokles napájení procesoru pod hranici 2.7V musí vyvolat restart procesoru a tím znemožnit vysílání špatných a zle časovaných impulsů, které jsou postrachem pro servo. Oddělující dioda D11 by měla byt Schottky s úbytkem 0.45V v propustném směru, aby bylo zabezpečeno správné napájení procesoru At2313. Použití Brown resetu je bezpodmínečně nutné, protože procesor, který je v nesprávném režimu napájení, se chová naprosto nepředvídatelně a chaoticky. Následný restart, po uvedení napájení do normálního stavu, je klidný a nezpůsobuje trhání a ani jiné problémy. Pokud dojde k “zahnědnutí“ v čase přestavování, tak se nic neděje, protože stav serva se zapisuje před pohybem serva a tak po restartu se servo nastaví samo do požadovaného stavu. Taky kondezátor C3 na reset pinu procesoru je dost důležitý, protože omezuje opakované restarty, pokud je napájení delší dobu na hranici Brown detekce.
Napájení srdcovky je realizováno přes obyčejné relé TXD2 (lepší by bylo bistabilní) a to tak, že se sleduje pohyb serva a v polovičce přesunové dráhy se relé přepne do opačného stavu. Tím je zabezpečeno, že nemůže dojit ke zkratu mezi jazykem vyhybky a kolejnicí, pokud je to tak vyřešeno. Po diskuzi s JKI jsem upravil ovládání srdcovky napřímo od mikropřepínače, který je umístěný přímo u přestavovacího mechanismu. Je to proto, že nedokáži zajistit shodu programu s reálným elektrickým stavem srdcovky na vyhybce. Teď se může relé použít na cokoliv, podle schopností zhotovitele.
Škubnutí serva na začátku, kdy se přivede napájeni, se nedá nijak ovlivnit. Zkoušel jsem toho opravdu dost, od zpožděného, zrychleného nebo řízeného startu a nic nepomáhá. Je to proste vlastnost serva a musíme s tím počítat. Dokonce nejhorší je to tehdy, když pomalu nabíhá napájení. Nejlepší je, když co nejdříve přijde první ovládací impuls, který to ihned srovná, tehdy je zákmit “skoro” nepozorovatelný. Píši “skoro”, ale on tam vždycky je a vyzkoušel jsem asi 15 různých druhu serva a všechny to dělají. Jediné “servo”, které to nedělá, je lineární, které má z principu mechaniku jinak vyřešenou a proto k startovacímu zákmitu nemůže dojít. Pokud je lineární servo odvozeno od klasiky, tak se škube taky.Jediné řešení, které jsem vymyslel, je nutnost nechat určitou vůli na koncích pohybu serva. Teda je přísně zakázané dávat tam natvrdo různá mikrotlačítka nebo přepínače. To je opravdu špatné a časem se “něco“ určitě utrhne nebo jinak poškodí. Jinak napsané, pohyb serva nesmi byt nijak konstrukčně-mechanicky omezen. Tím se zároveň ušetří startovací proud servem, který bývá kvůli mechanickému dorazu extremně veliký. Pokud servo jen zakmitne, bez toho, aby muselo něco násilím přetlačovat, tak je proudový start impuls celkem zanedbatelný.
Je velmi nutné dobře promyslet způsob převodu pohybu serva na vyhybku, protože to musí byt samosvorné a aby nedocházelo k přetlačování mezi servem a mechanikou přestavníku. Ovládaní jazyků vyhybky přímo servem, je snad to nejhorší možné řešení. Taky převod kruhového pohybu na přímočarý je nutno dobře promyslet a eliminovat vůle a zbytečné síly tam působící. Celá debata o použití serva se tak dá shrnout na tvrzení, že servo není přímo určené na modelovou železnici, ale při dodržení pár podmínek, se to dá použít. Musí se respektovat zvláštnosti serva a ono se odmění perfektní a spolehlivou prací, která se vůbec nedá srovnávat s jinými přestavníky.
Program jsem psal asi na třikrát protože jsem chtěl použít zabudované knihovny a to se jaksi nepodařilo. Použité knihovny jsou skoro nepoužitelné z důvodu jednoduchosti a jsou navrhnuté pro ideální stav, který ale při práci s několika přerušeními nemůže fungovat. Tím myslím to, že třeba obsluha UART v délce 8µS je k ničemu a při nepravidelnosti správ na Loconetu to způsobovalo chvění serva. Takže obě důležité knihovny (UART a servo) jsou nepoužitelné a musí se napsat samostatně. Obsluha UART je triviální, když si člověk uvědomí, že bafr je dvojstupňový a kdy se jenom musí zajistit, aby žádné přerušení netrvalo déle než je délka přijímaného bajtu. Obsluha UART musí zabezpečit okamžité převzetí znaku s minimální prodlevou v přerušení, já to mám asi 8 strojových cyklů(1µS), takže to je velmi rychlé a nemůže to ovlivnit časování serva.
Ono vlastně všechny přerušení musejí byt extrémně krátké, aby neovlivňovaly činnost serva a jeho časování. Já to mám tak, že tam je vždy jen jedna instrukce, třeba SBI GPIOR0.0 a hned následuje RETI. No a tento příznak je potom zpracován v hlavním programu, kde to absolutně nepřekáží.
Časování serva jsem musel řešit jako nejvyšší prioritu, aby jeho časování bylo za všech okolností naprosto stabilní. Proto je skoro úplně oddělené od zbytku programu a je ovládáno jen přes přerušení. Na ovládání jsem použil časovač „0“, který přepínám do dvou předdělících režimů. Jednou dělič 1/1024 a druhýkrát dělič 1/64, kde pomoci jednoduchého soft přepínače, přepínám na dva vykonávací směry. Jeden směr odpočítává čas 12mS a druhý směr odpočítává čas 1mS - 2mS, podle požadované hodnoty impulsu. Je to celkem jednoduché, jen na to přijít.
Při testech jsme upravili čas z 50mS na 12mS, protože to velmi účinně omezuje poškubávání serva při pomalém přestavování. Tím myslím, rozběhnutí a následné vrácení po překmitu, při přijmutí dalšího impulsu. Servo se vždy pohybuje maximální rychlostí a pokud překmitne, musí se vrátit.
Ovládání detekce je trošku složitější, detekce na shození návěstidla ani ne, ale to druhé, které je určené na všeobecné použití, mi dalo docela zabrat. Už jen použití více proměnných než na servo je zajímavé a naznačuje, že to není úplně bezproblémové. Hlavně používání EMF mne pořádně potrápilo. Není problém zjistit obsazení, ale je dost velký problém zjistit uvolnění koleje. Časové úseky na EMF jsou u každého dekodéru jiné a tak to musí být navrženo hodně blbuvzdorně. Detekce používá pakety s Opcode B2, kdy první detekce používá základní adresu a druha používá adresu o 1 větší.
Používáme Loconet a tak je nutné používat příkazy Loconetu, zrovna tady používáme pakety s OPCODE B0, B1, B2 a E5. Paketem B0 ovládáme vyhybky a návěstidla a paketem B1 odpovídáme, v jakém stavu je přestavník a návěstidlo. Paket B2 hlásí v jakém stavu je detekce obsazení. A nakonec E5 je programovací paket, kterým nastavujeme příslušné CV a zároveň s ním odpovídáme, v jakém stavu jsou jednotlivá CV.
Paket B0 je v tvaru <0xB0>,<0xB0>,<SW1>,<SW2>,<CHK>, kde bajty SW1 a SW2 přenášejí informaci a bajt CHK je kontrolní.
<sw1> = <0,A6,A5,A4- A3,A2,A1,A0>
<sw2> = <0,0,DIR,ON- A10,A9,A8,A7>
Každý ovladač si bere 2 bity adresy + DIR, teda celkem 4 adresy. Používáme modulo čtyřku adres, například 0, 4, 8, 12 až 2044 bajtů celkově. Bit ON je ignorovaný a nepoužívá se. Dá se napsat, že bity A1 + A0 + DIR je binární číslo &B000 - &B111 s osmi příkazy, DIR je LSB. Podle tohoto čísla se určuje, co ovladač vykoná (příkaz) a bity A2 až A10 definují adresu ovladače (adresa). Ideální je začít na adrese 4 (5 v RailCo), kdy se následně obsadí adresy 4-7 (5-8). Další ovladač periferie začíná na 8, 12, 16 atd. až do 2044. Pokud by se využil bit ON, tak by šlo rozšířit rozsah adres na 4096, ale to by zas nepodporovalo JMRI a RailCo. Takže to záleží na uživateli, jak se rozhodne používat adresový prostor. Na každý paket B0 odpovídá ovladač paketem B1, kde se potvrzuje vykonání příkazu, pokud je to dovoleno bitem D6.0 , který musí být „0“.
Projetím přes detekci obsazení se automaticky nahodí červená a pošle se paket B2, který má tvar <0xB2>, <IN1>, <IN2>, <CHK>
<in1> =<0,A6,A5,A4- A3,A2,A1,A0>
<in2> =<0, 1, I, L - A10,A9,A8,A7>
Kde se do obsahu B2 zkopíruje použitá adresa a do L se zapíše reálný stav. Paket se posílá 1x a potom je nastavena pauza 30vteřin, než se může poslat znovu. Je to proto, aby každé kolečko vlaku neposílalo svoji “vlastní“ správu, při bodové detekci obsazení. Druhá detekce je na volné použití a používá základní adresu+1.
Druhou detekci lze používat třeba na detekci staniční koleje, která může být detekovaná liniově, přes malé trafo.
Adresový prostor 8 pozic je rozdělen následovně pro:
Jedno vjezdové návěstidlo a jedna předzvěst:
adresa 0 = přepíná vyhybku rovno a nastavuje vždy červenou a žlutou předzvěst
adresa +1 = přepíná vyhybku do odbočky a nastavuje vždy červenou a žlutou předzvěst
adresa +2 = průjezd na přímou kolej ; zelena + zelena předzvěst
adresa +3 = vjezd na přímou kolej ; horní žlutá + zelená předzvěst
adresa +4 = vjezd odbočkou a potom stůj ; dvě žluté + blik žlutá předzvěst
adresa +5 = vjezd odbočkou a potom průjezd rovno ; zelena, dolní žlutá + blik žlutá předzvěst
adresa +6 = vjezd odbočkou a potom průjezd odbočkou ; blik horní žlutá, dolní žlutá + blik žlutá předzvěst
adresa +7 = posun ; bílá + žlutá předzvěst, projetím detekce se neshazuje bílá, zruší se až pohybem vyhybky
Dvě čtyřznakové návěstidla:
Toto se použije, když je první kolej přímá(1 kolej) a ta má svoje návěstidlo i přestavník a další dvě (2+3 kolej) jsou odbočkové a mají jeden přestavník a dvě návěstidla. Kvůli přehlednosti má jedna kolej sude a druhá kolej liché adresy. Návěstidlo je pro posun i vlakové cesty.
adresa 0 = přepíná vyhybku rovno a nastavuje obě červené
adresa +1 = přepíná vyhybku do odbočky a nastavuje obě červené
adresa +2 = odjezd odbočkou ; zelena, dolní žlutá - druha kolej je červená
adresa +3 = odjezd odbočkou ; zelena, dolní žlutá - první kolej je červená
adresa +4 = posun ; bílá ; přestavení vyhybky vypíná bílou - první kolej ; druha kolej je červená
adresa +5 = posun ; bílá ; přestavení vyhybky vypíná bílou - druhá kolej ; první kolej je červená
Na ovládání návěstidel používám po délce roztrhané 40 žílové kabely od harddisků a kupuji 16 a 10 pinové samořezací konektory, které nakrimpluji podle požadované délky. Původně jsem měl 0. a 1. adresu taky na návěstidla, které se rozsvítily podle zvolené cesty, ale nutnost přestavovat několik vyhybek do vlakové cesty to striktně omezila.
V Railco se to nastavuje tak, ze se voli adresa +1 od reálné a voli se vždy jen jedna volba v tabulce “Output Configuraton“, buď c nebo t. Je to proto, že volby se navzájem přímo ovlivňují a tak není třeba vypínací příkaz.
Paket s OPCODE E5 se používá na komunikaci a přenos zprav mezi jednotlivými jednotkami vseobecně. Jeho formát je předepsaný, ale protože mi to nevyhovuje a tak jsem si ho trošičku upravil.
<0xE5>,<10>,<SRC>,<DSTL>,<DSTH>,<PXCT1>,<D1>,<D2>,<D3>,<D4>
<PXCT2>,<D5>,<D6>,<D7>,<D8>,<CHK>
Toto je originál, kde mi hlavně vadí přesunování 7 bitu v jiném bajtu. Proto jsem omezil povolené hodnoty na limit 0-7F, který mi na konfiguraci všech CV bohatě stačí. Do procesoru se musí zadávat v HEX formátu.
Teď rozepíši jednotlivé bajty (HEX formát) :
E5 | 10 | SRC | DSTL | DSTH | PXC1 | D1 | D2 | D3 | D4 |
Opcode | delka | Příkaz | adrLow | adrHIGH | new adrL | new adrH | levy doraz | pravý doraz | posl. poloha |
PXC2 | D5 | D6-status | D7 | D8 | CHK |
Rychlost | NC | obsl. priznaku | druh návěst. | 0x48 | kontrola |
0xE5 | opcode |
0x10 | počet bajtu v paketu |
SRC |
příkaz, teda, co se má s paketem udělat, |
DSTL | nižší adresa ovladače, bere se základní adresa modulo 4 ; volba = 0, 4, 8, 16, 20…. .124 |
DSTH | vyšší adresa ovladače ; volba = 0-0F, teda klasika Loconet access formát 7 + 4 bity |
PXC1 | zapisovaná nová Low adresa modulo 4 ; volba = 0, 4, 8, 16, 20…. .124 |
D1 | zapisovaná nová High adresa ; volba = 0-0F, teda Loconet access formát 7 + 4 bity |
D2 | levý doraz serva, volba min 0 až 7F ; tato hodnota MUSÍ byt vždy menší než následující D3 |
D3 | pravý doraz serva, volba min 0 až 7F |
D4 | poslední stav serva, bud D2 nebo D3 |
PXC2 | rychlost serva, 1= maximální rychlost, 7F= minimální rychlost, 0= je vlastně 255, teda extrém pomalé |
D5 | zrušené, relé na srdcovku se ovládá externě |
D6.0 | 1 = zákaz vysílání B1 ; 0 = povolení vysílat B1 |
D6.1 | 1 = negace portu B ; 0 = normální stav |
D6.2 | 0 = posílá paket obsazení (B2) s adresou +0 od základní adresy ovladače; 0 i 1 = nahazuje červenou. Detekce je vždy funkční a měla by být zapojená. Pokud není, červena se shazuje ručně přestavením vyhybky. ; 1 = nevysilá paket B2. |
D6.3 | 0 = posílá paket obsazení (B2) s adresou +1 od základní adresy ovladače; 0 = nefunkční detekce |
D7 | druh použitého návěstidla, 0= nepoužité ; 1= vjezdové návěstidlo, 2 = 2x čtyřznak návěstidlo |
D8 | 48 (&B0100 1000), kontrolní číslo, pokud není 48H, tak je paket neplatný a ignoruje se. |
CHK | kontrola |
Na programování CV se používá program JMRI v sekci „Posli paket Loconet“ a odpověď se ukáže v sekci „Monitor Loconet“. Pochopitelně musíte mít nějaký převodník z Loconetu na počítač, například Locobuffer nebo MS100 nebo USB port / Loconet..
Tohle je můj nápad, jak by se to mohlo dělat.
Pákové provedení eliminuje převod z obloukového na přímočarý pohyb a přitom zajišťuje dostatečnou přesnost. Taky převod páky je dost důležitý na pohyb přestavování vyhybky. Tím myslím, poměr mezi oběma částmi páky. Tady to je asi 1.8 : 1, to znamená, že o tento poměr je koncový pohyb kratší oproti rozkmitu serva.
Taky se mi líbí, že pohyb vyhybky začíná pomalu, přes střed přeběhne rychleji a zase dolehnutí k druhé koleji je pomalejší.
Toto je vzorové „laboratorní“ zapojení, kde jsem zkoušel, co to všechno umí a jak se to bude chovat. Za dobu víc než rok se adaptér přestavil víc než 10 000-krát, protože se na něm odlaďoval program a testovalo se všechno možné a nemožné. Ale v zásadě se toto mechanické provedení dá použít i v reálu, protože je celkem univerzální a blbuvzdorné.
Jen pro zajímavost, drát do lustr svorek k vyhybkám, který musí být pružný a přitom odolný, tam používám obyčejné kancelářské sponky, které po opatrném narovnání nemají konkurenci. Jediné, co je lepší, jsou ocelové struny od leteckých modelářů. Ale s těma se dost blbě pracuje a lámou se při několikerém ohnutí. Navíc se dost blbě shání, kdežto kancelářských sponek je všude dost.
Do reálného modulu jsem servo s ovládáním zabudoval do žolíku, který dokáže spojit různé vzdálené dvoukolejky.
Tento modul dokáže spojit dvoukolejky od 40 mm do 62 mm středové vzdálenosti obou kolejí pomocí metrického šroubu 3mm uvnitř modulu.
Taky je zajímavé, že ovladač dokáže přestavovat dvě závislé vyhybky najednou. Když je to mechanicky možné, tak proč to nevyužít. Jinak bylo vyrobeno 8 ks ovladače, které bez problémů fungují u mého známého.
ptal jsem se Petra, kam umistit navrhy plosaku, HEX kod do procesoru a zatim mi neodpovedel.
---
Jsem invalida a vyrabim veci jen pro dobre zname a kamarady skoro za cenu soucastek, nejsem nenazrany a neberem to jako prostredek na kseft. Hodne veci berem jako vyzvu, ci to dokazem vymyslet a zhotovit.
---
Cena tohoto ovladace v soucastkach je asi 25Eur, podle typu serva, ktere nedoporucuji uplny suviks.
Tim myslim kompletni ovladac na desticke, tak jak je to na obrazku.
Kompletni oziveny, prednastaveny ovladac, urceny primo na zabudovani do modulu nebo kolejiste, bych mohl vyrobit za 28 Eur.
---
Musim byt ferovy a napisat, ze to urcite neni konecna cena, protoze dalsi konektory, kable, trafo na detekce a navestidlo, nejsou v cene a musi se koupit jinde, nebo zhotovit.