DCC vasútmodell kocsivilágítás vezérlő

Egy kedves ismerősöm mivel tudja hogy nagyon szeretem az elektronikát, felkért hogy készítsek neki a vasútmodeljéhez kocsivilágítást. Tetszett az ötlet, mert érdekelt hogyan van megvalósítva az egész rendszer vezérlése. Kölcsön kaptam a DCC vezérlőjét, és bele vágtam a témába. Így született meg a következő kis áramkör.

Funckiók:

  •  16db led a kocsi világításhoz, melyet tetszőlegesen maxmimum 4 részre lehet osztani, és a négy szekciót külön vezélreni(pl.: folyosó világítás, kabinok, WC, vezetőállás)
  • Végzárlámpa és vezérlőkocsi lámpák
  • PWM fényerőszabályozás
  • Vezérlőkocsi cím beállítás, melyel a homlokvilágítás és a végzár lámpák automatikusan kapcsolnak menetiránytól függően
  • Bootloader, a későbbi szoftver frissítéshez USB-n keresztül
  • A panel hosszát méretre lehet vágni a vezérlő elektronika után

A CV regiszerek beállításai:

CV regiszter Funkció
CV1 Kocsi címe
CV2 Világítás fényerő (0-255)
CV3 N/A
CV4 N/A
CV5 Mozdony címe
CV6 Mozdony mód
CV7 Verziószám
CV8 Gyári szám
CV9 F1 gomb világítás bitminta alsó bájt
CV10 F1 gomb világítás bitminta felső bájt
CV11 F2 gomb világítás bitminta alsó bájt
CV12 F2 gomb világítás bitminta felső bájt
CV13 F3 gomb világítás bitminta alsó bájt
CV14 F3 gomb világítás bitminta felső bájt
CV15 F4 gomb világítás bitminta alsó bájt
CV16 F4 gomb világítás bitminta felső bájt
CV29 Beállítások regiszter
CV100 Bootloader indítása(170 beírása esetén)

Jelenleg csak a 8bites címezést támogatja a dekóderem. A mozdony mód regiszterbe nem nulla beírása esetén a mozdony mód aktiválódik. Ha a mozdony  címét beállítjuk ami húzza a kocsikat, akkor a végzárlámpa és a frontlámpák a menetiránynak megfelelően automatikusan kapcsolódnak. Ha nincs mozdony módban, akkor a front lámpa kapcsolóval lehet ki/be kapcsolni az első világítást. A CV29 regiszterben a szabvány szerinti bittel lehet állítani a menetirányt.

A Hardware működése

A hardware működéséhez elengedhetetlen egy kicsi betekintés a DCC adatátviteli protokoljába. A sínpárban nem egyenáram folyik, hanem PWM modulált jel. A moduláció szélessége adja meg az átvinni kívánt bitek értékeit. Bináris 1 esetén 58uS körüli a PWM szélesség, bináris nulla esetén pedig 100uS körüli.

A dekóderemben az egyenirányítást követően a mikrokontrollerben egy bemenetnek dedikált lábon minden lefutó élre megszakítás generálódik, ami elindít egy timert. A timer 75uS után szintén megszakítást generál és megvizsgálja a DCC bementi láb állapotát. Amennyiben bináris 1-es került átvitelre, a láb magas szinten lesz, ellenkező esetben pedig nulla. Innentől kezdve már csak a bitek csomagba gyűjtése a feladat, utána eldönthetjük mit kezdük a kapott adatokkal.

A csomag felépítése a következő:

  • Adatszinkronizáló bitek(Preamable), amely minimum 10db bináris egyes
  • Packet start bit, ami egy darab bináris nulla
  • Cím bájt
  • Adat bájt
  • Minden adatbájtot egy újjab start bit követ, kivéve a legutolsót ami a hibaellenőrzéshez szükséges bájt és egy packet end bit, azaz bináris 1-es követ

 

 

A DCC csomagok értelmezése

A szabvány pontosan meghatározza a csomagok felépítését.  A legalapabb csomag amit a legrégebbi dekóderek is ismernek a mozdony irányának és sebességének a beállítására való:

A bevezető kódsor(preamable) után a cím bájt jön(Address), majd az utasítás. Az utasítás utolsó két bitje határozza meg az utasítás fajtáját, ami a fenti képen”01″. Az alsó 4 bit (SSSS) tartalmazza a sebességet. Az 5. “C” bit a régebbi rendszerek kompatibilitási szempontjából a front lámpát kapcsolja, vagy az újjabb rendszerek esetében a sebesség legmagasabb bitje. A “D” jelű bit pedig a mozdony iránya. A harmadik bájt a hiba ellenőrző összeg(EEEEEEEE).

