03/31/2025

How To Make Delta / V-Tail Mix Arduino Receiver For Delta Wing RC Airplane

Some model airplanes have delta wings. Some have V-tails. In delta wing models, two channels must work together as both aileron and elevator. In V-Tail models, it must work both elevator and rudder. This receiver has the necessary mixing feature.

Download Receiver Code, PDF and Gerber Files: https://drive.google.com/file/d/1BHzEPPrXesnFIR55zIHX7_UMv9p4uMUp/view?usp=sharing

 

 

Needs:
GT-24 NRF24L01+PA+SMD: https://s.click.aliexpress.com/e/_DekKUm9 OR https://s.click.aliexpress.com/e/_oEjrKrK
Arduino Micro Pro: https://s.click.aliexpress.com/e/_oEww0wy
100uF (16V or 25V) electrolytic capacitors : https://s.click.aliexpress.com/e/_DBJpcn1
10uF electrolytic capacitors : https://s.click.aliexpress.com/e/_DDVm071
100nF (104) ceramic capacitor: https://s.click.aliexpress.com/e/_DmUGp7T
Female Header Pin (12 pins) 12P Female: https://s.click.aliexpress.com/e/_DDqmgbh
Copper Clad Board: https://s.click.aliexpress.com/e/_oDTDgMM
LM1117 3.3V Regulator IC: https://s.click.aliexpress.com/e/_oFQSuhw OR https://s.click.aliexpress.com/e/_ooUqa3e
2×4 pin Header: https://s.click.aliexpress.com/e/_DdnClhn

Optional:
80W Soldering Iron: https://s.click.aliexpress.com/e/_oFNZ4UY
A4 Transfer Paper (Toner): https://s.click.aliexpress.com/e/_oFMhbda

Receiver Code For Arduino Micro Pro:

#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;
int ch_width_5 = 0;
int ch_width_6 = 0;

Servo ch1;
Servo ch2;
Servo ch3;
Servo ch4;
Servo ch5;
Servo ch6;

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

Signal data;

const uint64_t pipeIn = 0xABCDABCD71LL;
RF24 radio(8, 10);

void ResetData() {
  data.throttle = 0;
  data.roll = 127;
  data.pitch = 127;
  data.yaw = 127;
  data.aux1 = 0;
  data.aux2 = 0;
}

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

  ResetData();
  radio.begin();
  radio.openReadingPipe(1, pipeIn);
  radio.setChannel(100);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_MAX);
  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();
  }

  int pitchValue = map(data.pitch, 0, 255, -150, 150);  
  int yawValue = map(data.yaw, 0, 255, -150, 150);     

  int ch2Value = pitchValue - yawValue;  
  int ch4Value = pitchValue + yawValue;  

  ch_width_2 = map(ch2Value, -300, 300, 2000, 1000);  
  ch_width_4 = map(ch4Value, -300, 300, 1000, 2000);  

  ch_width_1 = map(data.roll, 0, 255, 1000, 2000);
  ch_width_3 = map(data.throttle, 0, 255, 1000, 2000);
  ch_width_5 = map(data.aux1, 0, 1, 1000, 2000);
  ch_width_6 = map(data.aux2, 0, 1, 1000, 2000);
  ch1.writeMicroseconds(ch_width_1);
  ch2.writeMicroseconds(ch_width_2);
  ch3.writeMicroseconds(ch_width_3);
  ch4.writeMicroseconds(ch_width_4);
  ch5.writeMicroseconds(ch_width_5);
  ch6.writeMicroseconds(ch_width_6);
}

Channels 2 and 4 are mix channels. Servos connected to these channels perform elevator and aileron functions for delta wing model aircraft. For V-Tail models, they perform elevator and rudder functions.
If one of the servos is not moving in the direction it should be; For example, when we pull the elevator arm, both servos should move in the upward direction. If one of them is moving in the opposite direction, change the 1000 and 2000 values ​​in the relevant line.

Example:

ch_width_2 = map(ch2Value, -300, 300, 2000, 1000);
instead
ch_width_2 = map(ch2Value, -300, 300, 1000, 2000);

 

Analysis of the receiver code; (Which line does what?)

// 6-Channel Delta Mix & V-Tail mix Receiver (FOR ARDUINO MICRO PRO)

#include <SPI.h>          // Include SPI library for communication with the nRF24L01 module 
#include <nRF24L01.h>     // Include nRF24L01 library for nRF24L01 module 
#include <RF24.h>         // Include RF24 library for radio communication 
#include <Servo.h>        // Include Servo library for controlling servos 

// Variables to store the pulse width for each channel 
int ch_width_1 = 0;
int ch_width_2 = 0;
int ch_width_3 = 0;
int ch_width_4 = 0;
int ch_width_5 = 0;
int ch_width_6 = 0;

// Servo objects for each channel 
Servo ch1;
Servo ch2;
Servo ch3;
Servo ch4;
Servo ch5;
Servo ch6;

