Introduction: StealthBoat

This instructable was created in fulfilment of the project requirement of the Makecourse-Art at the University of South Florida (

This is a remote-controlled boat created using an Arduino Uno, a 28BYJ-48 Stepper Motor with ULN2003 Driver, a MicroServo SG90, a breadboard, and multiple 3D printed pieces. The following steps will explain the code, wiring as well as setup of the pieces. The 3D printed pieces can be changed to one's preference.


  • 1 x Arduino Uno microcontroller
  • 1 x 28BYJ-48 Stepper Motor
  • 1 x 3D printed pieces
  • 1 x Mini-Breadboard
  • 1 x MicroServo SG90
  • 1 x ULN2003 Driver
  • 1 x IR Remote
  • 1 x IR reciever

Step 1: Step 1: Circuit Design

The above figure demonstrates the wiring of the circuit, connecting the motors as well as Arduino together. A 12- Volt battery is needed to power all the components. The digital pins for the motors and the IR receiver can be changed, however, ensure that it is also changed in the code which will be discussed below. If the power load of the two motors is excessive for the Arduino board, in which case the board won't power on, disconnect the Stepper motor's power supply and connect it to a separate 12-Volt battery.

Step 2: Step 2: Code

The above code can be implemented within the Arduino to control the motors. A simple For loop along with if statements are utilised. A rudimentary knowledge of code is required and can be learnt through the Arduino website. The libraries used are Multistepper.h, IRremote.h, Servo.h and Accelstepper.h. The stepper libraries utilised to allow for an easier coding experience for stepper motors. In this code, speed is the only parameter that is controlled in a simplistic manner. Most of the code created only utilise basic functions. The Multistepper and Accelstepper library are non-native ones, once downloaded they need to be added to the Arduino libraries folder. If the file isn't available for download below, navigate to the link below to download it. The downloaded Accelstepper file also contains the Multistepper library.

#include <Servo.h>
#include <MultiStepper.h> //must copy MultiStepper library to arduino libraries
#include <AccelStepper.h>
#include <IRremote.h> //must copy IRremote library to arduino libraries
#define plus 0xA3C8EDDB   //clockwise rotation button
#define minus 0xF076C13B  //counter clockwise rotation button
#define pause 0x20FE4DBB //HEX numbers vary for each remote, check monitor
#define one 0x9716BE3F
#define two 0x3D9AE3F7
#define three 0x6182021B
#define motorPin1  8      // IN1 on the ULN2003 driver
#define motorPin2  9      // IN2 on the ULN2003 driver
#define motorPin3  10     // IN3 on the ULN2003 driver
#define motorPin4  11     // IN4 on the ULN2003 driver
#define MotorInterfaceType 8</p><p>
int RECV_PIN = 4;     //IR receiver pin
Servo servoLeft;      //Identify Servo
AccelStepper stepper = AccelStepper(MotorInterfaceType, motorPin1, motorPin3, motorPin2, motorPin4);      //Identify Stepper
IRrecv irrecv(RECV_PIN);      //Assign pin to IR receiver
decode_results results;       //Decode the result
void setup()
  Serial.begin(9600);//Sets the data rate in bits per second (baud) for serial data transmission
  stepper.setMaxSpeed(2000);//Set the max speed to prevent error
  irrecv.enableIRIn(); // Start the receiver
  servoLeft.attach(12);  // Set left servo to digital pin 12
void loop()//Loops the program
  if (irrecv.decode(&results))//Decodes the results into digital
    Serial.println(results.value, HEX);//Prints HEX code for button pressed on monitor
    irrecv.resume(); // Receive the next value</p><p>    if (results.value == plus)//This part of program executes if the plus button is pressed
      servoLeft.write(180);//Turns servo in the direction left to 180 degrees
      delay(1);//delay of 1sec before next step
    }   if (results.value == minus)
      servoLeft.write(0);//Turns servo in the direction right to 90 degrees
    }   if (results.value == pause)
      servoLeft.write(90);//Turns servo in the direction center to 90 degrees

  if (results.value == one)
    stepper.setSpeed(500);//Set speed of the stepper to 500 rpm
    stepper.runSpeed();//Run at the speed specified
  }  if (results.value == two)
    stepper.setSpeed(1000);//Set speed of the stepper to 1000 rpm
  } if (results.value == three)
    stepper.setSpeed(1200);//Set speed of the stepper to 1200 rpm

Step 3: Step 3: 3D Printed Parts

The 3D print files for the project are present below created using Blender. Each file can be sent directly to a printer for printing, exporting to a different format is not needed. When connecting the parts together, the following parts will be present and need to be assembled according to the instructions provided in the next step. Additionally, holes need to be drilled into the printed pieces for proper concealment of wires as well as creating an opening for the IR receiver. These holes can be created using a drill, additional drill tutorials are also available online. The following parts will be present:

  • 1 x Bottom Hull (Main)
  • 2 x Side Floats
  • 6 x Side Float Connectors
  • 1 x Arduino Housing
  • 1 x Battery Housing
  • 1 x Stepper Motor Housing
  • 1 x Watermill

Step 4: Step 4: 3D Model Assembly

First, one hole needs to be created on the side of the Arduino and breadboard casing proportional to an IR receiver, enough for signals to be received without disruption. Next, create a hole on the length of the battery casing that doesn't have any openings. this is to allow the wiring for the servo motor rudder. Ensure that this hole is created on the middle side. Next, create another hole in the same piece but now closer to the right or left side, this is for the wiring of the stepper motor watermill. A hole also needs to be created within the stepper motor housing for proper protrusion of the rotating appendage of the motor.

Once the openings have been created, place the Arduino and breadboard with the wiring and sensor into the casing whilst connecting the motor wires through the openings already present. This task is tedious, be careful not to let any connections break during and after placement. Next, take the battery casing and place the ULN2003 and a 12-Volt battery inside it, the battery still disconnected to the Arduino. Ensure that it fits perfectly with the Arduino and stepper motor casing and retrieve the wires through the created holes and then proceed to tape or glue it to the 3D printed hull.

After this place the stepper motor into its casing and seal it with tape or glue, ensuring that the rotating appendage is protruding out. Connect the Watermill to this rotating appendage using superglue. The superglue can be taken out using acetone to reuse the motor for later projects. Then, Superglue the servo motor to the hull without any casing and superglue the rudder to it. In this project the rudder was not 3D printed, however, it is recommended. Lastly, connect the floats using the connectors to the hull of the boat, this is another tedious task, ensure that the floats align with each other and are symmetrically placed.

Step 5: Step 5: Final Product

The final piece can be colored or painted in any scheme and can also be modified physically. Due to the limitations of the motor power, the boat cannot achieve high velocities, but changes in the type of motor used can allow for higher speeds. Enjoy!