RC Boat with ESP8266 NodeMCU

I’ll share the entire development process from the very beginning: starting with a boat made of ceiling tiles, a gel pen, and a tin can, to a plastic model that’s good enough to give as a gift.

You can check out the final result here:

Why?

Since childhood, I’ve always wanted to build a remote-controlled model. It didn’t matter what kind—what mattered was building it myself.
After discovering Arduino, I started exploring other controllers and came across the ESP8266 NodeMCU. After reading about it, I realized it could help me make this dream a reality.
This started in March. My friend’s birthday was in the summer, so I thought I had plenty of time to build a boat and give it to him as a gift (spoiler: I was a month late).
He’s a fan of rivers and lakes, so choosing a water vehicle as the model was an easy decision.

What should the boat be like?

How I imagined the final model:

Electronic components:

Materials:

I wanted to control the boat from a smartphone, as it's convenient—always charged and readily available.

Remote Control Prototype 1.0

To start, I built a simple prototype using LEGO, parts from other Arduino projects, and a power bank.

On the ESP8266 NodeMCU, I set up:

Connection diagram
Connection diagram

First prototype
First prototype

Great, it works!

Remote Control Prototype 2.0

Controlling with buttons wasn’t very convenient, so I redesigned the interface to respond to touch in specific parts of the screen.
With this interface, frequent requests had to be sent to the server, so I added a WebSocket server on the ESP8266 NodeMCU to send commands over an established connection.

Connection diagram
Connection diagram

Second prototype
Second prototype

Control example
Control example

Detailed instructions on how to build such a car can be found here.

A Bit of Theory and Materials

Before diving into the details of creating the boat, I should briefly explain its components.

Image taken from here

The main parts that I will be discussing are highlighted in blue:
1 - rudder;
2 - propeller;
3 - drive shaft;
4 - there should be a coupling here;
5 - motor.

Main materials that inspired me and were used

Books:
The most useful material I found was in the book by John Finch, "Advanced R/C Boat Modeling." I looked at other books, but this one was the best for me.

Articles:

Video course how to make a rocket boat

Testing Reception Range

To test the range of the control system, I built this device:

On the client side, you can run a ping/pong test to the WebSocket server with response time measurement.
The table displays the number of requests/responses and the response time percentiles.

After walking around the park with direct line of sight, I found that the maximum distance I could maintain a reliable connection between the device and my smartphone was about 27 meters (I later checked the distance on the map).
27 meters: 95th percentile ~ 48 milliseconds, 99th percentile ~ 283 milliseconds.

Client interface for testing reception range
Client interface for testing reception range

Here is the link to get the code and run the experiment yourself.

Version 1.0

Electronic components:

Materials:

Version features:

I already had a working remote control scheme, so I could start working on the hull.
To assemble the boat's hull, I used blueprints from an article by Francisco Moliner.
I printed them, glued them together, and cut them out of ceiling tile.

While I was assembling the hull and thinking about what to make the drive shaft from, my brushless motor A2212 1000KV arrived.

In my inexperience, I ordered a motor for drones:

I struggled with this motor for a week.
I managed to start the motor, but when the voltage changed quickly (rapidly increasing or decreasing speed), the motor would turn off and the controller would restart.
I think this was due to the low power of the power supply (the powerbank).
In the end, I decided to switch to a more powerful brushed motor.

Trying in vain to set up stable motor operation
Trying in vain to set up stable motor operation

Assembly is in full swing
Assembly is in full swing

First test launch

I realized that I could make a good prototype, but it wouldn't look presentable.
I decided it was time to order a 3D printer, which I had wanted to try for a while.

Version 1.1

Version features:

To control the motor speed, I used the L298N, but lost almost half of the power.
This is a feature of using PWM or the way the circuit is designed — I'm not exactly sure.
I decided to abandon speed control. In the end, I used the L298N, but without PWM control, which significantly increased the motor power.

First Launch

Unfortunately, I chose the closest pond, which was very overgrown.
After swimming just one and a half meters, the boat tangled weeds around the propeller shaft and stopped responding to control.

After ten minutes, using a few branches taped together into one large one, we managed to retrieve the boat from the water.
Here are the first photos of the boat, but after that swim:

Not the cleanest pond
Not the cleanest pond

It's easy to see the positions of the rudder and the propeller
It's easy to see the positions of the rudder and the propeller

You can see how the weeds tangled around the shaft
You can see how the weeds tangled around the shaft

The boat still leaked a bit, so I had to search for the leak.

The blue goo is clearly visible on the white background
The blue goo is clearly visible on the white background

Version 1.2

Version features:

The boat, cleaned of dirt, looks much better
The boat, cleaned of dirt, looks much better

The rudder surface area is increased
The rudder surface area is increased

