De seindecoder op basis van een Arduino-nano en TLC5940 led-driver is inmiddels klaar. Ik heb bij de bouw dankbaar gebruik gemaakt van de vele bronnen die er binnen deze open-source wereld zijn.

DCC

Basis is de aansluiting van DCC op de Arduino. Ik heb dit gedaan volgens aanwijzingen op Stummis en gebruik de NMRA-DCC bibliotheek. Aansluitschema is als volgt:

Schermafbeelding 2016-02-21 om 10.19.46 In plaats van een led heb ik een 1N4148 diode gebruikt.

De onderste weerstand heeft een waarde van 1KΩ. De bovenste is 10KΩ.
Het uitgebreide schema vind je hier.

Voor de software hoef je niet zelf het programma te schrijven dat DCC kan afhandelen. Dit is kant en klaar beschikbaar als bibliotheek en hier te downloaden.

Om e.e.a. te proberen heb ik een simpel programmaatje gemaakt dat het adres afvangt en displayed. Is het een adres van de Arduino dan zegt ie ook welke toets (rood of groen) is gedrukt. Behalve dat ik een aansluitfoutjes bij de optocoupler gemaakt had werkte dit in één keer feilloos.

TLC5490

De TLC5940 is een 16 kanaals PWM-driver (LED-driver) met regelbare duty cycle en wordt gebruikt om het aantal PWM-uitgangen uit te breiden. PWM wil je hebben, want daarmee kun je de felheid van de leds regelen. Ook maakt het het nagloei effecten mogelijk. De Arduino heeft standaard 6 PWM uitgangen. Met deze chip heb je er in één keer 16. En als dat niet genoeg is dan kun je ze nog achterelkaar hangen (cascaderen) ook. Tot maximaal 64 chips (1024 leds). De felheid is te regelen met de 12 bits duty cycle en kent dus 4096 stappen (0-4095).

De aansluiting vraagt maar een paar pennen van de Arduino:

Schermafbeelding 2016-02-21 om 10.12.45

De twee weerstanden aan de TLC5940 hebben waardes van 10KΩ (links) en 2,2KΩ (rechts).

Ook voor de TLC5940 is een bibliotheek beschikbaar.

 

Adressen en type seinen

Het is nu zover dat ik dwergseinen, sim-seinen (voor en hoofd), voorseinen en hoofdseinen kan aansluiten. Je geeft eenmalig bij het laden van het programma in de Arduino aan welke adressen te gebruiken en welk type seinen is aangesloten en het werkt. Voorwaarde is wel dat de draden van de seinen op de juiste poorten worden aangesloten. Altijd beginnen vanaf aansluiting 0 en opeenvolgend.

In de code is aangegeven  wat de volgorde van de lampen is zoals die moet worden aangesloten. Hierin half ik meer flexibiliteit kunnen programmeren, maar dat vond ik teveel werk. je hoeft het tenslotte maar één keer te doen.

Boven in de code staan een aantal regels die van groot belang voor het herkennen van adres en type zijn.

const unsigned int signalAdr[] = {500, 501, 502, 503, 504};
const byte signalTyp[] = { 1, 2, 6, 1, 6};
const byte signalLeds[]= { 4, 4, 1, 2, 1};

De eerste regel bevat de adressen waarop gereageerd moet worden. Deze hoeven niet noodzakelijk opeenvolgend te zijn of aan te sluiten. Voor het beheer van je baan is dat wel aan te bevelen 😉.

De tweede regel specificeert het type sein dat is aangesloten. Hier is het belangrijk dat je het goed doet, want anders loopt het in de soep. Het programma verwacht en test op bepaalde volgordes. je kunt de volgende types specificeren:

  1. Voorsein, eerste adres; seinbeelden Fb0 en Fb1.
  2. Voorsein, tweede adres; seinbeelden Fb2 en Fb3.
  3. Voorsein, derde adres; seinbeeld Fb5
  4. Dwergsein, eerste adres; altijd gevolgd door
  5. Dwergsein, tweede adres. Bij mijn weten komt het niet voor dat een dwergsein maar twee seinbeelden geeft, dus is altijd een tweede adres nodig.
  6. SIM hoofdsein.
  7. SIM voorsein.
  8. Hoofdsein, eerste adres; seinbeelden Fb0 en Fb1. Kan gevolgd worden door
  9. Hoofdsein, tweede adres; derde licht voor Fb2. Of
  10. Hoofdsein, tweede adres; derde en vierde licht voor FB2 en Fb3. Mogelijk gevolgd door:
  11. Hoofdsein, derde adres; vijfde licht voor Fb6. Of
  12. Hoofdsein, derde adres; vijfde en zesde licht voor Fb5 en Fb6.

