Arduino nano rc kumanda alıcı-verici çalışmıyor(nrf modülü)

canoner17

Yeni Üye
26 Nis 2020
2
0
1
Selamlar, arduino kullanarak rc araba kumandası verici ve alıcı yapıyorum youtube dan bir videodan gördüğüm kadarıyla ancak çalıştıramadım bir takım sıkıntılar yaşıyorum.

Nrf modülü kullanıyorum haberleşme için arduino modeli olarak da nano kullanıyorum. Kumanda bağlantılarında nrf güç girişini nanoda 3v3 portuna bağladıktan sonra arduinoyu pc ye bağladığım pc görmüyor sadece arduinoya güç veriyor ve nanonun ısındığını da farkettim ancak bu bağlantıyı söktüğüm zaman bir sorun olmuyor arduino normal şekilde çalışıyor. Kumandayı 9v pil ile kullanmayı düşünüyorum ancak yasaktan dolayı henüz pil alamadım bu sebeple usb ile pc ye bağlayıp güç vermek istedim 5v yeterli diye düşündüm sorun bu olabilir mi? Hem hayvanın kötü olması hem tecrübesizlikten pek güzel bir lehim yapamadım ancak yine de yeterli olduğunu düşünüyorum herhangi bir kısa devre göremedim ve bağlantıların doğru olduğundan da eminim. Yardımcı olabilirseniz çok sevinirim.

Yapmaya çalıştığım kumanda sistemi şu siteden:
https://www.rcpano.net/2020/02/17/ucuz-basit-4-kanalli-model-ucak-kumandasi-yapimi/
 

onurboy

Yeni Üye
15 Nis 2020
24
18
3
Merhabalar,
Mümkünse sizin bağlantılarınızın resimlerini ve kodunuzu ekler misiniz? Birçok hata olabiliyor insanın dikkatinden kaçan. O şekilde daha iyi analiz ederiz. Ayırca ben de aynı projenin yapım videolarını ve yapılışını anlattığım blog sayfamı yeni konu olarak ekledim. Oradan da faydalanabilirsiniz.
Arduinoyu 5v pininden sürekli ve düzenli 5v veren bir kaynak ile besleyebilirsiniz sorun olmaz. Ancak ben 7-12V arası bir değer ile VIN pininden beslemeyi tercih ediyorum.
 

onurboy

Yeni Üye
15 Nis 2020
24
18
3
Ayrıca bir husus daha var. NRF modülü CE ve CSN uçlarını hangi pinlere bağladınız? Bu tarz modüller bazı pinlerde (2 gibi mesela) bahse konu hataları verebiliyor USB veri aktarımında. VIN den beslemek veya 5v pinden 5v kaynak ile beslemek en sağlıklısı. Bir de NRF24L01 modüller ucuz komponentler ama sorunlu çalışırlar. Özellikle besleme voltajı konusunda hassastırlar. Arduinonun 3.3v çıkışı onları bazen tam tatmin etmeyebiliyor. Bunun için 2 çözümden biri şart. İlki, modülün VCC ve GND bacakları arasına - ucu GND'ye + ucu VCC'ye olacak şekilde 16V ve üzerinde 100uf bir kondansatör bağlamak. Bu bi çeşit filtre ve tampon görevi görür ve modülünüz çalışır. (ışığın yanmasından bahsetmiyorum. gerçek çalışama yani veri alıp gönderme) Diğer çözüm ise bu modüller için satılan ara adaptörlerden almak. Tüm elektronik marketlerde (sitelerde) mevcut. Resimdeki alet. Bu iki işlemden birini yapmazsanız çok verimsiz çalışırlar veya çalışmazlar.8-pin-nrf24l01-wireless-modul-adaptoru-wireless-modul.jpg
 

canoner17

Yeni Üye
26 Nis 2020
2
0
1
Ayrıca bir husus daha var. NRF modülü CE ve CSN uçlarını hangi pinlere bağladınız? Bu tarz modüller bazı pinlerde (2 gibi mesela) bahse konu hataları verebiliyor USB veri aktarımında. VIN den beslemek veya 5v pinden 5v kaynak ile beslemek en sağlıklısı. Bir de NRF24L01 modüller ucuz komponentler ama sorunlu çalışırlar. Özellikle besleme voltajı konusunda hassastırlar. Arduinonun 3.3v çıkışı onları bazen tam tatmin etmeyebiliyor. Bunun için 2 çözümden biri şart. İlki, modülün VCC ve GND bacakları arasına - ucu GND'ye + ucu VCC'ye olacak şekilde 16V ve üzerinde 100uf bir kondansatör bağlamak. Bu bi çeşit filtre ve tampon görevi görür ve modülünüz çalışır. (ışığın yanmasından bahsetmiyorum. gerçek çalışama yani veri alıp gönderme) Diğer çözüm ise bu modüller için satılan ara adaptörlerden almak. Tüm elektronik marketlerde (sitelerde) mevcut. Resimdeki alet. Bu iki işlemden birini yapmazsanız çok verimsiz çalışırlar veya çalışmazlar.
Tekrar selamlar,

CE ve CSN sırasıyla D7 ve D8 pinlerine bağlı. İki devrede de kondansatör bağlı 35v 100uF bulabildim onu bağladım. Resimleri ekliyorum, lehim havyamın kötü olmasından ve tecrübesizliğimden kötü oldu ancak kısa devre göremedim ben ama tabi ki çok bilgim yok yeniyim bilmediğim sorunlar da olabilir. Kodları çerçeve içerisinde nasıl yükleyeceğimi bilemedim kusura bakmayın yazıdaki kalabalıktan dolayı.

Alıcı devresi şu şekilde:

Verici Devresi:


// 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));
}
-------------------------------------------------------------------------------------------------------------------------------
// 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);
}
 
Son düzenleme:

onurboy

Yeni Üye
15 Nis 2020
24
18
3
Evet devreyi bu şekilde çözmek puzzledan zor olacak :) Neyse en basitten başlamak lazım bu işlerde.
Öncelikle 35v 100uf kondansatörde sorun yok çalışır.
O zaman tavsiyeme geçeyim. Kendi metodolojimi anlatayım. Bu işlerde basitten başlayıp zora gitmek gerek ama genelde herkes hemen nihai sonuca ulaşmaya çalışıyor. Şimdi siz başkasının yazdığı bir kodu alıp arduinoya atıp hop hemen her şey çalışsın istiyorsunuz :) Biliyorum çünkü herkes böyle olsun istiyor ama maalesef böyle değil.
Basitten başlayalım. Bence önce hiç böyle devre lehim falan uğraşmadan breadboard üzerine temiz bir şekilde jumper kablo ile bağlantıları yapın. Çünkü bilemiyorum kablolama ve lehimleme fotolardan hiç güvenilir gelmedi bana. Önce donanımı bir temizleyelim. Düzgün olduğundan %100 emin olalım. %99 olmaz. Kumanda, araba falan sonra, boş verin.
Vericiden alıcıya tek bir kelime mesajı yollayalım bakalım onu alsın. Eğer bağlantımız tamam ve artık veri alabiliyorsak o zaman herşeyi yaptırırız.
Eklediğiniz kodda sorun göremedim ama bu kod genel olarak bir kütüphane desteği ile yazıldığından sizin bunda değişiklik yapmanız zor olur. İçine başlangıç seviyesindeki kullanıcılar nüfuz edemez. Size tavsiyem benim bloğumda yazdığım basit kodu kullanmanız. Daha kolay anlarsınız. Basitçe analog joysticklerden okuduğumuz değerleri basit bir dizi içine yazıyoruz sonra diziyi gönderiyoruz. Bu kadar. Karmaşık fonksiyonlara önce gerek yok. Bunu bir yapın sonra karmaşığa geçersiniz. Karşı tarafta da aynı diziyi alıyor ve elemanlarını map komutu ile basitçe motorların 0-255 aralığına çekiyor ve motorları sürüyoruz.
Bu metotla başarıya ulaşırsanız. İlk etapta böyle baştan başlamak zor ve angarya gibi gelse de başarımı garanti eder.
 
  • Beğen
Tepkiler: writersoul

Robotikforum.net Nedir?

  • Robotikforum.net 2020 yılında kurulup yayın hayatına başlayan ve Türkiye’de robotik kodlama alanının gelişimine katkıda bulunmak için bu alan ile ilgilenen bireylerin bir birleri ile yardımlaşmaları ve fikir danışmalarını sağlayarak daha iyi öğrenmek için her bir bireyin bilgisini ve tecrübesini alarak kendini geliştirebileceği ve sorularına cevap bulabileceği bir platform olarak kurulmuştur.

Bilgilendirme!!!

İçerik sağlayıcı paylaşım sitelerinden biri olan www.robotikforum.net Adresimizde T.C.K 20.ci Madde ve 5651 Sayılı Kanun'un 4.cü maddesinin (2).ci fıkrasına göre TÜM ÜYELERİMİZ yaptıkları paylaşımlardan sorumludur.

Sayfamızı beğendin mi?

X Merhaba ziyaretçi Robotikforum.net adresine hoşgeldin. Robotikforum.net
adresi gelişen teknoloji ile günden güne yaygınlaşan robotik teknolojileri
hakkında yardımlaşabileceğin ve tartışabileceğin bir platformdur.
Aramıza katılmaya ne dersin?
Kayıt Ol