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.