Arduino Train DEMO


Arduino Train DEMO

The DEMO app has only six speeds for controlling the train. But, as well as paid versions it supports Protocol 2.3.

A lot of modelers asked me to make a project with the simplest set of hardware, without using separate modules and URB boards. I still believe that using Arduino NANO is the most effective option for building a management system. But, as stated in the description of the project, you can use any microcontrollers.

You can download sketch from video for two options:

ESP32 sketch


For Arduino NANO, you can use the instructions and sketch from the first example for Arduino Train Junior Lite.

Garden Train


Garden Train

Bluetooth phone app train control for Garden Railways

  • Any number of controlled locomotives
  • 20-x speed thrust control
  • Extended lights and signals control
  • Unique function – a wireless decoupling system on loco
  • No restrictions! You can modify this system for any construction of locomotives or use it in your control system
  • Universal button for servicing loco devices (for example, cabin lighting, start / stop of the snow removal rotor or steam generator and other things)
  • Simple protocol (API) with extensibility
Garden Train

Simple and easy start

The simplest system consists of any Arduino board, a Bluetooth module and any Motor-driver with a voltage corresponding to the battery and the current consumed by the DC motor. As an example, I will use the standard parts of the project's URB: Arduino NANO, bluetooth module HC-05 and L298N. All these details together cost less than 10 US dollars.

Your locomotive battery should have a voltage of between 9 and 12 volts. If you take voltage from the rails, then you need to add a step-down DC-DC converter to the Arduino's power supply circuit and a diode with a capacitor of significant capacitance (about 1000 μF).

Train on battery

Small diesel garden railway loco
Simple circuit

The elementary circuit for using Arduino Garden Train App

Sketch for Arduino NANO

The sketch for Arduino is based on the example of Arduino IDE named SerialEvent. A four-character command parsing from the application is a block of code – if (stringComplete) { ... }. After which you can program any reaction of the microcontroller Atmega to these commands. Simple command protocol can be extended according to your requirements. Currently, the application has implemented 10 control commands and 20 commands for setting the motor rotation speed. Upload sketch to Arduino NANO.

After connecting via the Bluetooth, you can view these commands in serial terminal on the Arduino IDE of your computer with the USB cable connected.

Simple sketch for Garden Train

Connect App to different locomotives

Push Bluetooth Icon

Choose the loco by MAC address

Connect established

Push icon again for disconnecting, and reconnect to another loco

You can install this solution on multiple locomotives. The bluetooth connections in this project work as point-to-point without routing. Since each bluetooth module included in this scheme has its own unique MAC address, by switching these addresses in the application you can manage them all. Also, you and your friends can manage simultaneously multiple trains by installing the application on multiple phones.

More features. Start and disconnect commands.

My application, when successfully connected to the locomotive, sends the command «999z» to Arduino, and when it is disconnected, the command «888z» is also sent. Let's add a code to the sketch that will flash the floodlights of locomotive when it is successfully connected and turn off all the lights when it is turned off. Accordingly, you need to add LEDs to the circuit and add the code for manage control them from the application.

Since the main idea of my project is that you can completely rewrite the sketch code and come up with and implement your functions and ideas, these commands can also be used to turn on the engine sound of a locomotive or steam generator at connecting. And switching off them when disconnecting bluetooth from loco. You can also override the purpose of all other commands.

Buttons and features App Garden Train

More loco power

The maximum current from one pin Arduino is less than 40mA. In order for spotlights on a large-sized locomotive to be realistic, powerful LEDs with a current of more than 200 mA are needed, and large currents are also needed to control the servo drive. Therefore, it is logical to add a high current booster to the circuit. It can be done on transistors, but I prefer to use chips like Darlington arrays, etc.

If you are going to use a load with 5 volt voltage (for example, servos), then you also need to add a stepdown DC-DC converter to the circuit. And accordingly, slightly change the power scheme for the Arduino board. It is also very useful if you are going to add sound and many other accessories for Arduino (sensors, actuators, etc.)

In this sketch, added function via pressing a «decoupling» button for the processl of the train uncoupling mechanism. The servo lowers the trailer for 2 seconds and then returns the hitch hook to its original position. Like all the other examples, you can change all the parameters of the mechanism and the code of the sketch for your coupling mechanism. You can also add any blinking or fading effects to the code of the spotlights (see the URB project).

More Power sketch


The Arduino Garden Train app is a wireless remote control. You can use this application with any type of equipment placed on your locomotive. This can be not only a system based on classic Arduino boards. You only need to create a Bluetooth channel between the locomotive and the phone – simple four-character commands sent by the application can be processed by any microcontroller. For example, you can use ESP32, with integrated Bluetooth module and a large amount of memory. Or STM microcontrollers popular series of AVR.

Project MCUs

In my opinion, I provided all the necessary commands, but if you need more, send me a message. The application also implemented feedback. As an example of this type of functionality, you can see the online status of the locomotive accumulator when it is BT connected. Examples of this and other functions are given in this chapter with the code for Arduino as a starting point.

State of loco battery

State of battery

After the connection is established, it is enough to send the battery status from Arduino using a simple code:

byte data;

Where data is a variable with a value from 0 to 100, which can be produced by reading and mapping from any analog input of the microcontroller voltage values when using a bridge resistive circuit.

Voltage measuring

Without this data, the icon remains gray. If the data value is less than 40, then the icon turns yellow, if less than 20, it turns pink.

Setting PWM frequency on 120Hz

By default, the PWM sampling rate for Arduino is about 500 Hz. If you lower it to 120 Hz, the power of the electric motor at low revs increases, the unpleasant high-frequency squeak of the motor armature also decreases.

In all circuits presented above, the engine is controlled from pin 9 of Arduino (Timer 1). To decrease PWM to 120Hz needs add to the void setup () code block a line:

TCCR1B = TCCR1B & B11111000 | B00000100;

If the circuit includes a servo, then you need to replace the standard Servo.h library with an alternative – for example ServoTimer2.h


The values of all speeds are defined in the sketch, so you can use a popular solution based on DFPlayer Mini MP3 Player Module MP3 For Arduino. Or use ESP32 chip capabilities by adding an amplifier.

See also popular blog: Peckforton Light Railway.

Voltage measuring


how use sound