Weed protection added
Weed protection added

First successful launch:

Version 1.3

Version features:

Suddenly, I realized that the boat would require a lot of plastic, so I decided to make it a bit shorter.
To see how the shortened version would look, I redesigned the existing hull.

Version 2.0

Electronic components:

Materials:

Version features:

The 3D printer arrived!

The package from China arrived in perfect condition
The package from China arrived in perfect condition

The assembly process took about 6 hours
The assembly process took about 6 hours

Test print
Test print

Printing the shaft and coupling
Printing the shaft and coupling

The new hull looked neat
The new hull looked neat

It works great!

It was unclear what to do with the hole where water was getting in:

Version 3.0

Electronics components:

Materials:

Version features:

Before this, I had only worked in Kompas 3D for modeling simple designs, but the principles in Fusion360 are quite similar. I had to spend a few weekends learning how to optimize modeling in this program. After a couple of weeks, the first usable version of the boat body model was ready!

I divided the body into several parts and started printing.
I didn’t focus much on the printing settings, so the quality isn’t great.

Bow of the boat
Bow of the boat

Stern of the boat
Stern of the boat

Top of the boat
Top of the boat

Assembly process of the body
Assembly process of the body

Completed body
Completed body

Additionally, I modeled and printed the rudder. I solved the issue with the hole for controlling the rudder (visible in the photo). As a result, water almost stopped entering the boat through it.

One of the final versions
One of the final versions

Replaced one RGB LED with three different LEDs
Replaced one RGB LED with three different LEDs

The new motor occasionally didn't start on the first try, which was really frustrating. I thought this might be due to the power supply (powerbank), so I experimented with regular AA batteries, which seemed to improve things.

Experimenting with AA batteries
Experimenting with AA batteries

Then I suddenly realized that the powerbank probably contains multiple batteries, and I might be able to connect them in the way I need. So, I opened up the powerbank... but it turned out there was only one battery inside.

Only one battery inside the powerbank
Only one battery inside the powerbank

So, I decided I needed to order some batteries.

Version 3.1

Version features:

Here are the new battery compartments:

The contacts are still made from tin cans
The contacts are still made from tin cans

The compartments have been glued into the boat
The compartments have been glued into the boat

Finally, everything is working smoothly!

Version 3.2

Version features:

Here are the updates:

It wasn't easy to replace the already glued-in drive leg
It wasn't easy to replace the already glued-in drive leg

Version 3.3

Version features:

Part of the flexible coupling
Part of the flexible coupling

Complete set of the new version
Complete set of the new version

All parts of the boat and main components are made from plastic!
All parts of the boat and main components are made from plastic!

First water test of version 3.x:

During real-life tests, it became clear that the distance at which a stable connection between the smartphone and the boat could be maintained was about three times shorter than during tests (27 meters vs ~10 meters). The connection was often lost in the middle of the pond, and we had to wait for the wind to push the boat back to shore for reconnection. After these issues, an Emergency timeout parameter was added, which can be set on the client (default is 4 minutes). If no command was sent within this timeout, the boat would slowly move forward, helping avoid the boat drifting too far away. This strategy worked well on a small pond, but for larger bodies of water, this timeout should be removed.

The brushless motor was reintroduced after trying it with 18650 batteries, and it worked as expected. However, since the brushless motor is designed for drones, it could not simply be mounted horizontally, as the motor rotates around its base. So, a custom mount was modeled and printed for it:

First version of the base
First version of the base

The base fits perfectly
The base fits perfectly

The first version of the motor mount fit the motor perfectly but didn't fit well inside the boat, so further adjustments were needed. After 2-3 iterations of printing, the final mount was created that fit perfectly inside the boat and allowed the motor to work without interference:

The entire shaft assembly from motor to propeller
The entire shaft assembly from motor to propeller

Version 3.4

Version features:

Glued the motor in and tested it separately
Glued the motor in and tested it separately

Complete set of the new version
Complete set of the new version

Assembled version
Assembled version

Weighed the boat in full configuration:
The boat's full weight with all components is 626 grams
The boat's full weight with all components is 626 grams

Version 3.5

Version features:

Glued the top with rubber bands
Glued the top with rubber bands

Final version:

Final video of version 3.5

Client UI

When the settings menu is collapsed, nearly the entire screen area is available for control.

Settings:

All timeouts are sent to the server with each command, so they can be adjusted at any time.

Direction control
Direction control

Speed control
Speed control

Conclusion

The entire process took about six months. The model could have been refined and improved even further, but I decided to stop at the current result.
My friend liked the gift, so I’m doubly satisfied!

The source code for the 3D models and the boat code can be found here.
The source code for the distance test is available here.

Thanks for your attention!