Arduino DCCIntroduction

DCC is de digitale interface om te praten met modeltreinen. De beschrijving van de standaard is beschikbaar op de website van de Engelse National Model Railroad Association. Ik leg het hier ook uit, dus je hoeft niet meteen die saaie boeken in te duiken.

De signalen die naar de treinen worden gezonden bestaan uit 2 delen. Een deel geeft stroom en een ander deel geeft opdrachten. Stroom is nodig om de trein te laten rijden, licht te laten branden en voor extra functies als stoom, geluid, beweging etc. Er moet continue stroom naar de treinen lopen voor al deze functies.

Daarnaast zijn er de opdrachten, dit zijn de stuursignalen. Dit kan zoiets zijn als "ga vooruit rijden". Of "zet de koplampen aan". De verdere beschrijving van de inhoud van de DCC opdrachten staat beschreven onder treinen.



Arduino DCCBipolair signaal

Stroom moet er continue zijn. Dat is het uitgangspunt. Hoe is het dan mogelijk om ook nog signalen mee te sturen. Wel dat doet men door de stroom heel even de andere kant op te laten lopen.

De stroom loopt bijvoorbeeld linksom. Om nu een bericht over te zenden laat men de stroom heel even de andere kant op lopen (rechtsom). En daarna weer dezelfde tijd gewoon linksom. Daarna kan men het volgende bericht gaan sturen. De ontvanger ziet dat het signaal de andere kant op gaat, dan weer teruggaat en is dan klaar voor de volgende informatie.

In de digitale wereld gaat het alleen op nullen en enen. Op een of andere manier moest er dus een onderscheid tussen een 1 en een 0 worden bepaald. Dit heeft men gedaan door de lengte van een wisselen (rechtsom + linksom) anders te bepalen voor een 1 en een 0. Voor een 1 laat men eerst 58 microseconden de stroom andersom lopen en daarna nog eens 58 microseconden de originele richting op. Voor een 0 doet men dir voor 100 microseconden andersom en 100 microseconden normaal.

Om dus een 1 te verzenden kost het dus in principe 58+58 = 116 microseconden. Hierin zit wel een marge dat een blok een lengte mag hebben tussen de 55 en 61 microseconden. Voor de 0 moet de lengte liggen tussen 95 ondergrens en 10000 microseconden als bovengrens. (Nee die tienduizend is geen typo). Dit bedrag is zo lang om met een stretched 0 om te kunnen gaan. Dat is gewoon een periode waarin er niets zal worden gezonden.

Dus samenvattend hebben we een signaal nodig dat continue voeding geeft maar continue kan wisselen tussen + en -. Dit noemen we een bi-polair signaal.

Wat nu met die 1tjes en 0len. Wel die kun je combineren. Een 1 of 0 noem je een bit. Het combineren van bits gebeurd continue op je computer. 8 bits vormen samen een byte.



Arduino DCCDe oplossing

Om een DCC trein te kunnen aansturen met de Arduino moet de Arduino dus een signaal sturen dat afwisselend positief (linksom) en dan weer negatief (rechtsom) is, binnen een hard gedefinieerd tijdschema. Ook moet het voltage en spanning hoog genoeg zijn om meerdere treinen te kunnen laten rijden. De Arduino kan dat niet. De problemen:

  • Het signaal van de Arduino wisselt tussen 0V en 5V.
  • Het vermogen is te weinig, maximaal 5V ipv de gevraagde 15 Volt.
  • De spanning is te laag: 20mA in plaats van 500mA.
  • Tijdschema, dit zou mischien nog wel kunnen, maar dan is de Arduino te druk bezig met dit te bepalen om nog iets anders te kunnen doen.

Je ziet dat we nu een probleem hebben. Voor ieder probleem is echter gelukkig ook een oplossing en dat is hier gewoon extra speciale hardware.



Arduino DCCMotor shield

De Arduino beschikt over een hele rits female pins. Deze zitten boven en onder op de Arduino. Een shield is een hardware plaatje met male pins. Deze zet je op de Arduino (zeg maar op zijn rug) en de male pins van de shield passen perfect in de female pins op de Arduino. Op het shield kunnen extra hardware functies worden gezet. De motor shield waar we het hier over hebben bevat volop functies, waarvan er een aantal precies zijn wat we zoeken:

  • Functie om het signaal om te zetten naar een +V naar een -V.
  • Functie om het vermogen op te krikken naar gevraagde 15 Volt.
  • Functie om de spanning op te hogen naar minimaal 500mA.

Het shield kan deze functies leveren doordat het beschikt over een eigen processor, de L298 chip, dat is een dual full-bridge driver ontworpen om belastingen zoals relais, elektromagneten, DC en stappenmotoren te besturen. Precies wat we willen.

De motorshield zal de waarde op pin3 (LOW / HIGH)omzetten output (LOW / HIGH) op UITVOER-A. En op dezelfde manier zal de waarde op pin11 (LOW / HIGH) de output op UITVOER-B (LOW / HIGH) regelen. Hiermee kan handig een motor worden aangestuurd. Enorm handig, maar voor onze toepassing niet bruikbaar. We willen immers continue het hoge voltage en de richting ervan bepalen.

De hoogte van het voltage op UITVOER-A en UITVOER-B zal hierbij gelijk zijn aan het voltage op POWER-INVOER.

De pins 12 en 13 bepalen de richting van de stroom. Pin 12 voor UITVOER-A en pin 13 voor UITVOER-B. Bij een LOW spanning zal de stroom de ene kant op lopen. Bij een HIGH voltage de andere kant op. Deze pins zijn echter niet geactiveerd voor PWM (zie verderop). Wat we gaan doen is om pins die wel zijn geactiveerd voor PWM (5 en 10) te koppelen aan deze pins die de richting van de stroom bepalen.

We gaan hiervoor pin5 op het shield doorlussen naar pin13. En pin10 naar pin12. Hierbij zetten we de PWM om naar de direction. Of wat wij willen ons PWM kanaal met hierop controle over de lengte gaan we op het uitvoer kanaal gebruiken om de waarde daar om te wisselen. Hierbij zal bij iedere verandering van LOW naar HIGH (0V > 5V en andersom) op het PWM kanaal, de stroomrichting op het uitvoer kanaal wisselen (bij powerinvoer van 15V dus van +15V naar -15V en omgekeerd). Hiermee hebben we dus precies bereikt wat we willen!



Arduino DCCPulse Width Modulation

Van het problemen lijstje hebben we de eerste 3 opgelost door het gebruik van de motorshield. Het oplossing van de timing controle hebben we nog niet besproken. We willen output sturen met een lengte van 58 e/o 100 microseconden zonder hiervoor de processor kracht van de Arduino te hoeven gebruiken. Die moet andere dingen doen.

Op het Arduino zitten enkele uitgangen met een ~ voor het pin nummer. Dit zijn de pins 3, 5, 6, 9, 10 en 11. De tilde wil zeggen dat deze pins beschikken over Pulse Width Modulation functionaliteit. PWM functies controleren de lengte van signalen op de pins. Dit gebeurd door functionaliteit op het Arduino bord, maar zonder dat dit ten koste gaat van de rekenkracht van de Arduino processor. Je kunt dit zien als een soort 'slaaf' die los van de 'meester' aan het werk is.

Een eigenschap van de Arduino is wel dat iedere pulse dezelfde vaste lengte (duration) heeft. De Arduino heeft wel functies om de lengte van het eerste deel van de pulse aan te passen. Dit gaat dan wel ten koste van het 2e deel van de pulse. De ratio zal dus veranderen, dat willen we niet want het DCC signaal wil een 50% / 50% ration hebben.

