Build Your Own RC Airplane with Arduino: The Complete DIY Guide for Beginners

 

Can you control a model aircraft with a simple Arduino radio controller?
Absolutely — and this guide shows you exactly how. We'll build a lightweight foamboard RC airplane from scratch, wire up an Arduino-powered 4-channel NRF24L01 receiver, connect servos and an ESC, and fly it all with a homemade transmitter. No expensive commercial radio gear needed!


✈️ Introduction

RC airplanes are one of the most rewarding projects a maker or hobbyist can take on. The thrill of watching something you built lift off the ground and respond to your controls is genuinely hard to beat. But commercial RC transmitters and receivers can be expensive — sometimes more costly than the airplane itself.

In this project, we solve that problem by replacing the commercial radio system with a pair of Arduino microcontrollers and two inexpensive NRF24L01 2.4 GHz wireless modules. The result is a fully functional 4-channel radio link (throttle, pitch, roll, yaw) that you build yourself, understand completely, and can customise however you like.

The airframe is made from 5 mm kraft foamboard — cheap, easy to cut, and light enough to


 fly on a small brushed DC motor. A 2S 450 mAh LiPo battery keeps the whole thing feather-light, and a 20 A ESC handles smooth throttle control. Two 9 g servos move the elevator and ailerons, while a 5 g servo handles the rudder. The result is a beginner-friendly fixed-wing that is surprisingly agile in the air.

Whether you are new to electronics, returning to the RC hobby, or just curious whether Arduino can replace a proper transmitter — spoiler: it can — this guide walks you through every step. Let's build it.

🛒 What You Need — Full Parts List

All links below are affiliate links. Prices are budget-friendly and most ship worldwide.

#ComponentBuy Links
120A ESC
29g 180° Micro Servos
35g Micro Servo
42S 7.4V 450 mAh LiPo Battery
51.2 mm Pushrods
6Servo Control Horns
7Adjustable Linkage Stoppers
8Wheels
9DC 180 Motors
10108 mm Propellers (CW & CCW)
1118 AWG Silicone Cable
125 mm Kraft Foamboard
13LiPo Battery Charger


🛠️ Step 1 — Building the Airplane Body Structure




⚡ Step 2 — Wiring the Receiver Circuit


The receiver circuit is built around an Arduino Nano (or Uno). The NRF24L01 module connects via SPI (pins 7 & 8 for CE/CSN). Four servo outputs are mapped to digital pins D2–D5. The ESC signal wire also plugs into one of these channels, while the ESC itself powers the servos via its built-in Battery Eliminator Circuit (BEC). Keep all wiring short and use heat-shrink tubing on every joint before mounting inside the fuselage.

💻 Step 3 — Arduino Receiver Code

Upload the sketch below to the Arduino inside the airplane. This is a 4-channel receiver that outputs PWM signals on pins D2, D3, D4, and D5 — one for each control surface plus the throttle.


//  4 Channel Receiver | 4 Kanal Alıcı
//  PWM output on pins D2, D3, D4, D5

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

int ch_width_1 = 0;
int ch_width_2 = 0;
int ch_width_3 = 0;
int ch_width_4 = 0;

Servo ch1;
Servo ch2;
Servo ch3;
Servo ch4;

struct Signal {
  byte throttle;
  byte pitch;
  byte roll;
  byte yaw;
};

Signal data;

const uint64_t pipeIn = 0xE9E8F0F0E1LL;
RF24 radio(7, 8);

void ResetData() {
  // Initial values — center position for all channels
  data.throttle = 127;  // Motor Stop
  data.pitch    = 127;  // Center
  data.roll     = 127;  // Center
  data.yaw      = 127;  // Center
}

void setup() {
  ch1.attach(2);
  ch2.attach(3);
  ch3.attach(4);
  ch4.attach(5);

  ResetData();
  radio.begin();
  radio.openReadingPipe(1, pipeIn);
  radio.startListening();
}

unsigned long lastRecvTime = 0;

void recvData() {
  while (radio.available()) {
    radio.read(&data, sizeof(Signal));
    lastRecvTime = millis();
  }
}

void loop() {
  recvData();
  unsigned long now = millis();

  if (now - lastRecvTime > 1000) {
    ResetData();  // Signal lost — reset to safe defaults
  }

  ch_width_1 = map(data.throttle, 0, 255, 1000, 2000);  // D2
  ch_width_2 = map(data.pitch,    0, 255, 1000, 2000);  // D3
  ch_width_3 = map(data.roll,     0, 255, 1000, 2000);  // D4
  ch_width_4 = map(data.yaw,      0, 255, 1000, 2000);  // D5

  ch1.writeMicroseconds(ch_width_1);
  ch2.writeMicroseconds(ch_width_2);
  ch3.writeMicroseconds(ch_width_3);
  ch4.writeMicroseconds(ch_width_4);
}

📚 Step 4 — Installing the Required Libraries

⚠️ Important — Install Libraries Before Uploading!

The #include lines at the top of the code reference external library files (.h and .cpp). You must download and install these into your Arduino libraries folder before the sketch will compile.

How to install:
  1. Download the library ZIP from the link below.
  2. Open the Arduino IDE → Sketch → Include Library → Add .ZIP Library
  3. Select the downloaded ZIP file. Done!
Required libraries:
  • RF24 (NRF24L01) — github.com/maniacbug/RF24
    Note: If this version does not compile with your board, try the TMRh20 fork: github.com/nRF24/RF24
  • SPI — built into the Arduino IDE (no download needed)
  • Servo — built into the Arduino IDE (no download needed)

🚀 Final Tips Before Your First Flight

Always perform a range check before flying — walk 30 metres away from the plane with the transmitter and confirm all control surfaces respond correctly. Charge your LiPo fully before every session, and never discharge it below 3.5 V per cell. Trim your control surfaces on the ground so the airplane flies straight and level in calm conditions before attempting any manoeuvres.

Start your maiden flight in a large, open field with no wind and gentle throttle inputs. If the plane veers left or right, land, adjust the trim, and try again. Happy flying! ✈️


DIYRC AirplaneArduinoRC ControllerRadio ControlNRF24L01ElectronicsFoamboard AirplaneESCServoLiPo BatteryMakerHobbySTEMArduino Project


Comments