03/06/2025

Delta Wing ve V-Tail RC Uçaklar İçin Delta / V-Tail Mix destekli Arduino Alıcı Yapmı

Bazı model uçaklar delta kanatlıdır. Bazıları da V tipi kuyruğa sahiptir. Delta kanatlı modellerde iki kanalın birlikte hem aileron hem de elevator olarak çalışması gerekir.  V-Tail modeller de ise hem elevatör hem de rudder olarak çalışması gerekir. Bu alıcı gerekli olan miks özelliğine sahiptir.

Alıcı kodu, PDF ve Gerber dosyaları: https://drive.google.com/file/d/1BHzEPPrXesnFIR55zIHX7_UMv9p4uMUp/view?usp=sharing

 

 

Gerekli Malzemeler:
(Bu malzemeler ülkemizde farklı yerlerde makul fiyatlar ile satılmaktadır. İsimleri ile aratabilirsiniz. Yurtdışı linkleri malzemeyi görebilmeniz için referans amaçlıdır)

GT-24 NRF24L01+PA+SMD: https://s.click.aliexpress.com/e/_DekKUm9 Veya 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 Veya https://s.click.aliexpress.com/e/_ooUqa3e
2×4 pin Header: https://s.click.aliexpress.com/e/_DdnClhn

 

Arduino Mikro Pro için Alıcı kodu:

#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, 1000, 2000); 
  ch_width_4 = map(ch4Value, -300, 300, 2000, 1000); 
  
  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);
}

Kanal 2 ve 4 mixli kanallardır. Bu kanallara bağlı servolar delta kanatlı model uçaklar için elevator ve aileron fonksiyonlarını gerçekleştirir. V-Tail model uçaklar için elevator ve rudder fonksiyonlarını gerçekleştirir.
Servolardan biri olması gerektiği yönde hareket etmiyorsa; örneğin elevator kolunu çektiğimizde her iki servo da yukarı yönde hareket etmelidir. Eğer biri zıt yönde hareket ediyorsa ilgili satırdaki 1000 ve 2000 değerlerinin yerini değiştirin.

Örnek:

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


Alıcı kod analizi: (Hangi kod satırı ne işe yarar?)

6 kanal Delta Miks & V-tail mix Alıcı (ARDUINO MICRO PRO İÇİN)

#include <SPI.h>          //  nRF24L01 modülü ile iletişim için SPI kütüphanesini ekle
#include <nRF24L01.h>     //  nRF24L01 modülü için kütüphaneyi ekle
#include <RF24.h>         //  Radyo iletişimi için RF24 kütüphanesini ekle
#include <Servo.h>        //  Servo motorları kontrol etmek için Servo kütüphanesini ekle

// Her kanal için darbe genişliğini saklayacak değişkenler
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;

// Her kanal için Servo nesneleri
Servo ch1;
Servo ch2;
Servo ch3;
Servo ch4;
Servo ch5;
Servo ch6;

// Alınan sinyal verilerini saklamak için yapı
struct Signal {
  byte throttle;  // Throttle channel | Gaz kanalı
  byte pitch;     // Pitch channel    | Pitch kanalı
  byte roll;      // Roll channel     | Roll kanalı
  byte yaw;       // Yaw channel      | Yaw kanalı
  byte aux1;      // Auxiliary channel 1 | Yardımcı kanal 1
  byte aux2;      // Auxiliary channel 2 | Yardımcı kanal 2
};

Signal data;  // Signal yapısının bir örneğini oluştur

// Radyo iletişim boru adresini tanımla
const uint64_t pipeIn = 0xABCDABCD71LL;

// 8 (CE) ve 10 (CSN) pinleri ile bir RF24 radyo nesnesi oluştur
RF24 radio(8, 10);

// Sinyal verilerini varsayılan değerlere sıfırlayan fonksiyon
void ResetData() {
  data.throttle = 0;   // Set throttle to 0 | Gazı 0'a ayarla
  data.roll = 127;     // Set roll to neutral (127) | Roll'u nötr (127) yap
  data.pitch = 127;    // Set pitch to neutral (127) | Pitch'i nötr (127) yap
  data.yaw = 127;      // Set yaw to neutral (127) | Yaw'ı nötr (127) yap
  data.aux1 = 0;       // Set auxiliary channel 1 to 0 | Yardımcı kanal 1'i 0'a ayarla
  data.aux2 = 0;       // Set auxiliary channel 2 to 0 | Yardımcı kanal 2'yi 0'a ayarla
}

void setup() {
  // Servo motorları ilgili pinlere bağla
  ch1.attach(2);
  ch2.attach(3);
  ch3.attach(4);
  ch4.attach(5);
  ch5.attach(6);
  ch6.attach(7);

  ResetData();  // Sinyal verilerini varsayılana sıfırla

  // Radyo modülünü başlat
  radio.begin();
  radio.openReadingPipe(1, pipeIn);  // Okuma için Pipe aç
  radio.setChannel(100);             // Radyo kanalını 100'e ayarla
  radio.setAutoAck(false);           // Otomatik onaylamayı devre dışı bırak
  radio.setDataRate(RF24_250KBPS);   // Veri hızını 250 kbps'ye ayarla
  radio.setPALevel(RF24_PA_MAX);     // Güç amplifikatör seviyesini maksimuma ayarla
  radio.startListening();            // Gelen verileri dinlemeye başla
}

unsigned long lastRecvTime = 0;  // Son alınan veri zamanını saklayan değişken

// Radyo modülünden veri alan fonksiyon
void recvData() {
  while (radio.available()) {
    radio.read(&data, sizeof(Signal));  // Veriyi Signal yapısına oku
    lastRecvTime = millis();            // Son alınan zamanı güncelle
  }
}

void loop() {
  recvData();  // Radyodan veri al

  unsigned long now = millis();  // Şu anki zamanı al
  if (now - lastRecvTime > 1000) {
    ResetData();  // 1 saniye boyunca veri alınmazsa verileri sıfırla
  }

  // V-tail mixing process | V-tail miksleme işlemi
  int pitchValue = map(data.pitch, 0, 255, -150, 150);  // Pitch değerini -150 ile 150 arasına ölçekle
  int yawValue = map(data.yaw, 0, 255, -150, 150);      // Yaw değerini -150 ile 150 arasına ölçekle

  // 2. ve 4. kanallar için mikslenmiş değerler
  int ch2Value = pitchValue - yawValue;  //  2. Kanal: Pitch - Yaw
  int ch4Value = pitchValue + yawValue;  //  4. Kanal: Pitch + Yaw

  // Karıştırılmış değerleri servo darbe genişliğine (1000-2000 mikrosaniye) dönüştür
  ch_width_2 = map(ch2Value, -300, 300, 1000, 2000);  // ch2Value'yi darbe genişliğine dönüştür
  ch_width_4 = map(ch4Value, -300, 300, 2000, 1000);  // ch4Value'yi darbe genişliğine dönüştür (ters yön)

  // Diğer kanalları servo darbe genişliğine dönüştür
  ch_width_1 = map(data.roll, 0, 255, 1000, 2000);      // Roll kanalı
  ch_width_3 = map(data.throttle, 0, 255, 1000, 2000);  // Gaz kanalı
  ch_width_5 = map(data.aux1, 0, 1, 1000, 2000);        // Yardımcı kanal 1
  ch_width_6 = map(data.aux2, 0, 1, 1000, 2000);        // Yardımcı kanal 2

  // Servolara PWM sinyallerini gönder
  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);
}


Verici için
daha önce yayınladığım versiyonu kullanabilirsiniz. Bu alıcı ile uyumludur.

6 Kanallı (Opsiyonel 8) Uzaktan Kumanda Nasıl Yapılır? 2000m+ Menzil

_____________________________________________________________________

GENEL BİLGİLER:

Eğer Arduino/libraries klasöründe aşağıdaki kütüphane dosyaları yer almıyorsa kodu Arduino’ya yüklemeden önce gerekli kütüphane dosyalarını bilgisayarınıza indirmeniz gerekmektedir. Kütüphane dosyası yoksa kurulum gerçekleşmeyecek ve hata oluşacaktır.

Gerekli kütüphane dosyası:

SPI.h
nRF24L01.h
RF24.h
Servo.h

İndirmek için linkler …..:

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


Arduino IDE nasıl kurulur? & Kütüphane dosyaları nasıl yüklenir? Eğitim Videosu: