Type something to search...
Over-Engineering einer Modelleisenbahn

Manchmal packt einen die Nostalgie und man möchte alten Kindheitsschätzen neues Leben einhauchen. So erging es mir mit meiner alten LGB-Modelleisenbahn 🚂, die seit Jahren auf dem Dachboden verstaubte. Doch anstatt sie einfach nur aufzubauen, entschied ich mich dafür, sie in das 21. Jahrhundert zu katapultieren. Mit einer ordentlichen Portion Over-Engineering! Jetzt steht der alte Trafo immer auf Anschlag und die Messages in einem MQTT-Topic steuern die Richtung und Geschindigkeit der Bahn.

Die Idee: Eine smarte Pendelstrecke zu Weihnachten

Alle 30 Minuten fährt die alte Playmobil-Bahn nun zu Weihnachten zischend und dampfend ihre Pendelstrecke auf der festlich dekorierten Fensterbank. Sehr zur Freude des Nachwuchses!

Hardware ohne Löten: Der Aufbau

Eines der Hauptziele war es, die gesamte Hardware ohne Löten aufzubauen. Folgende Komponenten kamen zum Einsatz:

Verwendete Hardware:

  1. ESP32 Development Board: Das Gehirn der Operation.
  2. L298N H-Brücke Motorsteuerung: Um den analogen Zug digital steuern zu können.
  3. LGB Trafo (0-18V): Die Stromversorgung für die Schienen.
  4. Jumper Kabel: Für die gesamte Verkabelung.
  5. Lochrasterplatte 7x9cm: Als Träger für die Komponenten.
  6. Gehäuse mit Hutschiene (158x118x97mm): Für ein sauberes Finish.
  7. Nylon Schrauben/Abstandhalter Set: Zur Montage der Komponenten.

Verkabelung

Die Verkabelung war relativ einfach und erforderte keine besonderen Kenntnisse:

  • ESP32 zu L298N:

    • GPIO25 → ENA Pin (Jumper von ENA entfernt!)
    • GPIO26 → IN1
    • GPIO27 → IN2
    • GND → GND an L298N
  • LGB Trafo zu L298N:

    • Trafo Plus (18V) → 12V Eingang am L298N
    • Trafo Minus → GND am L298N (gleiche Klemme wie ESP32 GND)
  • L298N zu Schienen:

    • OUT1 → Schiene 1
    • OUT2 → Schiene 2
  • Stromversorgung:

    • ESP32 → über USB vom Computer oder ein USB-Netzteil
    • L298N → bekommt 18V vom LGB Trafo
Ansicht der LGB-Bahn, des Trafos sowie ESP32. Übersicht der Verkabelung zwischen ESP32, L298N H-Brücke und LGB Trafo, auf einer Lochrasterplatte montiert.

Software: ESP32 trifft MQTT

Für die smarte Steuerung habe ich den ESP32 mit dem WLAN verbunden und einen MQTT-Client eingerichtet. Dadurch kann der Zug über Home Assistant gesteuert werden.

Code-Auszug:

#include <WiFi.h>
#include <PubSubClient.h>

// WIFI & MQTT
const char* ssid = "<SSID>";
const char* password = "<PASSWORD>";
const char* mqtt_server = "<HOST>";
const char* mqtt_user = "<USER>";
const char* mqtt_password = "<PASSWORD>";

// Pin Definitions
const int MOTOR_SPEED_PIN = 25;  // ENA
const int MOTOR_DIR1_PIN = 26;   // IN1
const int MOTOR_DIR2_PIN = 27;   // IN2

WiFiClient espClient;
PubSubClient client(espClient);

int currentSpeed = 0;
bool forward = true;
unsigned long lastStatus = 0;
const long statusInterval = 30000;  // Status every 30s

void setup_wifi() {
  Serial.println("Connecting to WiFi...");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi connected");
  Serial.println("IP address: " + WiFi.localIP().toString());
}

void sendStatus() {
  if (client.connected()) {
    client.publish("train/status", "online", true);
    String state = String(currentSpeed) + "," + (forward ? "forward" : "backward");
    client.publish("train/state", state.c_str(), true);
  }
}

