Scale-N

Scale-N
Arduino
Componenten
Rollend Materieel
Naslag
Onderdelen
Wissels
Basis Electronica
Symbols Electronica
Programming Arduino
AKS
DCC++
DR5000













































Keerlusoplossing met arduino

Over het keerlusprobleem bij digitale 2-rail modelbanen is al heel wat afgefilosofeerd. Een oplossing zonder kortsluiting is het fraaist. In de praktijk komt dit neer op verschillende bezetmelders / detectiesecties die via een relais de polariteit van de keerlus omdraaien voor de trein een van de isolaties bereikt. Het nadeel van deze aanpak is dat je toch snel vier secties nodig hebt met alle bedrading die erbij hoort.
Er wordt gebruik gemaakt een simpele lichtsluis om de keerlusprobleem van de driehoek in het sporenplan op te lossen. Hoe werkt dat? Net als bij een gewone keerlusmodule is de keerlus aan beide uiteinden dubbel geïsoleerd. Laten we die isolaties even ISO1 en ISO2 noemen. De lichtsluis staat schuin over ISO2. Het relais van de lichtsluis poolt de spanning in de keerlus om. De keerlus wordt zo aangesloten dat standaard de polariteit klopt voor ISO1.
Een trein kan zonder kortsluiting over ISO1 rijden. Wanneer de trein ISO2 (de isolatie met lichtsluis) nadert, zal de lichtsluis de trein al zien voordat hij de isolatie bereikt. De lichtsluis poolt de keerlus om, zodat de trein zonder kortsluiting over ISO2 rijdt. Zodra de trein de lichtluis voorbij is, valt het relais weer af en kan de volgende trein komen. De keerlus is in beide richtingen te berijden.
In de praktijk voldoet de keerlus-met-lichtluis-oplossing prima, al moet het afstellen van de lichtluis met enige aandacht gebeuren. Kan dat niet nog beter? Zeker! Met een Arduino, twee lichtsluisjes en een handjevol andere onderdelen heb je de ultieme oplossing binnen handbereik. Zonder kortsluiting en met minimale bedrading.
Links en rechts van ISO2 komt een lichtluis. De onderlinge afstand is kleiner dan de kortste loc of wagen. Standaard staat de polairteit goed voor ISO1. Zodra en zolang een van de lichtsluizen bezet is, draait de Arduino via een relais de polariteit in de keerlus om. De trein kan nu zonder kortsluiting over ISO2 rijden. Pas wanneer beide lichtsluizen een instelbaar aantal seconden vrij zijn, valt de polariteit terug naar de beginstand.
Voor de schakeling heb ik een eenvoudig Arduino Shield gemaakt. In plaats van een relais zitten er gelijk drie op, zodat je de keerlus desgewenst kunt verdelen in maximaal drie bezetmelders. De drie relais worden parallel aangestuurd en gaan tegelijk om. De afvalvertraging is in te stellen via een potmetertje. Het Shield wordt simpelweg op de Arduino geklikt. Draadjes er aan en klaar.
De schakeling heeft maar een paar componenten. De lichtsluizen bestaan uit een IS471 met IR-LED. De uitgang van de detector is direct met een ingang van de Arduino verbonden. De potmeter dient om de afvalvertraging in te stellen en is aan een analoge ingang geknoopt.
Drie LEDs geven de status aan: de groene LED brandt als de schakeling actief is. Hij gaat knipperen zodra de afvalvertraging loopt. De gele LEDs geven aan voor welke isolatie de polariteit goed staat. De linker is voor ISO1, de rechter voor ISO2. De relais worden tegelijk aangestuurd via een transistor en blusdiode. De Arduino wordt gevoed met +12 Volt, wat ook de spanning voor de relais is. De spanningsstabilisator op de Arduino maakt daar +5 Volt van voor de processor.
De IR detectoren en IR LEDs worden met kabeltjes op de print aangesloten. De status LEDs kun je direct op de print monteren, maar ik heb ze met een kabeltje verlengd naar de voorkant van de baan.
Zo werkt het dan... Stel je voor dat het gele strookje tape ISO2 is. De linker gele LED brandt: de polariteit staat goed voor ISO1 (hier buiten beeld). De trein nadert de lichtsluis. Zodra hij de lichtsluis passeert, poolt de Arduino de spanning om voor ISO2. Nu brandt de andere gele LED.
Tijdens het passeren van ISO2 is altijd wel een van de lichtsluizen bezet. De polariteit blijft omgedraaid. Nadat de trein gepasseerd is, gaat de groene LED knipperen. Na het verstrijken van de afvalvertraging valt het relais terug. De polariteit staat nu weer goed voor de andere overgang, ISO1. De keerlus is in beide richtingen te berijden.
Code:
/*
  Reversing loop
  Reversing loop for model railroads
  Uses 2 IR detectors, 3 LEDs and 1 (or more) relay
  
  Pin 8: IR detector left (0 = free, 1 = occupied)
  Pin 9: IR detector right (0 = free, 1 = occupied)
  Pin 11: yellow LED left (standard polarity - unwatched gap is safe to pass)
  Pin 13: green LED status (flash during timedelay)
  Pin 12: yellow LED right (reversed polarity - gap with detectors is safe to pass)
  Pin 10: Relay(s)

  Weerstand voor vertraging?
  Jumper voor relais omdraaien?
 
   Huib Maaskant - www.floodland.nl/aim
 */

// Name pins
int detectl = 8;
int detectr = 9;
int ledyl = 11;
int ledg = 13;
int ledyr = 12;
int relay = 10;
int potpin = 0;            // analog pin used to connect the potentiometer

// Variables
int detectstatus;          // detection status: 1 = one or more detectors occupied
unsigned long waituntil;   // time out counter
unsigned long ledflash;    // led flash counter
int timedelay;             // delay in millisecs

// the setup routine runs once when you press reset:
void setup() {                
  // initialize pins
  pinMode(detectl, INPUT);
  pinMode(detectr, INPUT);
  pinMode(ledyl, OUTPUT);
  pinMode(ledg, OUTPUT);
  pinMode(ledyr, OUTPUT);
  pinMode(relay, OUTPUT);
  
  detectstatus = 0;
  ledflash = 0;
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {

  // idle state - standard polarity
  digitalWrite(ledg, HIGH);
  digitalWrite(ledyl, HIGH);
  digitalWrite(ledyr, LOW);
  digitalWrite(relay, LOW);

  // wait for detection
  while (detectstatus == 0) {
    detectstatus = digitalRead (detectl) + digitalRead (detectr);
  }
  
  // train approaching the gap with detection
  
  // change polarity
  digitalWrite(ledyl, LOW);
  digitalWrite(ledyr, HIGH);
  digitalWrite(relay, HIGH);
  
   // wait for detection to clear and timedelay to run out
  timedelay = map(analogRead(potpin), 0, 1023, 10, 5000);     // delay before polarity is changed to normal after clearing detection (millisecs)
  waituntil = millis() + timedelay; 
  
  while (waituntil > millis()) {
    // read status of detectors
    detectstatus = digitalRead (detectl) + digitalRead (detectr);

    if (detectstatus !=0) {
        // reset time counter if detector still occupied
        waituntil = millis() + timedelay;
        // make green LED solid
        digitalWrite(ledg, HIGH);
    }
    else { // we're in the time delay: flash that green LED
        if (ledflash < millis()) {
          ledflash = millis() + 200; // set flash interval
          digitalWrite(ledg, !digitalRead(ledg));
        }  
    } // else
  }
  
  // train has cleared the gap with detection

}



ref: http://www.floodland.nl/aim/info_arduino_keerlus_1.htm