De volgorde van de adressen en types is gekoppelt. In de bovenstaande code kunnen we dus lezen dat op adres 500 een voorsein is aangesloten met 501 als tweede adres. Op adres 502 is een Sim hoofdsein aangesloten. Op adres 503 is een voorsein aangesloten. Dit wordt niet gevolgd door een type 2, dus dit voorsein kan alleen Fb0 en Fb1 weggeven. Op adres 504 tenslotte is weer  een SIM hoofdsein aangesloten.

Dan is er nog een derde regel “signalLeds”. Hierin specificeer je hoeveel lampen een sein heeft. Dit is van belang bij voor en hoofdseinen voor het nagloeieffect.

Verander je dus deze drie regels programmacode, dan verander je het gedrag van de decoder.

Overige instellingen

Met het aanpassen van een aantal constanten, kun je het gedrag van de lichtwissel verder beïnvloeden:

const int dimConst = 50; // Brightness for all leds
const long fadeConst = 100; // Fade in/decrease in mSec.
const long darkDelay = 80; // Dark phase duration
const long interval = 1000; // interval at which to blink (milliseconds)

dimConst bepaald de felheid van de leds. Deze heeft een waarde tussen 0 (uit) en 4095.

fadeConst bepaald de snelheid van aan en uit gloeien. Ik heb een aanname gedaan dat het nagloeieffect alleen van toepassing is voor de voor- en hoofdseinen. Oude dwergseinen kunnen dit ook hebben, maar die heb ik niet op mijn baan, dus heb ik het niet gemaakt. Mocht iemand daar toch behoefte aan hebben, dan wil ik best de code hierop aanpassen.

Bij seinbeeld wisseling van voor- en hoofdseinen is een donkerfase ingebouwd. De duur daarvan wordt bepaald door constante darkDelay.

Tenslotten kun je de knipperfrequentie van de sim-seinen bepalen met de constante interval.

De sketch (het programma) is hier te downloaden.  Het is nog niet uitgebreid getest, dus als je fouten vind laat het me weten.

Bouw

In eerste instantie heb ik de opstelling als afgebeeld op een breadboard gemaakt. Hierbij was het me te lastig om de baan aan te sluiten. Ik heb dus een test gedaan met alleen DCC. Dat werkte direct en zonder problemen, en een wat uitgebreidere test die de verschillende seinbeelden schakelde. Hierbij was de invoer direct vanaf de computer.

Dat testen heeft tot een aantal verbeteringen geleid.

Dit weekend was er tijd om het geheel op te bouwen. Gisteren de DCC kant gesoldeerd, evenals de Arduino (daar moeten de pootjes nog aan). Aangesloten op de baan en het werkte weer prima.

Vanochtend de TLC5940 erop gebouwd. Evenals een dummy voorsein, om te testen.

En toen het moment van de waarheid: aangesloten op de baan (DCC) en 12v. Eerlijk gezegd was ik verbaasd dat het allemaal in één keer werkt, maar dat deed het wel. Het programma heb ik nog iets aan moeten passen, omdat bleek dat een opdracht meerdere keren wordt verstuurd wanneer je de schakelduur langer dan 0 hebt staan. Bij mij een keer of 10. Dit had wat knipperende lichtwissels tot gevolg. Daarom een conditie in het programma gezet dat alleen iets gedaan mag worden voor een specifiek adres, wanneer de laatste 200 msec  niets is gedaan.

En toen heb ik er nog maar een filmpje van gemaakt.

Inmiddels is een nieuw sein voor de seinbrug in de maak. Hopelijk gaat dat nu net zo vlot als de bouw van deze decoder.

Wordt vervolgd….

 

 

 

 

 

4 gedachten over “Arduino seindecoder

  1. Hoi Arjan,

    Ik weet niet of je veel ervaring hebt met automatiseren maar als ik dit lees word ik er zowieso wel even heel stil van… (en geniet 🙂 ). Weet dat je nu de handschoen bij ons hebt neergelegd om dit op te pakken om er ook iets mee te gaan doen… En wellicht gaan we dat nog doen ook 🙂

    Dank voor weer een mooi verhaal…

    Like

  2. Hi Arjan. I congratulate for you project. It’s very very Interesting for me.
    I’m also a passionate model railroad collector from Switzerland and mainly collect only Swiss models.
    I was looking for several years a way to control Swiss signal with Marklin Central Station and I cam across you site yesterday. I started play last year with Arduino and now with the addition of a TLC5940 you reach the wow effect on me.
    I would like to create for my own test some decoders, and I’m a developer and former electronics technician. I lost one of my eyes tree years ago so the last years is not so easy solder well. I would like to have a PCB board to easily mount and sold the pieces. As I read you produce that in China. Can me give some hints and a way to produce also the PCB’s.

    Thanks a lot
    Marcello Marchesoli

    Like

Plaats een reactie

Deze site gebruikt Akismet om spam te bestrijden. Ontdek hoe de data van je reactie verwerkt wordt.