RC model uçak, drone, araba ve tekneler için düşük maliyetli 4 kanallı uzaktan kumanda nasıl yapılır.
Yaklaşık maliyeti 13-14 USD olan orantılı kontrollere sahip uzaktan kumanda yapımı. Model uçak, drone, araba, tekne ve tank gibi her çeşit model araç kontrolü için kullanılabilir.
Gerekli malzemeler:
2 x Arduino Nano
1 x NRF24L01 + PA Wireless Modül
1 x NRF24L01 Wireless Modül
2 x Arduino joystick
2 x 100uF Kondansatör (16V veya üstü)
1 x 13*6 cm delikli plaket
1 x 5*3.5 cm delikli plaket
Transmitter Circuit – Receiver Circuit | Verici Devresi – Alıcı Devresi
Arduino ve kütüphane dosyaları ile ilgili deneyiminiz yoksa kodu yüklemeden önce aşağıdaki videoyu izlemelisiniz.
Transmitter Code | Verici Kodu
// 4 Channel Transmitter | 4 Kanal Verici #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> const uint64_t pipeOut = 0xE9E8F0F0E1LL; //IMPORTANT: The same as in the receiver 0xE9E8F0F0E1LL | Bu adres alıcı ile aynı olmalı RF24 radio(7, 8); // select CE,CSN pin | CE ve CSN pinlerin seçimi struct Signal { byte throttle; byte pitch; byte roll; byte yaw; }; Signal data; void ResetData() { data.throttle = 127; // Motor Stop (254/2=127)| Motor Kapalı (Signal lost position | sinyal kesildiğindeki pozisyon) data.pitch = 127; // Center | Merkez (Signal lost position | sinyal kesildiğindeki pozisyon) data.roll = 127; // Center | merkez (Signal lost position | sinyal kesildiğindeki pozisyon) data.yaw = 127; // Center | merkez (Signal lost position | sinyal kesildiğindeki pozisyon) } void setup() { //Start everything up radio.begin(); radio.openWritingPipe(pipeOut); radio.stopListening(); //start the radio comunication for Transmitter | Verici olarak sinyal iletişimi başlatılıyor ResetData(); } // Joystick center and its borders | Joystick merkez ve sınırları int mapJoystickValues(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 | Kumanda Kol Kalibrasyonları // Setting may be required for the correct values of the control levers. | Kolların doğru değerleri için ayar gerekebilir. data.throttle = mapJoystickValues( analogRead(A0), 524, 524, 1015, true ); data.roll = mapJoystickValues( analogRead(A1), 12, 524, 1020, true ); // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler data.pitch = mapJoystickValues( analogRead(A2), 12, 524, 1020, true ); // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler data.yaw = mapJoystickValues( analogRead(A3), 12, 524, 1020, true ); // "true" or "false" for servo direction | "true" veya "false" servo yönünü belirler radio.write(&data, sizeof(Signal)); }
Receiver Code | Alıcı Kodu
// 4 Channel Receiver | 4 Kanal Alıcı // PWM output on pins D2, D3, D4, D5 (Çıkış pinleri) #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() { // Define the inicial value of each data input. | Veri girişlerinin başlangıç değerleri // The middle position for Potenciometers. (254/2=127) | Potansiyometreler için orta konum data.throttle = 127; // Motor Stop | Motor Kapalı data.pitch = 127; // Center | Merkez data.roll = 127; // Center | Merkez data.yaw = 127; // Center | Merkez } void setup() { //Set the pins for each PWM signal | Her bir PWM sinyal için pinler belirleniyor. ch1.attach(2); ch2.attach(3); ch3.attach(4); ch4.attach(5); //Configure the NRF24 module ResetData(); radio.begin(); radio.openReadingPipe(1,pipeIn); radio.startListening(); //start the radio comunication for receiver | Alıcı olarak sinyal iletişimi başlatılıyor } 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_1 = map(data.throttle, 0, 255, 1000, 2000); // pin D2 (PWM signal) ch_width_2 = map(data.pitch, 0, 255, 1000, 2000); // pin D3 (PWM signal) ch_width_3 = map(data.roll, 0, 255, 1000, 2000); // pin D4 (PWM signal) ch_width_4 = map(data.yaw, 0, 255, 1000, 2000); // pin D5 (PWM signal) // Write the PWM signal | PWM sinyaller çıkışlara gönderiliyor ch1.writeMicroseconds(ch_width_1); ch2.writeMicroseconds(ch_width_2); ch3.writeMicroseconds(ch_width_3); ch4.writeMicroseconds(ch_width_4); }
Kodlardaki “include satırlarında yer alan .h uzantılı dosyalar kütüphane dosyalarıdır. Onları isimleri ile aratın. Bilgisayarınıza indirin ve Arduino/Libraries klasörüne koplayın. (Bunu kodu arduinoya yüklemeden önce yapmalısınız)
Örnek: NRF24L01 için gerekli kütüphane linki : https://github.com/maniacbug/RF24 (Arduino kartına göre farklı versiyon kütüphane dosyaları gerekebilir. Deneyerek bulunabilir)