void callback(char* topic, byte* payload, unsigned int length) {
  String message = "";
  for (int i = 0; i < length; i++) {
    message += (char)payload[i];
  }

  Serial.print("Message received [");
  Serial.print(topic);
  Serial.print("]: ");
  Serial.println(message);

  if (String(topic) == "train/speed") {
    currentSpeed = message.toInt();
    updateMotor();
  }
  else if (String(topic) == "train/direction") {
    forward = (message == "forward");
    updateMotor();
  }
}

void updateMotor() {
  int mappedSpeed = map(abs(currentSpeed), 0, 100, 0, 255);

  if (forward) {
    digitalWrite(MOTOR_DIR1_PIN, HIGH);
    digitalWrite(MOTOR_DIR2_PIN, LOW);
    Serial.println("Direction: Forward");
  } else {
    digitalWrite(MOTOR_DIR1_PIN, LOW);
    digitalWrite(MOTOR_DIR2_PIN, HIGH);
    Serial.println("Direction: Backward");
  }

  Serial.print("Speed: ");
  Serial.println(mappedSpeed);
  analogWrite(MOTOR_SPEED_PIN, mappedSpeed);

  sendStatus();
}

void reconnect() {
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    String clientId = "ESP32Train-";
    clientId += String(random(0xffff), HEX);

    if (client.connect(clientId.c_str(), mqtt_user, mqtt_password, "train/status", 0, true, "offline")) {
      Serial.println("connected");
      client.subscribe("train/speed");
      client.subscribe("train/direction");
      sendStatus();
    } else {
      Serial.println(" retry in 5 seconds");
      delay(5000);
    }
  }
}

void setup() {
  Serial.begin(115200);

  pinMode(MOTOR_SPEED_PIN, OUTPUT);
  pinMode(MOTOR_DIR1_PIN, OUTPUT);
  pinMode(MOTOR_DIR2_PIN, OUTPUT);

  digitalWrite(MOTOR_DIR1_PIN, LOW);
  digitalWrite(MOTOR_DIR2_PIN, LOW);
  analogWrite(MOTOR_SPEED_PIN, 0);

  setup_wifi();
  client.setServer(mqtt_server, 1886);
  client.setCallback(callback);
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  // Status updates
  unsigned long now = millis();
  if (now - lastStatus > statusInterval) {
    lastStatus = now;
    sendStatus();
  }
}

Home Assistant Integration

Die Integration in Home Assistant ermöglicht es, den Zug nach einem festgelegten Zeitplan fahren zu lassen. Die Bahn startet alle 30 Minuten und fährt von links nach rechts und wieder zurück.

alias: Pendelstrecke Bahn
description: ""
trigger:
  - platform: time_pattern
    minutes: "/30"
condition: []
action:
  - service: mqtt.publish
    data:
      topic: "train/direction"
      payload: "forward"
  - service: mqtt.publish
    data:
      topic: "train/speed"
      payload: "80"
  - delay: "00:00:20"
  - service: mqtt.publish
    data:
      topic: "train/speed"
      payload: "0"
  - delay: "00:00:05"
  - service: mqtt.publish
    data:
      topic: "train/direction"
      payload: "backward"
  - service: mqtt.publish
    data:
      topic: "train/speed"
      payload: "80"
  - delay: "00:00:20"
  - service: mqtt.publish
    data:
      topic: "train/speed"
      payload: "0"
mode: single

Fazit: Over-Engineering at its Best

Was als einfache Idee begann, wurde schnell zu einem kleinen Over-Engineering-Projekt. Doch es hat sich gelohnt. Die alte Modelleisenbahn fährt jetzt smart gesteuert auf der Fensterbank. 🎄

Das Beste daran ist, wie einfach es war, dank der Hilfe von ChatGPT. Ohne zu löten und mit minimalem Aufwand konnte ich meine alte LGB-Bahn ins Smart Home integrieren.

Abschließende Gedanken

Manchmal ist es einfach schön, alten Dingen neues Leben einzuhauchen und dabei etwas Neues zu lernen. Mit ein wenig Technik und der Unterstützung von KI-Assistenten kann man Großes bewirken, oder zumindest eine Modelleisenbahn smarter machen, als sie jemals sein sollte. Vermutlich ist das weniger DIY sondern mehr DiWHY! 😉

Related Posts