Om dit te kunnen afhandelen gebruiken we een andere build in functie, timer counters.

  • Timercounter 0, voor pin 5 en 6
  • Timercounter 1, voor pin 9 en 10
  • Timercounter 2, voor pin 11 en 3

We gaan het timercounter mechanisme misbruiken. Pins 6, 9 en 3 hebben we hiervoor niet nodig. De karakteristieken van Timercounter 2 zijn niet geschikt voor wat we willen doen waardoor ook pin 3 weg valt. We hebben dus pin 5 en 10 over. We gaan PIN-5 gebruiken voor het DCC programmeer spoor en PIN-10 voor de hoofdbaan.



Arduino DCCAansluiten

Het aansluiten is nu natuurlijk gemakkelijk. De UITVOER-A en UITVOER-B kunnen direct op de rsils worden aangesloten. Bijvoorbeeld voor UITVOER-A op het programmeerspoor en UITVOER-B op de echte baan.



Arduino DCCStroom

Nog een klein puntje voordat we kunnen gaan rijden. En dat is stroom. We hebben eigenlijk op 2 plaatsen stroom. In de Arduino en deels in het shield hebben we 5V nodig waar de Arduino op werkt. Normaal gesproken loopt dit via de USB aansluiting van de computer. Voor een operationele omgeving is het beter om daar een 5V transformator voor te gebruiken.

Voor de treinen op de baan hebben we 15V nodig. Hiervoor dient een losse 15V trafo te worden gebruikt.

Officieel kan de shield 12 V aan. In de praktijk kan ook 15 V zonder problemen worden gebruikt. De shield geeft dit vermogen ook terug aan de Arduino, zodat die in principe geen extra power nodig zou moeten hebben. Echter, in de specs van de Arduino staat dat er nooit meer dan 12V terug mag worden gegeven aan de Arduino. Nooit!. En dat is echter wel wat we willen doen. Dus hier hebben we een groot probleem.

De handigheid van de motor shield om stroom terug te leiden naar de Arduino, is dus eigenlijk een nadeel! Gelukkig heeft de motor shield hier ene (lelijke) oplossing voor. Het is namelijk mogelijk om de verbinding van het vermogen terug naar de Arduino te onderbreken. Dit doe je door op de shield een verbinding door te krassen. Hierdoor onderbreken we stroomverbinding tussen de shield en de Arduino. Hiervoor zit aan de achterkant een Vin connect verbinding. Deze dient met een stanley mes te worden doorgesneden. Omdat het nooit handig is om zomaar te vertrouwen op info over slopen van hardware, zie de documentatie. Maar geef er echt gehoor aan, anders heeft je Arduino nog maar een erg kort leven.

To avoid possible damage to the Arduino board on which the shield is mounted, we reccomend using an external power supply that provides a voltage between 7 and 12V. If your motor require more than 9V we recommend that you separate the power lines of the shield and the Arduino board on which the shield is mounted. This is possible by cutting the "Vin Connect" jumper placed on the back side of the shield. The absolute limit for the Vin at the screw terminals is 18V.



Arduino DCCStroomverbruik

Het stroomverbruik op de UITVOER-A en UITVOER-B kanalen is erg interessant. Hieraan kunnen we zien hoeveel stroom de treinen gebruiken. Deze informatie geeft het shield terug op de analoge pins A0 (voor UITVOER-A) en A1 (voor UITVOOR-B).

  • Door het monitoren van het verbruik is te zien hoe efficient de treinen rijden
  • Krijgen we inzicht of er een zwaardere trafo nodig is
  • Krijgen we inzicht in mogelijke kortsluitingen op de baan
  • Krijgen we info over power changes op het programmeer track. Een mechanisme dat DCC gebruikt om coderingen terug te sturen.


Categorie menu

Copyright 2023 www.punthooft.nl
We do not collect cookies for advertisement. Your data is never send to third parties.