DCC Servo decoder met Arduino voor dummy’s

Gestart door NTeering, 13 november 2015, 15:10:19 PM

NTeering

Even voorstellen,

Mijn naam is Nico Teering uit het Nederlandse Drunen (Noord Brabant). Sinds begin dit jaar ben ik weer begonnen met modelspoor. Gezien mijn beperkte ruimte wil ik een baan maken in schaal TT.
Daartoe heb ik eerst een kleine testbaan gemaakt om daarmee alle technische problemen problemen en oplossingen in kaart te brengen. Hoe dat allemaal gegaan is kun je hier allemaal teruglezen: http://forum.beneluxspoor.net/index.php/topic,63567.0.html.
Zoals je daar kunt lezen wil ik alle technische zaken realiseren met een Arduino microcomputer. Voor velen is dat wellicht nog een ver-van-mijn-bed-show.
Om ook de geïnteresseerden met minder technische kennis te helpen heb ik voor de Arduino een universeel programma gemaakt voor een DCC servo decoder t.b.v wisselaandrijving.
Daarover gaat deze bijdrage.

Inleiding
Het gebruik van een Arduino microcomputer in de modelspoorbouw is bij velen wel bekend.
Echter het daadwerkelijk zelf toepassen is voor de meesten een brug te ver.
Het programmeren of het doen van eenvoudige aanpassingen in een programma wordt toch als een groot probleem gezien.
Daardoor blijft de Arduino het domein van een zeer beperkte groep met wat meer technische kennis.
Dat is jammer, want met de Arduino kun je heel je modelspoorbaan goedkoop automatiseren.
Om de Arduino voor iedereen bereikbaar te maken heb ik daarom een programma gemaakt voor een DCC servo decoder op basis van een Arduino.
Met dit programma is het niet meer nodig om zelf nog maar één letter Arduino-code te schrijven.

Net als bij iedere andere servo decoder moet deze nog wel geconfigureerd worden. Dit configureren wordt meestal ten onrechte programmeren genoemd.
Om spraakverwarring te voorkomen gebruik ik de term programmeren voor het schrijven van de Arduino-code en de term configureren voor het uitvoeren van het programma. Bij dit configureren worden de servo's ingesteld.

Het programma werkt in twee verschillende 'toestanden'.
In de configureerstand kunnen de servo's worden ingeregeld middels één-letter commando's vanaf het toetsenbord. Hierbij communiceert de decoder via een USB-kabel met de computer. Hier zijn dus geen DCC signalen voor nodig.
Middels een specifiek commando ('E') wordt overgegaan naar de bedrijfstoestand.
In de bedrijfstoestand worden de servo's aangestuurd met het DCC signaal. Er is dan geen USB-kabel meer nodig. Door het sturen van een specifiek, zelf te bepalen, DCC adres wordt weer overgeschakeld naar de configureerstand.

Waarom een Arduino?
De belangrijkste reden is de prijs. Reken even mee:
•   Een (kloon)Arduino kost maximaal €3,00 zonder USB kabel.
•   Een servo (SG92R) kost ongeveer €2,30.
•   Twee relais inclusief aansturing middels optocoupler kosten ongeveer €1,50.
•   Dupont aansluitkabel voor €1,00.
•   Extra losse componenten voor het verwerken van het DCC signaal kosten €2,00.
Voor 9 wissels met puntstukpolarisatie kost dat: €3,00 + 9x€2,30 + 5x€1,50 + €1,00 + €2,00 = €34,20.
Dat is dus ongeveer €3,80 per wissel inclusief servo's en relais. Alle software is gratis.
Daar kan geen één commercieel product tegenop.
Voor 12 wissels zonder puntstukpolarisatie kost het €2,80 per wissel inclusief servo.

Een andere reden is het gemak waarmee alles geconfigureerd kan worden. Dat gebeurt geheel interactief en er is geen DCC-centrale voor nodig.

