Jindra Fučík

DCC dekodér pro 1/2/4 modelářská serva


Conformance Warrant 2017-0002
Pro verzi 5.3



Pozor: Vytvořil jsem také verzi 4 a 5, která používá jiné schéma zapojení a jiný software. Popis této verze najdete ZDE.

Tento dekodér vznikl jako rozšíření dekodéru Paco Cañada. Jedná se pouze o změnu firmware, zapojení a podstata je stále stejná.
Zdroj a poslední verze: http://www.fucik.name/masinky/servo/
Pro doplnění schéma a plošný spoj

DCC decoder for 1/2/4 model servos


Conformance Warrant 2017-0002
For version 5.3



Note: I did also new version 4. This version using different schematics and different software. Description of this version is HERE.

This decoder is only enhancement of decoder by Paco Cañada. It is only enhancement of software. Hardware and principles are still same.
Source and last versions: http://www.fucik.name/masinky/servo/
For info - schematics and board:



all in one .zip
Existují dvě verze software. Verze 3.0 a 3.5. a dvě pod-verze 3.2 a 3.4
Verze 3.0 zastavuje čtení dat během pohybu serva, takže je možné, že nepřijme některý paket, nicméně pohyb serva je velmi přesný.
Verze 3.5 naopak čte data neustále, takže může dojít ke chvění serva při pomalém pohybu.
Verze 3.2 Čte neustále, ovládá však pouze 2 serva, zato ve 4 polohách - Servo 1 dostává polohy A1,B1,A1 a B2, Servo 3 dostává polohy A3,B3,A4,B4 (serva 2 a 4 se nepodporují) - to je vhodné pro tří-cestné výhybky a pro CarSystem
Verze 3.4 Čte neustále, ovládá však pouze 1 servo, zato v 8 polohách - to je vhodné pro ovládání šuplíkových nádraží nebo malé točny velikosti Z a menší

Hlavní změna spočívá v tom, že dekodér definuje zvlášť polohu serva pro pozici A(rovně) a pro pozici B(do oblouku).
Dále je možné měnit směr otáčení ještě před dokončením otáčky.
A také je možné nastavit rychlost otáčení na maximální rychlost serva.
Here exist two versions of software. Version 3.0 and 3.5 and two subversions 3.2 and 3.4
Version 3.0 stopping read of packets during servo move. It means, it is possible, that decoder loses some packet, but servo move is very accurate.
Version 3.5 not interrupts packet reading, then it is possible that servo during slow moving can do small vibrations.
Version 3.2 not stopping read packets, handling only 2 servos, but in 4 positions - Servo 1 receiving positions A1, B1, A2 and B2, Servo 3 receiving positions A3,B3, A4 and B4 (Servos 2 and 4 not supported) - it is useful for three way turnouts and for CarSystem
Version 3.4 not stopping read packets, handling only 1 servo, but in all 8 positions - it is useful for small turntables for Z scale and smaller

Main change is, that decoder defining separate servo position for A(forward) and B(turn).
It is also possible to change direction before servo finish previous move.
And it is also possible to set up maximum servo speed.

CV Values
CV#CV#defaultmin-maxvýznammeaning
51311 (vyh. 5-8)0-63Primární adresa, spodní polovinaPrimary address, low half
515310-255Rychlost Serva 1Speed of servo 1
516410-255Rychlost Serva 2Speed of servo 2
517510-255Rychlost Serva 3Speed of servo 3
518610-255Rychlost Serva 4Speed of servo 4
730(35)-VerzeVersion
813 (0D hex)-ID VýrobceManufacturer ID
521900-7Primární adresa, horní polovinaPrimary address, high half
54129128 (bit 7)0/128konfigurace - 128 = ukládat nastavení a po startu se vracet k minulému stavuConfiguration - 128 = save last state and return after startup
5453378 (4E hex)10-127Délka mezery - doporučuji neměnit tohle je cca 50Hz (vzorec je CV546*256µs, takže cca 20ms)Spacing - it is recommended not change it - cca 50Hz (formula is CV546*256µs; it means cca 20ms)
5463411Příznaky (nepoužívá se)Flags (not used)
54735100 (64 hex)90-210Pozice A pro servo 1 (čas pulsu *10µs, takže 100=1,00ms; 250=2,5ms)Position A for servo 1 (pulse time *10µs; it means 100=1,00ms; 250=2,5ms)
54836100 (64 hex)90-210Pozice A pro servo 2Position A for servo 2
54937100 (64 hex)90-210Pozice A pro servo 3Position A for servo 3
55038100 (64 hex)90-210Pozice A pro servo 4Position A for servo 4
55139200 (C8 hex)90-210Pozice B pro servo 1 (čas pulsu *10µs, takže 100=1,00ms; 250=2,5ms)Position B for servo 1 (pulse time *10µs; it means 100=1,00ms; 250=2,5ms)
55240200 (C8 hex)90-210Pozice B pro servo 2Position B for servo 2
55341200 (C8 hex)90-210Pozice B pro servo 3Position B for servo 3
55442200 (C8 hex)90-210Pozice B pro servo 4Position B for servo 4
5554344-10Počet pulsů po dosažení poziceNumber of pulses after position reach

