Recommend a Prusa printer, earn $30! See the updated Prusa Rewards Program.

3D Printable 5-inch Gauge Battery Locomotive

This is a modified plank wagon with a motor and electronics. It is based of an English Electric EE718.
5
22
0
335
updated December 6, 2025

Description

PDF

Motor - https://www.ebay.co.uk/itm/126580863543?mkcid=16&mkevt=1&mkrid=711-127632-2357-0&ssspo=fbslgxu-r5-&sssrc=4429486&ssuid=2amj3ivztf-&var=&widget_ver=artemis&media=SMS


Motor driver - https://www.ebay.co.uk/itm/253233207202?mkcid=16&mkevt=1&mkrid=711-127632-2357-0&ssspo=QN5P8uKWSE6&sssrc=4429486&ssuid=2amj3ivztf-&var=&widget_ver=artemis&media=SMS

 

Belt drive - https://www.amazon.co.uk/your-orders/pop?ref=ppx_yo2ov_mob_b_pop&orderId=026-6834041-6310703&lineItemId=mnmgptolnpqnooy&shipmentId=UVJrxG6G0&packageId=1&asin=B0CQQYT9QM
 

Esp 32 - https://www.amazon.co.uk/Development-XTVTX-NodeMCU-32-ESP-WROOM-compatible/dp/B0CJHR8SMK/ref=sr_1_4_pp?crid=5X3HGKZTM5ZQ&dib=eyJ2IjoiMSJ9.U_D1E0zc1Jt7JeAoxpnGYmUvjMpRKfzMrz__UOADnqL8fHt2AIM_mLSn6ssO5SFM1U2yjdUHnZu5dfs9pvu8-e9QolmUUgIbBFaTEYLKPrD3nONGL7Tb9YWqXGl9NbBgAEe-yzXZWgjtGRDvYRXtAhOCWOvOusP5_4Wdgk46X40wZTr5aumyskrn150SIq9_y3R1f3KSGXK9Je6wiKzi97roSHCZSeuZrfobKgup7Yw.av8Nt_RFDvgwgKbdVulT7TJicBCFUA0VDv72iZ8808s&dib_tag=se&keywords=esp+32&qid=1749239409&sprefix=esp+32%2Caps%2C84&sr=8-4

 

Battery - https://www.amazon.co.uk/Yucel-Yuasa-YUCEL-battery-Y1-2-12/dp/B00VK74DY6/ref=sr_1_2_sspa?crid=3QLJJQ0LFC04B&dib=eyJ2IjoiMSJ9.SQF8Z5x2CdIM1TCxp5eI1MYG7cm0NdOsB4yvP67e1q3F33YTGvzbyFiBRMfHUnrHOvi2grhk1vt_KR7TmVrMgRFinhesC1JVmDJa_fX9uMhwj5zm1woqkCczgRk-rVbmkuztkQCFxVyo_g9PJ1Bx91yEgtbRXR_97-FQNwXGXE_3-hNBwRFlQdzdsIxBtZAEYiW5xUQH_rc6X2qZpev9uEey8gOthmfUYAWDB7c04CY.2fKSG9LEp3WtegYKLA7gv663zr-Fd7TW4zAcQICbIXk&dib_tag=se&keywords=12+volt+sealed+lead+acid+battery+yuvolt+1.2Ah&qid=1749239521&sprefix=12+volt+sealed+lead+acid+battery+yuvolt+1.2ah%2Caps%2C77&sr=8-2-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1

Extra parts may be requierd.

Feel free to leave a coment for assembaly instructions or any other info.

Code to upload to ESP32:

#include <WiFi.h>

#include <NetworkClient.h>

#include <WebServer.h>

#include <ESPmDNS.h>

#include <WiFiAP.h>


 

// Motor 1

int motor1Pin1 = 26;

int motor1Pin2 = 25;

int enable1Pin = 14;


 

// Setting PWM properties

const int resolution = 8;

int dutyCycle = 0;


 

const char *ssid = "Train Controller"; // Network Name

const char *password = ""; // Set password Here


 

String valueString = String(0);

WebServer server(80);


 

