Povedlo se mi odladit většinu problémů a tak sem dám kód k DCC přesuvně a popíšu řešení.
EDIT - doplněno a upraveno podle příspěvku níže, problémy odstraněny.
Co to umí:
- přesunout most do požadované pozice na pokyn DCC ovladače (zadáním adresy) nebo na pokyn tlačítka
- pomalé rozjezdy a dojezdy
- zkalibrovat výchozí polohu najetím na koncový optosenzor, opět skrz DCC nebo tlačítko
- okamžitě zastavit při povelu stop z ovladače (při odpojení DCC signálu z kolejiště) nebo při stisku nouzového tlačítka
Co to neumí:
- nastavovat jakékoliv parametry skrz DCC centrálu; základní adresa (zde 200) je zadaná v konfiguraci programu a další pozice jsou adresy po ní následující do počtu poloh přesuvny
- řídit mikrokrokování nastavením programu (dle mých zkušeností je nejlíp to vyzkoušet a pak zapojit natvrdo).
Potřebný software:
- knihovna NMRA DCC pro spolupráci s DCC protokolem. Obsažená v Arduino IDE, více zde:
https://mrrwa.org/- knihovna Accelstepper pro plynulé rozjezdy a zastavení a pro přímé zadávání cíle. Obsažená v Arduino IDE, dokumentace zde:
https://www.airspayce.com/mikem/arduino/AccelStepper/Potřebný hardware:
- Arduino Nano, stačí čínská verze (nutno stáhnout USB drivery)
- driver krokových motorů A4988 (trimrem je potřeba nastavit proudové omezení podle proudu motoru)
- koncový spínač (optosenzor, např.
https://www.aliexpress.com/item/1908175930.html)
- optočlen pro vstup DCC signálu z kolejiště - schéma níže, je dobré využít tento obvod, protože tvaruje signál, Fulda doporučuje i low-pass filtr pro odstranění rušení
- druhý optočlen pro získání informace o napětí v koleji (schéma doplním, ale v principu to samé, je-li DCC přítomno, tak tranzistor optočlenu zkratuje vstup Arduina proti zemi)
- tlačítka
- krokový motor, dvojfázový (4 dráty)
Co je kam zapojeno, je popsáno na začátku programu a okomentováno (zatím anglicky, můžu vám to přepsat, pokud bude zájem). Taky dále na obrázku.
Popis kódu:
Na začátku je definice vstupů a výstupů, následuje definice proměnných a parametrů.
DCC část - funguje s využitím přerušení na pinu 2, jakmile dorazí paket, převede se na číslo pozice. Je-livýsledek 0, zavolá se buď rutina pro najetí na optoseznzor (moveToHome), je-li výsledek jiné číslo z rozsahu pozic přesuvny, volá se rutina pro najetí na pozici (moveToPosition).
Tlačítková část - obsažena v hlavní smyčce, volají se tlačítka a získané číslo se opět převede na číslo pozice. Je-li pozice 0, skáče se hned na rutinu pro najetí na optosenzor, jinak se jede na zadanou pozici.
Tlačítka se načítají pomocí opakovaného čtení stavu vstupu pro potlačení zákmitů (pollButtons).
No a to je vše. Nejsem programátor, tohle je můj první program po 30 letech, tak tam najdete spoustu chyb a sám se chci na něco zeptat (viz dále), takže omluvte nelogičnosti, ale funguje to.
Poděkovat musím zejména Fuldovi za nakopnutí, že jsem se do toho vůbec pustil a za nasměrování kde hledat. Pak už to bylo jen o zavaření hlavy.
Využil jsem i funkce pro volání tlačítek od Michaela Hardwicka a pak příklady z knihoven.
Naopak, funkci nouzového stopu v Accelstepperu pokud vím nikdo nemá, tak jsem možná první.
Kód je ke stažení zde:
Zapojení DCC vstupu:
Drátovací schéma pro začátečníky, bez DCC, jen na tlačítka:
Pozn: šedé vodiče mezi Arduinem a driverem A4988 není třeba zapojovat hned, pokud nepoužijete mikrokrokování.
Motor zapojte podle toho, jaký máte (viz popis výstupů u destičky driveru)
Video ze zkoušek:
https://youtu.be/4BvjTdgR-HEDalší informace a zdroje:
https://mrrwa.org/2017/12/23/dcc-contro ... or-driver/ - DCC točna
https://mrr.trains.com/videos/layout-vi ... aging-yard - přesuvna na ovládání tlačítky, tohle jsem upravil pro svůj první pokus
https://mrr.trains.com/-/media/Files/PD ... olcode.pdf - kód k přesuvně výše
https://how2electronics.com/control-ste ... r-arduino/ - jak řídit motor s plynulým rozjezdem a dojezdem, dobrá záležitost.
https://www.rmweb.co.uk/community/index ... duino-uno/ - fórum o stavbě točny, ale trochu se to pak rozvolnilo
Poznámka na závěr níže již neplatí, opraveno. Ale nechám to tu jako doklad vývoje.
Je tam jeden zádrhel, ale funkci nevadí. Týká se volání procedur a rozdílného postupu programu při zadání funkce Home (Pozice 0) při stisku tlačítka a při zadání skrz DCC.
Pokud byste někdo měli chuť mi pomoct, ozvěte se mi (nejlíp tady, aby viděli všichni) a já to popíšu blíž. Díky předem.