Programování CV je možné provádět ve stránkovém a v přímém režimu.
Adresu lze naprogramovat také tak, že stisknete tlačítko a přehodíte příslušnou výhybku, dekodér si pak určí a uloží adresu.

Pokud máte s programováním potíže, lze nastavit hodnoty CV již při nahrávání hex souboru do procesoru. Postup je zachycen na následujícím obrázku.
The programming can be made it in Paged and Direct mode.
To program the decoder address we can use the pushbutton, push the button and switch the turnout, the decoder will calculate and store relevant address

If you will have a problems with programming CV, you can modify it during burning hex file into PIC. Steps are on following figure.
Zelená je primární adresa
Červená - čas pro servo 1...4
Žlutá - A poloha pro serva 1...4
Modrá - B poloha pro serva 1...4
Fialová - ostatní
Také je možné si CV odpočítat od začátku, jejich poloha odpovídá jejich číslu

CV35-CV41: Je možné si všimnout, že pro každé servo se nastavuje pozice pro A (rovně) a B (do odbočky) samostatně. Je možné nastavit i hodnoty v obráceném pořadí - tedy A=200 a B=100, takže není nutné obracet servo.
Pozor: dekodér neprovádí žádnou kontrolu na hodnoty, většina serv funguje v rozsahu 0,9 - 2,1 ms (90-210). Překvapila mne serva blue-arrow (ta levná malá modrá), která se na blbé hodnoty začala točit dokola.

Přidal jsem nové CV43 - udává počet pulsů po dosažení pozice. Tato hodnota je důležitá zejména pokud používáte maximální rychlost serva. Servo potřebuje ještě nějaký čas, aby se ustálilo na svojí pozici. Při pomalém běhu je ten čas velmi krátký, ale při rychlém přesunu se může stát, že servo ani nestihne na svojí pozici doběhnout. V takovém případě je možné tuto hodnotu zvětšit. Použitelné hodnoty jsou cca mezi 4 až 10, delší vedou ke chvění serva, kratší k nedobíhání na pozici.

