Jindra Fučík

Jednoduchá DCC točna

Od doby, kdy jsem postavil svůj první DCC dekodér pro točnu již oběhlo hodně vody. Za tu dobu se svět mírně posunul. V oblasti robotiky vznikla nová serva založená na DYNAMIXEL Protokolu 1.0. Jedno velmi zajímavé a u nás snadno dostupné je servo Waveshare ST3215. Zároveň se na trhu objevili mimořádně levné procesory založené na otevřené architektuře RISC-V. Já jsem použil procesor CH32V003 a prostředí Arduino Core CH32.

Tato kombinace umožnila poměrně značné zjednodušení celého systému. Především došlo k zásadnímu zjednodušení hardware a mechanické stránky. Zejména pro malé točny, kde je možné přimontovat most (uzavřenou točnu) přímo na unašeč motoru. Jako například Točna ze starého CD.

Simplified DCC turn table

A lot of water has flowed under the bridge since I built my first DCC decoder for a turntable. In the meantime, the world has moved on a bit. In the field of robotics, new servos based on the DYNAMIXEL Protocol 1.0 have emerged. One particularly interesting option, and one that is readily available here, is the Waveshare ST3215 servo. At the same time, extremely affordable processors based on the open RISC-V architecture have appeared on the market. I chose to use the CH32V003 processor along with the Arduino Core CH32 environment.

This combination allowed for a significant simplification of the entire system. In particular, the hardware and mechanical aspects were substantially simplified—especially in the case of small turntables, where the bridge (the rotating platform itself) can be mounted directly onto the motor drive. An example of this would be a turntable made from an old CD.

Decoder + servo

Stejně jako u předchozí verze, i tato verze splňuje následující požadavky:

  • Dostatečná přesnost pro použití i v mém modelovém měřítku N (1:160)
  • Opakovatelnost a univerzálnost celé konstrukce
  • Ovladatelnost pomocí běžně dostupných komerčních ovladačů
  • Rozšiřitelnost systému
  • Jednoduché a autonomní ovládání, tak aby bylo možné točnu ovládat i z počítače bez zásahu obsluhy

Hardware a mechanika

Mechanická stránka se mimořádně zjednodušila použitím komerčního serva, které obsahuje všechny potřebné komponenty. Zůstává tedy jen elektronika, která se příliš neliší od elektroniky pro běžné přestavníky. Dekodér využívá opticky oddělený vstup pro DCC a nezávislé napájení. Všechny tyto komponenty jsou poměrně běžné, proto nemá cenu je řešit. Pro připojení na straně serva je pak použito doporučené zapojení podle katalogu Waveshare. Servo vyžaduje napájení v rozmezí 6 až 12 V, proto je na desce také step down regulátor. Použil jsem jednoduchý modul, který je také velmi dostupný pod různými názvy. Zde je důležité před připojením serva nastavit vhodné výstupní napětí právě podle potřeb serva.

Na následujících obrázcích je detailní fotka dekodéru a schéma dekodéru.

Same as with previous, I state following criteria for my turn table:

  • Enough accuracy for my N (1:160) scale model
  • Repeatable and universal construction
  • To be controlled via market usual controllers
  • Extendibility of system
  • Easy and autonomous control, to be possible control turn-table also from computer without operator assistance

Hardware and mechanics

The mechanical aspect has been significantly simplified through the use of a commercial servo, which incorporates all the necessary components. This leaves only the electronics, which do not differ substantially from those used for standard turnout motors. The decoder features an optically isolated DCC input and an independent power supply. Since all these components are quite standard, there is no need to discuss them in detail. For the servo connection, the configuration recommended in the Waveshare catalog is used. As the servo requires a supply voltage between 6 to 12 V, a step-down regulator is included on the board. I utilized a simple module—widely available under various names—but it is crucial to set the output voltage to the appropriate level for the specific servo before connecting it.

The following images show a detailed photo of the decoder and a schematic of the decoder.

Decoder
Schematic

Software

Jak již zaznělo, software je vytvořený v prostředí Arduino. Vzhledem k tomu, že servo komunikuje s přenosovou rychlostí 1000000 bitů za vteřinu (jeden megabit), není vhodné použít Arduino knihovny Serial, která používá prosté přerušení a softwarovou obsluhu. Místo této knihovny jsem si vytvořil jednoúčelovou knihovnu STservoS. Tato knihovna využívá modernější přístup založený na DMA přenosu. Naopak pro čtení DCC dat jsem zachoval tradiční postup založený na přerušení a čtení hardwarového timeru.

Software je k dispozici na GitHubu.

Logika

Logika zůstala v podstatě stejná jako u předchozí verze. Vzhledem k většímu výkonu procesoru bylo možné některé části nastavení zásadně zjednodušit.

Pro názornost si použijeme příklad s točnou podle následujícího obrázku. Točna potřebuje znát počet výjezdů, v našem případě máme 3. Tuto hodnotu zadáme do CV34 (výchozí hodnota je právě 3, maximum je 15). Pak také potřebujeme zadat, od jakého čísla výhybky točna počítá svou adresu. Tato informace se zadává do CV1 a CV9 celkem běžným způsobem. Výchozí hodnota je 5, což pro systémy Roco znamená od výhybky číslo 5, pro systémy Lenz to znamená od výhybky číslo 1. Zadávání adres a posouvání mezi Roco a Lenz už bylo popsáno mnohokrát a nemá cenu se k němu vracet.

Na obrázku je vidět, že točna má 3 výjezdy (paprsky). Vzhledem k tomu, že se jedná o točnu a je tedy možné lokomotivu otočit, je potřeba uvažovat všech 6 poloh, ve kterých se může točna nacházet. Pro lepší představivost je dobré pracovat s tím, kde má točna ovládací boudu. Pro první výjezd může být bouda tedy na pozici 1, nebo na pozici 1’. To v praxi znamená, že na ovladači zvolíme výhybku 1 (pokud máme počáteční adresu 1), zvolením pozice "rovně" otočíme boudu do polohy 1, zvolením pozice "do odbočky" otočíme boudu do polohy 1’. Identicky pro výjezdy 2 a 3. Pochopitelně je vhodné si vytvořit vhodný ovládací panel založený například na XbusTCO, který bude názorněji vyjadřovat polohu točny.

Točna používá ještě jednu další adresu. V našem případě by se jednalo o adresu 4. Na této adrese lze ručně ovládat otočení. Tedy na ovladači navolím adresu 4 a stiskem tlačítka "do odbočky" se točna velice pomalu začne točit v jednom směru, stiskem tlačítka "rovně" pak v druhém směru. Po uvolnění tlačítka se zastaví.

Stejně jako u předchozí verze, tak i u této je poloha snímána pomocí snímače s přesností 12 bitů. Kruh je tedy rozdělen na 4096 kroků. Proto jako u předchozí verze i tady je pro každý výjezd poloha uložená do dvou CV.

Software

As previously mentioned, the software is developed within the Arduino environment. Given that the servo communicates at a data rate of 1,000,000 bits per second (one megabit), the standard Arduino Serial library, which relies on basic interrupts and software based handling, is unsuitable. Instead, I created a dedicated library called `STservoS`, which employs a more modern approach based on DMA (Direct Memory Access) transfers. Conversely, for reading DCC data, I retained the traditional method based on interrupts and hardware timer readings.

The software is available on GitHub.

Logic

The logic remains essentially the same as in the previous version. Thanks to increased processor performance, it has been possible to significantly simplify certain aspects of the configuration.

To illustrate this, let’s look at the example of a turntable shown in the image below. The turntable needs to know the number of exits. In this case, there are 3. This value is entered into CV34 (the default value is 3; the maximum is 15). We also need to specify the turnout number from which the turntable begins counting its addresses. This information is entered into CV1 and CV9 in the standard manner. The default value is 5; for Roco systems, this means starting from turnout number 5, while for Lenz systems, it means starting from turnout number 1. The process of assigning addresses and the differences between Roco and Lenz systems have been described many times, so there is no need to repeat them here.

As shown in the image, the turntable has 3 exits (spokes). Since it is a turntable, meaning a locomotive can be rotated, we must account for all 6 possible positions in which the turntable can be oriented. To make this easier to visualize, it is helpful to consider the location of the turntable's control cabin. For the first exit, the cabin could be in position 1 or position 1’. In practice, this means that if the starting address is 1, you select turnout 1 on your controller: choosing the "straight" position rotates the cabin to position 1, while choosing the "diverging" (turnout) position rotates it to position 1’. The same applies to exits 2 and 3. Naturally, it is advisable to create a suitable control panel, for instance, one based on the XbusTCO system, to provide a clearer visual indication of the turntable's position.

The turntable utilizes one additional address; in our case, this is address 4. This address allows for manual control of the rotation. By selecting address 4 on the controller, pressing the "turnout" (diverging) button causes the turntable to rotate very slowly in one direction, while pressing the "straight" button causes it to rotate in the opposite direction. Releasing the button brings it to a stop.

As with the previous version, the position is detected by a sensor with 12-bit resolution. The full circle is thus divided into 4,096 steps. Consequently, just as in the previous version, the position for each exit is stored across two CVs (Configuration Variables).


CV Values
CV#defaultmin-maxvýznammeaning
15 (vyh. 5-8)0-255Primární adresa, spodní polovinaPrimary address, low half
300-255Uložená pozice, část 1 (pouze pro čtení)*Saved Position, part 1 (read only)*--
400-255Uložená pozice, část 2 (pouze pro čtení)*Saved Position, part 2 (read only)*
71.00-255Verze (pouze pro čtení)Version (read only)
8130-255ID výrobce (pouze pro čtení)Manufacturer ID (read only)
900-255Primární adresa, horní polovinaPrimary address, high half
29128128Konfigurace (pouze pro čtení)Configuration (read only)
33101-255Rychlost otáčeníRotation speed
3431-255Počet výjezdůNumber of exits
350 (00 hex)0-255Pozice 1 rovně, část 1*Position 1 straight, part 1*(00 00 hex = 0)
360 (00 hex)0-255Pozice 1 rovně, část 2*Position 1 straight, part 2*
370 (00 hex)0-255Pozice 1 do odbočky, část 1*Position 1 turn, part 1*(08 00 hex = 2048)
388 (08 hex)0-255Pozice 1 do odbočky, část 2*Position 1 turn, part 2*
39170 (AA hex)0-255Pozice 2 rovně, část 1*Position 2 straight, part 1*(02 AA hex = 682)
4002 (02 hex)0-255Pozice 2 rovně, část 2*Position 2 straight, part 2*
41170 (AA hex)0-255Pozice 2 do odbočky, část 1*Position 2 turn, part 1*(0A AA hex = 2730)
4210 (0A hex)0-255Pozice 2 do odbočky, část 2*Position 2 turn, part 2*
4384 (54 hex)0-255Pozice 3 rovně, část 1*Position 3 straight, part 1*(05 54 hex = 1364)
445 (05 hex)0-255Pozice 3 rovně, část 2*Position 3 straight, part 2*
4584 (54 hex)0-255Pozice 3 do odbočky, část 1*Position 3 turn, part 1*(0D 54 hex = 3412)
4613 (0D hex)0-255Pozice 3 do odbočky, část 2*Position 3 turn, part 2*
... až do 15 / up to 15 ...
910 (00 hex)0-255Pozice 15 rovně, část 1*Position 15 straight, part 1*(00 00 hex = 0)
920 (00 hex)0-255Pozice 15 rovně, část 2*Position 15 straight, part 2*
930 (00 hex)0-255Pozice 15 do odbočky, část 1*Position 15 turn, part 1*(00 00 hex = 0)
940 (00 hex)0-255Pozice 15 do odbočky, část 2*Position 15 turn, part 2*

* Poznámka: tyto CV lze nastavovat také zápisem do CV8 - viz dole
* Note: this CV can be modified also by writing into CV8 - see bottom

Vzhledem k tomu, že nastavování CV pro koncové polohy je poněkud náročné (trefovat se do 4096 hodnot zabere dost času), rozhodl jsem se přidělat ještě jednu možnost nastavování.
Pokud točnu nastavíme do správné polohy (s použitím ručního otáčení pomocí adresy 4 a pak provedeme zápis do CV8, tak se aktuální poloha uloží do příslušné dvojice CV.
Pokud zapíšeme do CV8 hodnotu 0, zapíše se hodnota do CV 3 a 4, odkud je pak lze číst běžným způsobem.
Pokud zapíšeme do CV8 hodnotu 1, zapíše se hodnota do CV 35 a 36 - koncová pozice 1 rovně.
Pokud zapíšeme do CV8 hodnotu 2, zapíše se hodnota do CV 37 a 38 - koncová pozice 1 do odbočky.
Pokud zapíšeme do CV8 hodnotu 3, zapíše se hodnota do CV 39 a 40 - koncová pozice 2 rovně.
Pokud zapíšeme do CV8 hodnotu 4, zapíše se hodnota do CV 41 a 42 - koncová pozice 2 do odbočky.
Pokud zapíšeme do CV8 hodnotu 5, zapíše se hodnota do CV 43 a 44 - koncová pozice 3 rovně.
Pokud zapíšeme do CV8 hodnotu 6, zapíše se hodnota do CV 45 a 46 - koncová pozice 3 do odbočky.
Až pro poslední ...
Pokud zapíšeme do CV8 hodnotu 30, zapíše se hodnota do CV 93 a 94 - koncová pozice 15 do odbočky.

Pokud zapíšeme do CV8 hodnotu 33, provede se nastavení dekodéru do výchozích hodnot. (reset všech CV)
Pokud zapíšeme do CV8 hodnotu 34, provede se rozdělení kruhu na tolik pozic, kolik je hodnota CV34 a zapíše se do příslušných CV. To je velmi dobré pro první nastavení

Because setting up CV for end positions is little complicated (pointing to 4096 values is time consuming), I decided to add one optional method of programming.
When you rotate table to requested position (using manual turn via address 7 and 8, or mechanically disconnect motor/gear box and rotate table manually to requested position) and then write to CV8, then actual position will be stored to requested pair of CV.
When we will write value 0 to CV8, position will be stored in CV3 and CV4 (useful for following read)
When we will write value 1 to CV8, position will be stored in CV35 and CV36 (end position 1 straight).
When we will write value 2 to CV8, position will be stored in CV37 and CV38 (end position 1 turn).
When we will write value 3 to CV8, position will be stored in CV39 and CV40 (end position 2 straight).
When we will write value 4 to CV8, position will be stored in CV41 and CV42 (end position 2 turn).
When we will write value 5 to CV8, position will be stored in CV43 and CV44 (end position 3 straight).
When we will write value 6 to CV8, position will be stored in CV45 and CV46 (end position 3 turn).
up to last...
When we will write value 30 to CV8, position will be stored in CV93 and CV94 (end position 15 turn).

When we will write value 33 to CV8, all CVs are restored to manufacturer defaults (factory reset)
When we will write value 34 to CV8, cyrcle is divided to amount of slices per CV34 and all position CVs are updated. It is very good for start of programming