A későbbiekben rengeteg új funkció megjelent a dekóderekben, ezért kiterjesztették az utasításkészletet. A cím bájt utáni bájt legfelső 3 bitje tartalmazza az utasítások fajtát. A részletes leírás megtalálható ebben a dokumentumban.

Az eszköz konfigurálása

Kétféle módon lehet a dekóderek regisztereit beállítani, szerviz módban és “POM” módban.

 Szerviz mód

Egy programozó vágányt kell létrehozni, amit teljesen el kell szeparálni a fő vonaltól, és csak egy szerelvény lehet rajta, amit programozni szeretnénk. A vezérlőt is szerviz módú programozásra kell állítani. Szerviz módban az eszköz regisztereit lehet írni, és olvasni is. A dekóder szerviz módba állításához a vezérlő először RESET utasítást fog küldeni, majd a “Configuration Variable Access Instruction”-nak megfelelően az utasítás bájt legfelső 3 bitje 1-es lesz:

Ilyenkor nincs cím küldés, az első bájt egyből az utasítást tartalmazza, ahol a “CC” a regiszter műveletet tartalmazza:

  • CC=00 -> Nem használatos
  • CC=01 -> Regiszter érték ellenőrzése
  • CC=10 -> Regiszter írása
  • CC=11 -> Bit manipuláció

A “V” jelű bitek tartalmazzák a regiszterek sorszámát, és a “D” pedig a regiszter értéke amit írni vagy vizsgálni szeretnénk.

Bit manupuláció esetén a harmadik bájt a bitműveletet tartalmazza: 111CDBBB, ahol a

  • C=1 -> Bit írása
  • C=0 -> Bit csekkolása

“D” a bit értéke, “BBBB” pedig a vizsgálni kívánt bit pozíciója a bájton belül.

Adatok kiolvasása és írás nyugtázása

Szerviz módban a vezérlő alacsony áramú üzemmódban lép, maximum 250mA áram folyhat a sínekben. A dekóder a nyugtázáskor ~6mS ideig terhelést köt a sínre, legalább 60mA áramnak kell folynia, hogy az enkóder érzékelni tudja a nyugtázást. Mozdonyok esetében általában a motort kapcsolják be erre a kis időtartamra, de lévén hogy a kocsivilágításban nincs nagyáramú fogyasztó, így én  egy 100 Ohmos terhelésel oldottam meg.

A regiszterek értékeit kétféle módon lehet kiolvasni. Az első mód a “Page” mód, ilyenkor a vezérlő egyesével kiküldi 0-255-ig a számokat, ha a vizsgálni kívánt regiszter az éppen kiküldött számot tartalmazza, akkor a dekóder nyugtáz. Ez elég lassú folyamat, főleg ha magasabb számot tartalmaz az olvasni kívánt regiszter. 255 esetén akár 10 másodperc is eltelhet a kiolvasásig.

Később ezt a lassú módot váltották le egy gyorsabbal a “Direct Acces” móddal, ami már nem konkrét számokkal vizsgálja a regisztereket, hanem bitenként. Ebben az esetben csak 16x kell adatot küldeni a 255 helyett. Azért nem csak 8x, mert a biteket megvizsgálja 1-es és 0-ás állapotuk szerint is. Értelem szerűen ha nem tenné, és csak pl. az 1-eseket vizsgálná, akkor kiolvasás esetén az enkóder hibásan  nullának olvasná ki a regisztert amennyiben a dekóder nem támogatja ezt a módot. Ugyanis a régebbi dekóderek nem támogatják a “Direct Acces”-t.

Az általam használt enkóder először a “Direct Acces” móddal próbál olvasni, majd ha nincs nyugtázás, a “Page” mód következik. A gyors módszer inkább csak olvasásra, írásra pedig a “Page” módot használják.

POM Mód

A második mód a “POM”, azaz “Program On Main” programozás. Ilyenkor menet közben is lehet programozni a dekódert, nem kell külön vágányra tenni a szerelvényt. Hátrányai hogy a CV1 címregisztert nem lehet állítani, és nincs visszajelzés sem a műveletek sikerességéről sem. “POM” módban egy packet 4 bájtból áll: először a cím kerül kiküldésre, majd a regiszter írása utasítás, melyet a regiszer száma és a beírandó adat követ.

Kapcsolási rajz

A PCB-t házilag elkészíteni kicsit bonyolult a sok VIA miatt, így a működő prototípus után kínában gyártattam le az első 20 panelt. Ez volt az első kínai panelrendelésem, és pozitívan csalódtam, remek minőségű nyákokat kaptam! Forrasztás közben:

 

Az első beépített darab:

A kapcsolási rajz és a nyákterve Eagle forrása.

A hardverhez való szoftver letölthető a githubról. MPLAB 8 alatt írtam és C18-al lett fordítva.

Facebook Comments