De installatie van alle software is zeer gebruiksvriendelijk. Hierbij wordt alle vereiste software in één keer geïnstalleerd. Ook het uploaden van het decoder programma naar de Arduino gaat geheel automatisch.

Mogelijkheden
•   Besturen van maximaal 12 servo's t.b.v.  wisselaansturing zonder puntstukpolarisatie of maximaal 9 servo's met puntstukpolarisatie. De puntstukpolarisatie wordt gerealiseerd middels een extern relais.
•   Interactief, via beeldscherm en toetsenbord dus, configureren van de servo's. Dat is geheel onafhankelijk van de gebruikte DCC centrale.
•   Van iedere servo apart kunnen de begin- en eindhoek op de graad nauwkeurig worden ingesteld.
•   Een random DCC adres (1-2048) toekennen aan iedere servo.
Dus niet noodzakelijkerwijs opeenvolgende adressen.
•   Iedere servo (max. 9) kan worden gekoppeld met een relais voor puntstukpolarisatie.
Bij het verdraaien van de servo zal ook, halverwege de verdraaiing, dit relais worden omgezet.
•   Een test optie waarbij alle servo's een aantal malen heen-en weer gaan.
•   Vastleggen van 'inversie'. Hiermee kan worden ingesteld of een wissel bij bv een verdraaiing naar de kleinste hoek rechtdoor of afbuigend moet worden gezet. Dit is nodig omdat de servo op meerdere manieren gemonteerd kan worden.
•   Een documentatie optie waarmee alle instellingen worden getoond.
•   Het toekennen van een administratief nummer aan iedere servo.
•   Een reset optie waarbij alle instellingen uit het geheugen van de Arduino verwijderd worden.
•   Instelbare snelheid van de servo arm (5-50 msec. per graad).
•   Het vastleggen van het DCC adres waarmee de decoder naar de configuratie toestand gaat.
•   Een help optie toont alle commando's voor het configureren.

Het programma zelf is Engelstalig. De handleidingen zijn in het Nederlands.
Uiteraard gaat het om een eerste beta versie. Dus ik ben bij deze verontschuldigd voor eventuele fouten.

Een voorbeeld dialoog:
Arduino servo decoder, Version 0.1

Starting configuration
Set DCC address for entering configuration mode  (1-2048): 1000
Configuration address set to 1000

Please specify action (P/R/T/D/M/E/G/?):P

Please specify pin number
(3,4,5,6,7,8,9,10,11,12,14,15) 3
Servo on pin 3 set to angle: 75; LOW angle: 75, HIGH angle: 105

The selected pin number is 3

Please specify action for pin 3 (9/+/-/C/P/R/T/A/I/D/N/F/E/G/?): A
Set DCC address for pin 3 (0-2048): 55
Address set to 55

Please specify action for pin 3 (9/+/-/C/P/R/T/A/I/D/N/F/E/G/?): N
Specify turnout number on pin 3 (1-2048): 44
Number set to 44

Please specify action for pin 3 (9/+/-/C/P/R/T/A/I/D/N/F/E/G/?): F
Specify pin number for frog point polarisation:
(0,1,3-12,14-19,99=remove frogpin): 12
Pin 12 set as frogpin for servo on pin 3
Please specify action for pin 3 (9/+/-/C/P/R/T/A/I/D/N/F/E/G/?): -
Servo on pin 3 set to angle: 74; LOW angle: 74, HIGH angle: 105

Please specify action for pin 3 (9/+/-/C/P/R/T/A/I/D/N/F/E/G/?): C
Angle changed to HIGH
Servo on pin 3 set to angle: 105; LOW angle: 74, HIGH angle: 105

Please specify action for pin 3 (9/+/-/C/P/R/T/A/I/D/N/F/E/G/?): +
Servo on pin 3 set to angle: 106; LOW angle: 74, HIGH angle: 106

