Build a Simple Arduino RC Boat that can be Controlled Wirelessly using 433 MHz RF Modules

Published  July 3, 2021   0
RAJESH
Author
Arduino RC Boat using 433 MHz RF Modules

In this project, we will build a remote-controlled Arduino Air-Boat that can be controlled wirelessly using the 433 MHz RF Radio Modules. We will control this boat using a homemade remote control by building our own 433 MHz transmitter and a receiver module. In the case of remote-controlled devices or communication between two devices, we have a lot of options like IR, Bluetooth, internet, RF, etc. When compared to IR communication, radio communications have some advantages like more range and it doesn’t require a line of sight connection between the transmitter and receiver. Also, these modules can do two ways of communication, meaning it can transmit and receive at the same time. So using this 433MHz RF module, let’s build an Arduino RC Boat in this tutorial.

We have previously built many remote-controlled projects using these 433Mhz RF modules for either controlling a Robot like this RF controlled Robot or for Home Automation applications to Control Home appliances using RF. Apart from using RF modules, we have also built a Bluetooth Controlled Raspberry Pi Car and a DTMF Mobile phone controlled Arduino Robot previously. You can also check out these projects if you are interested.  

Components Required for Arduino RC Boat  

Components Required for Arduino RC Boat

  • 433MHz transmitter and receiver
  • Arduino (any Arduino, to reduce the size I am using promini)
  • HT12E and HT12D
  • Push buttons- 4Nos
  • Resistors- 1mega ohm, 47k ohm
  • L293d Motor Driver
  • 9V Battery (I am using a 7.4-volt battery)- 2Nos
  • 7805 regulator- 2Nos
  • DC motors- 2Nos
  • Motor leaf or propellors(I am using homemade propellors)- 2Nos
  • .1uf capacitor- 2Nos
  • Common PCB

433MHz RF Transmitter and Receiver Modules

433MHz RF Transmitter and Receiver Modules

These types of RF modules are very popular among makers. Because of their low cost and simplicity in connections. These modules are best for all forms of short-range communication projects. These modules are ASK (Amplitude Shift Keying) type RF modules, Amplitude-shift keying (ASK) is a form of amplitude modulation that represents digital data as variations in the amplitude of a carrier wave. In an ASK system, the binary symbol 1 is represented by transmitting a fixed-amplitude carrier wave and fixed frequency for a bit duration of T seconds. If the signal value is 1, then the carrier signal will be transmitted; otherwise, a signal value of 0 will be transmitted. That means they usually draw no power when transmitting Logic “zero”. This low power consumption makes them very useful in battery-operated projects.

433MHZ RF Transmitter

433MHZ RF Transmitter

This type of module is super tiny and comes with 3 pins VCC, ground, and data. Some other modules come with an extra antenna pin. The working voltage of the transmitter module is 3V-12V and this module doesn't have any adjustable components. One of the major advantages of this module is the low current consumption, it requires almost zero current to send bit zero.

Block Diagram of Arduino RC Boat Transmitter

Arduino RC Boat Transmitter Block Diagram

In the above block diagram, there are four pushbuttons (Control Buttons), these pushbuttons are for controlling the direction of the boat. We have four of them for forward, backward, left, and right. From the pushbuttons, we get logic for controlling the boat but can’t directly connect to the encoder that's why we used the Arduino. You might think why I used Arduino here, it is simply because we need to pull down two parallel data inputs of the encoder at the same time for a backward and forward movement that can’t be achieved with just pushbuttons. Then the encoder encodes the coming parallel data to serial outputs. Then we can transmit that serial data with the help of an RF transmitter.

Circuit Diagram of the Arduino RC Remote (Transmitter)

 Arduino RC Remote Circuit Diagram

In the above circuit, you can see one side of all four pushbuttons connected to four digital pins of Arduino (D6-D9) and all the four other sides connected to the ground. That is when we press the button, the corresponding digital pins get a logic low. The four parallel inputs of the HT12E encoder connected to another four digital pins of Arduino (D2-D5). So with the help of Arduino, we can decide the input of the encoder.

And talking about encoder HT12E is a 12-bit encoder and a parallel input-serial output encoder. Out of 12 bits, 8-bits are address bits that can be utilized for controlling multiple receivers. The pins A0-A7 are the address input pins. In this project, we are controlling only one receiver, so we don't want to change its address, so I connected all address pins to the ground. If you want to control different receivers with one transmitter, you can use dip switches here. AD8-AD11 are the control bit inputs. These inputs will control the D0-D3 outputs of the HT12D decoder. We need to connect an oscillator for the communication and the oscillator frequency should be 3KHz for 5V operation. Then the resistor value will be 1.1MΩ for 5V. Then I connected the output of the HT12E to the transmitter module. We already mentioned, the Arduino and rf transmitter module, both of these devices work on 5V high voltage will kill it, so to avoid this, I added the 7805, voltage regulator. Now we can connect (Vcc) 6-12volt any type batteries to input.

HT12E Encoder

Building the RC BOAT Transmitter Circuit

I soldered every component on a common PCB. Remember we are working on an RF project so there are a lot of chances for different types of interferences so connect all components very closely as much possible. It's better to use female pin headers for Arduino and the transmitter module. Also, try to solder everything on the copper pads instead of using extra wires. Finally, connect a small wire to the transmitter module that will help to increase the total range. Before connecting the Arduino and transmitter module, double-check the voltage of the lm7805 output.

Building the RC BOAT Transmitter Circuit

The above image shows the top view of the completed RC Boat transmitter circuit and the Bottom view of the completed RC Boat Transmitter circuit is shown below.

RC BOAT Transmitter Circuit

Building the Arduino RC Boat Transmitter Enclosure

A decent body is necessary for the remote. This step is all about your ideas, you can create a remote body with your ideas. I am explaining how I made this. For making a remote body, I choose 4mm MDF sheets, you can also choose plywood, foam sheet, or cardboard, then I cut two pieces from that with a length of 10cm and breadth of 5cm. Then I marked the positions for the buttons. I placed the direction buttons on the left side and forward, backward buttons on right. On the other side of the sheet, I connected the push buttons to the main transmitting circuit. Remember a normal pushbutton has 4 pins that are two pins for each side. Connect one pin to Arduino and the other pin to the ground. If you are confused with that, please check it with a multimeter or check the datasheet.

Arduino RC Boat Transmitter Enclosure

After connecting all these things, I placed the control circuit in between the two MDF boards and tighten with some long bolt (please refer to the below images if you want). Once again creating a good body is all about your ideas.

Arduino RC Remote

433Mhz Receiver Module

433Mhz Receiver module

This receiver also very tiny and comes with 4 pins VCC, ground, and the two middle pins are data out. The working voltage of this module is 5v. Like the transmitter module, this is also a low power module. Some modules come with an extra antenna pin but in my case, that is not present.

Block Diagram of the Arduino RC Boat Receiver

Arduino RC Boat Receiver Block Diagram

The above block diagram describes the working of the RF receiver circuit. First, we can receive the transmitted signals using the RF receiver module. The output of this receiver is serial data. But we can't control anything with this serial data that's why we connected the output to the decoder. The decoder decodes the serial data to our original parallel data. In this section, we don't require any microcontrollers, we can directly connect the outputs to the motor driver.

Circuit Diagram of Arduino RC Boat Receiver 

Arduino RC Boat Receiver Circuit Diagram

The HT12D is a 12-bit decoder which is a serial input-parallel output decoder. The input pin of the HT12D will be connected to a receiver that has a serial output. Among the 12-bits, 8 bits (A0-A7) are address bits and the HT12D will decode the input if only it matches its current address. D8-D11 are the output bits. To match this circuit to the transmitter circuit, I connected all the address pins to the ground. Data out of the module is the serial type and the decoder decodes this serial data to original parallel data and we get out through D8-D11. To match the oscillation frequency should connect the 33-56k resistor to oscillator pins. Led on the 17th pin indicates the valid transmission, it only lit after when the receiver connected to a transmitter. The voltage input of the receiver is also 6-12 volts.

HT12D Decoder

To control motors, I used the L293D IC, I choose this IC because to decrease the size and weight and this IC is best for controlling two motors in two directions. L293D has 16 pins, the below diagram shows the pinouts.

L293D IC

L293D Functions

1, 9 pins are the enable pin, we connect that to 5 v to enable motors 1A, 2A, 3A, and 4A are the control pins. The motor will turn to the right if the pin 1A goes low and 2A goes high, and the motor will turn to the left if 1A goes low and 2A high. So we connected these pins to the output ps of the decoder. 1Y, 2Y, 3Y, and 4Y are the motor connection pins. Vcc2 is the motor driving voltage pin, if you are using a high voltage motor, then you connect this pin to the corresponding voltage source.

Building the Receiver Circuit of Arduino RC Boat

Before building the receiver circuit, you should remember some important things. The important one is the size and weight because after building the circuit, we need to fix it on the boat. So if the weight increases, that will affect the buoyancy and movement.

So same as in the transmitter circuit, solder every component in a small common PCB and try to use minimum wires. I connected pin 8 of the motor driver to 5v because I am using 5V motors.

Receiver Circuit of Arduino RC Boat

Building the RC-BOAT

RC Boat Setup

I tried different materials to build the boat body. And I got a better result with thermocol sheet. So I decided to build the body with thermocol. First, I took a 3cm thick thermocol piece and place the receiver circuit on top, then I marked the shape of the boat in thermocol and cut. So this is my way to build the boat, you can build according to your ideas.

Motors and Propellers for Arduino Air Boat

Once again weight matters. So choosing the correct motor is important, I choose 5volt, n20 type normal dc motors which is small and weightless. To avoid the RF interferences should connect 0.1uf capacitor parallel to motor inputs.

Motors for Arduino Air Boat

In the case of propellers, I made propellers using plastic sheets. You can buy propellers from the store or you can build your own both will work just fine. To build the propellers, first, I took a small plastic sheet and cut two small pieces from it and I bend the pieces with the help of candle heat. Finally, I put a small hole in its center for the motor and fixed to the motor that's it.

Motors and Propellers for Arduino Air Boat

Working of Arduino RC Boat

This boat has two motors lets call it left and right. If the motor moves to clockwise also (the position of the propellor also depends) propellor sucks air from the front and exhaust to the backside. That generates forward drag.

Forward movement: If  both the left and right motors rotate to clockwise that will  forward movement

Backward movement: If  both the left and right motors  to rotate counterclockwise(that is propeller sucks  air from the backside and exhaust to the front side )that will make backward movement

Left movement: If  only the right motor  rotates  that is boat get only drag from the right side that will the boat to move to the left  side

Right movement: If only the left motor rotates that is boat gets only drag from the left side that will make the boat move to the right side.

We connected the motors driver's input to four output bits of the decoder(D8-D11). we can control these 4 outputs by connecting the AD8-AD11 to the ground that is the buttons in the remote. For example, if we connect AD8 to the ground that will activate the D8. So such a way we can control the two motors in two directions using these 4 outputs. But we can't control two motors by just one button (we need that for forward and backward movement) that's why we used the Arduino. With help of Arduino, we can select the input data pins as our wish.

Arduino Programming of the RC Boat

The programming of this boat is very simple because we want only some logic switching. And we can achieve everything with basic Arduino functions. The complete program for this project can be found at the bottom of this page. The explanation of your program is as follows

We start the program by defining the integers for four input buttons and decoder inputs pins.

int f_button = 9;
int b_button = 8;
int l_button = 7;
int r_button = 6;
int m1=2;
int m2=3;
int m3=4;
int m4=5;

In the setup section, I defined the pin modes. That is, the buttons are connected to digital pins so these pins should define as input and we need to get output for the input of the decoder so we should define those pins as output.

   pinMode(f_button,INPUT_PULLUP);
  pinMode(b_button,INPUT_PULLUP);
  pinMode(l_button,INPUT_PULLUP);
  pinMode(r_button,INPUT_PULLUP);
  pinMode(m1,OUTPUT);
  pinMode(m2,OUTPUT);
  pinMode(m3,OUTPUT);
  pinMode(m4,OUTPUT);

Next in the main loop function, we will read the button status using the digitalread function of Arduino. If the pin status goes low that means the corresponding pin is pressed then we will execute the conditions as like follows-

if ( digitalRead(f_button)==LOW) 

That means the forward button is pressed

 {
   digitalWrite(m1, LOW);
   digitalWrite(m3, LOW);
   digitalWrite(m2, HIGH);
   digitalWrite(m4, HIGH);
 }

This will pulldown m1 and m2 of the encoder this will activate both motors on the receiver side. Similarly, for backward movement

 {
   digitalWrite(m1, HIGH);
   digitalWrite(m3, HIGH);
   digitalWrite(m2, LOW);
   digitalWrite(m4, LOW);
 }

For left movement

 {
   digitalWrite(m1, LOW);
   digitalWrite(m3, HIGH);
   digitalWrite(m2, HIGH);
   digitalWrite(m4, HIGH);
 }

For right movement

 {
   digitalWrite(m1, HIGH);
   digitalWrite(m3, LOW);
   digitalWrite(m2, HIGH);
   digitalWrite(m4, HIGH);
 }

After compiling the code, upload it to your Arduino board.

Troubleshooting: Place the boat on the water surface and check whether it is moving correctly if not try to change the polarity of motors and propellers. Also, try to balance weight.

RC Boat

The complete working of the project can be found in the video linked at the bottom of this page. If you have any questions leave them in the comment section.

Code
int f_button = 9;
int b_button = 8;
int l_button = 7;
int r_button = 6;
int m1 = 2;
int m2 = 3;
int m3 = 4;
int m4 = 5;
void setup () {
  pinMode(f_button, INPUT_PULLUP);
  pinMode(b_button, INPUT_PULLUP);
  pinMode(l_button, INPUT_PULLUP);
  pinMode(r_button, INPUT_PULLUP);
  pinMode(m1, OUTPUT);
  pinMode(m2, OUTPUT);
  pinMode(m3, OUTPUT);
  pinMode(m4, OUTPUT);
}
void loop() {
  if ( digitalRead(f_button) == LOW)
  {
    digitalWrite(m1, LOW);
    digitalWrite(m3, LOW);
    digitalWrite(m2, HIGH );
    digitalWrite(m4, HIGH);
  }
  if ( digitalRead(b_button) == LOW)
  {
    digitalWrite(m2, LOW);
    digitalWrite(m4, LOW);
    digitalWrite(m1, HIGH);
    digitalWrite(m3, HIGH);
  }
  if ( digitalRead(l_button) == LOW)
  {
    digitalWrite(m1, LOW);
    digitalWrite(m2, HIGH);
    digitalWrite(m3, HIGH);
    digitalWrite(m4, HIGH);
  }
  if ( digitalRead(r_button) == LOW)
  {
    digitalWrite(m1, HIGH);
    digitalWrite(m2, LOW);
    digitalWrite(m3, HIGH);
    digitalWrite(m4, HIGH);
  }
}
Video

Have any question realated to this Article?

Ask Our Community Members