// Structure to store the received signal data 
struct Signal {
  byte throttle;  // Throttle channel 
  byte pitch;     // Pitch channel   
  byte roll;      // Roll channel   
  byte yaw;       // Yaw channel    
  byte aux1;      // Auxiliary channel 1 
  byte aux2;      // Auxiliary channel 2 
};

Signal data;  // Create an instance of the Signal structure 

// Define the radio communication pipe address 
const uint64_t pipeIn = 0xABCDABCD71LL;

// Create an RF24 radio object with pins 8 (CE) and 10 (CSN) 
RF24 radio(8, 10);

// Function to reset the signal data to default values 
void ResetData() {
  data.throttle = 0;   // Set throttle to 0 
  data.roll = 127;     // Set roll to neutral (127) 
  data.pitch = 127;    // Set pitch to neutral (127) 
  data.yaw = 127;      // Set yaw to neutral (127) 
  data.aux1 = 0;       // Set auxiliary channel 1 to 0
  data.aux2 = 0;       // Set auxiliary channel 2 to 0 
}

void setup() {
  // Attach servos to respective pins 
  ch1.attach(2);
  ch2.attach(3);
  ch3.attach(4);
  ch4.attach(5);
  ch5.attach(6);
  ch6.attach(7);

  ResetData();  // Reset signal data to default 

  // Initialize the radio module 
  radio.begin();
  radio.openReadingPipe(1, pipeIn);  // Open the reading pipe 
  radio.setChannel(100);             // Set the radio channel to 100 
  radio.setAutoAck(false);           // Disable auto-acknowledgment 
  radio.setDataRate(RF24_250KBPS);   // Set data rate to 250 kbps 
  radio.setPALevel(RF24_PA_MAX);     // Set power amplifier level to maximum 
  radio.startListening();            // Start listening for incoming data 
}

unsigned long lastRecvTime = 0;  // Variable to store the last received data time 

// Function to receive data from the radio module 
void recvData() {
  while (radio.available()) {
    radio.read(&data, sizeof(Signal));  // Read the data into the Signal structure 
    lastRecvTime = millis();            // Update the last received time
  }
}

void loop() {
  recvData();  // Receive data from the radio 

  unsigned long now = millis();  // Get the current time 
  if (now - lastRecvTime > 1000) {
    ResetData();  // If no data received for 1 second, reset the data 
  }

  // V-tail mixing process | V-tail miksleme işlemi
  int pitchValue = map(data.pitch, 0, 255, -150, 150);  // Scale pitch value between -150 and 150 
  int yawValue = map(data.yaw, 0, 255, -150, 150);      // Scale yaw value between -150 and 150 

  // Mixed values for channels 2 and 4 
  int ch2Value = pitchValue - yawValue;  // Channel 2: Pitch - Yaw 
  int ch4Value = pitchValue + yawValue;  // Channel 4: Pitch + Yaw 

  // Map the mixed values to servo pulse width (1000-2000 microseconds) 
  ch_width_2 = map(ch2Value, -300, 300, 1000, 2000);  // Map ch2Value to pulse width 
  ch_width_4 = map(ch4Value, -300, 300, 2000, 1000);  // Map ch4Value to pulse width (reversed direction) 

  // Map other channels to servo pulse width 
  ch_width_1 = map(data.roll, 0, 255, 1000, 2000);      // Roll channel 
  ch_width_3 = map(data.throttle, 0, 255, 1000, 2000);  // Throttle channel 
  ch_width_5 = map(data.aux1, 0, 1, 1000, 2000);        // Auxiliary channel 1 
  ch_width_6 = map(data.aux2, 0, 1, 1000, 2000);        // Auxiliary channel 2

  // Send PWM signals to the servos 
  ch1.writeMicroseconds(ch_width_1);
  ch2.writeMicroseconds(ch_width_2);
  ch3.writeMicroseconds(ch_width_3);
  ch4.writeMicroseconds(ch_width_4);
  ch5.writeMicroseconds(ch_width_5);
  ch6.writeMicroseconds(ch_width_6);
}

For the transmitter you can use the version I published before. It is compatible with this receiver.

How To Make 6-Channel (Optional 8 Channel) Radio Control. Range 2000m+

 

_______________________________________

 

GENERAL INFO:
Before uploading the codes to Arduino, you need to download the necessary library files to your computer.
If there are no library files, the installation will not occur and an error will occur.

 

Required library file:
SPI.h
nRF24L01.h
RF24.h
Servo.h

NRF24 Module Library File Links for download …..:

NRF24 Module library Files (Github page): https://github.com/nRF24/RF24

NRF24 Module library File (zip) : https://github.com/nRF24/RF24/archive/master.zip

Servo Library: https://www.arduinolibraries.info/libraries/servo

 

How to install Arduino IDE? & How to install Library File?