Please specify action for pin 3 (9/+/-/C/P/R/T/A/I/D/N/F/E/G/?): D
Pin 0 is not used
Pin 1 is not used
Pin 3 for turnout 44 with DCC address 55 uses angles 74/106 and no inversion; frogpin 12
Pin 4 is not used
Pin 5 is not used
Pin 6 is not used
Pin 7 is not used
Pin 8 is not used
Pin 9 is not used
Pin 10 is not used
Pin 11 is not used
Pin 12 is frogpin for turnout on pin 3
Pin 14 is not used
Pin 15 is not used
Pin 16 is not used
Pin 17 is not used
Pin 18 is not used
Pin 19 is not used

Move speed is 20 msec. per step
DCC address to start configuration mode: 1000


In deze dialoog gebeurt het volgende:
- DCC-adres toekennen (1000) voor configuratietoestand
- Selecteren van Pin 3
- Een DCC-adres toekennen aan pin 3 (55)
- Een administratief nummer toekennen aan deze wissel (44)
- De 'lage' hoek een graad aflagen.
- Met het C-commando de 'hoge' hoek selecteren.
- Deze hoek met één graad ophogen.
- Met het D-commando een overzicht tonen.

Meer weten?
Bekijk eens de volledige handleiding!
Of de installatiehandleiding!
Alle software (gezipt) kun je hier downloaden!
Als je de Arduino IDE al geïnstalleerd hebt kun je volstaan met alleen de Arduino sketch met de DCC library.

Wie durft?

dani

WELKOM
HEEL interessant, en heel leerrijk, maar toch zijn er hier al mensen die even diep of dieper in deze materie zitten, die ook de stap gezet hebben.
Misschien leuk om eens ervaringen uit te wisselen.

Mag ik er trouwens op wijzen dat het een microCONTROLLER is en geen computer,  niet om te willen muggenziften, maar zomaar.
Er zijn trouwens hier op 't forum al mensen die net hetzelfde hebben gerealiseerd met PIC  microcontrollers, dus ik denk dat als we al die knappe koppen bij elkaar steken, we bergen kunnen verzetten !!!
De kruik is te water gegaan...
De kruik is niet meer.

NTeering

@Dani,
Bedankt voor je reactie.
Toch maar even opgezocht:
De ontwikkeling van de techniek en van de toepassingen van microcomputers is gepaard gegaan met evolutie van de gebruikte termen:

    microcomputer voor kantoor, hobby en communicatie: homecomputer → personal computer → laptop → notebook → PDA → tablet
    microcomputer voor besturing: PLC → embedded systeem → microcontroller


Dus een microcontroller is een microcomputer specifiek bedoeld voor besturing.
Een Arduino is dus een computer van het type microcontroller.

Natuurlijk zijn er mensen die hier ook veel af weten. Maar mijn bedoeling met dit servo decoder programma is juist het bereiken van diegenen die er nog niet zoveel van af weten. Er wel van gehoord hebben, maar niet weten hoe een en ander te realiseren.
Een standaard Arduino board is dan weer een stuk simpeler dan een PIC-controller waar misschien nog van alles omheen moet worden gebouwd.

Nico

dani

Dat laatste klopt maar ik spreek uit ervari g als ik zeg dat het arduino bordje een instap is.
Eens je projecten bouwt dan grijp je sowieso terug naar de bare minimun chip en maakt de rest er rond zelf naar je behoefte. Het wordt het er dqn enkel maar goekoper op want een Atmel328 chip heb je nu al voor een euro... En dat is het hart van de ardui o Uno, Pro mini, Nano en nog ...
De kruik is te water gegaan...
De kruik is niet meer.

Geert

Mooie bijdrage Nico, en welkom op dit forum.

Heb je de DCC decodering zelf geschreven?


Geert
Schaal H0 - digitaal zelfbouw - Favoriete Lok: V200 DB

NTeering

Hallo Geert,

Ja, ik heb het programma grotendeels zelf geschreven.
In ieder geval 90% ervan, want dat is het configuratie deel.
Voor het DCC deel heb ik geleend bij Ruud Boer.
https://rudysmodelrailway.wordpress.com/
De DCC library is van Mynabay. (https://github.com/MynaBay/DCC_Decoder)

minitreintje

Mooi projectje! Zelf ben ik ook met Arduino bezig en ik heb hier ook een draadje lopen:
Trainduino

Zelf gebruik ik de DCC library van Alex Shepard in plaats van Mynabay omdat ik vind dat deze gemakkelijker en uitgebreider is.

groeten Dylan
Märklin C-rail modulebaan met Arduino

adrievans

Goed initiatief,zeker voor beginners zoals ik.
Als je ooit een programma wilt schrijven voor een stappenmotor wordt ik helemaal blij.
Ben aan het proberen een draaischijf aan te sturen.

NTeering

@Adrie

Daar zijn toch talloze voorbeelden van te vinden.  Google op Arduino stappenmotor.

adrievans

Citaat van: NTeering op 15 november 2015, 09:36:57 AM
@Adrie

Daar zijn toch talloze voorbeelden van te vinden.  Google op Arduino stappenmotor.

Weet ik,maar voorlopig kom ik nog niet verder dan continu 1 kant op draaien of om de zoveel tijd wisselen van draairichting.
Maar 4 sporen vastzetten met 4 knopjes is nog wat te hoog gegrepen voor mij.

dani

... en dan nog gezwegen om het geheel via DCC of MM protocol aan te sturen vermoed ik.

Adrie, ik heb een tijd geleden een stukje programma gemaakt voor het sturen van een  schiebebuhne op basis van een oude flatbedscanner.

Het staat niet 100% op punt maar als het klaar is contacteer ik je.
Anderzijds zou het in principe niet zo moeilijk mogen zijn, 4 knopjes, 4 posities....

Het zal een kwestie zijn van eerst een TEST programma te maken om de stappen tussen elk van de posities te tellen.

A.  een knopje  "vooruit"
B. een knopje "achteruit"

Bij elke druk op de knop doe je de stepper 1 stap  (ik veronderstel dat je full step werkt, maar dat maakt niet zo veel uit, je gaat alleen meer moeten tellen) links of rechts om tot je op je punt bent waar je wil zijn.  (je kan ook per 5 of 10 stappen werken).

En dan is het een kwestie van tellen.   Als je clever bent, dan voorzie je een 3de en 4de knopje  "set NUL"  en "toon Counter"

Dan kan je daar op drukken bij elke "goede" positie en kan je arduino het telwerk voor jou doen.
Wanneer je op "toon counter" drukt, kan je dan de arduino naar je USB poort het aantal getelde steps laten doorprinten.

eitje  ....  :-)

Volgens mij duurt het hier neertikken van de werkwijze langer dan het schrijven van het programma...   

De kruik is te water gegaan...
De kruik is niet meer.

NTeering

@Adrie,

Heb je niks aan de voorbeelden van stepper library?
C:\Program Files (x86)\Arduino\libraries\Stepper\examples

Nico

dani

het is vooral een kwestie van de situatie analyseren, in kleine stapjes (figuurlijk dan) onderverdelen en die dan vertalen naar een programma.

Een tip : probeer niet alles ineens perfect te krijgen, werk op een basis en verfijn dan.  Het zal misschien lang(er) duren maar je gaat leren uit je foutjes en je gaat waardevolle dingen mee dragen uit je experiment.
De kruik is te water gegaan...
De kruik is niet meer.

adrievans

Dani/Nico,
Voorlopig nog aan het zoeken naar een bestaand iets,zelf programmeertaal schrijven of aanpassen moet ik inderdaad stapje voor stapje leren.Een accolade,haakje puntje of komma is snel vergeten.  :(

dani

vooral niet bang van zijn , gewoon DOEN !  de compiler in de Arduino SDK zal je wel op je fouten wijzen en zorgen dat je ze kan verbeteren.
De kruik is te water gegaan...
De kruik is niet meer.