void handleRoot() {

  const char html[] PROGMEM = R"rawliteral(

  <!DOCTYPE HTML><html>

  <head>

    <meta name="viewport" content="width=device-width, initial-scale=1">

    <link rel="icon" href="data:,">

    <style>

      html { font-family: Helvetica; text-align: center; }

      .button {

        user-select: none; background-color: #4CAF50; border: none;

        color: white; padding: 12px 28px; font-size: 26px;

        margin: 1px; cursor: pointer;

      }

      .button2 { background-color: #ff0000; }

      input[type=range]:disabled {

        opacity: 0.5;

      }

    </style>

    <script>

      function moveForward() {

        fetch('/forward').then(() => {

          document.getElementById('motorSpeed').innerText = 0;

          document.getElementById('motorSlider').value = 0;

          document.getElementById('motorSlider').disabled = false;

          document.getElementById('motorDirection').innerText = "Forward";

        });

      }


 

      function stopMotor() {

        fetch('/stop').then(() => {

          document.getElementById('motorSpeed').innerText = 0;

          document.getElementById('motorSlider').value = 0;

          document.getElementById('motorSlider').disabled = true;

          document.getElementById('motorDirection').innerText = "Stopped";

        });

      }


 

      function moveReverse() {

        fetch('/reverse').then(() => {

          document.getElementById('motorSpeed').innerText = 0;

          document.getElementById('motorSlider').value = 0;

          document.getElementById('motorSlider').disabled = false;

          document.getElementById('motorDirection').innerText = "Reverse";

        });

      }


 

      function updateMotorSpeed(pos) {

        document.getElementById('motorSpeed').innerText = pos;

        fetch(/speed?value=${pos});

      }

      document.getElementById('motorSpeed').innerText = 0;

      document.getElementById('motorSlider').value = 0;

      document.getElementById('motorSlider').disabled = true;

    </script>

  </head>

  <body>

    <h1>5 inch locomotive controll</h1>

    <p><button class="button" onclick="moveForward()">FORWARD</button></p>

    <p><button class="button button2" onclick="stopMotor()">Neutral</button></p>

    <p><button class="button" onclick="moveReverse()">REVERSE</button></p>

    <p>Power: <span id="motorSpeed">0</span></p>

    <p>Direction: <span id="motorDirection">Stopped</span></p>

    <p>Throttle:</p>

    <input type="range" min="0" max="100" step="5" id="motorSlider" oninput="updateMotorSpeed(this.value)" value="0" disabled=true/>

  </body>

  </html>)rawliteral";

  server.send(200, "text/html", html);

}


 

void handleSpeed() {

  if (server.hasArg("value")) {

    valueString = server.arg("value");

    int value = valueString.toInt();

    if (value == 0) {

      analogWrite(enable1Pin, 0);

    } else {

      dutyCycle = map(value, 5, 100, 100, 255);

      analogWrite(enable1Pin, dutyCycle);

    }

  }

  server.send(200);

}


 

void handleStop() {

  digitalWrite(motor1Pin1, LOW);

  digitalWrite(motor1Pin2, LOW);

  analogWrite(enable1Pin, 0);

  dutyCycle = 0;

  server.send(200);

}


 

void handleForward() {

  digitalWrite(motor1Pin1, HIGH);

  digitalWrite(motor1Pin2, LOW);

  analogWrite(enable1Pin, 0);  // Reset speed to 0

  server.send(200);

}


 

void handleReverse() {

  digitalWrite(motor1Pin1, LOW);

  digitalWrite(motor1Pin2, HIGH);

  analogWrite(enable1Pin, 0);  // Reset speed to 0

  server.send(200);

}


 

void handleNotFound() {

  server.send(404, "text/plain", "File Not Found");

}


 

void setup(void) {

  pinMode(motor1Pin1, OUTPUT);

  pinMode(motor1Pin2, OUTPUT);

  analogWrite(enable1Pin, 0);

  analogWriteResolution(enable1Pin, resolution);


 

  WiFi.softAP(ssid, password);

  server.begin();


 

  MDNS.begin("esp32");


 

  server.on("/", handleRoot);

  server.on("/speed", handleSpeed);

  server.on("/forward", handleForward);

  server.on("/stop", handleStop);

  server.on("/reverse", handleReverse);

  server.onNotFound(handleNotFound);

}


 

void loop(void) {

  server.handleClient();

}

Tags



Model origin

The author remixed this model.

Differences of the remix compared to the original

Added parts to turn it into a locomotive including motor mount and clips to hold the body on.

 

License