Určení rychlosti serva (CV3-CV6) - rychlost znamená, kolikrát se použije každý puls. Takže pokud máme definované polohy A=100 a B=180 (1ms - 1,8ms), máme 80 kroků, takže při výchozím kmitočtu 50Hz je doba otáčení 80/50=1,6sec při rychlosti 1.
Při rychlosti 2 to bude dvojnásobně dlouho - tedy cca 3,2sec, při rychlosti 3 to bude trojnásobek, tedy 4,8sec. Pokud nastavím rychlost 0, znamená to maximální rychlost serva. (tu najdete v dokumentaci k servu a znamená rychlost otočení o 60° - cca 67kroků dekodéru)
Pokud nastavíme rychlost na hodnotu větší než 128, použije se jiná logika výpočtu. Namísto opakování kroků se použije přičítání větších čísel. Jednoduše řečeno pokud použijeme rychlost v rozsahu 128-255, dekodér odečte od zadaného čísla 127 a tolikrát rychleji servo poběží.
Několik příkladů, vždy pro první servo, vždy pro: CV#35=A=100; CV#39=B=200; CV#33=78=50Hz
Příklad 1:
CV#3=1
CV#35-CV#39=200-100=100
čas=(100*1)/50=2sec
Příklad 2:
CV#3=2
CV#35-CV#39=200-100=100
čas=(100*2)/50=4sec
Příklad 3:
CV#3=3
CV#35-CV#39=200-100=100
čas=(100*3)/50=6sec
Příklad 4:
CV#3=128
CV#35-CV#39=200-100=100
128-127=1
čas=(100/1)/50=2sec
Příklad 5:
CV#3=129
CV#35-CV#39=200-100=100
129-127=2
čas=(100/2)/50=1sec
Pozor: pro případ kdy se používá dělení nesmí první podíl (v závorce) vycházet desetinné číslo, takže pro další příklad musíme provést korekci B pozice na 199
Příklad 6:
CV#3=130
CV#35-CV#39=199-100=99
130-127=3
čas=(99/3)/50=0,66sec
Příklad 7:
CV#3=131
CV#35-CV#39=200-100=100
131-127=4
čas=(100/4)/50=0,5sec

CV33 - kmitočet; jedná se o celkem zásadní hodnotu pro servo. Většina výrobců serv uvádí, že jejich serva jsou konstruovaná pro kmitočet 50Hz, některá (Multiplex) pro 40Hz. Pokud potřebujete větší rychlost, můžete experimentovat s kmitočty 60Hz a možná i 70Hz, víc vám servo asi nedovolí.
Green is primary address
Red - time for servo 1...4
Yellow - A position for servo 1...4
blue - B position servo 1...4
Purple - rest
It is also possible to count CV - the position is equivalent to the CV no.

CV35-CV41: It is possible to find, that every servo defining position A (forward) and B (turn) separately. It means, that it is possible to setup values in different order - A=200 and B=100; it means it is not necessary to mount servo upside down.
Warning: Decoder not checking any values, usual servos working in range 0.9 - 2.1 ms (90 - 210). I was surprised by blue-arrow servos (that cheap blue one), which on wrong values start rotating.

I have added new CV43 - it means how many pulses are send to servo when it reach final position. This value is crucial especially when you are using maximum servo speed. Servo needs some time for stabilization his position. When it moves slowly, the time is short, but during a fast move it can happen, that servo not catch his position on-time. In that case is good to increase value of CV43. Useful values are between 4 and 10. Bigger values mean noise on servo, lower that servo not reaches his position.

Determining servo speed (CV3-CV6) - value means how many times is used every speed pulse. If we are moving servo from position 100 to position 180 (1ms - 1.8ms), we have 80 speed steps, with default frequency 50Hz and speed 1 it mean 80/50=1.6sec.
With speed 2 it will be two times longer - cca 3.2sec, for speed 3 it will be three times - 4.8sec.
If speed value is set-up to 0, it means maximum servo speed. (It can be found in vendor documentation)
For a speed value greater than 128 will be used different logic. Instead of repeating a pulse, the bigger adding will be used. It means, when we will use speed in a scale 128-255, decoder subtract 127 from given value and this value use for multiply speed of servo.
Few examples, always for first servo, always for: CV#35=A=100; CV#39=B=200; CV#33=78=50Hz
Example 1:
CV#3=1
CV#35-CV#39=200-100=100
time=(100*1)/50=2sec
Example 2:
CV#3=2
CV#35-CV#39=200-100=100
time=(100*2)/50=4sec
Example 3:
CV#3=3
CV#35-CV#39=200-100=100
time=(100*3)/50=6sec
Example 4:
CV#3=128
CV#35-CV#39=200-100=100
128-127=1
time=(100/1)/50=2sec
Example 5:
CV#3=129
CV#35-CV#39=200-100=100
129-127=2
time=(100/2)/50=1sec
Warning: for a case we are using dividing, the value in first brackets can not use tenths, then we will change B position to 199
Example 6:
CV#3=130
CV#35-CV#39=199-100=99
130-127=3
time=(99/3)/50=0,66sec
Example 7:
CV#3=131
CV#35-CV#39=200-100=100
131-127=4
time=(100/4)/50=0,5sec

CV33 - frequency; it is almost crucial value for servo move. Usual vendors say, that his servo is designed for 50Hz, some of (Multiplex) for 40Hz. If you need bigger speed, you can try to use with a frequency of 60Hz and also 70Hz. Bigger will not servo allow you.

CV33 Values
 CV33  f [Hz] t [sec] (A=100, B=200, speed=1)
98402,5
78502
65601,66
56701,4

Překmitnutí serva
U levných analogových serv se často stává, že při použití maximální rychlosti a velké výchylky dochází k "překmitnutí". To je přirozená vlastnost serva, pokusím se jí demonstrovat na následujícím obrázku. Servo se nachází v pozici A a dostane příkaz k okamžitému přesunu do pozice B. To je pochopitelně daleko, takže servo připojí motoru plné napájení a čeká na další puls.
Ten je stále ještě pro vzdálenou pozici, takže servo pokračuje plnou rychlostí.
Když přijde třetí puls, servo zjistí, že přejelo a tak se začne vracet.
Většinou se návrat povede na první pokus, ale může se stát, že i zde dojde k překmitu a tak servo zase provede korekci.

Z toho důvodu je nutné, aby drátovody mezi servem a vyhybkou (závorami, vraty výtopny) byli dostatečně pružné, aby dokázali tento překmit vykompenzovat.
Servo overlap
Cheap analog servos usually do with maximum speed that it will overlap. It is done by principles of servo. I will try to demonstrate it on following figure. We have servo in position A and send him command to move to position B. That is of course far. That means, that servo will connect his motor to full voltage and will wait for next pulse.
This pulse is again for far position, and then servo continues with full speed.
When third pulse will arrive, servo recognizes, that is over, then will start to go back.
Usually return will happen for first try, but it can happen, that servo overlap again and then will do last correction.

For that reason is necessary to use flexible/pliable wires for connection of servo and turnout (barriers, shed doors) to allow them to compensate this overlap.
Nastavení polohy
popis bude doplněn
Position set-up
description will be added


Download: dcc4servo_v3.xa.zip.

DCC dekodér verze 4.

Nová verze vznikla zejména proto, že jsem chtěl umožnit používat dekodér spolu se základnovou stanicí (popis ZDE)
Proto jsem změnil využití vývodů na procesoru. Bohužel jsem také musel zrušit programovací tlačítko, tím se ale modul hezky zmenšil a tlačítko stejně bylo stejně používáno maximálně jednou za život modulu. Hlavní přednosti nové verze spatřuji v korektním chování při programování a také v možnosti samostatného napájení. Bylo poněkud nepříjemné, že se všechna serva "pohnula", kdykoli bylo použito nouzové zastavení.

Tato verze dekodéru může být provozována s jakoukoli základnou. U programovacích základen není nutné blokovat brogramování ani při běžném provozu. Pokud chceme k programování použít základnu napájenou z DCC, je nutné nejprve odpojit všechna serva a pak teprve základnu přepojit na programovací svorky (PQ). Při počítání zátěže pro základnu není rozhodující počet připojených modulů, ale celkový počet serv. Je proto jedno, jestli do jedné základny připojíte jeden dekodér osazený čtyřmi servy a nebo dva dekodéry, každý s dvěmi servy.
Nastavení a vlastnosti CV jsou stejné jako v předchozí verzi.

DCC decoder in version 4

I did new version, because I would like to allow to use decoder with base stations (described HERE)
Then I changed usage of processor pins. Unfortunately I must remove programming button. Good is, that module become smaller; and of course, in normal situation button was used one time per decoder life. Main adventage of new version is, that it handles programming correctly and it allows you to use independent power source. It was wrong situation when every servo "move" when emergency stop occurs.

This version of decoder can be used with any of base station. When it is user with programming base station, it is no necessary to disable programming facility during normal usage. When you would like to program decoder using base station powered from DCC, it is necessary to remove all servos first, and then plug it to programming header (PQ). When you calculate consumption of module for base station, the amounts of decoders are not crucial, but you should count amount of connected servos. It means that it is same, you have four servos connected to one decoder, or you have two decoders, both with two servos.
Setup and usage of CVs are same as previous version.