LEGO-Weiche

Hintergrund:

Bei unserer LEGO-Eisenbahn , die mittlerweile auf ein "Kinderzimmer-sprengendes-Ausmaß" gewachsen ist, gibt es immer das Problem der Weichenumstellung. Der eine möchte nach rechts fahren, die Andere nach links. Somit kommt es zwangsläufig zu Streitereien und mittleren bis schweren Zugkatastrophen. 

Hier kam mir die Idee, die Weichen "fernzusteuern". Also ran an die Maus und losgedacht. 

In diversen "Lagerbeständen" fand ich noch eine alte IR-Fernbedienung, Sharp-IR-Empfänger, Mini-Servos und einen Arduino-Clone. Zusammen mit der Powerbank meiner Frau, ergibt sich ein erster Prototyp eines LEGO-Stellwerks.

Mechanischer Aufbau:

Als erstes habe ich mir gedanken über den Aufbau gemacht.

- Er darf die Originalteile nicht verändern

- Er sollte adaptiv sein

- Er sollte mit "LEGO-Bedienung" durch Kinder auf und abbaubar sein


Herausgekommen ist ein "LEGO-Stein" den ich auf meinem 3D-Drucker produziert habe. 

Er lässt sich mit normalen Steinen an die Weiche anbauen und fixieren. Ein einfaches Gestänge verbindet das Servo mit dem Umschalthebel der Weiche. Gesichert wird das Gestänge mit einem kleinem Stück Silikonschlauch.

Die Steuerung:
Als kleine Zentrale meines "Stellwerks" habe ich einen Arduino-Nano-Clone ausgewählt. Dieser liess sich am schnellsten von meiner Idee überzeugen.
Damit seine Beine nicht so in der Luft baumeln, und meine Frau nicht wieder fragt "Bleiben die Kabel so???", habe ich ihm eine schicke Basis gebaut.
Diese übernimmt die Verteilung aller Signale und bietet platz für vier Weichen (Servos).
Der Schaltplan:
Damit auch in unserer kleinen LEGO-Welt Energie gespart wird, und sie Servos nicht die ganze Zeit vor sich hin summen, schalte ich sie einfach aus wenn sie nichts zutun haben.
Dazu nehme ich einfach die 0V mit einem Transistor weg. 
Diese Schaltung ermöglicht auch Energieversorgungen mit höheren Spannungen einzusetzen (zum Beispiel 2S Lipo-Akku). Dabei wird auf dem "Powerstecker" PIN 3 statt 1 angeschlossen und der Arduino übernimmt die Spannungsregelung (hier aber Vorsicht mit der abgenommenen Leistung)
Das was mir an Eagle gefällt ist das sich sehr schnell und einfach Zeichnungen und Layouts erstellen lassen und zum Schluss auch noch die Fräsbahnen generiert werden. 
Somit ist der Prototypenbau ein "Kinderspiel".
Der Arduino-Code:
Ich hoffe selbsterklärend :-)
[code]
/******************************************************************************
 * Author: Michael Kriegers
 * Projekt: Weiche LEGO-Eisenbahn
 * Beschreibung: IR-Signale steuern vier Srevos auf Positionen im Tastbetrieb
 * 
 * 04/03/2019 erstellt erste Versuche
 * 05/03/2019 ausgebaut auf vier Servos
 * 07/03/2019 Abschaltung der Servos mit weiterem Ausgang
 * 09/03/2019 diverses Bugging
 * 
 *****************************************************************************/
#include <IRremote.h>
#include <Servo.h>

int irPin = 2; //Pin am Arduino Nano für den IR Receiver
char buff[50];

  struct servo
{
  int max_pos;  //Position 2 des Servos
  int min_pos;  //Position 1 des Servos
  int geschw;  //Geschwindigkeit des Servos (kleiner = schneller)
  int Freigabe; //Ausgang zum einschalten des Servo_1
  int Impuls;  //Impulsausgang fuer das Servo
  long code;
  bool merker;  //Positionsmerker
}Antrieb[4];
 
IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung
decode_results results;
Servo Weiche[4];  // create servo object to control a servo

void setup() 
{
  //Vorbelegung der Variablen aus dem Struct
  Antrieb[0]={180,15,6,6,5,0x2cb6,false};     // Taste Rot auf Fernbedienung
  Antrieb[1]={180,15,6,8,7,0xFFFF9A65,false}; // Taste Grün auf Fernbedienung
  Antrieb[2]={180,15,6,10,9,0xFFFFA25D,false};// Taste Blau auf Fernbedienung
  Antrieb[3]={180,15,6,12,11,0x22DD,false};   // Taste Weis auf Fernbedienung
  
  pinMode(irPin, INPUT);  //Den IR Pin als Eingang deklarieren.
  
  for(int i=0;i<4;i++)
  {
    pinMode(Antrieb[i].Freigabe, OUTPUT);  //Ausgang zum Einschalten des Servo
    Weiche[i].attach(Antrieb[i].Impuls);  // Zuordnug Ausgang zum Servo
  }
  
  pinMode(3, OUTPUT);digitalWrite(3, LOW);//Spannungsversorgung für IR-Sensor (GND)
  pinMode(4, OUTPUT);digitalWrite(4, HIGH);//Spannungsversorgung für IR-Sensor (VCC)
  irrecv.enableIRIn(); //Den IR Pin aktivieren
  Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen.
}

void loop() 
{
  if (irrecv.decode(&results))  //Wenn etwas gelesen wurde dann...
  {
    //Ausgabe des Wertes auf die Serielle Schnittstelle.
    int value = results.value;
    Serial.println(value, HEX);
    for (int t=0;t<4;t++)
    {
      if ((value == Antrieb[t].code)&&(Antrieb[t].merker == false))
      {
        digitalWrite(Antrieb[t].Freigabe, HIGH); //Servo einschalten
        for (int i=Antrieb[t].max_pos;i>Antrieb[t].min_pos;i--)
        {
          Weiche[t].write(i);                  // setzt das Servo auf Wert
          delay(Antrieb[t].geschw);                           // Wartezeit
        }
        delay(500);
        digitalWrite(Antrieb[t].Freigabe, LOW);   //Servo ausschalten
        sprintf(buff,"Weiche %i in Position 1",t);
        Serial.println(buff);
        Antrieb[t].merker = true;
        value = 0;
    }
        if (( value == Antrieb[t].code)&&(Antrieb[t].merker == true))
        {
          for (int i=Antrieb[t].min_pos;i<Antrieb[t].max_pos;i++)
          {
            digitalWrite(Antrieb[t].Freigabe, HIGH); //Servo einschalten
            Weiche[t].write(i);                  // setzt das Servo auf Wert
            delay(Antrieb[t].geschw);                           // Wartezeit
          }
          delay(500);
          digitalWrite(Antrieb[t].Freigabe, LOW);  //Servo ausschalten
          sprintf(buff,"Weiche %i in Position 2",t);
          Serial.println(buff);
          Antrieb[t].merker = false;
          value = 0;
        }
    }
    irrecv.resume(); // auf den nächsten Wert warten
  }
}
[/Code]
Share by: