10/05/2024

Uzun Menzilli Uzaktan Kumanda Yapımı. DIY Arduino RC 1-8 Kanal. BÖLÜM-1

100mW NRF24L01 PA LN (E01-ML01DP5) 2.4Ghz modül ve Arduino ile uzun menzilli uzaktan kumanda nasıl yapılır. 1 den 6 kanala kadar orantılı kanal ve 2 adet AÇ/KAPA kanal ile toplam 8 kanallı devrenin yapımı.

Birinci bölümde tek kanallı verici & alıcı devresi ve gerekli kodlar vardır. Bu şekilde bağlantılar ve kod karışık bir hale gelmeden devrelerinizi test edebilirsiniz. Ve bir sorun çıktığında çok daha kolay tespit yapabilir ve sorunu giderebilirsiniz. Daha sonra ikinci bölümde kanal sayısını sekize çıkartıp uzaktan kumanda devrelerimizi ve kodlarını geliştireceğiz.

Bu verici ve alıcı devrelerinin diğer Arduino uzaktan kumanda devrelerinden en büyük farkı kullandığım E01-ML01DP5 modülleridir. Bu modüller özünde NRF24L01 PA LN ile aynıdır. Ama güçleri daha fazladır. Verici olarak kullanıldığında 100mW (20dBm) gücünde çalışabilir. Teorik olarak 2100 metre menzile sahiptir. Ama pratik uygulamalarda bu azalacaktır. Bölüm 2 de bunu test edeceğiz. Alıcı olarak kullanıldığında ise yarı güçte çalışmaktadır.
Ayrıca metal kasası sayesinde elektriksel gürültüden etkilenmesi azalmıştır. Bu sayede daha kararlı çalışabilmektedir.

Gerekli Malzemeler:
2 x 100mW NRF24L01 PA LN (E01-ML01DP5): https://s.click.aliexpress.com/e/_DmEoWQf
2 x NRF24 wireless 3.3v adaptor
2 x Arduino Nano
2 x 100uF capacitor
4 x Dişi Header Pin (15 pins)
1 x 10K potansiyometre
Delikli plaket

VERİCİ ŞEMA:

VERİCİ KODU:

// 1 Channel Transmitter | 1 Kanal Verici
// Input pin A5

  #include <SPI.h>
  #include <nRF24L01.h>
  #include <RF24.h>
  const uint64_t pipeOut = 000322;    // NOTE: The same as in the receiver 000322 | Alıcı kodundaki adres ile aynı olmalı
  RF24 radio(9, 10);                          // select CE,CSN pin | CE ve CSN pinlerin seçimi

  struct Signal {
  byte aux1;
  byte aux3;
  
};
  Signal data;
  void ResetData() 
{
  data.aux1 = 0;                       // Signal lost position | Sinyal kesildiğindeki pozisyon
  data.aux3 = 0;
}
  void setup()
{
                                       //Configure the NRF24 module  | NRF24 modül konfigürasyonu
  radio.begin();
  radio.openWritingPipe(pipeOut);
  radio.setChannel(100);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);    // The lowest data rate value for more stable communication  | Daha kararlı iletişim için en düşük veri hızı.
  radio.setPALevel(RF24_PA_MAX);      // Output power is set for maximum |  Çıkış gücü maksimum için ayarlanıyor.
  radio.stopListening();              // Start the radio comunication for Transmitter | Verici için sinyal iletişimini başlatır.
  ResetData();
 
}
                                      // Joystick center and its borders | Joystick merkez ve sınırları
  int Border_Map(int val, int lower, int middle, int upper, bool reverse)
{
  val = constrain(val, lower, upper);
  if ( val < middle )
  val = map(val, lower, middle, 0, 128);
  else
  val = map(val, middle, upper, 128, 255);
  return ( reverse ? 255 - val : val );
}
  void loop()
{
                                     // Control Stick Calibration for channels  |  Her bir kanal için kumanda Kol Kalibrasyonları 
  data.aux1 = Border_Map( analogRead(A5), 0, 512, 1023, true );   // "true" or "false" for change signal direction | "true" veya "false" sinyal yönünü değiştirir.
  
  data.aux3 = digitalRead(7);
  radio.write(&data, sizeof(Signal));  
}

 

ALICI ŞEMA:

ALICI KODU:

//  1 Channel Receiver | 1 Kanal Alıcı
//  PWM output on pin D5

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

int ch_width_5 = 0;

Servo ch5;

struct Signal {
byte aux1;      
};

Signal data;

const uint64_t pipeIn = 000322;
RF24 radio(9, 10); 

void ResetData()
{

data.aux1 = 0;                                              // Define the inicial value of each data input. | Veri girişlerinin başlangıç değerleri
                                                            // The middle position for analog channels | Analog kanallar için orta konum
}

void setup()
{
                                                           // Set the pins for each PWM signal | Her bir PWM sinyal için pinler belirleniyor.
 
  ch5.attach(5);

                                                           
  ResetData();                                             // Configure the NRF24 module  | NRF24 Modül konfigürasyonu
  radio.begin();
  radio.openReadingPipe(1,pipeIn);
  radio.setChannel(100);
  radio.setAutoAck(false);
  radio.setDataRate(RF24_250KBPS);                          // The lowest data rate value for more stable communication  | Daha kararlı iletişim için en düşük veri hızı.
  radio.setPALevel(RF24_PA_MAX);                            // Output power is set for maximum |  Çıkış gücü maksimum için ayarlanıyor.
  radio.startListening();                                   // Start the radio comunication for receiver | Alıcı için sinyal iletişimini başlatır.

}

unsigned long lastRecvTime = 0;

void recvData()
{
while ( radio.available() ) {
radio.read(&data, sizeof(Signal));
lastRecvTime = millis();                                    // Receive the data | Data alınıyor
}
}

void loop()
{
recvData();
unsigned long now = millis();
if ( now - lastRecvTime > 1000 ) {
ResetData();                                                // Signal lost.. Reset data | Sinyal kayıpsa data resetleniyor
}

ch_width_5 = map(data.aux1, 0, 255, 1000, 2000);            // pin D5 (PWM signal)

ch5.writeMicroseconds(ch_width_5);                          // Write the PWM signal | PWM sinyaller çıkışlara gönderiliyor

}

Kodları Arduinoya yüklemeden önce bilgisayarınıza gerekli kütüphane dosyalarını yüklemeniz gerekir. Kütüphane dosyaları yoksa yükleme gerçekleşmez ve hata oluşur.
NRF24 Modülü için kütüphane indirme linkleri …..:

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

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